Skip to content

Commit

Permalink
fix: Allow opening waystone screen for attunement but no edits if edi…
Browse files Browse the repository at this point in the history
…ts are restricted
  • Loading branch information
BlayTheNinth committed Dec 21, 2023
1 parent 21cec0a commit 451e34f
Show file tree
Hide file tree
Showing 8 changed files with 57 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<WaystoneSettingsMenu> {
Expand All @@ -42,8 +33,6 @@ public class WaystoneSettingsScreen extends AbstractContainerScreen<WaystoneSett
private EditBox textField;
private WaystoneVisbilityButton visibilityButton;

private boolean focusTextFieldNextTick;

public WaystoneSettingsScreen(WaystoneSettingsMenu container, Inventory playerInventory, Component title) {
super(container, playerInventory, title);
imageHeight = 196;
Expand All @@ -53,8 +42,8 @@ public WaystoneSettingsScreen(WaystoneSettingsMenu container, Inventory playerIn
@Override
public void init() {
super.init();
IWaystone waystone = menu.getWaystone();
String oldText = waystone.getName();
final var waystone = menu.getWaystone();
var oldText = waystone.getName();
if (textField != null) {
oldText = textField.getValue();
}
Expand All @@ -68,16 +57,19 @@ public void init() {
textField = new EditBox(Minecraft.getInstance().font, leftPos + 33, topPos + 21, 110, 16, textField, Component.empty());
textField.setMaxLength(128);
textField.setValue(oldText);
textField.setEditable(menu.canEdit());
addRenderableWidget(textField);
setInitialFocus(textField);
if (menu.canEdit()) {
setInitialFocus(textField);
}

visibilityButton = new WaystoneVisbilityButton(leftPos + 9, topPos + 20, oldVisibility, menu.getVisibilityOptions());
visibilityButton = new WaystoneVisbilityButton(leftPos + 9, topPos + 20, oldVisibility, menu.getVisibilityOptions(), menu.canEdit());
addRenderableWidget(visibilityButton);
}

@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
if (textField.isMouseOver(mouseX, mouseY) && button == 1) {
if (menu.canEdit() && textField.isMouseOver(mouseX, mouseY) && button == 1) {
textField.setValue("");
return true;
}
Expand All @@ -98,15 +90,6 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
return super.keyPressed(keyCode, scanCode, modifiers);
}

@Override
protected void containerTick() {
// Button presses focus the button after onPress, so we can't change focus inside. Defer to here instead.
if (focusTextFieldNextTick) {
setInitialFocus(textField);
focusTextFieldNextTick = false;
}
}

@Override
public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTicks) {
super.render(guiGraphics, mouseX, mouseY, partialTicks);
Expand All @@ -119,7 +102,11 @@ public void render(GuiGraphics guiGraphics, int mouseX, int mouseY, float partia
}

if (textField != null && textField.getValue().isEmpty()) {
guiGraphics.drawString(Minecraft.getInstance().font, Component.translatable("waystones.untitled_waystone"), textField.getX() + 4, textField.getY() + 4, 0x808080);
guiGraphics.drawString(Minecraft.getInstance().font,
Component.translatable("waystones.untitled_waystone"),
textField.getX() + 4,
textField.getY() + 4,
0x808080);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import net.minecraft.network.chat.MutableComponent;
import net.minecraft.resources.ResourceLocation;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

Expand All @@ -17,13 +18,15 @@ public class WaystoneVisbilityButton extends Button implements ITooltipProvider
private static final ResourceLocation WAYSTONE_GUI_TEXTURES = new ResourceLocation(Waystones.MOD_ID, "textures/gui/menu/waystone.png");

private final List<WaystoneVisibility> options;
private final boolean canEdit;
private WaystoneVisibility visibility;

public WaystoneVisbilityButton(int x, int y, WaystoneVisibility visibility, List<WaystoneVisibility> options) {
public WaystoneVisbilityButton(int x, int y, WaystoneVisibility visibility, List<WaystoneVisibility> options, boolean canEdit) {
super(x, y, 18, 18, Component.empty(), button -> {
}, Button.DEFAULT_NARRATION);
this.options = options;
this.visibility = visibility;
this.canEdit = canEdit;
}

@Override
Expand All @@ -39,9 +42,14 @@ public boolean shouldShowTooltip() {

@Override
public List<Component> 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<Component>();
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() {
Expand All @@ -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());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -115,4 +118,8 @@ public List<WaystoneVisibility> getVisibilityOptions() {
return result;
}
}

public boolean canEdit() {
return canEdit;
}
}
1 change: 1 addition & 0 deletions shared/src/main/resources/assets/waystones/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down

0 comments on commit 451e34f

Please sign in to comment.