From 451e34fb8349d828ee2bebafc386b8f9cab1912f Mon Sep 17 00:00:00 2001 From: BlayTheNinth <1933180+BlayTheNinth@users.noreply.github.com> Date: Thu, 21 Dec 2023 12:41:27 +0100 Subject: [PATCH] fix: Allow opening waystone screen for attunement but no edits if edits are restricted --- .../block/entity/LandingStoneBlockEntity.java | 8 +++- .../block/entity/SharestoneBlockEntity.java | 7 +++- .../block/entity/WaystoneBlockEntity.java | 8 +++- .../gui/screen/WaystoneSettingsScreen.java | 39 +++++++------------ .../gui/widget/WaystoneVisbilityButton.java | 20 +++++++--- .../blay09/mods/waystones/menu/ModMenus.java | 4 +- .../waystones/menu/WaystoneSettingsMenu.java | 9 ++++- .../assets/waystones/lang/en_us.json | 1 + 8 files changed, 57 insertions(+), 39 deletions(-) diff --git a/shared/src/main/java/net/blay09/mods/waystones/block/entity/LandingStoneBlockEntity.java b/shared/src/main/java/net/blay09/mods/waystones/block/entity/LandingStoneBlockEntity.java index 5df013db..43a04f81 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/block/entity/LandingStoneBlockEntity.java +++ b/shared/src/main/java/net/blay09/mods/waystones/block/entity/LandingStoneBlockEntity.java @@ -3,6 +3,7 @@ import net.blay09.mods.balm.api.menu.BalmMenuProvider; import net.blay09.mods.waystones.api.WaystoneTypes; import net.blay09.mods.waystones.core.Waystone; +import net.blay09.mods.waystones.core.WaystonePermissionManager; import net.blay09.mods.waystones.menu.ModMenus; import net.blay09.mods.waystones.menu.WaystoneSettingsMenu; import net.minecraft.core.BlockPos; @@ -37,14 +38,17 @@ public Component getDisplayName() { } @Override - public AbstractContainerMenu createMenu(int windowId, Inventory playerInventory, Player playerEntity) { - return new WaystoneSettingsMenu(windowId, getWaystone(), LandingStoneBlockEntity.this, dataAccess, playerInventory); + public AbstractContainerMenu createMenu(int windowId, Inventory inventory, Player player) { + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + return new WaystoneSettingsMenu(windowId, getWaystone(), LandingStoneBlockEntity.this, dataAccess, inventory, error.isEmpty()); } @Override public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { buf.writeBlockPos(worldPosition); Waystone.write(buf, getWaystone()); + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + buf.writeBoolean(error.isEmpty()); } }; } diff --git a/shared/src/main/java/net/blay09/mods/waystones/block/entity/SharestoneBlockEntity.java b/shared/src/main/java/net/blay09/mods/waystones/block/entity/SharestoneBlockEntity.java index 5ddadb47..bed8b31a 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/block/entity/SharestoneBlockEntity.java +++ b/shared/src/main/java/net/blay09/mods/waystones/block/entity/SharestoneBlockEntity.java @@ -73,14 +73,17 @@ public Component getDisplayName() { } @Override - public AbstractContainerMenu createMenu(int windowId, Inventory playerInventory, Player playerEntity) { - return new WaystoneSettingsMenu(windowId, getWaystone(), SharestoneBlockEntity.this, dataAccess, playerInventory); + public AbstractContainerMenu createMenu(int windowId, Inventory inventory, Player player) { + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + return new WaystoneSettingsMenu(windowId, getWaystone(), SharestoneBlockEntity.this, dataAccess, inventory, error.isEmpty()); } @Override public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { buf.writeBlockPos(worldPosition); Waystone.write(buf, getWaystone()); + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + buf.writeBoolean(error.isEmpty()); } }; } diff --git a/shared/src/main/java/net/blay09/mods/waystones/block/entity/WaystoneBlockEntity.java b/shared/src/main/java/net/blay09/mods/waystones/block/entity/WaystoneBlockEntity.java index b2bfd5c6..0de55c52 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/block/entity/WaystoneBlockEntity.java +++ b/shared/src/main/java/net/blay09/mods/waystones/block/entity/WaystoneBlockEntity.java @@ -3,6 +3,7 @@ import net.blay09.mods.balm.api.menu.BalmMenuProvider; import net.blay09.mods.waystones.core.PlayerWaystoneManager; import net.blay09.mods.waystones.core.Waystone; +import net.blay09.mods.waystones.core.WaystonePermissionManager; import net.blay09.mods.waystones.menu.ModMenus; import net.blay09.mods.waystones.menu.WaystoneSelectionMenu; import net.blay09.mods.waystones.menu.WaystoneSettingsMenu; @@ -62,14 +63,17 @@ public Component getDisplayName() { } @Override - public AbstractContainerMenu createMenu(int windowId, Inventory playerInventory, Player playerEntity) { - return new WaystoneSettingsMenu(windowId, getWaystone(), WaystoneBlockEntity.this, dataAccess, playerInventory); + public AbstractContainerMenu createMenu(int windowId, Inventory inventory, Player player) { + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + return new WaystoneSettingsMenu(windowId, getWaystone(), WaystoneBlockEntity.this, dataAccess, inventory, error.isEmpty()); } @Override public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) { buf.writeBlockPos(worldPosition); Waystone.write(buf, getWaystone()); + final var error = WaystonePermissionManager.mayEditWaystone(player, player.level(), getWaystone()); + buf.writeBoolean(error.isEmpty()); } }; } diff --git a/shared/src/main/java/net/blay09/mods/waystones/client/gui/screen/WaystoneSettingsScreen.java b/shared/src/main/java/net/blay09/mods/waystones/client/gui/screen/WaystoneSettingsScreen.java index 3c7ae2f2..851d2514 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/client/gui/screen/WaystoneSettingsScreen.java +++ b/shared/src/main/java/net/blay09/mods/waystones/client/gui/screen/WaystoneSettingsScreen.java @@ -3,34 +3,25 @@ import com.mojang.blaze3d.systems.RenderSystem; import net.blay09.mods.balm.api.Balm; import net.blay09.mods.waystones.Waystones; -import net.blay09.mods.waystones.api.IWaystone; -import net.blay09.mods.waystones.api.WaystoneVisibility; import net.blay09.mods.waystones.client.gui.widget.ITooltipProvider; import net.blay09.mods.waystones.client.gui.widget.WaystoneVisbilityButton; import net.blay09.mods.waystones.menu.WaystoneSettingsMenu; -import net.blay09.mods.waystones.core.PlayerWaystoneManager; -import net.blay09.mods.waystones.api.WaystoneTypes; import net.blay09.mods.waystones.network.message.EditWaystoneMessage; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.Checkbox; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.gui.components.Renderable; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Inventory; import org.lwjgl.glfw.GLFW; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.Optional; public class WaystoneSettingsScreen extends AbstractContainerScreen { @@ -42,8 +33,6 @@ public class WaystoneSettingsScreen extends AbstractContainerScreen options; + private final boolean canEdit; private WaystoneVisibility visibility; - public WaystoneVisbilityButton(int x, int y, WaystoneVisibility visibility, List options) { + public WaystoneVisbilityButton(int x, int y, WaystoneVisibility visibility, List options, boolean canEdit) { super(x, y, 18, 18, Component.empty(), button -> { }, Button.DEFAULT_NARRATION); this.options = options; this.visibility = visibility; + this.canEdit = canEdit; } @Override @@ -39,9 +42,14 @@ public boolean shouldShowTooltip() { @Override public List getTooltipComponents() { - final var visibilityComponent = Component.translatable("tooltip.waystones.visibility." + visibility.name().toLowerCase(Locale.ROOT)) + final var visibilityValueComponent = Component.translatable("tooltip.waystones.visibility." + visibility.name().toLowerCase(Locale.ROOT)) .withStyle(ChatFormatting.WHITE); - return List.of(Component.translatable("tooltip.waystones.visibility", visibilityComponent).withStyle(ChatFormatting.YELLOW)); + final var result = new ArrayList(); + result.add(Component.translatable("tooltip.waystones.visibility", visibilityValueComponent).withStyle(ChatFormatting.YELLOW)); + if (!canEdit) { + result.add(Component.translatable("tooltip.waystones.edit_restricted", visibilityValueComponent).withStyle(ChatFormatting.RED)); + } + return result; } public WaystoneVisibility getVisibility() { @@ -50,7 +58,9 @@ public WaystoneVisibility getVisibility() { @Override public void onPress() { - final var index = options.indexOf(visibility); - visibility = options.get((index + 1) % options.size()); + if (canEdit) { + final var index = options.indexOf(visibility); + visibility = options.get((index + 1) % options.size()); + } } } diff --git a/shared/src/main/java/net/blay09/mods/waystones/menu/ModMenus.java b/shared/src/main/java/net/blay09/mods/waystones/menu/ModMenus.java index 90cc9e9f..24c95020 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/menu/ModMenus.java +++ b/shared/src/main/java/net/blay09/mods/waystones/menu/ModMenus.java @@ -9,6 +9,7 @@ import net.blay09.mods.waystones.block.entity.WaystoneBlockEntityBase; import net.blay09.mods.waystones.core.WarpMode; import net.blay09.mods.waystones.core.Waystone; +import net.blay09.mods.waystones.core.WaystonePermissionManager; import net.minecraft.core.BlockPos; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.MenuType; @@ -93,10 +94,11 @@ public static void initialize(BalmMenus menus) { waystoneSettings = menus.registerMenu(id("waystone_settings"), (windowId, inv, data) -> { final var pos = data.readBlockPos(); final var waystone = Waystone.read(data); + final var canEdit = data.readBoolean(); BlockEntity blockEntity = inv.player.level().getBlockEntity(pos); if (blockEntity instanceof WaystoneBlockEntityBase waystoneBlockEntity) { - return new WaystoneSettingsMenu(windowId, waystone, waystoneBlockEntity, waystoneBlockEntity.getContainerData(), inv); + return new WaystoneSettingsMenu(windowId, waystone, waystoneBlockEntity, waystoneBlockEntity.getContainerData(), inv, canEdit); } return null; diff --git a/shared/src/main/java/net/blay09/mods/waystones/menu/WaystoneSettingsMenu.java b/shared/src/main/java/net/blay09/mods/waystones/menu/WaystoneSettingsMenu.java index efb8a7de..f39b3a65 100644 --- a/shared/src/main/java/net/blay09/mods/waystones/menu/WaystoneSettingsMenu.java +++ b/shared/src/main/java/net/blay09/mods/waystones/menu/WaystoneSettingsMenu.java @@ -22,13 +22,16 @@ public class WaystoneSettingsMenu extends AbstractContainerMenu { private final IWaystone waystone; private final WaystoneBlockEntityBase blockEntity; private final ContainerData containerData; + private final boolean canEdit; - public WaystoneSettingsMenu(int windowId, IWaystone waystone, WaystoneBlockEntityBase blockEntity, ContainerData containerData, Inventory playerInventory) { + public WaystoneSettingsMenu(int windowId, IWaystone waystone, WaystoneBlockEntityBase blockEntity, ContainerData containerData, Inventory playerInventory, boolean canEdit) { super(ModMenus.waystoneSettings.get(), windowId); this.player = playerInventory.player; this.waystone = waystone; this.blockEntity = blockEntity; this.containerData = containerData; + this.canEdit = canEdit; + blockEntity.markReadyForAttunement(); checkContainerDataCount(containerData, 1); @@ -115,4 +118,8 @@ public List getVisibilityOptions() { return result; } } + + public boolean canEdit() { + return canEdit; + } } diff --git a/shared/src/main/resources/assets/waystones/lang/en_us.json b/shared/src/main/resources/assets/waystones/lang/en_us.json index eca8f420..b8395d5a 100644 --- a/shared/src/main/resources/assets/waystones/lang/en_us.json +++ b/shared/src/main/resources/assets/waystones/lang/en_us.json @@ -102,6 +102,7 @@ "tooltip.waystones.visibility.activation": "On Activation", "tooltip.waystones.visibility.global": "Global", "tooltip.waystones.visibility.shard_only": "Shards only", + "tooltip.waystones.edit_restricted": "This waystone cannot be edited.", "stat.waystones.waystone_activated": "Waystones Activated", "waystones.untitled_waystone": "Untitled Waystone", "waystones:warp_plate": "Warp Plate",