Skip to content

Commit f274292

Browse files
[MUI2] Programmed Circuit (#4311)
1 parent ebfa8a2 commit f274292

File tree

4 files changed

+106
-91
lines changed

4 files changed

+106
-91
lines changed

src/main/java/com/gregtechceu/gtceu/api/item/ComponentItem.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
11
package com.gregtechceu.gtceu.api.item;
22

3+
import com.gregtechceu.gtceu.GTCEu;
34
import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper;
45
import com.gregtechceu.gtceu.api.capability.IElectricItem;
56
import com.gregtechceu.gtceu.api.item.capability.ElectricItem;
67
import com.gregtechceu.gtceu.api.item.component.*;
8+
import com.gregtechceu.gtceu.api.mui.base.IItemUIHolder;
9+
import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData;
10+
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
11+
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
12+
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
713

814
import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider;
915
import com.lowdragmc.lowdraglib.client.renderer.IRenderer;
@@ -49,7 +55,8 @@
4955
@ParametersAreNonnullByDefault
5056
@MethodsReturnNonnullByDefault
5157
public class ComponentItem extends Item
52-
implements HeldItemUIFactory.IHeldItemUIHolder, IItemRendererProvider, IComponentItem {
58+
implements HeldItemUIFactory.IHeldItemUIHolder, IItemRendererProvider, IComponentItem,
59+
IItemUIHolder {
5360

5461
protected int burnTime = -1;
5562

@@ -443,4 +450,24 @@ public ItemStack getInfiniteChargedStack() {
443450
electricItem.setInfiniteCharge(true);
444451
return itemStack;
445452
}
453+
454+
@Override
455+
public @Nullable ModularPanel buildUI(PlayerInventoryGuiData<?> data, PanelSyncManager syncManager,
456+
UISettings settings) {
457+
for (IItemComponent component : getComponents()) {
458+
if (component instanceof IItemUIHolder uiHolder) {
459+
return uiHolder.buildUI(data, syncManager, settings);
460+
}
461+
}
462+
GTCEu.LOGGER.error("Tried to get UI of {} item when it does not have one!", data.getUsedItemStack());
463+
return null;
464+
}
465+
466+
@Override
467+
public boolean shouldOpenUI() {
468+
for (IItemComponent component : getComponents()) {
469+
if (component instanceof IItemUIHolder holder) return holder.shouldOpenUI();
470+
}
471+
return false;
472+
}
446473
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.gregtechceu.gtceu.api.mui.base;
2+
3+
import com.gregtechceu.gtceu.api.item.component.IInteractionItem;
4+
import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData;
5+
import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryUIFactory;
6+
7+
import net.minecraft.world.InteractionHand;
8+
import net.minecraft.world.InteractionResult;
9+
import net.minecraft.world.InteractionResultHolder;
10+
import net.minecraft.world.entity.player.Player;
11+
import net.minecraft.world.item.Item;
12+
import net.minecraft.world.item.ItemStack;
13+
import net.minecraft.world.item.context.UseOnContext;
14+
import net.minecraft.world.level.Level;
15+
16+
public interface IItemUIHolder extends IUIHolder<PlayerInventoryGuiData<?>>, IInteractionItem {
17+
18+
default boolean shouldOpenUI() {
19+
return true;
20+
}
21+
22+
@Override
23+
default InteractionResultHolder<ItemStack> use(Item item, Level level, Player player, InteractionHand usedHand) {
24+
if (!shouldOpenUI())
25+
return IInteractionItem.super.use(item, level, player, usedHand);
26+
if (level.isClientSide)
27+
PlayerInventoryUIFactory.INSTANCE.openFromHandClient(usedHand);
28+
return InteractionResultHolder.sidedSuccess(player.getItemInHand(usedHand), level.isClientSide);
29+
}
30+
31+
@Override
32+
default InteractionResult useOn(UseOnContext context) {
33+
if (!shouldOpenUI())
34+
return IInteractionItem.super.useOn(context);
35+
if (context.getLevel().isClientSide)
36+
PlayerInventoryUIFactory.INSTANCE.openFromHandClient(context.getHand());
37+
return InteractionResult.SUCCESS;
38+
}
39+
}

src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.gregtechceu.gtceu.api.machine.MachineDefinition;
44
import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine;
55
import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem;
6+
import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot;
67
import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine;
78
import com.gregtechceu.gtceu.api.mui.base.IPanelHandler;
89
import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable;
@@ -38,6 +39,8 @@
3839
import it.unimi.dsi.fastutil.booleans.BooleanConsumer;
3940

4041
import java.util.function.BooleanSupplier;
42+
import java.util.function.Consumer;
43+
import java.util.function.Supplier;
4144

4245
public class GTMuiWidgets {
4346

@@ -170,16 +173,17 @@ public static ToggleButton createInputFromOutputFluid(SimpleTieredMachine machin
170173
"cover.voiding.label.disabled")))));
171174
}
172175

