Skip to content

Commit 3e92d4f

Browse files
authored
[MUI2] Super/Quantum Tank (#4282)
1 parent 468492d commit 3e92d4f

3 files changed

Lines changed: 199 additions & 71 deletions

File tree

src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
package com.gregtechceu.gtceu.common.machine.storage;
22

33
import com.gregtechceu.gtceu.api.GTValues;
4-
import com.gregtechceu.gtceu.api.gui.GuiTextures;
5-
import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget;
64
import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity;
75
import com.gregtechceu.gtceu.api.machine.MetaMachine;
6+
import com.gregtechceu.gtceu.api.mui.factory.PosGuiData;
7+
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
88
import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank;
9+
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
10+
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
911

10-
import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup;
11-
import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture;
12-
import com.lowdragmc.lowdraglib.gui.texture.TextTexture;
1312
import com.lowdragmc.lowdraglib.gui.widget.*;
1413
import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved;
1514
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
@@ -127,33 +126,40 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play
127126
}
128127

129128
@Override
130-
public WidgetGroup createUIWidget() {
131-
var group = new WidgetGroup(0, 0, 176, 131);
132-
group.addWidget(new PhantomFluidWidget(cache, 0, 36, 6, 18, 18, this::getStored, this::updateStored)
133-
.setShowAmount(false)
134-
.setBackground(GuiTextures.FLUID_SLOT));
135-
group.addWidget(new LabelWidget(7, 9, "gtceu.creative.tank.fluid"));
136-
group.addWidget(new ImageWidget(7, 45, 154, 14, GuiTextures.DISPLAY));
137-
group.addWidget(new TextFieldWidget(9, 47, 152, 10, () -> String.valueOf(mBPerCycle), this::setmBPerCycle)
138-
.setMaxStringLength(11)
139-
.setNumbersOnly(1, Integer.MAX_VALUE));
140-
group.addWidget(new LabelWidget(7, 28, "gtceu.creative.tank.mbpc"));
141-
group.addWidget(new ImageWidget(7, 82, 154, 14, GuiTextures.DISPLAY));
142-
group.addWidget(new TextFieldWidget(9, 84, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle)
143-
.setMaxStringLength(11)
144-
.setNumbersOnly(1, Integer.MAX_VALUE));
145-
group.addWidget(new LabelWidget(7, 65, "gtceu.creative.tank.tpc"));
146-
group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value))
147-
.setTexture(
148-
new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON,
149-
new TextTexture("gtceu.creative.activity.off")),
150-
new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON,
151-
new TextTexture("gtceu.creative.activity.on")))
152-
.setPressed(isWorkingEnabled()));
153-
154-
return group;
129+
public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) {
130+
// TODO
131+
return super.buildUI(data, syncManager, settings);
155132
}
156133

