Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/main/java/com/gregtechceu/gtceu/api/item/IGTTool.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<PlayerInventoryGuiData<?>>, ItemLike, IForgeItem {

GTToolType getToolType();

Expand Down Expand Up @@ -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<GTToolType> getToolClasses(ItemStack stack) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -12,20 +12,17 @@

import org.jetbrains.annotations.NotNull;

public interface IToolUIBehavior extends IToolBehavior {
public interface IToolUIBehavior extends IToolBehavior, IUIHolder<PlayerInventoryGuiData<?>> {

@Override
default @NotNull InteractionResultHolder<ItemStack> 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);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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))));
}
}