diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java index 57dff0347c9..52cd3a1bd0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java @@ -19,15 +19,17 @@ import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolBehavior; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolUIBehavior; +import com.gregtechceu.gtceu.api.mui.base.IUIHolder; +import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.sound.SoundEntry; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.VanillaRecipeHelper; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; - import net.minecraft.Util; import net.minecraft.client.color.item.ItemColor; import net.minecraft.core.BlockPos; @@ -83,7 +85,7 @@ import static net.minecraft.world.item.Item.BASE_ATTACK_DAMAGE_UUID; import static net.minecraft.world.item.Item.BASE_ATTACK_SPEED_UUID; -public interface IGTTool extends HeldItemUIFactory.IHeldItemUIHolder, ItemLike, IForgeItem { +public interface IGTTool extends IUIHolder>, ItemLike, IForgeItem { GTToolType getToolType(); @@ -878,14 +880,15 @@ default void playSound(Player player) { } @Override - default ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder) { + default ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { for (var behavior : getToolStats().getBehaviors()) { - if (!(behavior instanceof IToolUIBehavior uiBehavior) || !uiBehavior.openUI(player, holder.getHand())) { + if (!(behavior instanceof IToolUIBehavior uiBehavior) || + !uiBehavior.shouldOpenUI(data.getPlayer(), data.getPlayer().getUsedItemHand())) { continue; } - return uiBehavior.createUI(player, holder); + return uiBehavior.buildUI(data, syncManager, settings); } - return new ModularUI(holder, player); + return null; } default Set getToolClasses(ItemStack stack) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java index e00fd5f658e..1349f8fcaff 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/behavior/IToolUIBehavior.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.api.item.tool.behavior; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.gregtechceu.gtceu.api.mui.base.IUIHolder; +import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData; +import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryUIFactory; -import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.entity.player.Player; @@ -12,20 +12,17 @@ import org.jetbrains.annotations.NotNull; -public interface IToolUIBehavior extends IToolBehavior { +public interface IToolUIBehavior extends IToolBehavior, IUIHolder> { @Override default @NotNull InteractionResultHolder onItemRightClick(@NotNull Level level, @NotNull Player player, @NotNull InteractionHand hand) { - var heldItem = player.getItemInHand(hand); - if (player instanceof ServerPlayer serverPlayer && openUI(serverPlayer, hand)) { - HeldItemUIFactory.INSTANCE.openUI(serverPlayer, hand); - return InteractionResultHolder.success(heldItem); + ItemStack heldItem = player.getItemInHand(hand); + if (level.isClientSide && shouldOpenUI(player, hand)) { + PlayerInventoryUIFactory.INSTANCE.openFromHandClient(hand); } return InteractionResultHolder.pass(heldItem); } - boolean openUI(@NotNull Player player, @NotNull InteractionHand hand); - - ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder); + boolean shouldOpenUI(@NotNull Player player, @NotNull InteractionHand hand); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index df1fbf0d72a..c5450d6c9b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -59,8 +59,7 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth) return createTitleBar(definition, panelWidth, background); } - public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { - var displayItem = definition.asStack(); + public static Flow createTitleBar(ItemStack displayItem, int panelWidth, UITexture background) { String machineName = displayItem.getHoverName().getString(); machineName = machineName.replaceAll("ยง.", "").trim(); @@ -94,6 +93,10 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth, .size(Math.min(minPanelWidth, textTitleWidth), textHeight)); } + public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { + return createTitleBar(definition.asStack(), panelWidth, background); + } + public static ToggleButton createPowerButton(BooleanSupplier getter, BooleanConsumer setter, PanelSyncManager syncManager) { BooleanSyncValue power = new BooleanSyncValue(getter, setter); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/AOEConfigUIBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/AOEConfigUIBehavior.java index 261f013aff3..0bb224a2ad9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/AOEConfigUIBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/AOEConfigUIBehavior.java @@ -1,17 +1,24 @@ package com.gregtechceu.gtceu.common.item.tool.behavior; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; import com.gregtechceu.gtceu.api.item.tool.behavior.IToolUIBehavior; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.InteractionSyncHandler; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget; +import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; -import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.TextTexture; -import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; -import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; - +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.NotNull; @@ -22,50 +29,121 @@ public class AOEConfigUIBehavior implements IToolUIBehavior { public static final AOEConfigUIBehavior INSTANCE = new AOEConfigUIBehavior(); + // @Override + // public boolean openUI(@NotNull Player player, @NotNull InteractionHand hand) { + // return player.isShiftKeyDown() && !getMaxAoEDefinition(player.getItemInHand(hand)).isZero(); + // } + // + // @Override + // public ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder) { + // var tag = getBehaviorsTag(holder.getHeld()); + // var defaultDefinition = getMaxAoEDefinition(holder.getHeld()); + // return new ModularUI(120, 80, holder, player).background(GuiTextures.BACKGROUND) + // .widget(new LabelWidget(6, 10, "item.gtceu.tool.aoe.columns")) + // .widget(new LabelWidget(49, 10, "item.gtceu.tool.aoe.rows")) + // .widget(new LabelWidget(79, 10, "item.gtceu.tool.aoe.layers")) + // .widget(new ButtonWidget(15, 24, 20, 20, new TextTexture("+"), (data) -> { + // AoESymmetrical.increaseColumn(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new ButtonWidget(15, 44, 20, 20, new TextTexture("-"), (data) -> { + // AoESymmetrical.decreaseColumn(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new ButtonWidget(50, 24, 20, 20, new TextTexture("+"), (data) -> { + // AoESymmetrical.increaseRow(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new ButtonWidget(50, 44, 20, 20, new TextTexture("-"), (data) -> { + // AoESymmetrical.decreaseRow(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new ButtonWidget(85, 24, 20, 20, new TextTexture("+"), (data) -> { + // AoESymmetrical.increaseLayer(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new ButtonWidget(85, 44, 20, 20, new TextTexture("-"), (data) -> { + // AoESymmetrical.decreaseLayer(tag, defaultDefinition); + // holder.markAsDirty(); + // })) + // .widget(new LabelWidget(23, 65, + // () -> Integer.toString(1 + + // 2 * AoESymmetrical.getColumn(getBehaviorsTag(holder.getHeld()), defaultDefinition)))) + // .widget(new LabelWidget(58, 65, + // () -> Integer.toString( + // 1 + 2 * AoESymmetrical.getRow(getBehaviorsTag(holder.getHeld()), defaultDefinition)))) + // .widget(new LabelWidget(93, 65, () -> Integer + // .toString(1 + AoESymmetrical.getLayer(getBehaviorsTag(holder.getHeld()), defaultDefinition)))); + // } + @Override - public boolean openUI(@NotNull Player player, @NotNull InteractionHand hand) { + public boolean shouldOpenUI(@NotNull Player player, @NotNull InteractionHand hand) { return player.isShiftKeyDown() && !getMaxAoEDefinition(player.getItemInHand(hand)).isZero(); } @Override - public ModularUI createUI(Player player, HeldItemUIFactory.HeldItemHolder holder) { - var tag = getBehaviorsTag(holder.getHeld()); - var defaultDefinition = getMaxAoEDefinition(holder.getHeld()); - return new ModularUI(120, 80, holder, player).background(GuiTextures.BACKGROUND) - .widget(new LabelWidget(6, 10, "item.gtceu.tool.aoe.columns")) - .widget(new LabelWidget(49, 10, "item.gtceu.tool.aoe.rows")) - .widget(new LabelWidget(79, 10, "item.gtceu.tool.aoe.layers")) - .widget(new ButtonWidget(15, 24, 20, 20, new TextTexture("+"), (data) -> { - AoESymmetrical.increaseColumn(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new ButtonWidget(15, 44, 20, 20, new TextTexture("-"), (data) -> { - AoESymmetrical.decreaseColumn(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new ButtonWidget(50, 24, 20, 20, new TextTexture("+"), (data) -> { - AoESymmetrical.increaseRow(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new ButtonWidget(50, 44, 20, 20, new TextTexture("-"), (data) -> { - AoESymmetrical.decreaseRow(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new ButtonWidget(85, 24, 20, 20, new TextTexture("+"), (data) -> { - AoESymmetrical.increaseLayer(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new ButtonWidget(85, 44, 20, 20, new TextTexture("-"), (data) -> { - AoESymmetrical.decreaseLayer(tag, defaultDefinition); - holder.markAsDirty(); - })) - .widget(new LabelWidget(23, 65, - () -> Integer.toString(1 + - 2 * AoESymmetrical.getColumn(getBehaviorsTag(holder.getHeld()), defaultDefinition)))) - .widget(new LabelWidget(58, 65, - () -> Integer.toString( - 1 + 2 * AoESymmetrical.getRow(getBehaviorsTag(holder.getHeld()), defaultDefinition)))) - .widget(new LabelWidget(93, 65, () -> Integer - .toString(1 + AoESymmetrical.getLayer(getBehaviorsTag(holder.getHeld()), defaultDefinition)))); + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + ItemStack held = data.getUsedItemStack(); + CompoundTag tag = getBehaviorsTag(held); + AoESymmetrical defaultDefinition = getMaxAoEDefinition(held); + InteractionSyncHandler minusCols = new InteractionSyncHandler(); + minusCols.setOnMousePressed(data1 -> AoESymmetrical.decreaseColumn(tag, defaultDefinition)); + InteractionSyncHandler plusCols = new InteractionSyncHandler(); + plusCols.setOnMousePressed(data1 -> AoESymmetrical.increaseColumn(tag, defaultDefinition)); + InteractionSyncHandler minusRows = new InteractionSyncHandler(); + minusRows.setOnMousePressed(data1 -> AoESymmetrical.decreaseRow(tag, defaultDefinition)); + InteractionSyncHandler plusRows = new InteractionSyncHandler(); + plusRows.setOnMousePressed(data1 -> AoESymmetrical.increaseRow(tag, defaultDefinition)); + InteractionSyncHandler minusLayers = new InteractionSyncHandler(); + minusLayers.setOnMousePressed(data1 -> AoESymmetrical.decreaseLayer(tag, defaultDefinition)); + InteractionSyncHandler plusLayers = new InteractionSyncHandler(); + plusLayers.setOnMousePressed(data1 -> AoESymmetrical.increaseLayer(tag, defaultDefinition)); + return new ModularPanel("aoe_config") + .child(GTMuiWidgets.createTitleBar(held, 174, GTGuiTextures.BACKGROUND)) + .child(Flow.column() + .margin(5) + .childPadding(2) + .child(Flow.row() + .childPadding(2) + .coverChildren() + .child(new TextWidget<>(IKey.lang("item.gtceu.tool.aoe.columns"))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("-")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("-")) + .syncHandler(minusCols)) + .child(new TextWidget<>(IKey.dynamic(() -> Component.literal(Integer.toString( + 2 * AoESymmetrical.getColumn(tag, defaultDefinition) + 1))))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("+")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("+")) + .syncHandler(plusCols))) + .child(Flow.row() + .childPadding(2) + .coverChildren() + .child(new TextWidget<>(IKey.lang("item.gtceu.tool.aoe.rows"))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("-")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("-")) + .syncHandler(minusRows)) + .child(new TextWidget<>(IKey.dynamic(() -> Component.literal(Integer.toString( + 2 * AoESymmetrical.getRow(tag, defaultDefinition) + 1))))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("+")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("+")) + .syncHandler(plusRows))) + .child(Flow.row() + .childPadding(2) + .coverChildren() + .child(new TextWidget<>(IKey.lang("item.gtceu.tool.aoe.layers"))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("-")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("-")) + .syncHandler(minusLayers)) + .child(new TextWidget<>(IKey.dynamic(() -> Component.literal(Integer.toString( + 2 * AoESymmetrical.getLayer(tag, defaultDefinition) + 1))))) + .child(new ButtonWidget<>() + .background(GTGuiTextures.MC_BUTTON, IKey.str("+")) + .hoverBackground(GTGuiTextures.MC_BUTTON_HOVERED, IKey.str("+")) + .syncHandler(plusLayers)))); } }