134+
/*
135+
* public WidgetGroup createUIWidget() {
136+
* var group = new WidgetGroup(0, 0, 176, 131);
137+
* group.addWidget(new PhantomFluidWidget(cache, 0, 36, 6, 18, 18, this::getStored, this::updateStored)
138+
* .setShowAmount(false)
139+
* .setBackground(GuiTextures.FLUID_SLOT));
140+
* group.addWidget(new LabelWidget(7, 9, "gtceu.creative.tank.fluid"));
141+
* group.addWidget(new ImageWidget(7, 45, 154, 14, GuiTextures.DISPLAY));
142+
* group.addWidget(new TextFieldWidget(9, 47, 152, 10, () -> String.valueOf(mBPerCycle), this::setmBPerCycle)
143+
* .setMaxStringLength(11)
144+
* .setNumbersOnly(1, Integer.MAX_VALUE));
145+
* group.addWidget(new LabelWidget(7, 28, "gtceu.creative.tank.mbpc"));
146+
* group.addWidget(new ImageWidget(7, 82, 154, 14, GuiTextures.DISPLAY));
147+
* group.addWidget(new TextFieldWidget(9, 84, 152, 10, () -> String.valueOf(ticksPerCycle), this::setTicksPerCycle)
148+
* .setMaxStringLength(11)
149+
* .setNumbersOnly(1, Integer.MAX_VALUE));
150+
* group.addWidget(new LabelWidget(7, 65, "gtceu.creative.tank.tpc"));
151+
* group.addWidget(new SwitchWidget(7, 101, 162, 20, (clickData, value) -> setWorkingEnabled(value))
152+
* .setTexture(
153+
* new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON,
154+
* new TextTexture("gtceu.creative.activity.off")),
155+
* new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON,
156+
* new TextTexture("gtceu.creative.activity.on")))
157+
* .setPressed(isWorkingEnabled()));
158+
*
159+
* return group;
160+
* }
161+
*/
162+
157163
@Override
158164
public ManagedFieldHolder getFieldHolder() {
159165
return MANAGED_FIELD_HOLDER;

src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java

Lines changed: 157 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,39 @@
33
import com.gregtechceu.gtceu.api.capability.IControllable;
44
import com.gregtechceu.gtceu.api.capability.recipe.IO;
55
import com.gregtechceu.gtceu.api.gui.GuiTextures;
6-
import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget;
7-
import com.gregtechceu.gtceu.api.gui.widget.TankWidget;
8-
import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget;
96
import com.gregtechceu.gtceu.api.item.tool.GTToolType;
107
import com.gregtechceu.gtceu.api.machine.*;
118
import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid;
129
import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine;
13-
import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine;
1410
import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine;
11+
import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine;
1512
import com.gregtechceu.gtceu.api.machine.trait.MachineTrait;
13+
import com.gregtechceu.gtceu.api.mui.base.drawable.IKey;
14+
import com.gregtechceu.gtceu.api.mui.base.widget.IWidget;
15+
import com.gregtechceu.gtceu.api.mui.factory.PosGuiData;
16+
import com.gregtechceu.gtceu.api.mui.utils.Alignment;
17+
import com.gregtechceu.gtceu.api.mui.value.BoolValue;
18+
import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue;
19+
import com.gregtechceu.gtceu.api.mui.value.sync.FluidSlotSyncHandler;
20+
import com.gregtechceu.gtceu.api.mui.value.sync.LongSyncValue;
21+
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
22+
import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers;
23+
import com.gregtechceu.gtceu.api.mui.widget.ParentWidget;
24+
import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget;
25+
import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton;
26+
import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow;
27+
import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot;
1628
import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank;
1729
import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable;
30+
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
31+
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
32+
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
33+
import com.gregtechceu.gtceu.common.mui.GTGuiTextures;
1834
import com.gregtechceu.gtceu.utils.FormattingUtil;
1935
import com.gregtechceu.gtceu.utils.GTMath;
2036
import com.gregtechceu.gtceu.utils.GTTransferUtils;
2137

22-
import com.lowdragmc.lowdraglib.gui.editor.ColorPattern;
2338
import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture;
24-
import com.lowdragmc.lowdraglib.gui.widget.ImageWidget;
25-
import com.lowdragmc.lowdraglib.gui.widget.LabelWidget;
26-
import com.lowdragmc.lowdraglib.gui.widget.Widget;
27-
import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup;
2839
import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced;
2940
import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted;
3041
import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender;
@@ -45,6 +56,7 @@
4556
import net.minecraft.world.phys.BlockHitResult;
4657
import net.minecraftforge.fluids.FluidStack;
4758
import net.minecraftforge.fluids.FluidUtil;
59+
import net.minecraftforge.fluids.IFluidTank;
4860
import net.minecraftforge.fluids.capability.IFluidHandler;
4961
import net.minecraftforge.items.IItemHandlerModifiable;
5062

@@ -64,7 +76,7 @@
6476
@ParametersAreNonnullByDefault
6577
@MethodsReturnNonnullByDefault
6678
public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable,
67-
IDropSaveMachine, IFancyUIMachine {
79+
IDropSaveMachine, IMuiMachine {
6880

6981
public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(QuantumTankMachine.class,
7082
MetaMachine.MANAGED_FIELD_HOLDER);
@@ -331,34 +343,97 @@ public FluidStack getLockedFluid() {
331343
//////////////////////////////////////
332344
// *********** GUI ***********//
333345
//////////////////////////////////////
334-
public Widget createUIWidget() {
335-
var group = new WidgetGroup(0, 0, 90, 63);
336-
group.addWidget(new ImageWidget(4, 4, 82, 55, GuiTextures.DISPLAY))
337-
.addWidget(new LabelWidget(8, 8, "gtceu.gui.fluid_amount"))
338-
.addWidget(new LabelWidget(8, 18, () -> FormattingUtil.formatBuckets(storedAmount))
339-
.setTextColor(-1)
340-
.setDropShadow(false))
341-
.addWidget(new TankWidget(cache, 0, 68, 23, true, true)
342-
.setShowAmount(false)
343-
.setBackground(GuiTextures.FLUID_SLOT))
344-
.addWidget(new PhantomFluidWidget(lockedFluid, 0, 68, 41, 18, 18,
345-
this::getLockedFluid, this::setLocked)
346-
.setShowAmount(false)
347-
.setBackground(ColorPattern.T_GRAY.rectTexture()))
348-
.addWidget(new ToggleButtonWidget(4, 41, 18, 18,
349-
GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids)
350-
.setShouldUseBaseBackground()
351-
.setTooltipText("gtceu.gui.fluid_auto_output.tooltip"))
352-
.addWidget(new ToggleButtonWidget(22, 41, 18, 18,
353-
GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked)
354-
.setShouldUseBaseBackground()
355-
.setTooltipText("gtceu.gui.fluid_lock.tooltip"))
356-
.addWidget(new ToggleButtonWidget(40, 41, 18, 18,
357-
GuiTextures.BUTTON_VOID, () -> isVoiding, (b) -> isVoiding = b)
358-
.setShouldUseBaseBackground()
359-
.setTooltipText("gtceu.gui.fluid_voiding_partial.tooltip"));
360-
group.setBackground(GuiTextures.BACKGROUND_INVERSE);
361-
return group;
346+
// TODO: Needs AOI widget
347+
@Override
348+
public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) {
349+
LongSyncValue bucketSyncer = new LongSyncValue(this::getStoredAmount, (ignored) -> {});
350+
syncManager.syncValue("bucket_amount", bucketSyncer);
351+
352+
return new ModularPanel(this.getDefinition().getName())
353+
.child(
354+
// Top half of the screen
355+
new ParentWidget<>()
356+
.widthRel(1)
357+
.height(20 + 60)
358+
// Box that has the display texture BG +
359+
// the buttons / text / etc
360+
.child(new ParentWidget<>()
361+
.background(GTGuiTextures.DISPLAY)
362+
.size(90, 63)
363+
.align(Alignment.CENTER)
364+
.child(IKey.lang("gtceu.gui.fluid_amount").asWidget()
365+
.color(0xffffff)
366+
.margin(8, 0, 8, 0))
367+
.child(IKey.dynamic(
368+
() -> Component.literal(
369+
FormattingUtil.formatBuckets(bucketSyncer.getLongValue())))
370+
.asWidget()
371+
.color(0xffffff)
372+
.margin(8, 0, 18, 0))
373+
.child(Flow.row()
374+
.margin(4, 0, 41, 0)
375+
.coverChildren()
376+
.child(createAutoOutputFluidButton(syncManager))
377+
.child(createFluidLockButton(syncManager))
378+
.child(createVoidButton(syncManager)))
379+
.child(Flow.column()
380+
.margin(68, 0, 23, 0)
381+
.coverChildren()
382+
.child(createFluidSlot(syncManager))
383+
.child(createPhantomLockedFluidSlot(syncManager)))))
384+
.child(GTMuiWidgets.createTitleBar(getDefinition(), 176, GTGuiTextures.BACKGROUND))
385+
.child(SlotGroupWidget.playerInventory(false).left(7).bottom(7));
386+
}
387+
388+
private ToggleButton createAutoOutputFluidButton(PanelSyncManager syncManager) {
389+
BooleanSyncValue fluidOutputs = new BooleanSyncValue(this::isAutoOutputFluids,
390+
this::setAutoOutputFluids);
391+
syncManager.syncValue("auto_output_fluids", fluidOutputs);
392+
return new ToggleButton()
393+
.value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue))
394+
.overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT)
395+
.tooltipAutoUpdate(true)
396+
.tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_auto_output",
397+
Component.translatable(fluidOutputs.getBoolValue() ? "cover.voiding.label.enabled" :
398+
"cover.voiding.label.disabled")))));
399+
}
400+
401+
private ToggleButton createFluidLockButton(PanelSyncManager syncManager) {
402+
BooleanSyncValue fluidLocked = new BooleanSyncValue(this::isLocked,
403+
this::setLocked);
404+
syncManager.syncValue("fluid_locked", fluidLocked);
405+
return new ToggleButton()
406+
.value(new BoolValue.Dynamic(fluidLocked::getBoolValue, fluidLocked::setBoolValue))
407+
.overlay(GTGuiTextures.BUTTON_LOCK)
408+
.tooltipAutoUpdate(true)
409+
.tooltipBuilder((r) -> r.addLine(IKey.lang(fluidLocked.getBoolValue() ?
410+
"gtceu.gui.fluid_lock.tooltip.enabled" :
411+
"gtceu.gui.fluid_lock.tooltip.disabled")));
412+
}
413+
414+
private ToggleButton createVoidButton(PanelSyncManager syncManager) {
415+
BooleanSyncValue voiding = new BooleanSyncValue(() -> this.isVoiding,
416+
(voidingBool) -> { this.isVoiding = voidingBool; });
417+
syncManager.syncValue("is_voiding", voiding);
418+
return new ToggleButton()
419+
.value(new BoolValue.Dynamic(voiding::getBoolValue, voiding::setBoolValue))
420+
.overlay(GTGuiTextures.BUTTON_VOID)
421+
.tooltipAutoUpdate(true)
422+
.tooltipBuilder((r) -> r.addLine(IKey.lang(voiding.getBoolValue() ?
423+
"gtceu.gui.fluid_voiding_partial.tooltip.enabled" :
424+
"gtceu.gui.fluid_voiding_partial.tooltip.disabled")));
425+
}
426+
427+
private IWidget createFluidSlot(PanelSyncManager syncManager) {
428+
syncManager.syncValue("fluid_slot",
429+
SyncHandlers.fluidSlot(new FluidCacheTankWrapper(cache)).controlsAmount(false));
430+
return new FluidSlot().syncHandler("fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT);
431+
}
432+
433+
private IWidget createPhantomLockedFluidSlot(PanelSyncManager syncManager) {
434+
syncManager.syncValue("locked_fluid_slot",
435+
new FluidSlotSyncHandler(lockedFluid).controlsAmount(false).phantom(true));
436+
return new FluidSlot().syncHandler("locked_fluid_slot", 0).background(GTGuiTextures.FLUID_SLOT);
362437
}
363438

364439
//////////////////////////////////////
@@ -461,4 +536,48 @@ public ManagedFieldHolder getFieldHolder() {
461536
return MANAGED_FIELD_HOLDER;
462537
}
463538
}
539+
540+
protected class FluidCacheTankWrapper implements IFluidTank {
541+
542+
private final FluidCache cache;
543+
544+
public FluidCacheTankWrapper(FluidCache cache) {
545+
this.cache = cache;
546+
}
547+
548+
@Override
549+
public @NotNull FluidStack getFluid() {
550+
return cache.getFluidInTank(0);
551+
}
552+
553+
@Override
554+
public int getFluidAmount() {
555+
return cache.getFluidInTank(0).getAmount();
556+
}
557+
558+
@Override
559+
public int getCapacity() {
560+
return cache.getTankCapacity(0);
561+
}
562+
563+
@Override
564+
public boolean isFluidValid(FluidStack fluidStack) {
565+
return cache.isFluidValid(0, fluidStack);
566+
}
567+
568+
@Override
569+
public int fill(FluidStack fluidStack, IFluidHandler.FluidAction fluidAction) {
570+
return cache.fill(fluidStack, fluidAction);
571+
}
572+
573+
@Override
574+
public @NotNull FluidStack drain(int i, IFluidHandler.FluidAction fluidAction) {
575+
return cache.drain(i, fluidAction);
576+
}
577+
578+
@Override
579+
public @NotNull FluidStack drain(FluidStack fluidStack, IFluidHandler.FluidAction fluidAction) {
580+
return cache.drain(fluidStack, fluidAction);
581+
}
582+
}
464583
}

src/main/java/com/gregtechceu/gtceu/common/mui/GTGuiTextures.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,12 @@ public static class IDs {
209209
"textures/gui/widget/button_distribution_mode.png",
210210
16, 48, 16, 16, ColorType.DEFAULT);
211211

212-
public static final UITexture[] VOIDING_MODE_OVERLAY = slice(
213-
"textures/gui/overlay/voiding_mode_overlay.png",
214-
16, 32, 16, 16, ColorType.DEFAULT);
212+
public static final UITexture BUTTON_VOID = fullImage("textures/gui/widget/button_void.png");
213+
214+
public static final UITexture BUTTON_VOID_PARTIAL = fullImage("textures/gui/widget/button_void_partial.png");
215+
216+
public static final UITexture[] BUTTON_VOID_MULTIBLOCK = slice("textures/gui/widget/button_void_multiblock.png",
217+
16, 48, 16, 16, ColorType.DEFAULT);
215218

216219
public static final UITexture[] FILTER_MODE_OVERLAY = slice(
217220
"textures/gui/overlay/filter_mode_overlay.png",

0 commit comments

Comments
 (0)