173-
public static ButtonWidget<?> createCircuitSlotPanel(SimpleTieredMachine machine, ModularPanel parentPanel,
174-
PanelSyncManager syncManager) {
175-
IntSyncValue circuitSyncValue = new IntSyncValue(() -> {
176-
if (machine.getCircuitInventory().getStackInSlot(0).isEmpty()) return -1;
177-
return IntCircuitBehaviour.getCircuitConfiguration(machine.getCircuitInventory().getStackInSlot(0));
176+
private static IntSyncValue createCircuitSlotSyncValue(Consumer<ItemStack> circuitSetter,
177+
Supplier<ItemStack> circuitGetter) {
178+
return new IntSyncValue(() -> {
179+
if (circuitGetter.get().isEmpty()) return -1;
180+
return IntCircuitBehaviour.getCircuitConfiguration(circuitGetter.get());
178181
},
179-
(v) -> machine.getCircuitInventory().setStackInSlot(0,
180-
(v < 0 ? ItemStack.EMPTY : IntCircuitBehaviour.stack(v))));
181-
syncManager.syncValue("circuit_slot", circuitSyncValue);
182+
(v) -> circuitSetter.accept(v < 0 ? ItemStack.EMPTY : IntCircuitBehaviour.stack(v)));
183+
}
182184

185+
public static ModularPanel createCircuitSlotPanel(IntSyncValue circuitSyncValue, PanelSyncManager syncManager) {
186+
syncManager.syncValue("circuit_slot", circuitSyncValue);
183187
Grid buttonGrid = new Grid()
184188
.coverChildren()
185189
.mapTo(8, 32, i -> new ToggleButton()
@@ -191,12 +195,10 @@ public static ButtonWidget<?> createCircuitSlotPanel(SimpleTieredMachine machine
191195
if (v) circuitSyncValue.setValue(i + 1);
192196
})));
193197

194-
ModularPanel circuitPanel = new Dialog<>("circuit_panel")
198+
return new Dialog<>("circuit_panel")
195199
.setDisablePanelsBelow(false)
196200
.setDraggable(true)
197201
.setCloseOnOutOfBoundsClick(true)
198-
.relative(parentPanel)
199-
.leftRelOffset(0.0f, -180)
200202
.height(105)
201203
.child(new Column()
202204
.padding(2)
@@ -207,7 +209,24 @@ public static ButtonWidget<?> createCircuitSlotPanel(SimpleTieredMachine machine
207209
.alignX(Alignment.Center)
208210
.child(IKey.lang("item.gtceu.circuit.integrated.gui").asWidget())
209211
.child(buttonGrid));
212+
}
213+
214+
public static ModularPanel createCircuitSlotPanel(Consumer<ItemStack> circuitSetter,
215+
Supplier<ItemStack> circuitGetter, PanelSyncManager syncManager) {
216+
IntSyncValue circuitSyncValue = createCircuitSlotSyncValue(circuitSetter, circuitGetter);
217+
return createCircuitSlotPanel(circuitSyncValue, syncManager);
218+
}
210219

220+
public static ButtonWidget<?> createCircuitSlotPanel(IHasCircuitSlot machine, ModularPanel parentPanel,
221+
PanelSyncManager syncManager) {
222+
IntSyncValue circuitSyncValue = createCircuitSlotSyncValue(
223+
i -> machine.getCircuitInventory().setStackInSlot(0, i),
224+
() -> machine.getCircuitInventory().getStackInSlot(0));
225+
ModularPanel circuitPanel = createCircuitSlotPanel(
226+
circuitSyncValue,
227+
syncManager)
228+
.relative(parentPanel)
229+
.leftRelOffset(0.0f, -180);
211230
IPanelHandler circuitPanelHandler = syncManager.panel("circuit_panel",
212231
(sm, sh) -> circuitPanel, true);
213232

Lines changed: 9 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,28 @@
11
package com.gregtechceu.gtceu.common.item;
22

3-
import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity;
4-
import com.gregtechceu.gtceu.api.gui.GuiTextures;
5-
import com.gregtechceu.gtceu.api.gui.widget.SlotWidget;
63
import com.gregtechceu.gtceu.api.item.component.IAddInformation;
7-
import com.gregtechceu.gtceu.api.item.component.IItemUIFactory;
8-
import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot;
9-
import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler;
10-
import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
4+
import com.gregtechceu.gtceu.api.mui.base.IItemUIHolder;
5+
import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData;
6+
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
7+
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
8+
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
119
import com.gregtechceu.gtceu.common.data.GTItems;
12-
import com.gregtechceu.gtceu.config.ConfigHolder;
10+
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
1311

1412
import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory;
15-
import com.lowdragmc.lowdraglib.gui.modular.ModularUI;
16-
import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup;
17-
import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture;
18-
import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget;
19-
import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
2013

2114
import net.minecraft.nbt.CompoundTag;
2215
import net.minecraft.network.chat.Component;
2316
import net.minecraft.util.Mth;
24-
import net.minecraft.world.InteractionResult;
25-
import net.minecraft.world.entity.player.Player;
2617
import net.minecraft.world.item.ItemStack;
2718
import net.minecraft.world.item.TooltipFlag;
28-
import net.minecraft.world.item.context.UseOnContext;
2919
import net.minecraft.world.level.Level;
30-
import net.minecraft.world.level.block.entity.BlockEntity;
3120

3221
import org.jetbrains.annotations.Nullable;
3322

3423
import java.util.List;
3524

36-
public class IntCircuitBehaviour implements IItemUIFactory, IAddInformation {
25+
public class IntCircuitBehaviour implements IAddInformation, IItemUIHolder {
3726

3827
public static final int CIRCUIT_MAX = 32;
3928

@@ -43,11 +32,6 @@ public static ItemStack stack(int configuration) {
4332
return stack;
4433
}
4534

46-
public static void setCircuitConfiguration(HeldItemUIFactory.HeldItemHolder holder, int configuration) {
47-
setCircuitConfiguration(holder.getHeld(), configuration);
48-
holder.markAsDirty();
49-
}
50-
5135
public static void setCircuitConfiguration(ItemStack itemStack, int configuration) {
5236
if (configuration < 0 || configuration > CIRCUIT_MAX)
5337
throw new IllegalArgumentException("Given configuration number is out of range!");
@@ -99,61 +83,7 @@ public void appendHoverText(ItemStack stack, @Nullable Level level, List<Compone
9983
}
10084

10185
@Override
102-
public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player entityPlayer) {
103-
LabelWidget label = new LabelWidget(9, 8, "Programmed Circuit Configuration");
104-
label.setDropShadow(false);
105-
label.setTextColor(0x404040);
106-
var modular = new ModularUI(184, 132, holder, entityPlayer)
107-
.widget(label);
108-
SlotWidget slotwidget = new SlotWidget(
109-
new CustomItemStackHandler(stack(getCircuitConfiguration(holder.getHeld()))),
110-
0, 82, 20, false, false);
111-
slotwidget.setBackground(GuiTextures.SLOT);
112-
modular.widget(slotwidget);
113-
int idx = 0;
114-
for (int x = 0; x <= 2; x++) {
115-
for (int y = 0; y <= 8; y++) {
116-
int finalIdx = idx;
117-
modular.widget(new ButtonWidget(10 + (18 * y), 48 + (18 * x), 18, 18,
118-
new GuiTextureGroup(GuiTextures.SLOT, new ItemStackTexture(stack(finalIdx)).scale(16f / 18)),
119-
data -> {
120-
setCircuitConfiguration(holder, finalIdx);
121-
slotwidget.setHandlerSlot(new CustomItemStackHandler(stack(finalIdx)), 0);
122-
}));
123-
idx++;
124-
}
125-
}
126-
for (int x = 0; x <= 5; x++) {
127-
int finalIdx = x + 27;
128-
modular.widget(new ButtonWidget(10 + (18 * x), 102, 18, 18,
129-
new GuiTextureGroup(GuiTextures.SLOT, new ItemStackTexture(stack(finalIdx)).scale(16f / 18)),
130-
data -> {
131-
setCircuitConfiguration(holder, finalIdx);
132-
slotwidget.setHandlerSlot(new CustomItemStackHandler(stack(finalIdx)), 0);
133-
}));
134-
}
135-
modular.mainGroup.setBackground(GuiTextures.BACKGROUND);
136-
return modular;
137-
}
138-
139-
@Override
140-
public InteractionResult useOn(UseOnContext context) {
141-
var stack = context.getItemInHand();
142-
int circuitSetting = getCircuitConfiguration(stack);
143-
BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos());
144-
if (entity instanceof MetaMachineBlockEntity machineEntity && context.isSecondaryUseActive()) {
145-
if (machineEntity.metaMachine instanceof IHasCircuitSlot circuitMachine &&
146-
circuitMachine.getCircuitInventory().getSlots() > 0) {
147-
setCircuitConfig(circuitMachine.getCircuitInventory(), circuitSetting);
148-
}
149-
if (!ConfigHolder.INSTANCE.machines.ghostCircuit)
150-
stack.shrink(1);
151-
return InteractionResult.SUCCESS;
152-
}
153-
return IItemUIFactory.super.useOn(context);
154-
}
155-
156-
void setCircuitConfig(NotifiableItemStackHandler circuit, int value) {
157-
circuit.setStackInSlot(0, IntCircuitBehaviour.stack(value));
86+
public ModularPanel buildUI(PlayerInventoryGuiData<?> data, PanelSyncManager syncManager, UISettings settings) {
87+
return GTMuiWidgets.createCircuitSlotPanel(data::setUsedItemStack, data::getUsedItemStack, syncManager);
15888
}
15989
}

0 commit comments

Comments
 (0)