From 55fd4f69e14b9a4e53d4ff69e8c8b99976a04404 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Sep 2024 18:07:07 -0700 Subject: [PATCH 01/63] initial work to compile --- dependencies.gradle | 2 +- .../java/gregtech/api/cover/CoverWithUI.java | 15 ++++++++------ .../java/gregtech/api/mui/GTGuiTheme.java | 6 +++--- .../mui/widget/GhostCircuitSlotWidget.java | 20 +++++++++---------- .../gregtech/common/covers/CoverConveyor.java | 9 ++++----- .../common/covers/CoverFluidFilter.java | 6 +++--- .../common/covers/CoverFluidVoiding.java | 4 ++-- .../common/covers/CoverItemFilter.java | 6 +++--- .../common/covers/CoverItemVoiding.java | 7 +++---- .../covers/CoverItemVoidingAdvanced.java | 7 +++---- .../common/covers/CoverMachineController.java | 10 +++++----- .../gregtech/common/covers/CoverPump.java | 7 +++---- .../common/covers/CoverRoboticArm.java | 7 +++---- .../common/covers/filter/BaseFilter.java | 3 ++- .../covers/filter/BaseFilterContainer.java | 8 ++++---- .../filter/OreDictionaryItemFilter.java | 19 +++++++++--------- .../covers/filter/SimpleFluidFilter.java | 4 ++-- .../covers/filter/SimpleItemFilter.java | 13 ++++++------ .../common/covers/filter/SmartItemFilter.java | 7 +++---- .../multiblockpart/MetaTileEntityItemBus.java | 4 ++-- .../mui/widget/HighlightedTextField.java | 10 +++++----- .../widget/orefilter/OreFilterTestSlot.java | 4 ++-- 22 files changed, 89 insertions(+), 89 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 9ccd17cb2c0..91d6a5d5c7e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -40,7 +40,7 @@ dependencies { // Published dependencies api("codechicken:codechickenlib:3.2.3.358") - api("com.cleanroommc:modularui:2.5.0-rc1") { transitive = false } + api("com.cleanroommc:modularui:2.5.0-rc2") { transitive = false } api("com.cleanroommc:groovyscript:1.2.0-hotfix1") { transitive = false } api("CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.700") api("appeng:ae2-uel:v0.56.4") { transitive = false } diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index d1c6fa0d0c8..e6e45670ec1 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -29,7 +29,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.ApiStatus; public interface CoverWithUI extends Cover, IUIHolder, IGuiHolder { @@ -98,12 +98,15 @@ default void markAsDirty() { /** * Create the Title bar widget for a Cover. */ - static Row createTitleRow(ItemStack stack) { - return new Row() + static Flow createTitleRow(ItemStack stack) { + return Flow.row() .pos(4, 4) .height(16).coverChildrenWidth() .child(new ItemDrawable(stack).asWidget().size(16).marginRight(4)) - .child(IKey.str(stack.getDisplayName()).color(UI_TITLE_COLOR).asWidget().heightRel(1.0f)); + .child(IKey.str(stack.getDisplayName()) + .color(UI_TITLE_COLOR) + .shadow(true) + .asWidget().heightRel(1.0f)); } /** @@ -204,8 +207,8 @@ private BoolValue.Dynamic boolValueOf(EnumSyncValue syncValue, T value) { return new BoolValue.Dynamic(() -> syncValue.getValue() == value, $ -> syncValue.setValue(value)); } - public Row build() { - var row = new Row().marginBottom(2).coverChildrenHeight().widthRel(1f); + public Flow build() { + var row = Flow.row().marginBottom(2).coverChildrenHeight().widthRel(1f); if (this.enumValue != null && this.syncValue != null) { for (var enumVal : enumValue.getEnumConstants()) { var button = new ToggleButton().size(18).marginRight(2) diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index 3ed22931d18..4a6c2c2d4dd 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -9,7 +9,7 @@ import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.IThemeApi; import com.cleanroommc.modularui.drawable.UITexture; -import com.cleanroommc.modularui.screen.Tooltip; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.theme.ReloadThemeEvent; import com.cleanroommc.modularui.utils.JsonBuilder; import org.jetbrains.annotations.Nullable; @@ -108,7 +108,7 @@ public static void onReloadThemes(ReloadThemeEvent.Pre event) { public static Builder templateBuilder(String themeId) { Builder builder = new Builder(themeId); builder.openCloseAnimation(0); - builder.tooltipPos(Tooltip.Pos.NEXT_TO_MOUSE); + builder.tooltipPos(RichTooltip.Pos.NEXT_TO_MOUSE); builder.smoothProgressBar(true); return builder; } @@ -163,7 +163,7 @@ public Builder smoothProgressBar(boolean smoothBar) { } /** Set the tooltip pos for this theme. Overrides global cfg. */ - public Builder tooltipPos(Tooltip.Pos tooltipPos) { + public Builder tooltipPos(RichTooltip.Pos tooltipPos) { theme.elementBuilder.add(b -> b.add("tooltipPos", tooltipPos.name())); return this; } diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index 448740e7147..83f772c8686 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -6,7 +6,6 @@ import gregtech.api.recipes.ingredients.IntCircuitIngredient; import gregtech.client.utils.TooltipHelper; -import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.items.IItemHandler; @@ -16,7 +15,7 @@ import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularScreen; -import com.cleanroommc.modularui.screen.Tooltip; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.ItemSlotSH; import com.cleanroommc.modularui.widgets.ButtonWidget; @@ -27,7 +26,6 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; public class GhostCircuitSlotWidget extends ItemSlot { @@ -35,6 +33,7 @@ public class GhostCircuitSlotWidget extends ItemSlot { private static final int SYNC_CIRCUIT_INDEX = 10; public GhostCircuitSlotWidget() { + super(); tooltipBuilder(this::getCircuitSlotTooltip); } @@ -67,13 +66,13 @@ public ItemSlot slot(ModularSlot slot) { return this; } - @Override - protected List getItemTooltip(ItemStack stack) { - // we don't want the item tooltip - return Collections.emptyList(); - } + // @Override + // protected List getItemTooltip(ItemStack stack) { + // // we don't want the item tooltip + // return Collections.emptyList(); + // } - protected void getCircuitSlotTooltip(@NotNull Tooltip tooltip) { + protected void getCircuitSlotTooltip(@NotNull RichTooltip tooltip) { String configString; int value = getSyncHandler().getGhostCircuitHandler().getCircuitValue(); if (value == GhostCircuitItemStackHandler.NO_CONFIG) { @@ -134,7 +133,8 @@ private void createSelectorPanel() { .left(7).right(7).top(41).height(4 * 18) .matrix(options) .minColWidth(18).minRowHeight(18) - .minElementMargin(0, 0))) + .minElementMargin(0, 0)), + true) .openPanel(); } diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 798c0000e8c..89b1980899a 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -55,8 +55,7 @@ import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.IntArrayList; @@ -514,8 +513,8 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { - var column = new Column().top(24).margin(7, 0) + protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); EnumSyncValue manualIOmode = new EnumSyncValue<>(ManualImportExportMode.class, @@ -539,7 +538,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager.syncValue("throughput", throughput); if (createThroughputRow()) - column.child(new Row().coverChildrenHeight() + column.child(Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ButtonWidget<>() .left(0).width(18) diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index 85b39ca1a9d..42ce332df76 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -43,7 +43,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -154,13 +154,13 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan return getFilter().createPanel(guiSyncManager) .size(176, 212).padding(7) .child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack())) - .child(new Column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() + .child(Flow.column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() .child(new EnumRowBuilder<>(FluidFilterMode.class) .value(filteringMode) .lang("cover.filter.mode.title") .overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY) .build()) - .child(new Row() + .child(Flow.row() .marginBottom(2) .widthRel(1f) .coverChildrenHeight() diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java index c6aa519660c..48b992f96f7 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java @@ -32,7 +32,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; public class CoverFluidVoiding extends CoverPump { @@ -80,7 +80,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager sync var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); return super.createUI(mainPanel, syncManager) - .child(new Row().height(18).widthRel(1f) + .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() .value(isWorking) diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index 18e6432bc07..64fed7d02a8 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -42,7 +42,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -156,13 +156,13 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan return getFilter().createPanel(guiSyncManager) .size(176, 212).padding(7) .child(CoverWithUI.createTitleRow(getFilterContainer().getFilterStack()).left(4)) - .child(new Column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() + .child(Flow.column().widthRel(1f).align(Alignment.TopLeft).top(22).coverChildrenHeight() .child(new EnumRowBuilder<>(ItemFilterMode.class) .value(filteringMode) .lang("cover.filter.mode.title") .overlay(16, GTGuiTextures.FILTER_MODE_OVERLAY) .build()) - .child(new Row() + .child(Flow.row() .marginBottom(2) .widthRel(1f) .coverChildrenHeight() diff --git a/src/main/java/gregtech/common/covers/CoverItemVoiding.java b/src/main/java/gregtech/common/covers/CoverItemVoiding.java index 35a64252725..4d3d878196f 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoiding.java @@ -29,8 +29,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; public class CoverItemVoiding extends CoverConveyor { @@ -78,11 +77,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); return super.createUI(mainPanel, guiSyncManager) - .child(new Row().height(18).widthRel(1f) + .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() .value(isWorking) diff --git a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java index 4a062735ae3..607dbac7816 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java @@ -24,8 +24,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -94,7 +93,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); guiSyncManager.syncValue("voiding_mode", voidingMode); @@ -112,7 +111,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager .lang("cover.voiding.voiding_mode") .overlay(16, GTGuiTextures.VOIDING_MODE_OVERLAY) .build()) - .child(new Row().right(0).coverChildrenHeight() + .child(Flow.row().right(0).coverChildrenHeight() .child(transferTextField .setEnabledIf(w -> this.itemFilterContainer.showGlobalTransferLimitSlider() && this.voidingMode == VoidingMode.VOID_OVERFLOW) diff --git a/src/main/java/gregtech/common/covers/CoverMachineController.java b/src/main/java/gregtech/common/covers/CoverMachineController.java index 2626d8f3acd..545f3cde52e 100644 --- a/src/main/java/gregtech/common/covers/CoverMachineController.java +++ b/src/main/java/gregtech/common/covers/CoverMachineController.java @@ -32,7 +32,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -121,7 +121,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan return GTGuis.createPanel(this, 176, 112) .child(CoverWithUI.createTitleRow(getPickItem())) - .child(new Column() + .child(Flow.column() .widthRel(1.0f).margin(7, 0) .top(24).coverChildrenHeight() @@ -151,7 +151,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan // Controlling selector .child(createSettingsRow().height(16 + 2 + 16) - .child(new Column().heightRel(1.0f).coverChildrenWidth() + .child(Flow.column().heightRel(1.0f).coverChildrenWidth() .child(IKey.lang("cover.machine_controller.control").asWidget() .left(0).height(16).marginBottom(2)) .child(modeButton(controllerModeValue, ControllerMode.MACHINE).left(0))) @@ -169,8 +169,8 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .right(0)))); } - private Column modeColumn(EnumSyncValue syncValue, ControllerMode mode, IKey title) { - return new Column().coverChildrenHeight().width(18) + private Flow modeColumn(EnumSyncValue syncValue, ControllerMode mode, IKey title) { + return Flow.column().coverChildrenHeight().width(18) .child(title.asWidget().size(16).marginBottom(2).alignment(Alignment.Center)) .child(modeButton(syncValue, mode)); } diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 2fdb55e2cdd..c2380dcecd7 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -53,8 +53,7 @@ import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -220,11 +219,11 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager sync syncManager.syncValue("pump_mode", pumpMode); syncManager.syncValue("throughput", throughput); - var column = new Column().top(24).margin(7, 0) + var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); if (createThroughputRow()) - column.child(new Row().coverChildrenHeight() + column.child(Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ButtonWidget<>() .left(0).width(18) diff --git a/src/main/java/gregtech/common/covers/CoverRoboticArm.java b/src/main/java/gregtech/common/covers/CoverRoboticArm.java index 22047e6db2e..7ef93dffb6c 100644 --- a/src/main/java/gregtech/common/covers/CoverRoboticArm.java +++ b/src/main/java/gregtech/common/covers/CoverRoboticArm.java @@ -26,8 +26,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -197,7 +196,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { EnumSyncValue transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); guiSyncManager.syncValue("transfer_mode", transferMode); @@ -213,7 +212,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager .lang("cover.generic.transfer_mode") .overlay(GTGuiTextures.TRANSFER_MODE_OVERLAY) .build()) - .child(new Row().right(0).coverChildrenHeight() + .child(Flow.row().right(0).coverChildrenHeight() .child(new TextFieldWidget().widthRel(0.5f).right(0) .setEnabledIf(w -> shouldDisplayAmountSlider()) .setNumbers(0, Integer.MAX_VALUE) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilter.java b/src/main/java/gregtech/common/covers/filter/BaseFilter.java index 27f6a56bccb..b0a312b6e1e 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilter.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilter.java @@ -144,7 +144,8 @@ public IWidget createBlacklistUI() { .value(new BooleanSyncValue( this::isBlacklistFilter, this::setBlacklistFilter)) - .textureGetter(state -> GTGuiTextures.BUTTON_BLACKLIST[state]) + .stateBackground(0, GTGuiTextures.BUTTON_BLACKLIST[0]) + .stateBackground(1, GTGuiTextures.BUTTON_BLACKLIST[1]) .addTooltip(0, IKey.lang("cover.filter.blacklist.disabled")) .addTooltip(1, IKey.lang("cover.filter.blacklist.enabled"))); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 38867b542bf..ae0ed4c71a1 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -20,7 +20,7 @@ import com.cleanroommc.modularui.value.sync.SyncHandlers; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ItemSlot; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -213,16 +213,16 @@ public void handleLegacyNBT(NBTTagCompound nbt) { /** Uses Cleanroom MUI */ public IWidget initUI(ModularPanel main, PanelSyncManager manager) { - PanelSyncHandler panel = manager.panel("filter_panel", main, (syncManager, syncHandler) -> { + PanelSyncHandler panel = (PanelSyncHandler) manager.panel("filter_panel", (syncManager, syncHandler) -> { var filter = hasFilter() ? getFilter() : BaseFilter.ERROR_FILTER; filter.setMaxTransferSize(getMaxTransferSize()); return filter.createPopupPanel(syncManager); - }); + }, true); var filterButton = new ButtonWidget<>(); filterButton.setEnabled(hasFilter()); - return new Row().coverChildrenHeight() + return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() .slot(SyncHandlers.itemSlot(this, 0) diff --git a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java index 0eec589f555..0d91fd97cf8 100644 --- a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java @@ -20,7 +20,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.Tooltip; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.BooleanConsumer; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -29,8 +29,7 @@ import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; @@ -112,7 +111,7 @@ public void initUI(Consumer widgetGroup) {} var caseSensitive = new BooleanSyncValue(this.filterReader::isCaseSensitive, setCaseSensitive); var matchAll = new BooleanSyncValue(this.filterReader::shouldMatchAll, setMatchAll); - return new Column().widthRel(1f).coverChildrenHeight() + return Flow.column().widthRel(1f).coverChildrenHeight() .child(new HighlightedTextField() .setHighlightRule(this::highlightRule) .onUnfocus(() -> { @@ -123,9 +122,9 @@ public void initUI(Consumer widgetGroup) {} .setTextColor(Color.WHITE.darker(1)) .value(expression).marginBottom(4) .height(18).widthRel(1f)) - .child(new Row().coverChildrenHeight() + .child(Flow.row().coverChildrenHeight() .widthRel(1f) - .child(new Column().height(18) + .child(Flow.column().height(18) .coverChildrenWidth().marginRight(2) .child(GTGuiTextures.OREDICT_INFO.asWidget() .size(8).top(0) @@ -148,7 +147,8 @@ public void initUI(Consumer widgetGroup) {} .child(new CycleButtonWidget() .size(18).value(caseSensitive) .marginRight(2) - .textureGetter(state -> GTGuiTextures.BUTTON_CASE_SENSITIVE[state]) + .stateBackground(0, GTGuiTextures.BUTTON_CASE_SENSITIVE[0]) + .stateBackground(1, GTGuiTextures.BUTTON_CASE_SENSITIVE[1]) .addTooltip(0, IKey.lang("cover.ore_dictionary_filter.button.case_sensitive.disabled")) .addTooltip(1, @@ -156,7 +156,8 @@ public void initUI(Consumer widgetGroup) {} .child(new CycleButtonWidget() .size(18).value(matchAll) .marginRight(2) - .textureGetter(state -> GTGuiTextures.BUTTON_MATCH_ALL[state]) + .stateBackground(0, GTGuiTextures.BUTTON_MATCH_ALL[0]) + .stateBackground(1, GTGuiTextures.BUTTON_MATCH_ALL[1]) .addTooltip(0, IKey.lang("cover.ore_dictionary_filter.button.match_all.disabled")) .addTooltip(1, @@ -180,7 +181,7 @@ protected void getStatusIcon(Widget widget) { widget.background(texture); } - protected void createStatusTooltip(Tooltip tooltip) { + protected void createStatusTooltip(RichTooltip tooltip) { var result = this.filterReader.getResult(); if (result == null) return; List list = new ArrayList<>(); diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index ed2b3a40eaf..68997d3ee14 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -13,7 +13,7 @@ import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.FluidSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -53,7 +53,7 @@ public void configureFilterTanks(int amount) { @Override public @NotNull Widget createWidgets(PanelSyncManager syncManager) { - return new Row().coverChildrenHeight().widthRel(1f) + return Flow.row().coverChildrenHeight().widthRel(1f) .child(SlotGroupWidget.builder() .matrix("FFF", "FFF", diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index 4eaf4ffc865..1a5f580ce99 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -26,8 +26,7 @@ import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.slot.SlotGroup; import org.jetbrains.annotations.NotNull; @@ -114,7 +113,7 @@ public void initUI(Consumer widgetGroup) { syncManager.registerSlotGroup(filterInventory); - return new Row().coverChildren() + return Flow.row().coverChildren() .child(SlotGroupWidget.builder() .matrix("XXX", "XXX", @@ -146,16 +145,18 @@ public void initUI(Consumer widgetGroup) { } }))) .build().marginRight(4)) - .child(new Column().width(18).coverChildren() + .child(Flow.column().width(18).coverChildren() .child(createBlacklistUI()) .child(new CycleButtonWidget() .value(ignoreDamage) - .textureGetter(state -> GTGuiTextures.BUTTON_IGNORE_DAMAGE[state]) + .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_DAMAGE[0]) + .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_DAMAGE[1]) .addTooltip(0, IKey.lang("cover.item_filter.ignore_damage.disabled")) .addTooltip(1, IKey.lang("cover.item_filter.ignore_damage.enabled"))) .child(new CycleButtonWidget() .value(ignoreNBT) - .textureGetter(state -> GTGuiTextures.BUTTON_IGNORE_NBT[state]) + .stateBackground(0, GTGuiTextures.BUTTON_IGNORE_NBT[0]) + .stateBackground(1, GTGuiTextures.BUTTON_IGNORE_NBT[1]) .addTooltip(0, IKey.lang("cover.item_filter.ignore_nbt.disabled")) .addTooltip(1, IKey.lang("cover.item_filter.ignore_nbt.enabled")))); } diff --git a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java index 425189b7de2..d7cbf29c463 100644 --- a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java @@ -22,8 +22,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.jetbrains.annotations.NotNull; @@ -115,8 +114,8 @@ public void initUI(Consumer widgetGroup) { filterReader::setFilteringMode); syncManager.syncValue("filter_mode", filterMode); - return new Row().coverChildren() - .child(new Column().coverChildren().marginRight(4) + return Flow.row().coverChildren() + .child(Flow.column().coverChildren().marginRight(4) .child(createFilterModeButton(filterMode, SmartFilteringMode.ELECTROLYZER)) .child(createFilterModeButton(filterMode, SmartFilteringMode.CENTRIFUGE)) .child(createFilterModeButton(filterMode, SmartFilteringMode.SIFTER))) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index 50435231a3b..a549ccbf81f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -47,7 +47,7 @@ import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.jetbrains.annotations.NotNull; @@ -310,7 +310,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .minColWidth(18).minRowHeight(18) .alignX(0.5f) .matrix(widgets)) - .child(new Column() + .child(Flow.column() .pos(backgroundWidth - 7 - 18, backgroundHeight - 18 * 4 - 7 - 5) .width(18).height(18 * 4 + 5) .child(GTGuiTextures.getLogo(getUITheme()).asWidget().size(17).top(18 * 3 + 5)) diff --git a/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java b/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java index 3bb6a3e652b..decaddf4cab 100644 --- a/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java +++ b/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java @@ -1,7 +1,7 @@ package gregtech.common.mui.widget; import com.cleanroommc.modularui.api.value.IStringValue; -import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.textfield.TextFieldHandler; import com.cleanroommc.modularui.widgets.textfield.TextFieldRenderer; @@ -53,7 +53,7 @@ public HighlightedTextField getThis() { } @Override - public void onRemoveFocus(GuiContext context) { + public void onRemoveFocus(ModularGuiContext context) { super.onRemoveFocus(context); highlighter.runHighlighter(getText()); if (isSynced()) @@ -70,7 +70,7 @@ public static final class TextHighlighter extends TextFieldRenderer { private Function highlightRule = string -> string; - private Map cacheMap = new Object2ObjectOpenHashMap<>(); + private final Map cacheMap = new Object2ObjectOpenHashMap<>(); public TextHighlighter(TextFieldHandler handler) { super(handler); @@ -81,8 +81,8 @@ public void setHighlightRule(Function highlightRule) { } @Override - protected float draw(String text, float x, float y) { - return super.draw(this.cacheMap.getOrDefault(text, text), x, y); + protected void draw(String text, float x, float y) { + super.draw(this.cacheMap.getOrDefault(text, text), x, y); } public void runHighlighter(String text) { diff --git a/src/main/java/gregtech/common/mui/widget/orefilter/OreFilterTestSlot.java b/src/main/java/gregtech/common/mui/widget/orefilter/OreFilterTestSlot.java index 1948364bbec..e4d0ea8648c 100644 --- a/src/main/java/gregtech/common/mui/widget/orefilter/OreFilterTestSlot.java +++ b/src/main/java/gregtech/common/mui/widget/orefilter/OreFilterTestSlot.java @@ -7,7 +7,7 @@ import gregtech.common.covers.filter.oreglob.impl.ImpossibleOreGlob; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widgets.ItemSlot; import it.unimi.dsi.fastutil.objects.Object2BooleanAVLTreeMap; @@ -106,7 +106,7 @@ public void updatePreview() { } @Override - public void draw(GuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { super.draw(context, widgetTheme); if (this.matchSuccess) { GTGuiTextures.OREDICT_MATCH From e7994aa7ef54b844ab8c12aad8f66cf6ca028c5a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Sep 2024 21:25:12 -0700 Subject: [PATCH 02/63] put out fires for now --- .../covers/ender/CoverAbstractEnderLink.java | 209 +++++++++++------- .../covers/ender/CoverEnderFluidLink.java | 7 +- .../common/mui/widget/GTFluidSlot.java | 24 +- 3 files changed, 141 insertions(+), 99 deletions(-) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index eb5c6a81d9d..658c40f099f 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -24,6 +24,7 @@ import net.minecraft.util.ITickable; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.api.widget.Interactable; @@ -38,10 +39,11 @@ import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ListWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Row; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -49,10 +51,8 @@ import java.io.IOException; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -146,13 +146,13 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - protected Column createWidgets(ModularPanel panel, PanelSyncManager syncManager) { + protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); var entrySelectorSH = createEntrySelector(panel); syncManager.syncValue("entry_selector", entrySelectorSH); - return new Column().coverChildrenHeight().top(24) + return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) .child(new Row().marginBottom(2) .coverChildrenHeight() @@ -171,18 +171,18 @@ protected Column createWidgets(ModularPanel panel, PanelSyncManager syncManager) .disableHoverBackground() .addTooltipLine(IKey.lang("cover.generic.ender.open_selector")) .onMousePressed(i -> { - if (entrySelectorSH.isPanelOpen()) { - entrySelectorSH.closePanel(); - } else { - entrySelectorSH.openPanel(); - } - Interactable.playButtonClickSound(); + // if (entrySelectorSH.isPanelOpen()) { + // entrySelectorSH.closePanel(); + // } else { + // entrySelectorSH.openPanel(); + // } + // Interactable.playButtonClickSound(); return true; }))) .child(createIoRow()); } - protected abstract PanelSyncHandler createEntrySelector(ModularPanel panel); + protected abstract EntrySelectorSH createEntrySelector(ModularPanel panel); protected abstract IWidget createEntrySlot(); @@ -217,7 +217,7 @@ protected IWidget createPrivateButton() { protected IWidget createIoRow() { var ioEnabled = new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled); - return new Row().marginBottom(2) + return Flow.row().marginBottom(2) .coverChildrenHeight() .child(new ToggleButton() .value(ioEnabled) @@ -291,20 +291,19 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { nbt.setInteger("Frequency", activeEntry.getColor()); } - protected abstract class EntrySelectorSH extends PanelSyncHandler { + protected abstract class EntrySelectorSH extends SyncHandler implements IPanelHandler { - private static final int TRACK_SUBPANELS = 3; + // private static final int TRACK_SUBPANELS = 3; private static final int DELETE_ENTRY = 1; private final EntryTypes type; private final ModularPanel mainPanel; private static final String PANEL_NAME = "entry_selector"; - private final Set opened = new HashSet<>(); + // private final Set opened = new HashSet<>(); protected UUID playerUUID; protected EntrySelectorSH(ModularPanel mainPanel, EntryTypes type) { - super(mainPanel, EntrySelectorSH::defaultPanel); - this.type = type; this.mainPanel = mainPanel; + this.type = type; } @Override @@ -313,18 +312,33 @@ public void init(String key, PanelSyncManager syncManager) { this.playerUUID = syncManager.getPlayer().getUniqueID(); } - private static ModularPanel defaultPanel(PanelSyncManager syncManager, PanelSyncHandler syncHandler) { - return GTGuis.createPopupPanel(PANEL_NAME, 168, 112); - } - public UUID getPlayerUUID() { return isPrivate ? playerUUID : null; } @Override + public void openPanel() {} + + @Override + public void closePanel() {} + + @Override + public void closePanelInternal() {} + + @Override + public void closeSubPanels() {} + + @Override + public void deleteCachedPanel() {} + + @Override + public boolean isSubPanel() { + return false; + } + public ModularPanel createUI(PanelSyncManager syncManager) { List names = new ArrayList<>(VirtualEnderRegistry.getEntryNames(getPlayerUUID(), type)); - return super.createUI(syncManager) + return GTGuis.createPopupPanel(PANEL_NAME, 168, 112) .child(IKey.lang("cover.generic.ender.known_channels") .color(UI_TITLE_COLOR).asWidget() .top(6) @@ -345,7 +359,7 @@ protected IWidget createRow(String name, ModularPanel mainPanel, PanelSyncManage var entryDescriptionSH = new EntryDescriptionSH(mainPanel, key, entry); syncManager.syncValue(key, isPrivate ? 1 : 0, entryDescriptionSH); - return new Row() + return Flow.row() .left(4) .marginBottom(2) .height(18) @@ -363,7 +377,7 @@ protected IWidget createRow(String name, ModularPanel mainPanel, PanelSyncManage .tooltipBuilder(tooltip -> { String desc = entry.getDescription(); if (!desc.isEmpty()) - tooltip.addLine(desc); + tooltip.add(desc); }) .width(64) .height(16) @@ -374,12 +388,12 @@ protected IWidget createRow(String name, ModularPanel mainPanel, PanelSyncManage .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) .onMousePressed(i -> { // open entry settings - if (entryDescriptionSH.isPanelOpen()) { - entryDescriptionSH.closePanel(); - } else { - entryDescriptionSH.openPanel(); - } - Interactable.playButtonClickSound(); + // if (entryDescriptionSH.isPanelOpen()) { + // entryDescriptionSH.closePanel(); + // } else { + // entryDescriptionSH.openPanel(); + // } + // Interactable.playButtonClickSound(); return true; })) .child(createSlotWidget(entry)) @@ -399,43 +413,43 @@ protected IWidget createRow(String name, ModularPanel mainPanel, PanelSyncManage })); } - @Override - public void closePanel() { - var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); - for (var key : opened) { - if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { - psh.closePanel(); - } - } - super.closePanel(); - } - - @Override - @SuppressWarnings("UnstableApiUsage") - public void closePanelInternal() { - var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); - for (var key : opened) { - if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { - psh.closePanel(); - } - } - super.closePanelInternal(); - } + // @Override + // public void closePanel() { + // var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); + // for (var key : opened) { + // if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { + // psh.closePanel(); + // } + // } + // super.closePanel(); + // } + + // @Override + // @SuppressWarnings("UnstableApiUsage") + // public void closePanelInternal() { + // var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); + // for (var key : opened) { + // if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { + // psh.closePanel(); + // } + // } + // super.closePanelInternal(); + // } @Override public void readOnClient(int i, PacketBuffer packetBuffer) throws IOException { - if (i == TRACK_SUBPANELS) { - handleTracking(packetBuffer); - } - super.readOnClient(i, packetBuffer); + // if (i == TRACK_SUBPANELS) { + // handleTracking(packetBuffer); + // } + // super.readOnClient(i, packetBuffer); } @Override public void readOnServer(int i, PacketBuffer packetBuffer) throws IOException { - if (i == TRACK_SUBPANELS) { - handleTracking(packetBuffer); - } - super.readOnServer(i, packetBuffer); + // if (i == TRACK_SUBPANELS) { + // handleTracking(packetBuffer); + // } + // super.readOnServer(i, packetBuffer); if (i == DELETE_ENTRY) { UUID uuid = UUID.fromString(NetworkUtils.readStringSafe(packetBuffer)); String name = NetworkUtils.readStringSafe(packetBuffer); @@ -443,16 +457,16 @@ public void readOnServer(int i, PacketBuffer packetBuffer) throws IOException { } } - private void handleTracking(PacketBuffer buffer) { - boolean add = buffer.readBoolean(); - String key = NetworkUtils.readStringSafe(buffer); - if (key != null) { - if (add) opened.add(key); - else opened.remove(key); - } - } + // private void handleTracking(PacketBuffer buffer) { + // boolean add = buffer.readBoolean(); + // String key = NetworkUtils.readStringSafe(buffer); + // if (key != null) { + // if (add) opened.add(key); + // else opened.remove(key); + // } + // } - private class EntryDescriptionSH extends PanelSyncHandler { + private static class EntryDescriptionSH extends SyncHandler implements IPanelHandler { /** * Creates a PanelSyncHandler @@ -460,8 +474,17 @@ private class EntryDescriptionSH extends PanelSyncHandler { * @param mainPanel the main panel of the current GUI */ public EntryDescriptionSH(ModularPanel mainPanel, String key, VirtualEntry entry) { - super(mainPanel, (syncManager, syncHandler) -> defaultPanel(syncHandler, key, entry)); + // super(mainPanel, (syncManager, syncHandler) -> defaultPanel(syncHandler, key, entry)); } + // + // @Override + // public boolean isSubPanel() { + // return subPanel; + // } + // + // public boolean isPanelOpen() { + // return this.open; + // } private static ModularPanel defaultPanel(@NotNull PanelSyncHandler syncHandler, String key, VirtualEntry entry) { @@ -487,23 +510,43 @@ private static ModularPanel defaultPanel(@NotNull PanelSyncHandler syncHandler, @Override public void openPanel() { - opened.add(getKey()); - EntrySelectorSH.this.sync(3, buffer -> { - buffer.writeBoolean(true); - NetworkUtils.writeStringSafe(buffer, getKey()); - }); - super.openPanel(); + // opened.add(getKey()); + // EntrySelectorSH.this.sync(3, buffer -> { + // buffer.writeBoolean(true); + // NetworkUtils.writeStringSafe(buffer, getKey()); + // }); + // super.openPanel(); } @Override public void closePanel() { - opened.remove(getKey()); - EntrySelectorSH.this.sync(3, buffer -> { - buffer.writeBoolean(false); - NetworkUtils.writeStringSafe(buffer, getKey()); - }); - super.closePanel(); + // opened.remove(getKey()); + // EntrySelectorSH.this.sync(3, buffer -> { + // buffer.writeBoolean(false); + // NetworkUtils.writeStringSafe(buffer, getKey()); + // }); + // super.closePanel(); } + + @Override + public void closeSubPanels() {} + + @Override + public void closePanelInternal() {} + + @Override + public void deleteCachedPanel() {} + + @Override + public boolean isSubPanel() { + return false; + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException {} + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException {} } protected abstract IWidget createSlotWidget(T entry); diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index 27c338154b1..ba53b0aab1f 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -31,9 +31,8 @@ import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.EnumSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import java.util.UUID; @@ -119,7 +118,7 @@ public CoverPump.PumpMode getPumpMode() { } @Override - protected PanelSyncHandler createEntrySelector(ModularPanel panel) { + protected EntrySelectorSH createEntrySelector(ModularPanel panel) { return new EntrySelectorSH(panel, EntryTypes.ENDER_FLUID) { @Override @@ -151,7 +150,7 @@ protected IWidget createEntrySlot() { .marginRight(2); } - protected Column createWidgets(ModularPanel panel, PanelSyncManager syncManager) { + protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { getFluidFilterContainer().setMaxTransferSize(1); var pumpMode = new EnumSyncValue<>(CoverPump.PumpMode.class, this::getPumpMode, this::setPumpMode); diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 1b0ccff4ebe..de46cf15d66 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -15,11 +15,10 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; -import com.cleanroommc.modularui.drawable.TextRenderer; +import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; -import com.cleanroommc.modularui.screen.Tooltip; -import com.cleanroommc.modularui.screen.viewport.GuiContext; -import com.cleanroommc.modularui.theme.WidgetSlotTheme; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; @@ -36,13 +35,14 @@ public class GTFluidSlot extends Widget implements Interactable, Je private GTFluidSyncHandler syncHandler; public GTFluidSlot() { - tooltip().setAutoUpdate(true).setHasTitleMargin(true); + tooltip().setAutoUpdate(true); + // .setHasTitleMargin(true); tooltipBuilder(tooltip -> { if (!isSynced()) return; var fluid = this.syncHandler.getFluid(); if (fluid == null) return; - tooltip.addLine(fluid.getLocalizedName()); + tooltip.add(fluid.getLocalizedName()); tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); // Add various tooltips from the material @@ -50,7 +50,7 @@ public GTFluidSlot() { if (formula != null) { for (String s : formula) { if (s.isEmpty()) continue; - tooltip.addLine(s); + tooltip.add(s); } } @@ -80,7 +80,7 @@ public GTFluidSlot syncHandler(GTFluidSyncHandler syncHandler) { } @Override - public void draw(GuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); if (content != null) { GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); @@ -93,7 +93,7 @@ public void draw(GuiContext context, WidgetTheme widgetTheme) { if (isHovering()) { GlStateManager.colorMask(true, true, true, false); GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, - getWidgetTheme(context.getTheme()).getSlotHoverColor()); + getWidgetTheme(context.getTheme()).getColor()); GlStateManager.colorMask(true, true, true, true); } } @@ -118,7 +118,7 @@ public Result onMouseTapped(int mouseButton) { } @Override - public WidgetSlotTheme getWidgetTheme(ITheme theme) { + protected WidgetTheme getWidgetThemeInternal(ITheme theme) { return theme.getFluidSlotTheme(); } @@ -127,7 +127,7 @@ public WidgetSlotTheme getWidgetTheme(ITheme theme) { return this.syncHandler.getFluid(); } - public static void addIngotMolFluidTooltip(FluidStack fluidStack, Tooltip tooltip) { + public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip tooltip) { // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { int numIngots = fluidStack.amount / GTValues.L; @@ -136,7 +136,7 @@ public static void addIngotMolFluidTooltip(FluidStack fluidStack, Tooltip toolti if (extra != 0) { fluidAmount += String.format(" + %d L", extra); } - tooltip.addLine(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); + tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); } } } From 86850f77c4d560f24985c5b23858be5b2218ee47 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Sep 2024 22:54:43 -0700 Subject: [PATCH 03/63] rework ender covers to fit new version --- .../covers/ender/CoverAbstractEnderLink.java | 366 ++++++------------ .../covers/ender/CoverEnderFluidLink.java | 36 +- .../covers/filter/BaseFilterContainer.java | 6 +- .../common/mui/widget/GTFluidSlot.java | 6 + 4 files changed, 137 insertions(+), 277 deletions(-) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 658c40f099f..0dec283c1c4 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -24,7 +24,6 @@ import net.minecraft.util.ITickable; import codechicken.lib.raytracer.CuboidRayTraceResult; -import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.api.widget.Interactable; @@ -49,10 +48,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.UUID; import java.util.regex.Pattern; @@ -148,9 +145,9 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); + this.playerUUID = syncManager.getPlayer().getUniqueID(); - var entrySelectorSH = createEntrySelector(panel); - syncManager.syncValue("entry_selector", entrySelectorSH); + var entrySelectorSH = (PanelSyncHandler) syncManager.panel("entry_selector", entrySelector(getType()), true); return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) @@ -171,19 +168,16 @@ protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { .disableHoverBackground() .addTooltipLine(IKey.lang("cover.generic.ender.open_selector")) .onMousePressed(i -> { - // if (entrySelectorSH.isPanelOpen()) { - // entrySelectorSH.closePanel(); - // } else { - // entrySelectorSH.openPanel(); - // } - // Interactable.playButtonClickSound(); + if (entrySelectorSH.isPanelOpen()) { + entrySelectorSH.closePanel(); + } else { + entrySelectorSH.openPanel(); + } return true; }))) .child(createIoRow()); } - protected abstract EntrySelectorSH createEntrySelector(ModularPanel panel); - protected abstract IWidget createEntrySlot(); protected IWidget createColorIcon() { @@ -291,59 +285,17 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { nbt.setInteger("Frequency", activeEntry.getColor()); } - protected abstract class EntrySelectorSH extends SyncHandler implements IPanelHandler { - - // private static final int TRACK_SUBPANELS = 3; - private static final int DELETE_ENTRY = 1; - private final EntryTypes type; - private final ModularPanel mainPanel; - private static final String PANEL_NAME = "entry_selector"; - // private final Set opened = new HashSet<>(); - protected UUID playerUUID; - - protected EntrySelectorSH(ModularPanel mainPanel, EntryTypes type) { - this.mainPanel = mainPanel; - this.type = type; - } - - @Override - public void init(String key, PanelSyncManager syncManager) { - super.init(key, syncManager); - this.playerUUID = syncManager.getPlayer().getUniqueID(); - } - - public UUID getPlayerUUID() { - return isPrivate ? playerUUID : null; - } - - @Override - public void openPanel() {} - - @Override - public void closePanel() {} - - @Override - public void closePanelInternal() {} - - @Override - public void closeSubPanels() {} - - @Override - public void deleteCachedPanel() {} - - @Override - public boolean isSubPanel() { - return false; - } - - public ModularPanel createUI(PanelSyncManager syncManager) { - List names = new ArrayList<>(VirtualEnderRegistry.getEntryNames(getPlayerUUID(), type)); - return GTGuis.createPopupPanel(PANEL_NAME, 168, 112) + protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { + return (syncManager, syncHandler) -> { + Set names = VirtualEnderRegistry.getEntryNames(getOwner(), type); + return GTGuis.createPopupPanel("entry_selector", 168, 112) .child(IKey.lang("cover.generic.ender.known_channels") - .color(UI_TITLE_COLOR).asWidget() + .color(UI_TITLE_COLOR) + .shadow(true) + .asWidget() .top(6) .left(4)) - .child(ListWidget.builder(names, name -> createRow(name, this.mainPanel, syncManager)) + .child(ListWidget.builder(names, name -> createRow(name, syncManager, type)) .background(GTGuiTextures.DISPLAY.asIcon() .width(168 - 8) .height(112 - 20)) @@ -351,206 +303,112 @@ public ModularPanel createUI(PanelSyncManager syncManager) { .size(168 - 12, 112 - 24) .left(4) .bottom(6)); - } + }; + } - protected IWidget createRow(String name, ModularPanel mainPanel, PanelSyncManager syncManager) { - T entry = VirtualEnderRegistry.getEntry(getPlayerUUID(), this.type, name); - String key = String.format("entry#%s_description", entry.getColorStr()); - var entryDescriptionSH = new EntryDescriptionSH(mainPanel, key, entry); - syncManager.syncValue(key, isPrivate ? 1 : 0, entryDescriptionSH); - - return Flow.row() - .left(4) - .marginBottom(2) - .height(18) - .widthRel(0.98f) - .setEnabledIf(row -> VirtualEnderRegistry.hasEntry(getOwner(), this.type, name)) - .child(new Rectangle() - .setColor(entry.getColor()) - .asWidget() - .marginRight(4) - .size(16) - .background(GTGuiTextures.SLOT.asIcon().size(18)) - .top(1)) - .child(new InteractableText<>(entry, CoverAbstractEnderLink.this::updateColor) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(tooltip -> { - String desc = entry.getDescription(); - if (!desc.isEmpty()) - tooltip.add(desc); - }) - .width(64) - .height(16) - .top(1) - .marginRight(4)) - .child(new ButtonWidget<>() - .overlay(GuiTextures.GEAR) - .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) - .onMousePressed(i -> { - // open entry settings - // if (entryDescriptionSH.isPanelOpen()) { - // entryDescriptionSH.closePanel(); - // } else { - // entryDescriptionSH.openPanel(); - // } - // Interactable.playButtonClickSound(); - return true; - })) - .child(createSlotWidget(entry)) - .child(new ButtonWidget<>() - .overlay(GTGuiTextures.BUTTON_CROSS) - .setEnabledIf(w -> !Objects.equals(entry.getColor(), activeEntry.getColor())) - .addTooltipLine(IKey.lang("cover.generic.ender.delete_entry")) - .onMousePressed(i -> { - // todo option to force delete, maybe as a popup? - deleteEntry(getPlayerUUID(), name); - syncToServer(1, buffer -> { - NetworkUtils.writeStringSafe(buffer, getPlayerUUID().toString()); - NetworkUtils.writeStringSafe(buffer, name); - }); - Interactable.playButtonClickSound(); - return true; - })); - } + protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { + return (syncManager, syncHandler) -> GTGuis.createPopupPanel(key, 168, 36 + 6) + .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) + .color(UI_TITLE_COLOR) + .asWidget() + .left(4) + .top(6)) + .child(new TextFieldWidget() + .setTextColor(Color.WHITE.darker(1)) + .widthRel(0.95f) + .height(18) + .value(new StringSyncValue(entry::getDescription, string -> { + entry.setDescription(string); + if (syncHandler.isPanelOpen()) { + syncHandler.closePanel(); + } + })) + .alignX(0.5f) + .bottom(6)); + } + + protected IWidget createRow(final String name, final PanelSyncManager syncManager, final EntryTypes type) { + final T entry = VirtualEnderRegistry.getEntry(getOwner(), type, name); + var key = String.format("entry#%s_description", entry.getColorStr()); + var syncKey = PanelSyncManager.makeSyncKey(key, isPrivate ? 1 : 0); + final var entryDescriptionPanelHandler = (PanelSyncHandler) syncManager.panel(syncKey, + entryDescription(key, entry), true); + final var syncHandler = new EnderCoverSyncHandler(); + syncManager.syncValue(key + "_handler", syncHandler); + + return Flow.row() + .left(4) + .marginBottom(2) + .height(18) + .widthRel(0.98f) + .setEnabledIf(row -> VirtualEnderRegistry.hasEntry(getOwner(), type, name)) + .child(new Rectangle() + .setColor(entry.getColor()) + .asWidget() + .marginRight(4) + .size(16) + .background(GTGuiTextures.SLOT.asIcon().size(18)) + .top(1)) + .child(new InteractableText<>(entry, CoverAbstractEnderLink.this::updateColor) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(tooltip -> { + String desc = entry.getDescription(); + if (!desc.isEmpty()) tooltip.add(desc); + }) + .width(64) + .height(16) + .top(1) + .marginRight(4)) + .child(new ButtonWidget<>() + .overlay(GuiTextures.GEAR) + .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) + .onMousePressed(i -> { + // open entry settings + if (entryDescriptionPanelHandler.isPanelOpen()) { + entryDescriptionPanelHandler.closePanel(); + } else { + entryDescriptionPanelHandler.openPanel(); + } + Interactable.playButtonClickSound(); + return true; + })) + .child(createSlotWidget(entry)) + .child(new ButtonWidget<>() + .overlay(GTGuiTextures.BUTTON_CROSS) + .setEnabledIf(w -> !Objects.equals(entry.getColor(), activeEntry.getColor())) + .addTooltipLine(IKey.lang("cover.generic.ender.delete_entry")) + .onMousePressed(i -> { + // todo option to force delete, maybe as a popup? + deleteEntry(getOwner(), name); + syncHandler.syncToServer(1, buffer -> { + NetworkUtils.writeStringSafe(buffer, + getOwner() == null ? "null" : getOwner().toString()); + NetworkUtils.writeStringSafe(buffer, name); + }); + Interactable.playButtonClickSound(); + return true; + })); + } - // @Override - // public void closePanel() { - // var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); - // for (var key : opened) { - // if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { - // psh.closePanel(); - // } - // } - // super.closePanel(); - // } - - // @Override - // @SuppressWarnings("UnstableApiUsage") - // public void closePanelInternal() { - // var manager = getSyncManager().getModularSyncManager().getPanelSyncManager(PANEL_NAME); - // for (var key : opened) { - // if (manager.getSyncHandler(key) instanceof PanelSyncHandler psh) { - // psh.closePanel(); - // } - // } - // super.closePanelInternal(); - // } + protected abstract IWidget createSlotWidget(T entry); + + protected abstract void deleteEntry(UUID player, String name); + + protected class EnderCoverSyncHandler extends SyncHandler { + + private static final int DELETE_ENTRY = 1; @Override - public void readOnClient(int i, PacketBuffer packetBuffer) throws IOException { - // if (i == TRACK_SUBPANELS) { - // handleTracking(packetBuffer); - // } - // super.readOnClient(i, packetBuffer); - } + public void readOnClient(int i, PacketBuffer packetBuffer) {} @Override - public void readOnServer(int i, PacketBuffer packetBuffer) throws IOException { - // if (i == TRACK_SUBPANELS) { - // handleTracking(packetBuffer); - // } - // super.readOnServer(i, packetBuffer); + public void readOnServer(int i, PacketBuffer packetBuffer) { if (i == DELETE_ENTRY) { - UUID uuid = UUID.fromString(NetworkUtils.readStringSafe(packetBuffer)); + var s = NetworkUtils.readStringSafe(packetBuffer); + UUID uuid = "null".equals(s) ? null : UUID.fromString(s); String name = NetworkUtils.readStringSafe(packetBuffer); deleteEntry(uuid, name); } } - - // private void handleTracking(PacketBuffer buffer) { - // boolean add = buffer.readBoolean(); - // String key = NetworkUtils.readStringSafe(buffer); - // if (key != null) { - // if (add) opened.add(key); - // else opened.remove(key); - // } - // } - - private static class EntryDescriptionSH extends SyncHandler implements IPanelHandler { - - /** - * Creates a PanelSyncHandler - * - * @param mainPanel the main panel of the current GUI - */ - public EntryDescriptionSH(ModularPanel mainPanel, String key, VirtualEntry entry) { - // super(mainPanel, (syncManager, syncHandler) -> defaultPanel(syncHandler, key, entry)); - } - // - // @Override - // public boolean isSubPanel() { - // return subPanel; - // } - // - // public boolean isPanelOpen() { - // return this.open; - // } - - private static ModularPanel defaultPanel(@NotNull PanelSyncHandler syncHandler, String key, - VirtualEntry entry) { - return GTGuis.createPopupPanel(key, 168, 36 + 6) - .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) - .color(UI_TITLE_COLOR) - .asWidget() - .left(4) - .top(6)) - .child(new TextFieldWidget() - .setTextColor(Color.WHITE.darker(1)) - .widthRel(0.95f) - .height(18) - .value(new StringSyncValue(entry::getDescription, string -> { - entry.setDescription(string); - if (syncHandler.isPanelOpen()) { - syncHandler.closePanel(); - } - })) - .alignX(0.5f) - .bottom(6)); - } - - @Override - public void openPanel() { - // opened.add(getKey()); - // EntrySelectorSH.this.sync(3, buffer -> { - // buffer.writeBoolean(true); - // NetworkUtils.writeStringSafe(buffer, getKey()); - // }); - // super.openPanel(); - } - - @Override - public void closePanel() { - // opened.remove(getKey()); - // EntrySelectorSH.this.sync(3, buffer -> { - // buffer.writeBoolean(false); - // NetworkUtils.writeStringSafe(buffer, getKey()); - // }); - // super.closePanel(); - } - - @Override - public void closeSubPanels() {} - - @Override - public void closePanelInternal() {} - - @Override - public void deleteCachedPanel() {} - - @Override - public boolean isSubPanel() { - return false; - } - - @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException {} - - @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException {} - } - - protected abstract IWidget createSlotWidget(T entry); - - protected abstract void deleteEntry(UUID player, String name); } } diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index ba53b0aab1f..fc816b55248 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -118,27 +118,21 @@ public CoverPump.PumpMode getPumpMode() { } @Override - protected EntrySelectorSH createEntrySelector(ModularPanel panel) { - return new EntrySelectorSH(panel, EntryTypes.ENDER_FLUID) { - - @Override - protected IWidget createSlotWidget(VirtualTank entry) { - var fluidTank = GTFluidSlot.sync(entry) - .canFillSlot(false) - .canDrainSlot(false); - - return new GTFluidSlot() - .size(18) - .background(GTGuiTextures.FLUID_SLOT) - .syncHandler(fluidTank) - .marginRight(2); - } - - @Override - protected void deleteEntry(UUID uuid, String name) { - VirtualEnderRegistry.deleteEntry(uuid, getType(), name, tank -> tank.getFluidAmount() == 0); - } - }; + protected IWidget createSlotWidget(VirtualTank entry) { + var fluidTank = GTFluidSlot.sync(entry) + .canFillSlot(false) + .canDrainSlot(false); + + return new GTFluidSlot() + .size(18) + .background(GTGuiTextures.FLUID_SLOT) + .syncHandler(fluidTank) + .marginRight(2); + } + + @Override + protected void deleteEntry(UUID uuid, String name) { + VirtualEnderRegistry.deleteEntry(uuid, getType(), name, tank -> tank.getFluidAmount() == 0); } @Override diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index ae0ed4c71a1..cb4be02de35 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -11,10 +11,10 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -246,10 +246,12 @@ public IWidget initUI(ModularPanel main, PanelSyncManager manager) { } else { panel.closePanel(); } - Interactable.playButtonClickSound(); + // Interactable.playButtonClickSound(); return true; })) .child(IKey.dynamic(this::getFilterName) + .color(Color.WHITE.main) + .shadow(true) .alignment(Alignment.CenterRight).asWidget() .left(36).right(0).height(18)); } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index de46cf15d66..52d2dbfcc46 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -23,6 +23,7 @@ import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.utils.NumberFormat; +import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -79,6 +80,11 @@ public GTFluidSlot syncHandler(GTFluidSyncHandler syncHandler) { return this; } + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof GTFluidSyncHandler; + } + @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); From 7f8d5db6a12a4436f42f79246927233fb45c07e8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 09:20:42 -0700 Subject: [PATCH 04/63] pass in gui data instead of main panel fix more issues --- src/main/java/gregtech/api/cover/CoverWithUI.java | 2 +- .../java/gregtech/common/covers/CoverConveyor.java | 7 ++++--- .../gregtech/common/covers/CoverFluidRegulator.java | 5 +++-- .../gregtech/common/covers/CoverFluidVoiding.java | 5 +++-- .../common/covers/CoverFluidVoidingAdvanced.java | 5 +++-- .../gregtech/common/covers/CoverItemVoiding.java | 5 +++-- .../common/covers/CoverItemVoidingAdvanced.java | 5 +++-- src/main/java/gregtech/common/covers/CoverPump.java | 8 ++++---- .../gregtech/common/covers/CoverRoboticArm.java | 5 +++-- .../common/covers/ender/CoverAbstractEnderLink.java | 13 ++++++++----- .../common/covers/ender/CoverEnderFluidLink.java | 8 ++++---- .../common/covers/filter/BaseFilterContainer.java | 11 +++++------ .../common/mui/widget/InteractableText.java | 5 +++++ 13 files changed, 49 insertions(+), 35 deletions(-) diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index e6e45670ec1..559abe4a57d 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -105,7 +105,7 @@ static Flow createTitleRow(ItemStack stack) { .child(new ItemDrawable(stack).asWidget().size(16).marginRight(4)) .child(IKey.str(stack.getDisplayName()) .color(UI_TITLE_COLOR) - .shadow(true) + .shadow(false) .asWidget().heightRel(1.0f)); } diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 89b1980899a..36ca9521035 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -45,6 +45,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -509,11 +510,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan getItemFilterContainer().setMaxTransferSize(getMaxStackSize()); return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createUI(panel, guiSyncManager)) + .child(createUI(guiData, guiSyncManager)) .bindPlayerInventory(); } - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); @@ -566,7 +567,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager g .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); if (createFilterRow()) - column.child(getItemFilterContainer().initUI(mainPanel, guiSyncManager)); + column.child(getItemFilterContainer().initUI(data, guiSyncManager)); if (createManualIOModeRow()) column.child(new EnumRowBuilder<>(ManualImportExportMode.class) diff --git a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java index 27122cdfa7a..141b51e0552 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java +++ b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java @@ -20,6 +20,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -247,7 +248,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager syncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); transferMode.updateCacheFromSource(true); syncManager.syncValue("transfer_mode", transferMode); @@ -259,7 +260,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager sync var filterTransferSize = new StringSyncValue(this::getStringTransferRate, this::setStringTransferRate); filterTransferSize.updateCacheFromSource(true); - return super.createUI(mainPanel, syncManager) + return super.createUI(data, syncManager) .child(new EnumRowBuilder<>(TransferMode.class) .value(transferMode) .lang("cover.generic.transfer_mode") diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java index 48b992f96f7..4bd8472b55f 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java @@ -25,6 +25,7 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -76,10 +77,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager syncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); - return super.createUI(mainPanel, syncManager) + return super.createUI(data, syncManager) .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java index 80b7bb45564..b6a9e1cd1e5 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java @@ -20,6 +20,7 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -105,7 +106,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager syncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); syncManager.syncValue("voiding_mode", voidingMode); @@ -118,7 +119,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager sync transferTextField.setEnabled(this.fluidFilterContainer.showGlobalTransferLimitSlider() && this.voidingMode == VoidingMode.VOID_OVERFLOW); - return super.createUI(mainPanel, syncManager) + return super.createUI(data, syncManager) .child(new EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) .lang("cover.voiding.voiding_mode") diff --git a/src/main/java/gregtech/common/covers/CoverItemVoiding.java b/src/main/java/gregtech/common/covers/CoverItemVoiding.java index 4d3d878196f..e8129ec11f3 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoiding.java @@ -22,6 +22,7 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -77,10 +78,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { var isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); - return super.createUI(mainPanel, guiSyncManager) + return super.createUI(data, guiSyncManager) .child(Flow.row().height(18).widthRel(1f) .marginBottom(2) .child(new ToggleButton() diff --git a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java index 607dbac7816..b739e7e6e1f 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java @@ -17,6 +17,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -93,7 +94,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); guiSyncManager.syncValue("voiding_mode", voidingMode); @@ -105,7 +106,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager g transferTextField.setEnabled(this.itemFilterContainer.showGlobalTransferLimitSlider() && this.voidingMode == VoidingMode.VOID_OVERFLOW); - return super.createUI(mainPanel, guiSyncManager) + return super.createUI(data, guiSyncManager) .child(new EnumRowBuilder<>(VoidingMode.class) .value(voidingMode) .lang("cover.voiding.voiding_mode") diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index c2380dcecd7..2da916c3c44 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -43,6 +43,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -195,11 +196,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan getFluidFilterContainer().setMaxTransferSize(getMaxTransferRate()); return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createUI(panel, guiSyncManager)) + .child(createUI(guiData, guiSyncManager)) .bindPlayerInventory(); } - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager syncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var manualIOmode = new EnumSyncValue<>(ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode); manualIOmode.updateCacheFromSource(true); @@ -251,8 +252,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager sync .onUpdateListener(w -> w.overlay(createAdjustOverlay(true))))); if (createFilterRow()) - column.child(getFluidFilterContainer() - .initUI(mainPanel, syncManager)); + column.child(getFluidFilterContainer().initUI(data, syncManager)); if (createManualIOModeRow()) column.child(new EnumRowBuilder<>(ManualImportExportMode.class) diff --git a/src/main/java/gregtech/common/covers/CoverRoboticArm.java b/src/main/java/gregtech/common/covers/CoverRoboticArm.java index 7ef93dffb6c..b1b99657adf 100644 --- a/src/main/java/gregtech/common/covers/CoverRoboticArm.java +++ b/src/main/java/gregtech/common/covers/CoverRoboticArm.java @@ -19,6 +19,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; @@ -196,7 +197,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager guiSyncManager) { + protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { EnumSyncValue transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); guiSyncManager.syncValue("transfer_mode", transferMode); @@ -206,7 +207,7 @@ protected ParentWidget createUI(ModularPanel mainPanel, PanelSyncManager g s -> this.itemFilterContainer.setTransferSize(Integer.parseInt(s))); filterTransferSize.updateCacheFromSource(true); - return super.createUI(mainPanel, guiSyncManager) + return super.createUI(data, guiSyncManager) .child(new EnumRowBuilder<>(TransferMode.class) .value(transferMode) .lang("cover.generic.transfer_mode") diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 0dec283c1c4..1c1c782d751 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -30,6 +30,7 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; import com.cleanroommc.modularui.drawable.Rectangle; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; @@ -138,14 +139,15 @@ public boolean usesMui2() { public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { var panel = GTGuis.createPanel(this, 176, 192); + this.playerUUID = guiData.getPlayer().getUniqueID(); + return panel.child(CoverWithUI.createTitleRow(getPickItem())) - .child(createWidgets(panel, guiSyncManager)) + .child(createWidgets(guiData, guiSyncManager)) .bindPlayerInventory(); } - protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { + protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); - this.playerUUID = syncManager.getPlayer().getUniqueID(); var entrySelectorSH = (PanelSyncHandler) syncManager.panel("entry_selector", entrySelector(getType()), true); @@ -291,7 +293,7 @@ protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { return GTGuis.createPopupPanel("entry_selector", 168, 112) .child(IKey.lang("cover.generic.ender.known_channels") .color(UI_TITLE_COLOR) - .shadow(true) + .shadow(false) .asWidget() .top(6) .left(4)) @@ -310,6 +312,7 @@ protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { return (syncManager, syncHandler) -> GTGuis.createPopupPanel(key, 168, 36 + 6) .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) .color(UI_TITLE_COLOR) + .shadow(false) .asWidget() .left(4) .top(6)) @@ -394,7 +397,7 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage protected abstract void deleteEntry(UUID player, String name); - protected class EnderCoverSyncHandler extends SyncHandler { + private final class EnderCoverSyncHandler extends SyncHandler { private static final int DELETE_ENTRY = 1; diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index fc816b55248..a5638561fa2 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -29,7 +29,7 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.layout.Flow; @@ -144,15 +144,15 @@ protected IWidget createEntrySlot() { .marginRight(2); } - protected Flow createWidgets(ModularPanel panel, PanelSyncManager syncManager) { + protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { getFluidFilterContainer().setMaxTransferSize(1); var pumpMode = new EnumSyncValue<>(CoverPump.PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("pump_mode", pumpMode); pumpMode.updateCacheFromSource(true); - return super.createWidgets(panel, syncManager) - .child(getFluidFilterContainer().initUI(panel, syncManager)) + return super.createWidgets(data, syncManager) + .child(getFluidFilterContainer().initUI(data, syncManager)) .child(new EnumRowBuilder<>(CoverPump.PumpMode.class) .value(pumpMode) .overlay(GTGuiTextures.CONVEYOR_MODE_OVERLAY) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index cb4be02de35..f545f37b16b 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -1,5 +1,6 @@ package gregtech.common.covers.filter; +import gregtech.api.cover.CoverWithUI; import gregtech.api.mui.GTGuiTextures; import gregtech.api.util.IDirtyNotifiable; @@ -12,9 +13,8 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.GuiTextures; -import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.factory.GuiData; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -212,7 +212,7 @@ public void handleLegacyNBT(NBTTagCompound nbt) { } /** Uses Cleanroom MUI */ - public IWidget initUI(ModularPanel main, PanelSyncManager manager) { + public IWidget initUI(GuiData data, PanelSyncManager manager) { PanelSyncHandler panel = (PanelSyncHandler) manager.panel("filter_panel", (syncManager, syncHandler) -> { var filter = hasFilter() ? getFilter() : BaseFilter.ERROR_FILTER; filter.setMaxTransferSize(getMaxTransferSize()); @@ -246,12 +246,11 @@ public IWidget initUI(ModularPanel main, PanelSyncManager manager) { } else { panel.closePanel(); } - // Interactable.playButtonClickSound(); return true; })) .child(IKey.dynamic(this::getFilterName) - .color(Color.WHITE.main) - .shadow(true) + .color(CoverWithUI.UI_TEXT_COLOR) + .shadow(false) .alignment(Alignment.CenterRight).asWidget() .left(36).right(0).height(18)); } diff --git a/src/main/java/gregtech/common/mui/widget/InteractableText.java b/src/main/java/gregtech/common/mui/widget/InteractableText.java index eac6936059a..bcafa15208d 100644 --- a/src/main/java/gregtech/common/mui/widget/InteractableText.java +++ b/src/main/java/gregtech/common/mui/widget/InteractableText.java @@ -38,6 +38,11 @@ public Result onMousePressed(int mouseButton) { return Result.SUCCESS; } + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof EntryColorSH; + } + private static class EntryColorSH extends SyncHandler { private final Consumer setter; From 99f2bc3bf72d8acf38cbe8b42baabdca2848f27e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 10:39:44 -0700 Subject: [PATCH 05/63] fix issues in GTFluidSlot --- .../api/mui/sync/GTFluidSyncHandler.java | 25 ++++++++++++++----- .../common/mui/widget/GTFluidSlot.java | 4 +-- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index b5be013da18..1bd903d6c70 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -20,6 +20,7 @@ public class GTFluidSyncHandler extends SyncHandler { private static final int TRY_CLICK_CONTAINER = 1; + private static final int UPDATE_TANK = 2; private final IFluidTank tank; private boolean canDrainSlot = true; @@ -57,6 +58,13 @@ public boolean canFillSlot() { @Override public void readOnClient(int id, PacketBuffer buf) { + switch (id) { + case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); + case UPDATE_TANK -> { + tank.drain(Integer.MAX_VALUE, true); + tank.fill(NetworkUtils.readFluidStack(buf), true); + } + } if (id == TRY_CLICK_CONTAINER) { replaceCursorItemStack(NetworkUtils.readItemStack(buf)); } @@ -88,20 +96,24 @@ public ItemStack tryClickContainer(boolean tryFillAll) { if (tankFluid == null && heldFluid == null) return ItemStack.EMPTY; + ItemStack returnable = ItemStack.EMPTY; + // tank is empty, try to fill tank if (canFillSlot && tankFluid == null) { - return fillTankFromStack(fluidHandlerItem, heldFluid, tryFillAll); + returnable = fillTankFromStack(fluidHandlerItem, heldFluid, tryFillAll); // hand is empty, try to drain tank } else if (canDrainSlot && heldFluid == null) { - return drainTankFromStack(fluidHandlerItem, tankFluid, tryFillAll); + returnable = drainTankIntoStack(fluidHandlerItem, tankFluid, tryFillAll); // neither is empty but tank is not full, try to fill tank } else if (canFillSlot && tank.getFluidAmount() < tank.getCapacity() && heldFluid != null) { - return fillTankFromStack(fluidHandlerItem, heldFluid, tryFillAll); + returnable = fillTankFromStack(fluidHandlerItem, heldFluid, tryFillAll); } - return ItemStack.EMPTY; + syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, tank.getFluid())); + + return returnable; } private ItemStack fillTankFromStack(IFluidHandlerItem fluidHandler, @NotNull FluidStack heldFluid, @@ -141,15 +153,15 @@ private ItemStack fillTankFromStack(IFluidHandlerItem fluidHandler, @NotNull Flu return itemStackEmptied; } - private ItemStack drainTankFromStack(IFluidHandlerItem fluidHandler, FluidStack tankFluid, boolean tryFillAll) { + private ItemStack drainTankIntoStack(IFluidHandlerItem fluidHandler, FluidStack tankFluid, boolean tryFillAll) { ItemStack heldItem = getSyncManager().getCursorItem(); if (heldItem.isEmpty()) return ItemStack.EMPTY; ItemStack fluidContainer = fluidHandler.getContainer(); int filled = fluidHandler.fill(tankFluid, false); if (filled > 0) { - tank.drain(filled, true); fluidHandler.fill(tankFluid, true); + tank.drain(filled, true); if (tryFillAll) { // Determine how many more items we can fill. One item is already filled. // Integer division means it will round down, so it will only fill equivalent fluid amounts. @@ -160,6 +172,7 @@ private ItemStack drainTankFromStack(IFluidHandlerItem fluidHandler, FluidStack tank.drain(filled * additional, true); fluidContainer.grow(additional); } + fluidContainer = fluidHandler.getContainer(); replaceCursorItemStack(fluidContainer); playSound(tankFluid, false); return fluidContainer; diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 52d2dbfcc46..a5e71fa0129 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -43,7 +43,7 @@ public GTFluidSlot() { var fluid = this.syncHandler.getFluid(); if (fluid == null) return; - tooltip.add(fluid.getLocalizedName()); + tooltip.add(fluid.getLocalizedName()).newLine(); tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); // Add various tooltips from the material @@ -51,7 +51,7 @@ public GTFluidSlot() { if (formula != null) { for (String s : formula) { if (s.isEmpty()) continue; - tooltip.add(s); + tooltip.add(s).newLine(); } } From d1222e7f8753b6203650c4adaaf4fdded790ea52 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 10:41:44 -0700 Subject: [PATCH 06/63] move multi fluid hatches to mui2 simplify loop --- .../MetaTileEntityMultiFluidHatch.java | 46 +++++++++++++++++++ .../common/mui/widget/GTFluidSlot.java | 9 ++-- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index cf053eb8500..3e0604bf8f1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -13,8 +13,11 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -31,8 +34,15 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.layout.Grid; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; public class MetaTileEntityMultiFluidHatch extends MetaTileEntityMultiblockNotifiablePart @@ -114,12 +124,19 @@ public T getCapability(Capability capability, EnumFacing side) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeBoolean(workingEnabled); + for (var tank : fluidTankList.getFluidTanks()) { + NetworkUtils.writeFluidStack(buf, tank.getFluid()); + } } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); this.workingEnabled = buf.readBoolean(); + for (var tank : fluidTankList.getFluidTanks()) { + var fluid = NetworkUtils.readFluidStack(buf); + tank.fill(fluid, true); + } } @Override @@ -189,6 +206,35 @@ public void registerAbilities(List abilityList) { abilityList.addAll(fluidTankList.getFluidTanks()); } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + int rowSize = (int) Math.sqrt(numSlots); + + List fluidSlots = new ArrayList<>(); + for (int i = 0; i < numSlots; i++) { + fluidSlots.add(new GTFluidSlot()); + } + + return GTGuis.createPanel(this, 176, 18 + 18 * rowSize + 94) + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(new Grid() + .margin(0) + .leftRel(0.5f) + .top(17) + .mapTo(rowSize, fluidSlots, + (i, slot) -> slot.syncHandler(GTFluidSlot.sync(fluidTankList.getTankAt(i)) + .canDrainSlot(true) + .canFillSlot(!isExportHatch)) + .background(GTGuiTextures.FLUID_SLOT)) + .coverChildren()) + .bindPlayerInventory(); + } + @Override protected ModularUI createUI(EntityPlayer entityPlayer) { int rowSize = (int) Math.sqrt(numSlots); diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index a5e71fa0129..71fea974fed 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -47,12 +47,9 @@ public GTFluidSlot() { tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); // Add various tooltips from the material - List formula = FluidTooltipUtil.getFluidTooltip(fluid); - if (formula != null) { - for (String s : formula) { - if (s.isEmpty()) continue; - tooltip.add(s).newLine(); - } + for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { + if (s.isEmpty()) continue; + tooltip.add(s).newLine(); } addIngotMolFluidTooltip(fluid, tooltip); From a5fd9f383125074b66f81aab7bd5655927ebfefc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:24:38 -0700 Subject: [PATCH 07/63] add more panel method overloads spotless --- src/main/java/gregtech/api/mui/GTGuis.java | 27 +++++++++++++++++++ .../common/mui/widget/GTFluidSlot.java | 2 -- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 614f6a08f1b..f8ff789c678 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -44,6 +44,24 @@ public static ModularPanel createPanel(ItemStack stack, int width, int height) { return createPanel(valueItem.unlocalizedName, width, height); } + public static ModularPanel createPanel(String name) { + return ModularPanel.defaultPanel(name); + } + + public static ModularPanel createPanel(MetaTileEntity mte) { + return createPanel(mte.metaTileEntityId.getPath()); + } + + public static ModularPanel createPanel(Cover cover) { + return createPanel(cover.getDefinition().getResourceLocation().getPath()); + } + + public static ModularPanel createPanel(ItemStack stack) { + MetaItem.MetaValueItem valueItem = ((MetaItem) stack.getItem()).getItem(stack); + if (valueItem == null) throw new IllegalArgumentException("Item must be a meta item!"); + return createPanel(valueItem.unlocalizedName); + } + public static ModularPanel createPopupPanel(String name, int width, int height) { return createPopupPanel(name, width, height, false, false); } @@ -53,6 +71,15 @@ public static ModularPanel createPopupPanel(String name, int width, int height, return new PopupPanel(name, width, height, disableBelow, closeOnOutsideClick); } + public static ModularPanel createPopupPanel(String name) { + return createPopupPanel(name, false, false); + } + + public static ModularPanel createPopupPanel(String name, boolean disableBelow, + boolean closeOnOutsideClick) { + return new PopupPanel(name, 176, 166, disableBelow, closeOnOutsideClick); + } + private static class PopupPanel extends ModularPanel { private final boolean disableBelow; diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 71fea974fed..159c0424684 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -28,8 +28,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.List; - public class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider { private final TextRenderer textRenderer = new TextRenderer(); From 7ab5acfa4282c8d7a319d2e202973d324d99904a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:47:57 -0700 Subject: [PATCH 08/63] add methods to GTFluidSlot don't need background --- .../MetaTileEntityMultiFluidHatch.java | 4 +-- .../common/mui/widget/GTFluidSlot.java | 33 +++++++++++++++---- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index 3e0604bf8f1..b0b50b18f52 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -13,7 +13,6 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; @@ -229,8 +228,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .mapTo(rowSize, fluidSlots, (i, slot) -> slot.syncHandler(GTFluidSlot.sync(fluidTankList.getTankAt(i)) .canDrainSlot(true) - .canFillSlot(!isExportHatch)) - .background(GTGuiTextures.FLUID_SLOT)) + .canFillSlot(!isExportHatch))) .coverChildren()) .bindPlayerInventory(); } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 159c0424684..d61a03e8f24 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -28,10 +28,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider { +public final class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider { private final TextRenderer textRenderer = new TextRenderer(); private GTFluidSyncHandler syncHandler; + private boolean showAmount = true; + private boolean disableBackground = false; + // todo phantom public GTFluidSlot() { tooltip().setAutoUpdate(true); @@ -75,22 +78,40 @@ public GTFluidSlot syncHandler(GTFluidSyncHandler syncHandler) { return this; } + public GTFluidSlot showAmount(boolean showAmount) { + this.showAmount = showAmount; + return this; + } + + public GTFluidSlot disableBackground() { + this.disableBackground = true; + return this; + } + @Override public boolean isValidSyncHandler(SyncHandler syncHandler) { return syncHandler instanceof GTFluidSyncHandler; } + @Override + public void drawBackground(ModularGuiContext context, WidgetTheme widgetTheme) { + if (disableBackground) return; + super.drawBackground(context, widgetTheme); + } + @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); - if (content != null) { - GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + + if (content != null && showAmount) { String s = NumberFormat.formatWithMaxDigits(getBaseUnitAmount(content.amount)) + getBaseUnit(); this.textRenderer.setAlignment(Alignment.CenterRight, getArea().width - 1f); this.textRenderer.setPos(0, 12); this.textRenderer.draw(s); } + if (isHovering()) { GlStateManager.colorMask(true, true, true, false); GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, @@ -99,12 +120,12 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { } } - protected double getBaseUnitAmount(double amount) { + private double getBaseUnitAmount(double amount) { return amount / 1000; } - protected String getBaseUnit() { - return "L"; + private String getBaseUnit() { + return "kL"; } @NotNull From f8dab58c9e70dd4152d56f1b403a9406445fd038 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:03:57 -0700 Subject: [PATCH 09/63] fix ghost circuit slot tooltip --- .../api/mui/widget/GhostCircuitSlotWidget.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index 83f772c8686..d64866951d8 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -7,7 +7,6 @@ import gregtech.client.utils.TooltipHelper; import net.minecraft.network.PacketBuffer; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.items.IItemHandler; import com.cleanroommc.modularui.api.IPanelHandler; @@ -66,21 +65,15 @@ public ItemSlot slot(ModularSlot slot) { return this; } - // @Override - // protected List getItemTooltip(ItemStack stack) { - // // we don't want the item tooltip - // return Collections.emptyList(); - // } - protected void getCircuitSlotTooltip(@NotNull RichTooltip tooltip) { String configString; int value = getSyncHandler().getGhostCircuitHandler().getCircuitValue(); if (value == GhostCircuitItemStackHandler.NO_CONFIG) { - configString = new TextComponentTranslation("gregtech.gui.configurator_slot.no_value").getFormattedText(); + configString = IKey.lang("gregtech.gui.configurator_slot.no_value").get(); } else { configString = String.valueOf(value); } - + tooltip.clearText(); tooltip.addLine(IKey.lang("gregtech.gui.configurator_slot.tooltip", configString)); } From 153904cde1ce96d049a470491250ef3b9e4a5c92 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:01:23 -0700 Subject: [PATCH 10/63] add formatting methods for amount and fluid name --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1bd903d6c70..f84c3da4e13 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -56,6 +56,14 @@ public boolean canFillSlot() { return this.canFillSlot; } + public String getFormattedFluidAmount() { + return String.format("%,d", tank.getFluid() == null ? 0 : tank.getFluid().amount); + } + + public String getFluidLocalizedName() { + return tank.getFluid() == null ? "" : tank.getFluid().getLocalizedName(); + } + @Override public void readOnClient(int id, PacketBuffer buf) { switch (id) { From 08ab14847e77c5895192b6ac9de98817b11543be Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:02:22 -0700 Subject: [PATCH 11/63] forgor to remove --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index f84c3da4e13..da7d13eca4d 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -73,9 +73,6 @@ public void readOnClient(int id, PacketBuffer buf) { tank.fill(NetworkUtils.readFluidStack(buf), true); } } - if (id == TRY_CLICK_CONTAINER) { - replaceCursorItemStack(NetworkUtils.readItemStack(buf)); - } } @Override From 2a7392c83f840a8320dc7f808e57b5f01d7c24f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 20 Sep 2024 20:49:13 -0700 Subject: [PATCH 12/63] remove old ui --- .../MetaTileEntityMultiFluidHatch.java | 21 ------------------- 1 file changed, 21 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index b0b50b18f52..5a90f5c760f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -232,25 +232,4 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .coverChildren()) .bindPlayerInventory(); } - - @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - int rowSize = (int) Math.sqrt(numSlots); - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, - 18 + 18 * rowSize + 94) - .label(10, 5, getMetaFullName()); - - for (int y = 0; y < rowSize; y++) { - for (int x = 0; x < rowSize; x++) { - int index = y * rowSize + x; - builder.widget( - new TankWidget(fluidTankList.getTankAt(index), 89 - rowSize * 9 + x * 18, 18 + y * 18, 18, 18) - .setBackgroundTexture(GuiTextures.FLUID_SLOT) - .setContainerClicking(true, !isExportHatch) - .setAlwaysShowFull(true)); - } - } - builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 18 + 18 * rowSize + 12); - return builder.build(getHolder(), entityPlayer); - } } From 1b429f6c10fa2f02e1906f74c4b55826162c5eaa Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 20 Sep 2024 21:07:47 -0700 Subject: [PATCH 13/63] improve GTGuis methods add default size fields remove manually calling click sound --- src/main/java/gregtech/api/mui/GTGuis.java | 37 ++++++++++++++-------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index f8ff789c678..0d88ddd7be1 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -19,6 +19,8 @@ public class GTGuis { + public static final int DEFAULT_WIDTH = 176, DEFAULT_HIEGHT = 166; + @ApiStatus.Internal public static void registerFactories() { GuiManager.registerFactory(MetaTileEntityGuiFactory.INSTANCE); @@ -39,26 +41,34 @@ public static ModularPanel createPanel(Cover cover, int width, int height) { } public static ModularPanel createPanel(ItemStack stack, int width, int height) { - MetaItem.MetaValueItem valueItem = ((MetaItem) stack.getItem()).getItem(stack); - if (valueItem == null) throw new IllegalArgumentException("Item must be a meta item!"); - return createPanel(valueItem.unlocalizedName, width, height); + String locale; + if (stack.getItem() instanceof MetaItemmetaItem) { + var valueItem = metaItem.getItem(stack); + if (valueItem == null) throw new IllegalArgumentException("Item must be a meta item!"); + locale = valueItem.unlocalizedName; + } else { + locale = stack.getTranslationKey(); + } + return createPanel(locale, width, height); } public static ModularPanel createPanel(String name) { - return ModularPanel.defaultPanel(name); + return ModularPanel.defaultPanel(name, DEFAULT_WIDTH, DEFAULT_HIEGHT); } - public static ModularPanel createPanel(MetaTileEntity mte) { + public static ModularPanel defaultPanel(MetaTileEntity mte) { return createPanel(mte.metaTileEntityId.getPath()); } - public static ModularPanel createPanel(Cover cover) { + public static ModularPanel defaultPanel(Cover cover) { return createPanel(cover.getDefinition().getResourceLocation().getPath()); } - public static ModularPanel createPanel(ItemStack stack) { - MetaItem.MetaValueItem valueItem = ((MetaItem) stack.getItem()).getItem(stack); - if (valueItem == null) throw new IllegalArgumentException("Item must be a meta item!"); + public static ModularPanel defaultPanel(ItemStack stack) { + return createPanel(stack, DEFAULT_WIDTH, DEFAULT_HIEGHT); + } + + public static ModularPanel defaultPanel(MetaItem.MetaValueItem valueItem) { return createPanel(valueItem.unlocalizedName); } @@ -71,13 +81,13 @@ public static ModularPanel createPopupPanel(String name, int width, int height, return new PopupPanel(name, width, height, disableBelow, closeOnOutsideClick); } - public static ModularPanel createPopupPanel(String name) { - return createPopupPanel(name, false, false); + public static ModularPanel defaultPopupPanel(String name) { + return defaultPopupPanel(name, false, false); } - public static ModularPanel createPopupPanel(String name, boolean disableBelow, + public static ModularPanel defaultPopupPanel(String name, boolean disableBelow, boolean closeOnOutsideClick) { - return new PopupPanel(name, 176, 166, disableBelow, closeOnOutsideClick); + return new PopupPanel(name, DEFAULT_WIDTH, DEFAULT_HIEGHT, disableBelow, closeOnOutsideClick); } private static class PopupPanel extends ModularPanel { @@ -94,7 +104,6 @@ public PopupPanel(@NotNull String name, int width, int height, boolean disableBe .onMousePressed(mouseButton -> { if (mouseButton == 0 || mouseButton == 1) { this.closeIfOpen(true); - Interactable.playButtonClickSound(); return true; } return false; From af7728e475e215068a6d37240415a52b061a07bf Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 21 Sep 2024 22:25:43 -0700 Subject: [PATCH 14/63] fix issues with GTFluidSlot and cell behavior sync changes to tank fluid automatically work on supporting phantom fluid slot --- src/main/java/gregtech/api/mui/GTGuis.java | 3 +- .../api/mui/sync/GTFluidSyncHandler.java | 65 +++++++++++++++---- .../MetaTileEntityMultiFluidHatch.java | 4 -- .../common/mui/widget/GTFluidSlot.java | 22 ++++++- 4 files changed, 73 insertions(+), 21 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuis.java b/src/main/java/gregtech/api/mui/GTGuis.java index 0d88ddd7be1..9f9989b2601 100644 --- a/src/main/java/gregtech/api/mui/GTGuis.java +++ b/src/main/java/gregtech/api/mui/GTGuis.java @@ -9,7 +9,6 @@ import net.minecraft.item.ItemStack; -import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.factory.GuiManager; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -86,7 +85,7 @@ public static ModularPanel defaultPopupPanel(String name) { } public static ModularPanel defaultPopupPanel(String name, boolean disableBelow, - boolean closeOnOutsideClick) { + boolean closeOnOutsideClick) { return new PopupPanel(name, DEFAULT_WIDTH, DEFAULT_HIEGHT, disableBelow, closeOnOutsideClick); } diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index da7d13eca4d..7532d41893d 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -1,5 +1,7 @@ package gregtech.api.mui.sync; +import com.cleanroommc.modularui.utils.MouseData; + import gregtech.api.util.GTUtility; import net.minecraft.entity.item.EntityItem; @@ -9,6 +11,7 @@ import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundEvent; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; @@ -19,21 +22,51 @@ public class GTFluidSyncHandler extends SyncHandler { - private static final int TRY_CLICK_CONTAINER = 1; - private static final int UPDATE_TANK = 2; + public static final int TRY_CLICK_CONTAINER = 1; + public static final int UPDATE_TANK = 2; + public static final int UPDATE_AMOUNT = 3; private final IFluidTank tank; + private FluidStack lastFluid; + private FluidStack lockedFluid; private boolean canDrainSlot = true; private boolean canFillSlot = true; + private boolean phantom; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; } + @Override + public void detectAndSendChanges(boolean init) { + var current = getFluid(); + if (current == null && lastFluid == null) return; + if (current == null || lastFluid == null || lastFluid.getFluid() != current.getFluid()) { + lastFluid = current == null ? null : current.copy(); + syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); + } else if (current.amount != lastFluid.amount) { + syncToClient(UPDATE_AMOUNT, buffer -> buffer.writeInt(current.amount)); + } + } + public FluidStack getFluid() { return this.tank.getFluid(); } + public void setFluid(FluidStack fluid) { + if (tank instanceof FluidTank fluidTank) { + fluidTank.setFluid(fluid); + } else { + tank.drain(Integer.MAX_VALUE, true); + tank.fill(fluid, true); + } + } + + public void setAmount(int amount) { + if (getFluid() == null) return; + getFluid().amount = amount; + } + public int getCapacity() { return this.tank.getCapacity(); } @@ -56,6 +89,15 @@ public boolean canFillSlot() { return this.canFillSlot; } + public GTFluidSyncHandler phantom(boolean phantom) { + this.phantom = phantom; + return this; + } + + public boolean isPhantom() { + return phantom; + } + public String getFormattedFluidAmount() { return String.format("%,d", tank.getFluid() == null ? 0 : tank.getFluid().amount); } @@ -68,17 +110,16 @@ public String getFluidLocalizedName() { public void readOnClient(int id, PacketBuffer buf) { switch (id) { case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); - case UPDATE_TANK -> { - tank.drain(Integer.MAX_VALUE, true); - tank.fill(NetworkUtils.readFluidStack(buf), true); - } + case UPDATE_TANK -> setFluid(NetworkUtils.readFluidStack(buf)); + case UPDATE_AMOUNT -> setAmount(buf.readInt()); } } @Override public void readOnServer(int id, PacketBuffer buf) { if (id == TRY_CLICK_CONTAINER) { - var stack = tryClickContainer(buf.readBoolean()); + var data = MouseData.readPacket(buf); + var stack = tryClickContainer(data.mouseButton == 0); if (!stack.isEmpty()) syncToClient(TRY_CLICK_CONTAINER, buffer -> NetworkUtils.writeItemStack(buffer, stack)); } @@ -162,27 +203,27 @@ private ItemStack drainTankIntoStack(IFluidHandlerItem fluidHandler, FluidStack ItemStack heldItem = getSyncManager().getCursorItem(); if (heldItem.isEmpty()) return ItemStack.EMPTY; - ItemStack fluidContainer = fluidHandler.getContainer(); + ItemStack fluidContainer = ItemStack.EMPTY; int filled = fluidHandler.fill(tankFluid, false); + int stored = tankFluid.amount; if (filled > 0) { fluidHandler.fill(tankFluid, true); tank.drain(filled, true); + fluidContainer = fluidHandler.getContainer(); if (tryFillAll) { // Determine how many more items we can fill. One item is already filled. // Integer division means it will round down, so it will only fill equivalent fluid amounts. // For example: // Click with 3 cells, with 2500L of fluid in the tank. // 2 cells will be filled, and 500L will be left behind in the tank. - int additional = Math.min(heldItem.getCount(), tankFluid.amount / filled) - 1; + int additional = Math.min(heldItem.getCount(), stored / filled) - 1; tank.drain(filled * additional, true); fluidContainer.grow(additional); } - fluidContainer = fluidHandler.getContainer(); replaceCursorItemStack(fluidContainer); playSound(tankFluid, false); - return fluidContainer; } - return ItemStack.EMPTY; + return fluidContainer; } /** diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index 5a90f5c760f..b8f58dfa844 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -6,9 +6,6 @@ import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableFluidTank; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.TankWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; @@ -19,7 +16,6 @@ import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index d61a03e8f24..1ea9063aba4 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -1,5 +1,9 @@ package gregtech.common.mui.widget; +import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; + +import com.cleanroommc.modularui.utils.MouseData; + import gregtech.api.GTValues; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.util.FluidTooltipUtil; @@ -28,7 +32,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public final class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider { +public final class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider, + JeiGhostIngredientSlot { private final TextRenderer textRenderer = new TextRenderer(); private GTFluidSyncHandler syncHandler; @@ -69,7 +74,7 @@ public void onInit() { } public GTFluidSlot syncHandler(IFluidTank fluidTank) { - return syncHandler(new GTFluidSyncHandler(fluidTank)); + return syncHandler(sync(fluidTank)); } public GTFluidSlot syncHandler(GTFluidSyncHandler syncHandler) { @@ -132,7 +137,8 @@ private String getBaseUnit() { @Override public Result onMouseTapped(int mouseButton) { if (this.syncHandler.canFillSlot() || this.syncHandler.canDrainSlot()) { - this.syncHandler.syncToServer(1, buffer -> buffer.writeBoolean(mouseButton == 0)); + var data = MouseData.create(mouseButton); + this.syncHandler.syncToServer(GTFluidSyncHandler.TRY_CLICK_CONTAINER, data::writeToPacket); Interactable.playButtonClickSound(); return Result.SUCCESS; } @@ -161,4 +167,14 @@ public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip to tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); } } + + @Override + public void setGhostIngredient(@NotNull FluidStack ingredient) { + this.syncHandler.setFluid(ingredient); + } + + @Override + public @Nullable FluidStack castGhostIngredientIfValid(@NotNull Object ingredient) { + return this.syncHandler.isPhantom() && ingredient instanceof FluidStack fluidStack ? fluidStack : null; + } } From 459be0cbe007fd0345e7775ba99ea05a790c7d86 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 21 Sep 2024 23:02:53 -0700 Subject: [PATCH 15/63] spotless --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 3 +-- src/main/java/gregtech/common/mui/widget/GTFluidSlot.java | 8 +++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 7532d41893d..3a53df370b2 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -1,7 +1,5 @@ package gregtech.api.mui.sync; -import com.cleanroommc.modularui.utils.MouseData; - import gregtech.api.util.GTUtility; import net.minecraft.entity.item.EntityItem; @@ -17,6 +15,7 @@ import net.minecraftforge.fluids.capability.IFluidHandlerItem; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 1ea9063aba4..3b14fbd3f08 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -1,9 +1,5 @@ package gregtech.common.mui.widget; -import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; - -import com.cleanroommc.modularui.utils.MouseData; - import gregtech.api.GTValues; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.util.FluidTooltipUtil; @@ -20,12 +16,14 @@ import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.utils.NumberFormat; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.Widget; @@ -33,7 +31,7 @@ import org.jetbrains.annotations.Nullable; public final class GTFluidSlot extends Widget implements Interactable, JeiIngredientProvider, - JeiGhostIngredientSlot { + JeiGhostIngredientSlot { private final TextRenderer textRenderer = new TextRenderer(); private GTFluidSyncHandler syncHandler; From 3c3f02946cbd6b5117479328c661b839990fbcd1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 26 Oct 2024 19:01:34 -0700 Subject: [PATCH 16/63] move FixedFluidSlotSH logic into GTFluidSyncHandler move showAmount to GTFluidSyncHandler use GTFluidSlot for SimpleFluidFilter --- .../api/mui/sync/FixedFluidSlotSH.java | 150 ------------------ .../api/mui/sync/GTFluidSyncHandler.java | 144 ++++++++++++++++- .../covers/filter/SimpleFluidFilter.java | 9 +- .../common/mui/widget/GTFluidSlot.java | 64 +++++--- 4 files changed, 189 insertions(+), 178 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/sync/FixedFluidSlotSH.java diff --git a/src/main/java/gregtech/api/mui/sync/FixedFluidSlotSH.java b/src/main/java/gregtech/api/mui/sync/FixedFluidSlotSH.java deleted file mode 100644 index bf3c6c581d7..00000000000 --- a/src/main/java/gregtech/api/mui/sync/FixedFluidSlotSH.java +++ /dev/null @@ -1,150 +0,0 @@ -package gregtech.api.mui.sync; - -import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandlerItem; - -import com.cleanroommc.modularui.utils.MouseData; -import com.cleanroommc.modularui.value.sync.FluidSlotSyncHandler; -import org.jetbrains.annotations.Nullable; - -public class FixedFluidSlotSH extends FluidSlotSyncHandler { - - @Nullable - private FluidStack lastStoredPhantomFluid; - - public FixedFluidSlotSH(IFluidTank fluidTank) { - super(fluidTank); - if (this.updateCacheFromSource(true) && fluidTank.getFluid() != null) { - this.lastStoredPhantomFluid = fluidTank.getFluid().copy(); - } - } - - @Override - public void readOnServer(int id, PacketBuffer buf) { - super.readOnServer(id, buf); - if (id == 0) { - var fluid = getFluidTank().getFluid(); - if (this.lastStoredPhantomFluid == null && fluid != null || - (this.lastStoredPhantomFluid != null && !this.lastStoredPhantomFluid.isFluidEqual(fluid))) { - this.lastStoredPhantomFluid = fluid; - } - } - } - - @Override - public void setValue(@Nullable FluidStack value, boolean setSource, boolean sync) { - super.setValue(value, setSource, sync); - if (setSource) { - this.getFluidTank().drain(Integer.MAX_VALUE, true); - if (!isFluidEmpty(value)) { - this.getFluidTank().fill(value.copy(), true); - } - } - } - - @Override - public void tryClickPhantom(MouseData mouseData) { - EntityPlayer player = getSyncManager().getPlayer(); - ItemStack currentStack = player.inventory.getItemStack(); - FluidStack currentFluid = this.getFluidTank().getFluid(); - IFluidHandlerItem fluidHandlerItem = currentStack - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); - - if (mouseData.mouseButton == 0) { - if (currentStack.isEmpty() || fluidHandlerItem == null) { - if (this.canDrainSlot()) { - this.getFluidTank().drain(mouseData.shift ? Integer.MAX_VALUE : 1000, true); - } - } else { - FluidStack cellFluid = fluidHandlerItem.drain(Integer.MAX_VALUE, false); - if ((this.controlsAmount() || currentFluid == null) && cellFluid != null) { - if (this.canFillSlot()) { - if (!this.controlsAmount()) { - cellFluid.amount = 1; - } - if (this.getFluidTank().fill(cellFluid, true) > 0) { - this.lastStoredPhantomFluid = cellFluid.copy(); - } - } - } else { - if (this.canDrainSlot()) { - this.getFluidTank().drain(mouseData.shift ? Integer.MAX_VALUE : 1000, true); - } - } - } - } else if (mouseData.mouseButton == 1) { - if (this.canFillSlot()) { - if (currentFluid != null) { - if (this.controlsAmount()) { - FluidStack toFill = currentFluid.copy(); - toFill.amount = 1000; - this.getFluidTank().fill(toFill, true); - } - } else if (this.lastStoredPhantomFluid != null) { - FluidStack toFill = this.lastStoredPhantomFluid.copy(); - toFill.amount = this.controlsAmount() ? 1 : toFill.amount; - this.getFluidTank().fill(toFill, true); - } - } - } else if (mouseData.mouseButton == 2 && currentFluid != null && this.canDrainSlot()) { - this.getFluidTank().drain(mouseData.shift ? Integer.MAX_VALUE : 1000, true); - } - this.setValue(this.getFluidTank().getFluid(), false, true); - } - - @Override - public void tryScrollPhantom(MouseData mouseData) { - FluidStack currentFluid = this.getFluidTank().getFluid(); - int amount = mouseData.mouseButton; - if (!this.controlsAmount()) { - var fluid = getFluidTank().getFluid(); - int newAmt = amount == 1 ? 1 : 0; - if (fluid != null && fluid.amount != newAmt) { - fluid.amount = newAmt; - setValue(fluid, true, true); - return; - } - } - if (mouseData.shift) { - amount *= 10; - } - if (mouseData.ctrl) { - amount *= 100; - } - if (mouseData.alt) { - amount *= 1000; - } - if (currentFluid == null) { - if (amount > 0 && this.lastStoredPhantomFluid != null) { - FluidStack toFill = this.lastStoredPhantomFluid.copy(); - toFill.amount = this.controlsAmount() ? amount : 1; - this.getFluidTank().fill(toFill, true); - } - this.setValue(this.getFluidTank().getFluid(), false, true); - return; - } - if (amount > 0) { - FluidStack toFill = currentFluid.copy(); - toFill.amount = amount; - this.getFluidTank().fill(toFill, true); - } else if (amount < 0) { - this.getFluidTank().drain(-amount, true); - } - this.setValue(this.getFluidTank().getFluid(), false, true); - } - - @Override - public boolean controlsAmount() { - if (getFluidTank() instanceof SimpleFluidFilterReader.WritableFluidTank writableFluidTank) { - return writableFluidTank.showAmount(); - } - return super.controlsAmount(); - } -} diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 3a53df370b2..5bdc9c0a849 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -12,9 +12,11 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; +import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.utils.FluidTankHandler; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; @@ -24,16 +26,22 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int TRY_CLICK_CONTAINER = 1; public static final int UPDATE_TANK = 2; public static final int UPDATE_AMOUNT = 3; + public static final int PHANTOM_SCROLL = 4; + public static final int LOCK_FLUID = 5; private final IFluidTank tank; + private final IFluidHandler handler; private FluidStack lastFluid; private FluidStack lockedFluid; + private FluidStack phantomFluid; private boolean canDrainSlot = true; private boolean canFillSlot = true; private boolean phantom; + private boolean showAmount = true; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; + this.handler = FluidTankHandler.getTankFluidHandler(tank); } @Override @@ -59,6 +67,15 @@ public void setFluid(FluidStack fluid) { tank.drain(Integer.MAX_VALUE, true); tank.fill(fluid, true); } + if (!isPhantom() || fluid == null) return; + if (this.phantomFluid == null || this.phantomFluid.getFluid() != fluid.getFluid()) { + this.phantomFluid = fluid; + } + } + + public void lockFluid(FluidStack fluid) { + this.lockedFluid = fluid; + sync(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, fluid)); } public void setAmount(int amount) { @@ -90,6 +107,8 @@ public boolean canFillSlot() { public GTFluidSyncHandler phantom(boolean phantom) { this.phantom = phantom; + if (phantom && this.tank.getFluid() != null) + this.phantomFluid = this.tank.getFluid().copy(); return this; } @@ -97,6 +116,15 @@ public boolean isPhantom() { return phantom; } + public GTFluidSyncHandler showAmount(boolean showAmount) { + this.showAmount = showAmount; + return this; + } + + public boolean showAmount() { + return this.showAmount; + } + public String getFormattedFluidAmount() { return String.format("%,d", tank.getFluid() == null ? 0 : tank.getFluid().amount); } @@ -111,16 +139,122 @@ public void readOnClient(int id, PacketBuffer buf) { case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); case UPDATE_TANK -> setFluid(NetworkUtils.readFluidStack(buf)); case UPDATE_AMOUNT -> setAmount(buf.readInt()); + case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf)); } } @Override public void readOnServer(int id, PacketBuffer buf) { - if (id == TRY_CLICK_CONTAINER) { - var data = MouseData.readPacket(buf); - var stack = tryClickContainer(data.mouseButton == 0); - if (!stack.isEmpty()) - syncToClient(TRY_CLICK_CONTAINER, buffer -> NetworkUtils.writeItemStack(buffer, stack)); + switch (id) { + case TRY_CLICK_CONTAINER -> { + var data = MouseData.readPacket(buf); + if (isPhantom()) { + tryClickPhantom(data); + } else { + var stack = tryClickContainer(data.mouseButton == 0); + if (!stack.isEmpty()) + syncToClient(TRY_CLICK_CONTAINER, buffer -> NetworkUtils.writeItemStack(buffer, stack)); + } + } + case UPDATE_TANK -> { + var fluid = NetworkUtils.readFluidStack(buf); + setFluid(fluid); + } + case PHANTOM_SCROLL -> tryScrollPhantom(MouseData.readPacket(buf)); + case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf)); + } + } + + public void tryClickPhantom(MouseData data) { + EntityPlayer player = getSyncManager().getPlayer(); + ItemStack currentStack = player.inventory.getItemStack(); + FluidStack currentFluid = this.tank.getFluid(); + if (currentStack.getCount() > 1) currentStack = GTUtility.copy(1, currentStack); + IFluidHandlerItem fluidHandlerItem = currentStack + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + + switch (data.mouseButton) { + case 0 -> { + if (currentStack.isEmpty() || fluidHandlerItem == null) { + if (this.canDrainSlot()) { + this.tank.drain(data.shift ? Integer.MAX_VALUE : 1000, true); + } + } else { + FluidStack cellFluid = fluidHandlerItem.drain(Integer.MAX_VALUE, false); + if ((this.showAmount || currentFluid == null) && cellFluid != null) { + if (this.canFillSlot()) { + if (!this.showAmount) { + cellFluid.amount = 1; + } + if (this.tank.fill(cellFluid, true) > 0) { + this.phantomFluid = cellFluid.copy(); + } + } + } else { + if (this.canDrainSlot()) { + this.tank.drain(data.shift ? Integer.MAX_VALUE : 1000, true); + } + } + } + } + case 1 -> { + if (this.canFillSlot()) { + if (currentFluid != null) { + if (this.showAmount) { + FluidStack toFill = currentFluid.copy(); + toFill.amount = 1000; + this.tank.fill(toFill, true); + } + } else if (this.phantomFluid != null) { + FluidStack toFill = this.phantomFluid.copy(); + toFill.amount = this.showAmount ? 1 : toFill.amount; + this.tank.fill(toFill, true); + } + } + } + case 2 -> { + if (currentFluid != null && canDrainSlot()) + this.tank.drain(data.shift ? Integer.MAX_VALUE : 1000, true); + } + } + } + + public void tryScrollPhantom(MouseData mouseData) { + FluidStack currentFluid = this.tank.getFluid(); + int amount = mouseData.mouseButton; + if (!this.showAmount()) { + int newAmt = amount == 1 ? 1 : 0; + if (newAmt == 0) { + setFluid(null); + return; + } else if (currentFluid != null && currentFluid.amount != newAmt) { + setAmount(newAmt); + return; + } + } + if (mouseData.shift) { + amount *= 10; + } + if (mouseData.ctrl) { + amount *= 100; + } + if (mouseData.alt) { + amount *= 1000; + } + if (currentFluid == null) { + if (amount > 0 && this.phantomFluid != null) { + FluidStack toFill = this.phantomFluid.copy(); + toFill.amount = this.showAmount() ? amount : 1; + this.tank.fill(toFill, true); + } + return; + } + if (amount > 0) { + FluidStack toFill = currentFluid.copy(); + toFill.amount = amount; + this.tank.fill(toFill, true); + } else if (amount < 0) { + this.tank.drain(-amount, true); } } diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index 68997d3ee14..53f46254cdf 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -2,8 +2,8 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.FixedFluidSlotSH; import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -11,7 +11,6 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.FluidSlot; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; @@ -58,8 +57,10 @@ public void configureFilterTanks(int amount) { .matrix("FFF", "FFF", "FFF") - .key('F', i -> new FluidSlot() - .syncHandler(new FixedFluidSlotSH(filterReader.getFluidTank(i)).phantom(true))) + .key('F', i -> new GTFluidSlot() + .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) + .phantom(true) + .showAmount(false))) .build().marginRight(4)) .child(createBlacklistUI()); } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 3b14fbd3f08..488e7550b9f 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -3,13 +3,16 @@ import gregtech.api.GTValues; import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.util.FluidTooltipUtil; +import gregtech.api.util.GTUtility; import gregtech.api.util.LocalizationUtils; import gregtech.client.utils.TooltipHelper; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.item.ItemStack; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IKey; @@ -18,6 +21,8 @@ import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.integration.jei.JeiGhostIngredientSlot; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -35,9 +40,7 @@ public final class GTFluidSlot extends Widget implements Interactab private final TextRenderer textRenderer = new TextRenderer(); private GTFluidSyncHandler syncHandler; - private boolean showAmount = true; private boolean disableBackground = false; - // todo phantom public GTFluidSlot() { tooltip().setAutoUpdate(true); @@ -48,7 +51,8 @@ public GTFluidSlot() { if (fluid == null) return; tooltip.add(fluid.getLocalizedName()).newLine(); - tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); + if (this.syncHandler.showAmount()) + tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); // Add various tooltips from the material for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { @@ -56,7 +60,8 @@ public GTFluidSlot() { tooltip.add(s).newLine(); } - addIngotMolFluidTooltip(fluid, tooltip); + if (this.syncHandler.showAmount()) + addIngotMolFluidTooltip(fluid, tooltip); }); } @@ -69,6 +74,7 @@ public void onInit() { this.textRenderer.setShadow(true); this.textRenderer.setScale(0.5f); this.textRenderer.setColor(Color.WHITE.main); + getContext().getJeiSettings().addJeiGhostIngredientSlot(this); } public GTFluidSlot syncHandler(IFluidTank fluidTank) { @@ -81,11 +87,6 @@ public GTFluidSlot syncHandler(GTFluidSyncHandler syncHandler) { return this; } - public GTFluidSlot showAmount(boolean showAmount) { - this.showAmount = showAmount; - return this; - } - public GTFluidSlot disableBackground() { this.disableBackground = true; return this; @@ -108,7 +109,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); - if (content != null && showAmount) { + if (content != null && this.syncHandler.showAmount()) { String s = NumberFormat.formatWithMaxDigits(getBaseUnitAmount(content.amount)) + getBaseUnit(); this.textRenderer.setAlignment(Alignment.CenterRight, getArea().width - 1f); this.textRenderer.setPos(0, 12); @@ -131,11 +132,10 @@ private String getBaseUnit() { return "kL"; } - @NotNull @Override - public Result onMouseTapped(int mouseButton) { + public @NotNull Result onMousePressed(int mouseButton) { + var data = MouseData.create(mouseButton); if (this.syncHandler.canFillSlot() || this.syncHandler.canDrainSlot()) { - var data = MouseData.create(mouseButton); this.syncHandler.syncToServer(GTFluidSyncHandler.TRY_CLICK_CONTAINER, data::writeToPacket); Interactable.playButtonClickSound(); return Result.SUCCESS; @@ -144,13 +144,20 @@ public Result onMouseTapped(int mouseButton) { } @Override - protected WidgetTheme getWidgetThemeInternal(ITheme theme) { - return theme.getFluidSlotTheme(); + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) { + if (!this.syncHandler.isPhantom()) return false; + if ((scrollDirection.isUp() && !this.syncHandler.canFillSlot()) || + (scrollDirection.isDown() && !this.syncHandler.canDrainSlot())) { + return false; + } + MouseData mouseData = MouseData.create(scrollDirection.modifier); + this.syncHandler.syncToServer(GTFluidSyncHandler.PHANTOM_SCROLL, mouseData::writeToPacket); + return true; } @Override - public @Nullable Object getIngredient() { - return this.syncHandler.getFluid(); + protected WidgetTheme getWidgetThemeInternal(ITheme theme) { + return theme.getFluidSlotTheme(); } public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip tooltip) { @@ -168,11 +175,30 @@ public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip to @Override public void setGhostIngredient(@NotNull FluidStack ingredient) { - this.syncHandler.setFluid(ingredient); + if (this.syncHandler.isPhantom()) { + this.syncHandler.setFluid(ingredient); + this.syncHandler.syncToServer(GTFluidSyncHandler.UPDATE_TANK, + buffer -> NetworkUtils.writeFluidStack(buffer, ingredient)); + } else { + this.syncHandler.lockFluid(ingredient); + } } @Override public @Nullable FluidStack castGhostIngredientIfValid(@NotNull Object ingredient) { - return this.syncHandler.isPhantom() && ingredient instanceof FluidStack fluidStack ? fluidStack : null; + if (ingredient instanceof FluidStack stack) { + return stack; + } else if (ingredient instanceof ItemStack stack && + stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null)) { + var handler = GTUtility.copy(1, stack) + .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + return handler == null ? null : handler.drain(Integer.MAX_VALUE, true); + } + return null; + } + + @Override + public @Nullable Object getIngredient() { + return this.syncHandler.getFluid(); } } From 372f0339e4c0d9a27d6af0a854cfb832e584c40b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 27 Oct 2024 17:18:05 -0700 Subject: [PATCH 17/63] try to implement locking fluid to GTFluidSyncHandler port and utilize it in MetaTileEntityFluidHatch --- .../api/mui/sync/GTFluidSyncHandler.java | 73 +++++++------ .../MetaTileEntityFluidHatch.java | 102 ++++++++++++++++++ 2 files changed, 143 insertions(+), 32 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 5bdc9c0a849..ff9a82232b2 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -12,15 +12,15 @@ import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.utils.FluidTankHandler; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; +import java.util.function.Consumer; + public class GTFluidSyncHandler extends SyncHandler { public static final int TRY_CLICK_CONTAINER = 1; @@ -30,9 +30,8 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int LOCK_FLUID = 5; private final IFluidTank tank; - private final IFluidHandler handler; + private Consumer onLocked; private FluidStack lastFluid; - private FluidStack lockedFluid; private FluidStack phantomFluid; private boolean canDrainSlot = true; private boolean canFillSlot = true; @@ -41,7 +40,6 @@ public class GTFluidSyncHandler extends SyncHandler { public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; - this.handler = FluidTankHandler.getTankFluidHandler(tank); } @Override @@ -56,7 +54,22 @@ public void detectAndSendChanges(boolean init) { } } + public void lockFluid(FluidStack stack) { + if (getFluid() != null && getFluid().amount != 0) return; + this.onLocked.accept(stack); + this.phantomFluid = stack; + syncToServer(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, stack)); + } + + public GTFluidSyncHandler onLockFluid(Consumer onLocked) { + this.onLocked = onLocked; + return this; + } + public FluidStack getFluid() { + if (this.tank.getFluid() == null) + return phantomFluid; + return this.tank.getFluid(); } @@ -73,11 +86,6 @@ public void setFluid(FluidStack fluid) { } } - public void lockFluid(FluidStack fluid) { - this.lockedFluid = fluid; - sync(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, fluid)); - } - public void setAmount(int amount) { if (getFluid() == null) return; getFluid().amount = amount; @@ -122,15 +130,17 @@ public GTFluidSyncHandler showAmount(boolean showAmount) { } public boolean showAmount() { + if (!isPhantom() && phantomFluid != null) + return false; return this.showAmount; } - public String getFormattedFluidAmount() { + public @NotNull String getFormattedFluidAmount() { return String.format("%,d", tank.getFluid() == null ? 0 : tank.getFluid().amount); } - public String getFluidLocalizedName() { - return tank.getFluid() == null ? "" : tank.getFluid().getLocalizedName(); + public @NotNull String getFluidLocalizedName() { + return tank.getFluid() == null ? "Empty" : tank.getFluid().getLocalizedName(); } @Override @@ -139,29 +149,29 @@ public void readOnClient(int id, PacketBuffer buf) { case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); case UPDATE_TANK -> setFluid(NetworkUtils.readFluidStack(buf)); case UPDATE_AMOUNT -> setAmount(buf.readInt()); - case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf)); } } @Override public void readOnServer(int id, PacketBuffer buf) { - switch (id) { - case TRY_CLICK_CONTAINER -> { - var data = MouseData.readPacket(buf); - if (isPhantom()) { - tryClickPhantom(data); - } else { - var stack = tryClickContainer(data.mouseButton == 0); - if (!stack.isEmpty()) - syncToClient(TRY_CLICK_CONTAINER, buffer -> NetworkUtils.writeItemStack(buffer, stack)); - } - } - case UPDATE_TANK -> { - var fluid = NetworkUtils.readFluidStack(buf); - setFluid(fluid); + if (id == TRY_CLICK_CONTAINER) { + var data = MouseData.readPacket(buf); + if (isPhantom()) { + tryClickPhantom(data); + } else { + var stack = tryClickContainer(data.mouseButton == 0); + if (!stack.isEmpty()) + syncToClient(TRY_CLICK_CONTAINER, buffer -> NetworkUtils.writeItemStack(buffer, stack)); } - case PHANTOM_SCROLL -> tryScrollPhantom(MouseData.readPacket(buf)); - case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf)); + } else if (id == UPDATE_TANK) { + var fluid = NetworkUtils.readFluidStack(buf); + setFluid(fluid); + } else if (id == PHANTOM_SCROLL) { + tryScrollPhantom(MouseData.readPacket(buf)); + } else if (id == LOCK_FLUID) { + var f = NetworkUtils.readFluidStack(buf); + this.onLocked.accept(f); + this.phantomFluid = f; } } @@ -226,11 +236,10 @@ public void tryScrollPhantom(MouseData mouseData) { int newAmt = amount == 1 ? 1 : 0; if (newAmt == 0) { setFluid(null); - return; } else if (currentFluid != null && currentFluid.amount != newAmt) { setAmount(newAmt); - return; } + return; } if (mouseData.shift) { amount *= 10; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 8cf7c4f2e6a..eae44485dfe 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -13,10 +13,14 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -38,11 +42,22 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ItemSlot; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.function.Consumer; +import java.util.function.Supplier; public class MetaTileEntityFluidHatch extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart, IControllable { @@ -216,6 +231,85 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { return createTankUI(fluidTank, getMetaFullName(), entityPlayer).build(getHolder(), entityPlayer); } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + var fluidSyncHandler = GTFluidSlot.sync(fluidTank) + .showAmount(false) + .onLockFluid(stack -> { + if (!isExportHatch) return; + + if (stack == null) { + this.setLocked(false); + this.lockedFluid = null; + } else { + this.setLocked(true); + this.lockedFluid = stack.copy(); + this.lockedFluid.amount = 1; + } + }); + + return GTGuis.createPanel(this, 176, 166) + .child(IKey.lang(getMetaFullName()).asWidget().pos(6, 6)) + + // export specific + .childIf(isExportHatch, new ItemSlot() + .pos(90, 44) + .background(GTGuiTextures.SLOT, GTGuiTextures.OUT_SLOT_OVERLAY) + .slot(new ModularSlot(exportItems, 0) + .accessibility(false, true))) + .childIf(isExportHatch, new ToggleButton() + .pos(7, 64) + .value(new BooleanSyncValue(this::isLocked, this::setLocked)) + .addTooltipElement(IKey.lang("gregtech.gui.fluid_lock.tooltip"))) + + // import specific + .childIf(!isExportHatch, GTGuiTextures.TANK_ICON.asWidget() + .pos(91, 36) + .size(14, 15)) + .childIf(!isExportHatch, new ItemSlot() + .pos(90, 53) + .slot(new ModularSlot(exportItems, 0) + .accessibility(false, true))) + + // common ui + .child(Flow.column() + .crossAxisAlignment(Alignment.CrossAxis.START) + .size(81, isExportHatch ? 46 : 55) + .padding(3, 4) + .background(GTGuiTextures.DISPLAY) + .pos(7, 16) + .child(IKey.lang("gregtech.gui.fluid_amount").asWidget() + .widthRel(1f) + .height(10)) + // IKey's do not like empty strings... + .child(IKey.dynamic(getFluidName(fluidSyncHandler)) + .asWidget() + .widthRel(1f) + .setEnabledIf(textWidget -> fluidSyncHandler.getFluid() != null) + .height(10)) + .child(IKey.dynamic(fluidSyncHandler::getFormattedFluidAmount) + .asWidget() + .setEnabledIf(textWidget -> fluidSyncHandler.showAmount()) + .widthRel(1f) + .height(10))) + .child(new GTFluidSlot() + .pos(69, 43) + .size(18) + .syncHandler(fluidSyncHandler)) + .child(new ItemSlot() + .pos(90, 16) + .background(GTGuiTextures.SLOT, GTGuiTextures.IN_SLOT_OVERLAY) + .slot(new ModularSlot(importItems, 0) + .accessibility(true, true) + .filter(stack -> fluidSyncHandler.getFluid() != null))) + .bindPlayerInventory(); + } + public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, EntityPlayer entityPlayer) { // Create base builder/widget references Builder builder = ModularUI.defaultBuilder(); @@ -268,6 +362,14 @@ public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, Entity .bindPlayerInventory(entityPlayer.inventory); } + private Supplier getFluidName(GTFluidSyncHandler syncHandler) { + return () -> { + if (syncHandler.getFluid() == null && lockedFluid != null) + return lockedFluid.getLocalizedName(); + return syncHandler.getFluidLocalizedName(); + }; + } + protected Consumer> getFluidNameText(TankWidget tankWidget) { return (list) -> { TextComponentTranslation translation = tankWidget.getFluidTextComponent(); From f53ef3e79f7384d6335198576c195ffbeb3c4d3e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:12:10 -0700 Subject: [PATCH 18/63] locking works now various fixes/improvements to MetaTileEntityFluidHatch --- .../api/mui/sync/GTFluidSyncHandler.java | 46 ++++++++++++++----- .../MetaTileEntityFluidHatch.java | 31 ++++++++++--- .../common/mui/widget/GTFluidSlot.java | 24 ++++++++-- 3 files changed, 78 insertions(+), 23 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index ff9a82232b2..216d9ada5ea 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -10,8 +10,8 @@ import net.minecraft.util.SoundEvent; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import com.cleanroommc.modularui.network.NetworkUtils; @@ -55,10 +55,10 @@ public void detectAndSendChanges(boolean init) { } public void lockFluid(FluidStack stack) { - if (getFluid() != null && getFluid().amount != 0) return; - this.onLocked.accept(stack); - this.phantomFluid = stack; - syncToServer(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, stack)); + final var f = stack != null && stack.amount < 1 ? null : stack; + this.onLocked.accept(f); + this.phantomFluid = f; + syncToServer(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, f)); } public GTFluidSyncHandler onLockFluid(Consumer onLocked) { @@ -67,9 +67,6 @@ public GTFluidSyncHandler onLockFluid(Consumer onLocked) { } public FluidStack getFluid() { - if (this.tank.getFluid() == null) - return phantomFluid; - return this.tank.getFluid(); } @@ -180,8 +177,7 @@ public void tryClickPhantom(MouseData data) { ItemStack currentStack = player.inventory.getItemStack(); FluidStack currentFluid = this.tank.getFluid(); if (currentStack.getCount() > 1) currentStack = GTUtility.copy(1, currentStack); - IFluidHandlerItem fluidHandlerItem = currentStack - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + var fluidHandlerItem = FluidUtil.getFluidHandler(currentStack); switch (data.mouseButton) { case 0 -> { @@ -273,8 +269,7 @@ public ItemStack tryClickContainer(boolean tryFillAll) { return ItemStack.EMPTY; ItemStack useStack = GTUtility.copy(1, playerHeldStack); - IFluidHandlerItem fluidHandlerItem = useStack - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + var fluidHandlerItem = FluidUtil.getFluidHandler(useStack); if (fluidHandlerItem == null) return ItemStack.EMPTY; FluidStack tankFluid = tank.getFluid(); @@ -422,4 +417,31 @@ private void playSound(FluidStack fluid, boolean fill) { player.world.playSound(null, player.posX, player.posY + 0.5, player.posZ, soundEvent, SoundCategory.PLAYERS, 1.0F, 1.0F); } + + public FluidStack getPhantomFluid() { + return isPhantom() ? phantomFluid : null; + } + + public FluidStack getLockedFluid() { + return !isPhantom() ? phantomFluid : null; + } + + public boolean canLockFluid() { + return onLocked != null; + } + + public void toggleLockFluid() { + if (getLockedFluid() != null) { + lockFluid(null); + return; + } + var s = getSyncManager().getCursorItem(); + if (s.isEmpty()) return; + if (s.getCount() > 1) s = GTUtility.copy(1, s); + var h = FluidUtil.getFluidHandler(s); + if (h == null) return; + var f = h.getTankProperties()[0].getContents(); + if (f == null) return; + lockFluid(f.copy()); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index eae44485dfe..e826b2fefbb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -35,6 +35,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidUtil; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -240,6 +241,8 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) + .canDrainSlot(false) + .canFillSlot(false) .onLockFluid(stack -> { if (!isExportHatch) return; @@ -263,9 +266,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .slot(new ModularSlot(exportItems, 0) .accessibility(false, true))) .childIf(isExportHatch, new ToggleButton() - .pos(7, 64) + .pos(7, 63) + // todo lock overlay .value(new BooleanSyncValue(this::isLocked, this::setLocked)) - .addTooltipElement(IKey.lang("gregtech.gui.fluid_lock.tooltip"))) + // todo tooltip is not working for some reasone + .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.fluid_lock.tooltip")))) // import specific .childIf(!isExportHatch, GTGuiTextures.TANK_ICON.asWidget() @@ -273,6 +278,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .size(14, 15)) .childIf(!isExportHatch, new ItemSlot() .pos(90, 53) + .background(GTGuiTextures.SLOT, GTGuiTextures.OUT_SLOT_OVERLAY) .slot(new ModularSlot(exportItems, 0) .accessibility(false, true))) @@ -290,23 +296,34 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .child(IKey.dynamic(getFluidName(fluidSyncHandler)) .asWidget() .widthRel(1f) - .setEnabledIf(textWidget -> fluidSyncHandler.getFluid() != null) + .setEnabledIf(textWidget -> { + var tank = fluidSyncHandler.getFluid(); + if (tank == null) tank = fluidSyncHandler.getLockedFluid(); + return tank != null; + }) .height(10)) .child(IKey.dynamic(fluidSyncHandler::getFormattedFluidAmount) .asWidget() - .setEnabledIf(textWidget -> fluidSyncHandler.showAmount()) + .setEnabledIf(textWidget -> fluidSyncHandler.getFluid() != null) .widthRel(1f) .height(10))) .child(new GTFluidSlot() - .pos(69, 43) + .disableBackground() + .pos(69, isExportHatch ? 43 : 52) .size(18) .syncHandler(fluidSyncHandler)) .child(new ItemSlot() .pos(90, 16) .background(GTGuiTextures.SLOT, GTGuiTextures.IN_SLOT_OVERLAY) .slot(new ModularSlot(importItems, 0) - .accessibility(true, true) - .filter(stack -> fluidSyncHandler.getFluid() != null))) + .singletonSlotGroup() + .filter(stack -> { + if (!isExportHatch) return true; + var h = FluidUtil.getFluidHandler(stack); + if (h == null) return false; + return h.getTankProperties()[0].getContents() == null; + }) + .accessibility(true, true))) .bindPlayerInventory(); } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 488e7550b9f..bacb7a2e706 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -25,6 +25,7 @@ import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; @@ -106,6 +107,8 @@ public void drawBackground(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); + if (content == null) + content = this.syncHandler.getLockedFluid(); GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); @@ -118,8 +121,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (isHovering()) { GlStateManager.colorMask(true, true, true, false); - GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, - getWidgetTheme(context.getTheme()).getColor()); + GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, getSlotHoverColor()); GlStateManager.colorMask(true, true, true, true); } } @@ -139,6 +141,11 @@ private String getBaseUnit() { this.syncHandler.syncToServer(GTFluidSyncHandler.TRY_CLICK_CONTAINER, data::writeToPacket); Interactable.playButtonClickSound(); return Result.SUCCESS; + + } else if (this.syncHandler.canLockFluid()) { + this.syncHandler.toggleLockFluid(); + Interactable.playButtonClickSound(); + return Result.SUCCESS; } return Result.IGNORE; } @@ -160,6 +167,14 @@ protected WidgetTheme getWidgetThemeInternal(ITheme theme) { return theme.getFluidSlotTheme(); } + public int getSlotHoverColor() { + WidgetTheme theme = getWidgetTheme(getContext().getTheme()); + if (theme instanceof WidgetSlotTheme slotTheme) { + return slotTheme.getSlotHoverColor(); + } + return ITheme.getDefault().getFluidSlotTheme().getSlotHoverColor(); + } + public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip tooltip) { // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { @@ -190,8 +205,9 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { return stack; } else if (ingredient instanceof ItemStack stack && stack.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null)) { - var handler = GTUtility.copy(1, stack) - .getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); + if (stack.getCount() > 1) stack = GTUtility.copy(1, stack); + + var handler = stack.getCapability(CapabilityFluidHandler.FLUID_HANDLER_ITEM_CAPABILITY, null); return handler == null ? null : handler.drain(Integer.MAX_VALUE, true); } return null; From 8104b03c303dd9ddc30f05e8b5d21a8ec8687ffa Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 28 Oct 2024 20:11:41 -0700 Subject: [PATCH 19/63] simplify accessibility --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 10 +++------- .../common/covers/ender/CoverEnderFluidLink.java | 3 +-- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 5 ++--- .../multiblockpart/MetaTileEntityMultiFluidHatch.java | 3 +-- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 216d9ada5ea..cbf761eab58 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -92,8 +92,9 @@ public int getCapacity() { return this.tank.getCapacity(); } - public GTFluidSyncHandler canDrainSlot(boolean canDrainSlot) { - this.canDrainSlot = canDrainSlot; + public GTFluidSyncHandler accessibility(boolean canDrain, boolean canFill) { + this.canDrainSlot = canDrain; + this.canFillSlot = canFill; return this; } @@ -101,11 +102,6 @@ public boolean canDrainSlot() { return this.canDrainSlot; } - public GTFluidSyncHandler canFillSlot(boolean canFillSlot) { - this.canFillSlot = canFillSlot; - return this; - } - public boolean canFillSlot() { return this.canFillSlot; } diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index a5638561fa2..4c373dfd41c 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -120,8 +120,7 @@ public CoverPump.PumpMode getPumpMode() { @Override protected IWidget createSlotWidget(VirtualTank entry) { var fluidTank = GTFluidSlot.sync(entry) - .canFillSlot(false) - .canDrainSlot(false); + .accessibility(false, false); return new GTFluidSlot() .size(18) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index e826b2fefbb..84946ccbff7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -241,8 +241,7 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) - .canDrainSlot(false) - .canFillSlot(false) + .accessibility(false, false) .onLockFluid(stack -> { if (!isExportHatch) return; @@ -269,7 +268,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .pos(7, 63) // todo lock overlay .value(new BooleanSyncValue(this::isLocked, this::setLocked)) - // todo tooltip is not working for some reasone + // todo tooltip is not working for some reason, fixed in rc3 .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.fluid_lock.tooltip")))) // import specific diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index b8f58dfa844..6ac0ad4ee05 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -223,8 +223,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .top(17) .mapTo(rowSize, fluidSlots, (i, slot) -> slot.syncHandler(GTFluidSlot.sync(fluidTankList.getTankAt(i)) - .canDrainSlot(true) - .canFillSlot(!isExportHatch))) + .accessibility(true, !isExportHatch))) .coverChildren()) .bindPlayerInventory(); } From a2f7b93e61b21c2988652b4c34d885fb3518f643 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 29 Oct 2024 15:22:04 -0700 Subject: [PATCH 20/63] no longer necessary --- src/main/java/gregtech/common/covers/CoverConveyor.java | 1 - src/main/java/gregtech/common/covers/CoverPump.java | 7 +------ .../common/covers/ender/CoverAbstractEnderLink.java | 1 + .../gregtech/common/covers/filter/BaseFilterContainer.java | 5 +---- 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 36ca9521035..1fa4e43dffe 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -525,7 +525,6 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana this::getConveyorMode, this::setConveyorMode); IntSyncValue throughput = new IntSyncValue(this::getTransferRate, this::setTransferRate); - throughput.updateCacheFromSource(true); StringSyncValue formattedThroughput = new StringSyncValue(throughput::getStringValue, throughput::setStringValue); diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 2da916c3c44..7cc596eb1b9 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -203,18 +203,13 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { var manualIOmode = new EnumSyncValue<>(ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode); - manualIOmode.updateCacheFromSource(true); var throughput = new IntSyncValue(this::getTransferRate, this::setTransferRate); - throughput.updateCacheFromSource(true); var throughputString = new StringSyncValue( - throughput::getStringValue, - throughput::setStringValue); - throughputString.updateCacheFromSource(true); + throughput::getStringValue, throughput::setStringValue); var pumpMode = new EnumSyncValue<>(PumpMode.class, this::getPumpMode, this::setPumpMode); - pumpMode.updateCacheFromSource(true); syncManager.syncValue("manual_io", manualIOmode); syncManager.syncValue("pump_mode", pumpMode); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 1c1c782d751..cd4b661b4a0 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -149,6 +149,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { var name = new StringSyncValue(this::getColorStr, this::updateColor); + // todo unneeded cast in mui2 rc3 var entrySelectorSH = (PanelSyncHandler) syncManager.panel("entry_selector", entrySelector(getType()), true); return Flow.column().coverChildrenHeight().top(24) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index f545f37b16b..7bb6c7473e3 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -219,9 +219,6 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { return filter.createPopupPanel(syncManager); }, true); - var filterButton = new ButtonWidget<>(); - filterButton.setEnabled(hasFilter()); - return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() @@ -235,7 +232,7 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { })) .size(18).marginRight(2) .background(GTGuiTextures.SLOT, GTGuiTextures.FILTER_SLOT_OVERLAY.asIcon().size(16))) - .child(filterButton + .child(new ButtonWidget<>() .background(GTGuiTextures.MC_BUTTON, GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .hoverBackground(GuiTextures.MC_BUTTON_HOVERED, GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) From cf0d22bd638f43f6531a937b1e8d4c0a62bffe62 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 29 Oct 2024 15:22:18 -0700 Subject: [PATCH 21/63] delete old mui code --- .../MetaTileEntityFluidHatch.java | 101 +----------------- 1 file changed, 1 insertion(+), 100 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 84946ccbff7..a4994e45f1b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -4,9 +4,6 @@ import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableFluidTank; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.ModularUI.Builder; import gregtech.api.gui.widgets.*; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -16,22 +13,17 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.mui.sync.GTFluidSyncHandler; -import gregtech.api.util.GTUtility; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; @@ -57,7 +49,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.function.Consumer; import java.util.function.Supplier; public class MetaTileEntityFluidHatch extends MetaTileEntityMultiblockNotifiablePart @@ -227,11 +218,6 @@ public void registerAbilities(List abilityList) { abilityList.add(fluidTank); } - @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return createTankUI(fluidTank, getMetaFullName(), entityPlayer).build(getHolder(), entityPlayer); - } - @Override public boolean usesMui2() { return true; @@ -326,59 +312,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .bindPlayerInventory(); } - public ModularUI.Builder createTankUI(IFluidTank fluidTank, String title, EntityPlayer entityPlayer) { - // Create base builder/widget references - Builder builder = ModularUI.defaultBuilder(); - TankWidget tankWidget; - - // Add input/output-specific widgets - if (isExportHatch) { - tankWidget = new PhantomTankWidget(fluidTank, 69, 43, 18, 18, - () -> this.lockedFluid, - f -> { - if (this.fluidTank.getFluidAmount() != 0) { - return; - } - if (f == null) { - this.setLocked(false); - this.lockedFluid = null; - } else { - this.setLocked(true); - this.lockedFluid = f.copy(); - this.lockedFluid.amount = 1; - } - }) - .setAlwaysShowFull(true).setDrawHoveringText(false); - - builder.image(7, 16, 81, 46, GuiTextures.DISPLAY) - .widget(new SlotWidget(exportItems, 0, 90, 44, true, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.OUT_SLOT_OVERLAY)) - .widget(new ToggleButtonWidget(7, 64, 18, 18, - GuiTextures.BUTTON_LOCK, this::isLocked, this::setLocked) - .setTooltipText("gregtech.gui.fluid_lock.tooltip") - .shouldUseBaseBackground()); - } else { - tankWidget = new TankWidget(fluidTank, 69, 52, 18, 18) - .setAlwaysShowFull(true).setDrawHoveringText(false); - - builder.image(7, 16, 81, 55, GuiTextures.DISPLAY) - .widget(new ImageWidget(91, 36, 14, 15, GuiTextures.TANK_ICON)) - .widget(new SlotWidget(exportItems, 0, 90, 53, true, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.OUT_SLOT_OVERLAY)); - } - - // Add general widgets - return builder.label(6, 6, title) - .label(11, 20, "gregtech.gui.fluid_amount", 0xFFFFFF) - .widget(new AdvancedTextWidget(11, 30, getFluidAmountText(tankWidget), 0xFFFFFF)) - .widget(new AdvancedTextWidget(11, 40, getFluidNameText(tankWidget), 0xFFFFFF)) - .widget(tankWidget) - .widget(new FluidContainerSlotWidget(importItems, 0, 90, 16, false) - .setBackgroundTexture(GuiTextures.SLOT, GuiTextures.IN_SLOT_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory); - } - - private Supplier getFluidName(GTFluidSyncHandler syncHandler) { + protected Supplier getFluidName(GTFluidSyncHandler syncHandler) { return () -> { if (syncHandler.getFluid() == null && lockedFluid != null) return lockedFluid.getLocalizedName(); @@ -386,39 +320,6 @@ private Supplier getFluidName(GTFluidSyncHandler syncHandler) { }; } - protected Consumer> getFluidNameText(TankWidget tankWidget) { - return (list) -> { - TextComponentTranslation translation = tankWidget.getFluidTextComponent(); - // If there is no fluid in the tank, but there is a locked fluid - if (translation == null) { - translation = GTUtility.getFluidTranslation(this.lockedFluid); - } - - if (translation != null) { - list.add(translation); - } - }; - } - - protected Consumer> getFluidAmountText(TankWidget tankWidget) { - return (list) -> { - String fluidAmount = ""; - - // Nothing in the tank - if (tankWidget.getFormattedFluidAmount().equals("0")) { - // Display Zero to show information about the locked fluid - if (this.lockedFluid != null) { - fluidAmount = "0"; - } - } else { - fluidAmount = tankWidget.getFormattedFluidAmount(); - } - if (!fluidAmount.isEmpty()) { - list.add(new TextComponentString(fluidAmount)); - } - }; - } - @Override public void addInformation(ItemStack stack, @Nullable World player, @NotNull List tooltip, boolean advanced) { From 2288ed806ae487762c08024d4bee1ca342a6a48b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 6 Nov 2024 14:16:48 -0700 Subject: [PATCH 22/63] mixin to mui2 to fix various issues --- .../java/gregtech/api/mui/StateOverlay.java | 15 +++ .../gregtech/mixins/mui2/ItemSlotSHMixin.java | 107 ++++++++++++++++++ .../mixins/mui2/ToggleButtonMixin.java | 22 ++++ .../gregtech/mixins/mui2/TooltipMixin.java | 100 ++++++++++++++++ src/main/resources/mixins.gregtech.mui2.json | 18 +++ 5 files changed, 262 insertions(+) create mode 100644 src/main/java/gregtech/api/mui/StateOverlay.java create mode 100644 src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/TooltipMixin.java create mode 100644 src/main/resources/mixins.gregtech.mui2.json diff --git a/src/main/java/gregtech/api/mui/StateOverlay.java b/src/main/java/gregtech/api/mui/StateOverlay.java new file mode 100644 index 00000000000..537cf6e02ad --- /dev/null +++ b/src/main/java/gregtech/api/mui/StateOverlay.java @@ -0,0 +1,15 @@ +package gregtech.api.mui; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.widgets.ToggleButton; + +public interface StateOverlay { + + ToggleButton overlay(boolean selected, IDrawable... overlay); + + ToggleButton hoverOverlay(boolean selected, IDrawable... overlay); + + static StateOverlay cast(ToggleButton button) { + return (StateOverlay) button; + } +} diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java new file mode 100644 index 00000000000..bfc8344461b --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java @@ -0,0 +1,107 @@ +package gregtech.mixins.mui2; + +import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.items.ItemHandlerHelper; + +import com.cleanroommc.modularui.utils.MouseData; +import com.cleanroommc.modularui.value.sync.ItemSlotSH; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.io.IOException; + +@Mixin(value = ItemSlotSH.class, remap = false) +public abstract class ItemSlotSHMixin extends SyncHandler { + + @Shadow + protected abstract void phantomScroll(MouseData mouseData); + + @Shadow + public abstract void setEnabled(boolean enabled, boolean sync); + + @Shadow + public abstract boolean isPhantom(); + + @Shadow + private ItemStack lastStoredPhantomItem; + + @Shadow + public abstract ModularSlot getSlot(); + + @Shadow + public abstract void incrementStackCount(int amount); + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#90 + */ + @Overwrite + public void readOnServer(int id, PacketBuffer buf) throws IOException { + if (id == 2) { + phantomClick(MouseData.readPacket(buf)); + } else if (id == 3) { + phantomScroll(MouseData.readPacket(buf)); + } else if (id == 4) { + setEnabled(buf.readBoolean(), false); + } else if (id == 5) { + if (!isPhantom()) return; + gregTech$phantomClick(MouseData.create(0), buf.readItemStack()); + } + } + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#90 + */ + @Overwrite + protected void phantomClick(MouseData mouseData) { + gregTech$phantomClick(mouseData, getSyncManager().getCursorItem()); + } + + @Unique + protected void gregTech$phantomClick(MouseData mouseData, ItemStack cursorStack) { + ItemStack slotStack = getSlot().getStack(); + ItemStack stackToPut; + if (!cursorStack.isEmpty() && !slotStack.isEmpty() && + !ItemHandlerHelper.canItemStacksStack(cursorStack, slotStack)) { + stackToPut = cursorStack.copy(); + if (mouseData.mouseButton == 1) { + stackToPut.setCount(1); + } + stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); + getSlot().putStack(stackToPut); + this.lastStoredPhantomItem = stackToPut.copy(); + } else if (slotStack.isEmpty()) { + if (cursorStack.isEmpty()) { + if (mouseData.mouseButton == 1 && !this.lastStoredPhantomItem.isEmpty()) { + stackToPut = this.lastStoredPhantomItem.copy(); + } else { + return; + } + } else { + stackToPut = cursorStack.copy(); + } + if (mouseData.mouseButton == 1) { + stackToPut.setCount(1); + } + stackToPut.setCount(Math.min(stackToPut.getCount(), getSlot().getItemStackLimit(stackToPut))); + getSlot().putStack(stackToPut); + this.lastStoredPhantomItem = stackToPut.copy(); + } else { + if (mouseData.mouseButton == 0) { + if (mouseData.shift) { + getSlot().putStack(ItemStack.EMPTY); + } else { + incrementStackCount(-1); + } + } else if (mouseData.mouseButton == 1) { + incrementStackCount(1); + } + } + } +} diff --git a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java new file mode 100644 index 00000000000..0a3c899378c --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java @@ -0,0 +1,22 @@ +package gregtech.mixins.mui2; + +import gregtech.api.mui.StateOverlay; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.widgets.AbstractCycleButtonWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; +import org.spongepowered.asm.mixin.Mixin; + +@Mixin(value = ToggleButton.class, remap = false) +public class ToggleButtonMixin extends AbstractCycleButtonWidget implements StateOverlay { + + public ToggleButton overlay(boolean selected, IDrawable... overlay) { + this.overlay = addToArray(this.overlay, overlay, selected ? 1 : 0); + return getThis(); + } + + public ToggleButton hoverOverlay(boolean selected, IDrawable... overlay) { + this.hoverOverlay = addToArray(this.hoverOverlay, overlay, selected ? 1 : 0); + return getThis(); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java new file mode 100644 index 00000000000..10ef60994cb --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java @@ -0,0 +1,100 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.RichTextWidget; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.function.Consumer; + +@Mixin(value = RichTooltip.class, remap = false) +public abstract class TooltipMixin { + + @Shadow + private boolean dirty; + + @Shadow + @Final + private RichText text; + + @Shadow + private Consumer tooltipBuilder; + + @Shadow + public abstract RichTooltip getThis(); + + @Shadow + public abstract void markDirty(); + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public void buildTooltip() { + this.dirty = false; + this.text.clearText(); + if (this.tooltipBuilder != null) { + this.tooltipBuilder.accept(getThis()); + } + } + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { + Consumer existingBuilder = this.tooltipBuilder; + if (existingBuilder != null) { + this.tooltipBuilder = tooltip -> { + existingBuilder.accept(getThis()); + tooltipBuilder.accept(getThis()); + }; + } else { + this.tooltipBuilder = tooltipBuilder; + } + markDirty(); + return getThis(); + } + + @Mixin(value = RichTextWidget.class, remap = false) + private static abstract class RichTextWidgetMixin extends Widget { + + @Shadow + private boolean autoUpdate; + + @Shadow + private boolean dirty; + + @Shadow + @Final + private RichText text; + + @Shadow + private Consumer builder; + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + super.draw(context, widgetTheme); + if (this.autoUpdate || this.dirty) { + if (this.builder != null) { + this.text.clearText(); + this.builder.accept(this.text); + } + this.dirty = false; + } + this.text.drawAtZero(context, getArea(), widgetTheme); + } + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json new file mode 100644 index 00000000000..13a6aa8b24d --- /dev/null +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -0,0 +1,18 @@ +{ + "package": "gregtech.mixins.mui2", + "refmap": "mixins.gregtech.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "injectors": { + "maxShiftBy": 10 + }, + "mixins": [ + "ItemSlotSHMixin", + "ToggleButtonMixin", + "TooltipMixin", + "TooltipMixin$RichTextWidgetMixin" + ], + "client": [], + "server": [] +} From 46c0a2a855b8aef287e6a2eae430b8d036f9511e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 6 Nov 2024 15:25:31 -0700 Subject: [PATCH 23/63] more mixins, and actually apply them --- .../GregTechLateMixinLoadingPlugin.java | 1 + .../mixins/mui2/ClientEventHandlerMixin.java | 28 +++++++++ .../gregtech/mixins/mui2/ItemSlotSHMixin.java | 18 ++++++ .../mixins/mui2/PanelSyncHandlerMixin.java | 53 ++++++++++++++++ .../mixins/mui2/PanelSyncManagerMixin.java | 36 +++++++++++ .../gregtech/mixins/mui2/StyledTextMixin.java | 61 +++++++++++++++++++ .../gregtech/mixins/mui2/TextWidgetMixin.java | 15 +++++ src/main/resources/mixins.gregtech.mui2.json | 8 ++- 8 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/StyledTextMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java diff --git a/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java b/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java index f429a9d749e..f26eacee77a 100644 --- a/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java +++ b/src/main/java/gregtech/mixins/GregTechLateMixinLoadingPlugin.java @@ -19,6 +19,7 @@ public List getMixinConfigs() { configs.add("mixins.gregtech.ccl.json"); configs.add("mixins.gregtech.littletiles.json"); configs.add("mixins.gregtech.vintagium.json"); + configs.add("mixins.gregtech.mui2.json"); configs.add("mixins.gregtech.nothirium.json"); return configs; diff --git a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java new file mode 100644 index 00000000000..23ec94eaea7 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java @@ -0,0 +1,28 @@ +package gregtech.mixins.mui2; + +import net.minecraftforge.client.event.GuiScreenEvent; + +import com.cleanroommc.modularui.ClientEventHandler; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ClientEventHandler.class, remap = false) +@SuppressWarnings("UnstableApiUsage") +public abstract class ClientEventHandlerMixin { + + @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", + at = @At("HEAD"), + cancellable = true) + private static void fixMouseInput(GuiScreenEvent.MouseInputEvent.Pre event, CallbackInfo ci) { + ci.cancel(); + } + + @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", + at = @At("HEAD"), + cancellable = true) + private static void fixKeyInput(GuiScreenEvent.KeyboardInputEvent.Pre event, CallbackInfo ci) { + ci.cancel(); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java index bfc8344461b..4e9229f0832 100644 --- a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java @@ -4,20 +4,27 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.ItemHandlerHelper; +import com.cleanroommc.modularui.screen.ModularContainer; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.ItemSlotSH; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; import java.io.IOException; @Mixin(value = ItemSlotSH.class, remap = false) public abstract class ItemSlotSHMixin extends SyncHandler { + @Unique + private boolean gregTech$registered; + @Shadow protected abstract void phantomScroll(MouseData mouseData); @@ -36,6 +43,17 @@ public abstract class ItemSlotSHMixin extends SyncHandler { @Shadow public abstract void incrementStackCount(int amount); + @WrapOperation(method = "init", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/screen/ModularContainer;registerSlot(Ljava/lang/String;Lcom/cleanroommc/modularui/widgets/slot/ModularSlot;)V")) + protected void wrapRegister(ModularContainer instance, String slotGroup, ModularSlot modularSlot, + Operation original) { + if (!gregTech$registered) { + original.call(instance, slotGroup, modularSlot); + gregTech$registered = true; + } + } + /** * @author GTCEu - Ghzdude * @reason Implement MUI2 PR#90 diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java new file mode 100644 index 00000000000..970eb793977 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java @@ -0,0 +1,53 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.api.widget.ISynced; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.ModularSyncManager; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.WidgetTree; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.concurrent.atomic.AtomicInteger; + +@Mixin(PanelSyncHandler.class) +public abstract class PanelSyncHandlerMixin { + + @Shadow + private PanelSyncManager syncManager; + + @Shadow + public abstract boolean isPanelOpen(); + + @Redirect(method = "openPanel(Z)V", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/widget/WidgetTree;collectSyncValues(Lcom/cleanroommc/modularui/value/sync/PanelSyncManager;Lcom/cleanroommc/modularui/screen/ModularPanel;)V")) + protected void redirectCollectValues(PanelSyncManager syncManager, ModularPanel panel) { + gregTech$collectSyncValues(this.syncManager, panel); + } + + @Inject(method = "openPanel(Z)V", at = @At("HEAD"), cancellable = true) + protected void openCheck(boolean syncToServer, CallbackInfo ci) { + if (isPanelOpen()) ci.cancel(); + } + + @Unique + private static void gregTech$collectSyncValues(PanelSyncManager syncManager, ModularPanel panel) { + AtomicInteger id = new AtomicInteger(0); + String syncKey = ModularSyncManager.AUTO_SYNC_PREFIX + panel.getName(); + WidgetTree.foreachChildBFS(panel, widget -> { + if (widget instanceof ISyncedsynced) { + if (synced.isSynced() && !syncManager.hasSyncHandler(synced.getSyncHandler())) { + syncManager.syncValue(syncKey, id.getAndIncrement(), synced.getSyncHandler()); + } + } + return true; + }, false); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java new file mode 100644 index 00000000000..e5423f5c407 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java @@ -0,0 +1,36 @@ +package gregtech.mixins.mui2; + +import gregtech.api.util.GTLog; + +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Map; + +@Mixin(PanelSyncManager.class) +public abstract class PanelSyncManagerMixin { + + @Shadow + @Final + private Map syncHandlers; + + @Shadow + private String panelName; + + @Inject(method = "receiveWidgetUpdate", at = @At("HEAD"), cancellable = true) + public void injectCheck(String mapKey, int id, PacketBuffer buf, CallbackInfo ci) { + if (!this.syncHandlers.containsKey(mapKey)) { + GTLog.logger.warn("[ModularUI] SyncHandler \"{}\" does not exist for panel \"{}\"! ID was {}.", mapKey, + panelName, id); + ci.cancel(); + } + } +} diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java new file mode 100644 index 00000000000..1a9375454e5 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -0,0 +1,61 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.AnimatedText; +import com.cleanroommc.modularui.drawable.text.StyledText; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.widgets.TextWidget; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = StyledText.class, remap = false) +public class StyledTextMixin { + + @Shadow + @Final + private IKey key; + + @Shadow + private Alignment alignment; + + @Shadow + private Integer color; + + @Shadow + private float scale; + + @Shadow + private Boolean shadow; + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#86 + */ + @Overwrite + public TextWidget asWidget() { + int color = this.color == null ? 0 : this.color; + boolean shadow = this.shadow == null || this.shadow; + return new TextWidget(this.key) + .alignment(this.alignment) + .color(color) + .scale(this.scale) + .shadow(shadow); + } + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#86 + */ + @Overwrite + public AnimatedText withAnimation() { + int color = this.color == null ? 0 : this.color; + boolean shadow = this.shadow == null || this.shadow; + return new AnimatedText(this.key) + .alignment(this.alignment) + .color(color) + .scale(this.scale) + .shadow(shadow); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java new file mode 100644 index 00000000000..e18c221232d --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java @@ -0,0 +1,15 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.widgets.TextWidget; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = TextWidget.class, remap = false) +public class TextWidgetMixin { + + @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) + public int clamp(int r) { + return Math.max(1, r); + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 13a6aa8b24d..cb97f2be00c 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -9,10 +9,16 @@ }, "mixins": [ "ItemSlotSHMixin", + "PanelSyncHandlerMixin", + "PanelSyncManagerMixin", + "StyledTextMixin", + "TextWidgetMixin", "ToggleButtonMixin", "TooltipMixin", "TooltipMixin$RichTextWidgetMixin" ], - "client": [], + "client": [ + "ClientEventHandlerMixin" + ], "server": [] } From 20c653b6ac09280443e49093ec50cc415569a4cc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:03:44 -0700 Subject: [PATCH 24/63] don't remap, fix tests (grr) --- src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java | 2 +- src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java index 970eb793977..e7037d9f235 100644 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java @@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicInteger; -@Mixin(PanelSyncHandler.class) +@Mixin(value = PanelSyncHandler.class, remap = false) public abstract class PanelSyncHandlerMixin { @Shadow diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java index e5423f5c407..9bea0ab1af2 100644 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncManagerMixin.java @@ -15,7 +15,7 @@ import java.util.Map; -@Mixin(PanelSyncManager.class) +@Mixin(value = PanelSyncManager.class, remap = false) public abstract class PanelSyncManagerMixin { @Shadow From 20f249078a36c29847d51d6985440fa487748fc3 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 6 Nov 2024 19:33:19 -0700 Subject: [PATCH 25/63] fix dragging in certain conditions --- src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java index e18c221232d..47653365891 100644 --- a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java +++ b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java @@ -1,15 +1,21 @@ package gregtech.mixins.mui2; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.TextWidget; import com.llamalad7.mixinextras.injector.ModifyReturnValue; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @Mixin(value = TextWidget.class, remap = false) -public class TextWidgetMixin { +public abstract class TextWidgetMixin extends Widget { @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) public int clamp(int r) { return Math.max(1, r); } + + @Override + public boolean canHover() { + return hasTooltip(); + } } From cc1ca0958b40842df1c15ad369e95ee41736d715 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 7 Nov 2024 17:31:44 -0700 Subject: [PATCH 26/63] update enderlink --- .../covers/ender/CoverAbstractEnderLink.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index cd4b661b4a0..b4159e5c0a5 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -184,7 +184,6 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { protected abstract IWidget createEntrySlot(); protected IWidget createColorIcon() { - // todo color selector popup panel return new DynamicDrawable(() -> new Rectangle() .setColor(this.activeEntry.getColor()) .asIcon().size(16)) @@ -195,10 +194,8 @@ protected IWidget createColorIcon() { } protected IWidget createPrivateButton() { - var isPrivate = new BooleanSyncValue(this::isPrivate, this::setPrivate); - isPrivate.updateCacheFromSource(true); - return new ToggleButton() + .value(new BooleanSyncValue(this::isPrivate, this::setPrivate)) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .background(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) .hoverBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) @@ -207,17 +204,14 @@ protected IWidget createPrivateButton() { .tooltipBuilder(tooltip -> tooltip.addLine(IKey.lang(this.isPrivate ? "cover.ender_fluid_link.private.tooltip.enabled" : "cover.ender_fluid_link.private.tooltip.disabled"))) - .marginRight(2) - .value(isPrivate); + .marginRight(2); } protected IWidget createIoRow() { - var ioEnabled = new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled); - return Flow.row().marginBottom(2) .coverChildrenHeight() .child(new ToggleButton() - .value(ioEnabled) + .value(new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled)) .overlay(IKey.dynamic(() -> IKey.lang(this.ioEnabled ? "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled").get()) @@ -294,7 +288,6 @@ protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { return GTGuis.createPopupPanel("entry_selector", 168, 112) .child(IKey.lang("cover.generic.ender.known_channels") .color(UI_TITLE_COLOR) - .shadow(false) .asWidget() .top(6) .left(4)) @@ -335,7 +328,7 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage final T entry = VirtualEnderRegistry.getEntry(getOwner(), type, name); var key = String.format("entry#%s_description", entry.getColorStr()); var syncKey = PanelSyncManager.makeSyncKey(key, isPrivate ? 1 : 0); - final var entryDescriptionPanelHandler = (PanelSyncHandler) syncManager.panel(syncKey, + final var panelHandler = (PanelSyncHandler) syncManager.panel(syncKey, entryDescription(key, entry), true); final var syncHandler = new EnderCoverSyncHandler(); syncManager.syncValue(key + "_handler", syncHandler); @@ -368,12 +361,12 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) .onMousePressed(i -> { // open entry settings - if (entryDescriptionPanelHandler.isPanelOpen()) { - entryDescriptionPanelHandler.closePanel(); + // todo this isn't working for some reason + if (panelHandler.isPanelOpen()) { + panelHandler.closePanel(); } else { - entryDescriptionPanelHandler.openPanel(); + panelHandler.openPanel(); } - Interactable.playButtonClickSound(); return true; })) .child(createSlotWidget(entry)) From 0617a14bf359b1e83f96c67e0752a054ce9d542d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:54:43 -0700 Subject: [PATCH 27/63] simplify mixin --- .../mixins/mui2/PanelSyncHandlerMixin.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java index e7037d9f235..99a850b1c10 100644 --- a/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java +++ b/src/main/java/gregtech/mixins/mui2/PanelSyncHandlerMixin.java @@ -8,7 +8,6 @@ import com.cleanroommc.modularui.widget.WidgetTree; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; @@ -29,25 +28,20 @@ public abstract class PanelSyncHandlerMixin { at = @At(value = "INVOKE", target = "Lcom/cleanroommc/modularui/widget/WidgetTree;collectSyncValues(Lcom/cleanroommc/modularui/value/sync/PanelSyncManager;Lcom/cleanroommc/modularui/screen/ModularPanel;)V")) protected void redirectCollectValues(PanelSyncManager syncManager, ModularPanel panel) { - gregTech$collectSyncValues(this.syncManager, panel); - } - - @Inject(method = "openPanel(Z)V", at = @At("HEAD"), cancellable = true) - protected void openCheck(boolean syncToServer, CallbackInfo ci) { - if (isPanelOpen()) ci.cancel(); - } - - @Unique - private static void gregTech$collectSyncValues(PanelSyncManager syncManager, ModularPanel panel) { AtomicInteger id = new AtomicInteger(0); String syncKey = ModularSyncManager.AUTO_SYNC_PREFIX + panel.getName(); WidgetTree.foreachChildBFS(panel, widget -> { if (widget instanceof ISyncedsynced) { - if (synced.isSynced() && !syncManager.hasSyncHandler(synced.getSyncHandler())) { - syncManager.syncValue(syncKey, id.getAndIncrement(), synced.getSyncHandler()); + if (synced.isSynced() && !this.syncManager.hasSyncHandler(synced.getSyncHandler())) { + this.syncManager.syncValue(syncKey, id.getAndIncrement(), synced.getSyncHandler()); } } return true; }, false); } + + @Inject(method = "openPanel(Z)V", at = @At("HEAD"), cancellable = true) + protected void openCheck(boolean syncToServer, CallbackInfo ci) { + if (isPanelOpen()) ci.cancel(); + } } From d9adc0cb74bd95d7b3a2618a0ee4e34a88c3dd7b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:55:36 -0700 Subject: [PATCH 28/63] improve ui and fix entry settings --- .../java/gregtech/api/cover/CoverWithUI.java | 1 - .../covers/ender/CoverAbstractEnderLink.java | 50 +++++++++++-------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 559abe4a57d..701532eba79 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -105,7 +105,6 @@ static Flow createTitleRow(ItemStack stack) { .child(new ItemDrawable(stack).asWidget().size(16).marginRight(4)) .child(IKey.str(stack.getDisplayName()) .color(UI_TITLE_COLOR) - .shadow(false) .asWidget().heightRel(1.0f)); } diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index b4159e5c0a5..53701cacd6b 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -48,6 +48,7 @@ import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.lwjgl.input.Keyboard; import java.util.Objects; import java.util.Set; @@ -303,25 +304,35 @@ protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { } protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { - return (syncManager, syncHandler) -> GTGuis.createPopupPanel(key, 168, 36 + 6) - .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) - .color(UI_TITLE_COLOR) - .shadow(false) - .asWidget() - .left(4) - .top(6)) - .child(new TextFieldWidget() - .setTextColor(Color.WHITE.darker(1)) - .widthRel(0.95f) - .height(18) - .value(new StringSyncValue(entry::getDescription, string -> { - entry.setDescription(string); - if (syncHandler.isPanelOpen()) { - syncHandler.closePanel(); + return (syncManager, syncHandler) -> { + var sync = new StringSyncValue(entry::getDescription, entry::setDescription); + return GTGuis.createPopupPanel(key, 168, 36 + 6) + .child(IKey.lang("cover.generic.ender.set_description.title", entry.getColorStr()) + .color(UI_TITLE_COLOR) + .asWidget() + .left(4) + .top(6)) + .child(new TextFieldWidget() { + + // todo move this to new class? + @Override + public @NotNull Result onKeyPressed(char character, int keyCode) { + var result = super.onKeyPressed(character, keyCode); + if (result == Result.SUCCESS && keyCode == Keyboard.KEY_RETURN) { + sync.setStringValue(getText()); + if (syncHandler.isPanelOpen()) { + syncHandler.closePanel(); + } } - })) - .alignX(0.5f) - .bottom(6)); + return result; + } + }.setTextColor(Color.WHITE.darker(1)) + .value(sync) + .widthRel(0.95f) + .height(18) + .alignX(0.5f) + .bottom(6)); + }; } protected IWidget createRow(final String name, final PanelSyncManager syncManager, final EntryTypes type) { @@ -346,7 +357,7 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .size(16) .background(GTGuiTextures.SLOT.asIcon().size(18)) .top(1)) - .child(new InteractableText<>(entry, CoverAbstractEnderLink.this::updateColor) + .child(new InteractableText<>(entry, this::updateColor) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(tooltip -> { String desc = entry.getDescription(); @@ -361,7 +372,6 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) .onMousePressed(i -> { // open entry settings - // todo this isn't working for some reason if (panelHandler.isPanelOpen()) { panelHandler.closePanel(); } else { From bab658e7450e26a968c928a71f40a9581c52e2ed Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 7 Nov 2024 19:56:15 -0700 Subject: [PATCH 29/63] use fallback theme --- .../gregtech/mixins/mui2/StyledTextMixin.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java index 1a9375454e5..1a46399d79f 100644 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -1,5 +1,6 @@ package gregtech.mixins.mui2; +import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.AnimatedText; import com.cleanroommc.modularui.drawable.text.StyledText; @@ -35,12 +36,15 @@ public class StyledTextMixin { */ @Overwrite public TextWidget asWidget() { - int color = this.color == null ? 0 : this.color; - boolean shadow = this.shadow == null || this.shadow; - return new TextWidget(this.key) + var text = new TextWidget(this.key) .alignment(this.alignment) - .color(color) - .scale(this.scale) + .scale(this.scale); + + var theme = ITheme.getDefault().getTextFieldTheme(); + int color = this.color == null ? theme.getColor() : this.color; + boolean shadow = this.shadow == null ? theme.getTextShadow() : this.shadow; + + return text.color(color) .shadow(shadow); } @@ -50,12 +54,15 @@ public TextWidget asWidget() { */ @Overwrite public AnimatedText withAnimation() { - int color = this.color == null ? 0 : this.color; - boolean shadow = this.shadow == null || this.shadow; - return new AnimatedText(this.key) + var text = new AnimatedText(this.key) .alignment(this.alignment) - .color(color) - .scale(this.scale) + .scale(this.scale); + + var theme = ITheme.getDefault().getTextFieldTheme(); + int color = this.color == null ? theme.getColor() : this.color; + boolean shadow = this.shadow == null ? theme.getTextShadow() : this.shadow; + + return text.color(color) .shadow(shadow); } } From e62670dde4ad418726984fcc902542b02a4a942e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 7 Nov 2024 20:05:59 -0700 Subject: [PATCH 30/63] fix check --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index cbf761eab58..f77759682a1 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -55,7 +55,7 @@ public void detectAndSendChanges(boolean init) { } public void lockFluid(FluidStack stack) { - final var f = stack != null && stack.amount < 1 ? null : stack; + final var f = stack == null || stack.amount < 1 ? null : stack; this.onLocked.accept(f); this.phantomFluid = f; syncToServer(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, f)); From 232653600e72c3de619e3649d7c161d577c4744e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 10 Nov 2024 18:36:55 -0700 Subject: [PATCH 31/63] improve lock check improve lock toggle slightly --- .../api/mui/sync/GTFluidSyncHandler.java | 22 ++++++++++--------- .../common/mui/widget/GTFluidSlot.java | 2 +- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index f77759682a1..e87ddeb05a7 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -427,17 +427,19 @@ public boolean canLockFluid() { } public void toggleLockFluid() { - if (getLockedFluid() != null) { + if (getLockedFluid() == null) { + var cursorItem = getSyncManager().getCursorItem(); + if (cursorItem.isEmpty()) return; + if (cursorItem.getCount() > 1) cursorItem = GTUtility.copy(1, cursorItem); + + var fluidHandler = FluidUtil.getFluidHandler(cursorItem); + if (fluidHandler == null) return; + + var fluidStack = fluidHandler.getTankProperties()[0].getContents(); + if (fluidStack == null) return; + lockFluid(fluidStack.copy()); + } else { lockFluid(null); - return; } - var s = getSyncManager().getCursorItem(); - if (s.isEmpty()) return; - if (s.getCount() > 1) s = GTUtility.copy(1, s); - var h = FluidUtil.getFluidHandler(s); - if (h == null) return; - var f = h.getTankProperties()[0].getContents(); - if (f == null) return; - lockFluid(f.copy()); } } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index bacb7a2e706..8cd4105f1cf 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -107,7 +107,7 @@ public void drawBackground(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); - if (content == null) + if (content == null && this.syncHandler.canLockFluid()) content = this.syncHandler.getLockedFluid(); GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); From c4b2c1681b9c8d93abe6b3f04893f6ca11699b41 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 10 Nov 2024 19:32:32 -0700 Subject: [PATCH 32/63] improve StateOverlay + mixin --- src/main/java/gregtech/api/mui/StateOverlay.java | 15 +++++++++++---- .../gregtech/mixins/mui2/ToggleButtonMixin.java | 8 ++++---- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/mui/StateOverlay.java b/src/main/java/gregtech/api/mui/StateOverlay.java index 537cf6e02ad..fefdc7fc477 100644 --- a/src/main/java/gregtech/api/mui/StateOverlay.java +++ b/src/main/java/gregtech/api/mui/StateOverlay.java @@ -3,13 +3,20 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.widgets.ToggleButton; +import java.util.function.Consumer; + public interface StateOverlay { - ToggleButton overlay(boolean selected, IDrawable... overlay); + StateOverlay overlay(boolean selected, IDrawable... overlay); + + StateOverlay hoverOverlay(boolean selected, IDrawable... overlay); - ToggleButton hoverOverlay(boolean selected, IDrawable... overlay); + static ToggleButton cast(ToggleButton button, Consumer function) { + function.accept((StateOverlay) button); + return button; + } - static StateOverlay cast(ToggleButton button) { - return (StateOverlay) button; + static ToggleButton create(Consumer function) { + return cast(new ToggleButton(), function); } } diff --git a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java index 0a3c899378c..3838ecf5805 100644 --- a/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ToggleButtonMixin.java @@ -10,13 +10,13 @@ @Mixin(value = ToggleButton.class, remap = false) public class ToggleButtonMixin extends AbstractCycleButtonWidget implements StateOverlay { - public ToggleButton overlay(boolean selected, IDrawable... overlay) { + public StateOverlay overlay(boolean selected, IDrawable... overlay) { this.overlay = addToArray(this.overlay, overlay, selected ? 1 : 0); - return getThis(); + return (StateOverlay) getThis(); } - public ToggleButton hoverOverlay(boolean selected, IDrawable... overlay) { + public StateOverlay hoverOverlay(boolean selected, IDrawable... overlay) { this.hoverOverlay = addToArray(this.hoverOverlay, overlay, selected ? 1 : 0); - return getThis(); + return (StateOverlay) getThis(); } } From 96d49ee0a565acd1b1c79689ca9260b6114ba1bf Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 10 Nov 2024 19:33:35 -0700 Subject: [PATCH 33/63] properly fix unboxing issue --- src/main/java/gregtech/api/mui/UnboxFix.java | 8 +++ .../gregtech/mixins/mui2/StyledTextMixin.java | 58 +++++++++++++++---- .../gregtech/mixins/mui2/TextWidgetMixin.java | 44 ++++++++++++-- 3 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/UnboxFix.java diff --git a/src/main/java/gregtech/api/mui/UnboxFix.java b/src/main/java/gregtech/api/mui/UnboxFix.java new file mode 100644 index 00000000000..48f1bda2f20 --- /dev/null +++ b/src/main/java/gregtech/api/mui/UnboxFix.java @@ -0,0 +1,8 @@ +package gregtech.api.mui; + +public interface UnboxFix { + + void gregTech$useDefaultTextColor(boolean b); + + void gregTech$useDefaultShadow(boolean b); +} diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java index 1a46399d79f..009d107dbc9 100644 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -1,18 +1,24 @@ package gregtech.mixins.mui2; -import com.cleanroommc.modularui.api.ITheme; +import gregtech.api.mui.UnboxFix; + import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.AnimatedText; import com.cleanroommc.modularui.drawable.text.StyledText; +import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.widgets.TextWidget; +import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(value = StyledText.class, remap = false) -public class StyledTextMixin { +public abstract class StyledTextMixin implements UnboxFix { @Shadow @Final @@ -30,6 +36,22 @@ public class StyledTextMixin { @Shadow private Boolean shadow; + @Unique + private boolean gregTech$defaultTextColor = true; + + @Unique + private boolean gregTech$defaultShadow = true; + + @Override + public void gregTech$useDefaultTextColor(boolean b) { + gregTech$defaultTextColor = b; + } + + @Override + public void gregTech$useDefaultShadow(boolean b) { + gregTech$defaultShadow = b; + } + /** * @author GTCEu - Ghzdude * @reason Implement MUI2 PR#86 @@ -40,12 +62,11 @@ public TextWidget asWidget() { .alignment(this.alignment) .scale(this.scale); - var theme = ITheme.getDefault().getTextFieldTheme(); - int color = this.color == null ? theme.getColor() : this.color; - boolean shadow = this.shadow == null ? theme.getTextShadow() : this.shadow; + ((UnboxFix) text).gregTech$useDefaultTextColor(this.color == null); + ((UnboxFix) text).gregTech$useDefaultShadow(this.shadow == null); - return text.color(color) - .shadow(shadow); + return text.color(color == null ? 0 : color) + .shadow(shadow != null && shadow); } /** @@ -58,11 +79,24 @@ public AnimatedText withAnimation() { .alignment(this.alignment) .scale(this.scale); - var theme = ITheme.getDefault().getTextFieldTheme(); - int color = this.color == null ? theme.getColor() : this.color; - boolean shadow = this.shadow == null ? theme.getTextShadow() : this.shadow; + ((UnboxFix) text).gregTech$useDefaultTextColor(this.color == null); + ((UnboxFix) text).gregTech$useDefaultShadow(this.shadow == null); + + return text.color(color == null ? 0 : color) + .shadow(shadow != null && shadow); + } + + @ModifyArg(method = "draw", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) + public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { + return gregTech$defaultTextColor ? theme.getTextColor() : color; + } - return text.color(color) - .shadow(shadow); + @ModifyArg(method = "draw", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) + public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { + return gregTech$defaultShadow ? theme.getTextShadow() : shadow; } } diff --git a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java index 47653365891..40320a51020 100644 --- a/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java +++ b/src/main/java/gregtech/mixins/mui2/TextWidgetMixin.java @@ -1,21 +1,57 @@ package gregtech.mixins.mui2; +import gregtech.api.mui.UnboxFix; + +import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.TextWidget; import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; @Mixin(value = TextWidget.class, remap = false) -public abstract class TextWidgetMixin extends Widget { +public abstract class TextWidgetMixin extends Widget implements UnboxFix { - @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) - public int clamp(int r) { - return Math.max(1, r); + @Unique + private boolean gregTech$defaultTextColor = true; + + @Unique + private boolean gregTech$defaultShadow = true; + + @Override + public void gregTech$useDefaultTextColor(boolean b) { + gregTech$defaultTextColor = b; + } + + @Override + public void gregTech$useDefaultShadow(boolean b) { + gregTech$defaultShadow = b; } @Override public boolean canHover() { return hasTooltip(); } + + @ModifyReturnValue(method = { "getDefaultHeight", "getDefaultWidth" }, at = @At("TAIL")) + public int clamp(int r) { + return Math.max(1, r); + } + + @ModifyArg(method = "draw", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) + public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { + return gregTech$defaultTextColor ? theme.getTextColor() : color; + } + + @ModifyArg(method = "draw", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) + public boolean fixShadow(boolean shadow, @Local(argsOnly = true) WidgetTheme theme) { + return gregTech$defaultShadow ? theme.getTextShadow() : shadow; + } } From 9b6cc8cc59a2de6c730bbf3da8c624c7f864d15c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 10 Nov 2024 19:54:42 -0700 Subject: [PATCH 34/63] actually fix tooltip --- src/main/java/gregtech/mixins/mui2/TooltipMixin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java index 10ef60994cb..7883e8b12de 100644 --- a/src/main/java/gregtech/mixins/mui2/TooltipMixin.java +++ b/src/main/java/gregtech/mixins/mui2/TooltipMixin.java @@ -39,8 +39,8 @@ public abstract class TooltipMixin { @Overwrite public void buildTooltip() { this.dirty = false; - this.text.clearText(); if (this.tooltipBuilder != null) { + this.text.clearText(); this.tooltipBuilder.accept(getThis()); } } From c80861e62cac29528a2551cee7e49bdbd50a93bd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 10 Nov 2024 20:23:49 -0700 Subject: [PATCH 35/63] improve draw slightly fix defaults for StyledTextMixin --- .../gregtech/common/mui/widget/GTFluidSlot.java | 16 +++++++--------- .../gregtech/mixins/mui2/StyledTextMixin.java | 12 ++++++++++++ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 8cd4105f1cf..6731730e249 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -106,6 +106,12 @@ public void drawBackground(ModularGuiContext context, WidgetTheme widgetTheme) { @Override public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + if (widgetTheme instanceof WidgetSlotTheme slotTheme) { + draw(context, slotTheme); + } + } + + public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); if (content == null && this.syncHandler.canLockFluid()) content = this.syncHandler.getLockedFluid(); @@ -121,7 +127,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { if (isHovering()) { GlStateManager.colorMask(true, true, true, false); - GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, getSlotHoverColor()); + GuiDraw.drawRect(1, 1, getArea().w() - 2, getArea().h() - 2, widgetTheme.getSlotHoverColor()); GlStateManager.colorMask(true, true, true, true); } } @@ -167,14 +173,6 @@ protected WidgetTheme getWidgetThemeInternal(ITheme theme) { return theme.getFluidSlotTheme(); } - public int getSlotHoverColor() { - WidgetTheme theme = getWidgetTheme(getContext().getTheme()); - if (theme instanceof WidgetSlotTheme slotTheme) { - return slotTheme.getSlotHoverColor(); - } - return ITheme.getDefault().getFluidSlotTheme().getSlotHoverColor(); - } - public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip tooltip) { // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java index 009d107dbc9..bf252463dec 100644 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -15,7 +15,9 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(value = StyledText.class, remap = false) public abstract class StyledTextMixin implements UnboxFix { @@ -52,6 +54,16 @@ public abstract class StyledTextMixin implements UnboxFix { gregTech$defaultShadow = b; } + @Inject(method = "color", at = @At("HEAD")) + private void setDefault(int color, CallbackInfoReturnable cir) { + gregTech$useDefaultTextColor(false); + } + + @Inject(method = "shadow", at = @At("HEAD")) + private void setDefault(boolean shadow, CallbackInfoReturnable cir) { + gregTech$useDefaultShadow(false); + } + /** * @author GTCEu - Ghzdude * @reason Implement MUI2 PR#86 From 0e23ea43d920746bf4da867f8fa37fc930c268c0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:02:17 -0700 Subject: [PATCH 36/63] switch to proper method --- .../java/gregtech/common/covers/filter/SimpleItemFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index 1a5f580ce99..d69e6de7649 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -133,7 +133,7 @@ public void initUI(Consumer widgetGroup) { .getInteger(SimpleItemFilterReader.COUNT); if (count > 0) tooltip.addLine( - IKey.format("Count: %s", TextFormattingUtil.formatNumbers(count))); + IKey.str("Count: %s", TextFormattingUtil.formatNumbers(count))); } }) .slot(SyncHandlers.phantomItemSlot(this.filterReader, index) From 17da4f7928193956d00351f3f0c08ca2505c3e19 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:02:40 -0700 Subject: [PATCH 37/63] properly fix draggable issue --- .../mixins/mui2/ClientEventHandlerMixin.java | 65 +++++++++++++++---- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java index 23ec94eaea7..bbc295e40a8 100644 --- a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java @@ -1,28 +1,67 @@ package gregtech.mixins.mui2; -import net.minecraftforge.client.event.GuiScreenEvent; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import com.cleanroommc.modularui.ClientEventHandler; +import com.cleanroommc.modularui.api.IMuiScreen; +import com.cleanroommc.modularui.core.mixin.GuiScreenAccessor; +import org.lwjgl.input.Keyboard; +import org.lwjgl.input.Mouse; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(value = ClientEventHandler.class, remap = false) @SuppressWarnings("UnstableApiUsage") public abstract class ClientEventHandlerMixin { - @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", - at = @At("HEAD"), - cancellable = true) - private static void fixMouseInput(GuiScreenEvent.MouseInputEvent.Pre event, CallbackInfo ci) { - ci.cancel(); + @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleMouseInput()V")) + private static void fixMouseInput(GuiScreen instance) { + int button = Mouse.getEventButton(); + if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { + if (Mouse.getEventButtonState()) { + acc.setEventButton(button); + acc.setLastMouseEvent(Minecraft.getSystemTime()); + screen.getScreen().onMousePressed(button); + + } else if (button != -1) { + acc.setEventButton(-1); + screen.getScreen().onMouseRelease(button); + + } else if (acc.getEventButton() != -1 && acc.getLastMouseEvent() > 0L) { + long l = Minecraft.getSystemTime() - acc.getLastMouseEvent(); + screen.getScreen().onMouseDrag(button, l); + } + } } - @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", - at = @At("HEAD"), - cancellable = true) - private static void fixKeyInput(GuiScreenEvent.KeyboardInputEvent.Pre event, CallbackInfo ci) { - ci.cancel(); + private static Character lastChar = null; + + @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", + at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleKeyboardInput()V")) + private static void fixKeyInput(GuiScreen instance) { + if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { + char c0 = Keyboard.getEventCharacter(); + int key = Keyboard.getEventKey(); + boolean state = Keyboard.getEventKeyState(); + if (state) { + lastChar = c0; + screen.getScreen().onKeyPressed(c0, key); + // return doAction(muiScreen, ms -> ms.onKeyPressed(c0, key)) || keyTyped(mcScreen, c0, key); + } else { + // releasing a key + // for some reason when you press E after joining a world the button will not trigger the press event, + // but ony the release event, causing this to be null + if (lastChar == null) return; + // when the key is released, the event char is empty + screen.getScreen().onKeyRelease(lastChar, key); + // if (doAction(muiScreen, ms -> ms.onKeyRelease(lastChar, key))) return true; + // if (key == 0 && c0 >= ' ') { + // return keyTyped(mcScreen, c0, key); + // } + } + } } } From 481e6af75afd20dd14c321e0419c2b22b21109ec Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:19:46 -0700 Subject: [PATCH 38/63] fix locking button and tooltip --- src/main/java/gregtech/api/mui/GTGuiTextures.java | 1 + .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 4f0345f49fc..2fecf35642e 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -167,6 +167,7 @@ public static class IDs { public static final UITexture[] BUTTON_MATCH_ALL = slice("textures/gui/widget/ore_filter/button_match_all.png", 16, 32, 16, 16, true); + public static final UITexture BUTTON_LOCK = fullImage("textures/gui/widget/button_lock.png"); public static final UITexture OREDICT_ERROR = fullImage("textures/gui/widget/ore_filter/error.png"); public static final UITexture OREDICT_INFO = fullImage("textures/gui/widget/ore_filter/info.png"); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index a4994e45f1b..00c91ac5cf3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -253,9 +253,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .childIf(isExportHatch, new ToggleButton() .pos(7, 63) // todo lock overlay + .overlay(GTGuiTextures.BUTTON_LOCK) .value(new BooleanSyncValue(this::isLocked, this::setLocked)) - // todo tooltip is not working for some reason, fixed in rc3 - .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.fluid_lock.tooltip")))) + .addTooltip(true, IKey.lang("gregtech.gui.fluid_lock.tooltip.enabled")) + .addTooltip(false, IKey.lang("gregtech.gui.fluid_lock.tooltip.disabled"))) // import specific .childIf(!isExportHatch, GTGuiTextures.TANK_ICON.asWidget() From f590473451888366959a1eeaa0d73a4ec16c6ee5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 18:48:21 -0700 Subject: [PATCH 39/63] fix fluid display --- .../MetaTileEntityFluidHatch.java | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 00c91ac5cf3..fafced83e1a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -39,11 +39,12 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ItemSlot; +import com.cleanroommc.modularui.widgets.RichTextWidget; import com.cleanroommc.modularui.widgets.ToggleButton; -import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.slot.ModularSlot; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -252,7 +253,6 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .accessibility(false, true))) .childIf(isExportHatch, new ToggleButton() .pos(7, 63) - // todo lock overlay .overlay(GTGuiTextures.BUTTON_LOCK) .value(new BooleanSyncValue(this::isLocked, this::setLocked)) .addTooltip(true, IKey.lang("gregtech.gui.fluid_lock.tooltip.enabled")) @@ -269,30 +269,29 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .accessibility(false, true))) // common ui - .child(Flow.column() - .crossAxisAlignment(Alignment.CrossAxis.START) - .size(81, isExportHatch ? 46 : 55) - .padding(3, 4) - .background(GTGuiTextures.DISPLAY) - .pos(7, 16) - .child(IKey.lang("gregtech.gui.fluid_amount").asWidget() - .widthRel(1f) - .height(10)) - // IKey's do not like empty strings... - .child(IKey.dynamic(getFluidName(fluidSyncHandler)) - .asWidget() - .widthRel(1f) - .setEnabledIf(textWidget -> { - var tank = fluidSyncHandler.getFluid(); - if (tank == null) tank = fluidSyncHandler.getLockedFluid(); - return tank != null; - }) - .height(10)) - .child(IKey.dynamic(fluidSyncHandler::getFormattedFluidAmount) - .asWidget() - .setEnabledIf(textWidget -> fluidSyncHandler.getFluid() != null) - .widthRel(1f) - .height(10))) + .child(new RichTextWidget() + .size(81 - 6, (isExportHatch ? 46 : 55) - 8) + // .padding(3, 4) + .background(GTGuiTextures.DISPLAY.asIcon().size(81, isExportHatch ? 46 : 55)) + .pos(7 + 3, 16 + 4) + .textColor(Color.WHITE.main) + .alignment(Alignment.TopLeft) + .autoUpdate(true) + .textBuilder(richText -> { + richText.add(IKey.lang("gregtech.gui.fluid_amount")).newLine(); + String name = null; + FluidStack fluid = fluidSyncHandler.getFluid(); + if (fluid != null) { + name = fluid.getLocalizedName(); + } else if (lockedFluid != null) { + name = lockedFluid.getLocalizedName(); + } + if (name == null) return; + if (name.length() > 25) name = name.substring(0, 25) + "..."; + + richText.add(name).newLine(); + richText.add(fluidSyncHandler.getFormattedFluidAmount()).newLine(); + })) .child(new GTFluidSlot() .disableBackground() .pos(69, isExportHatch ? 43 : 52) From 1ebef64b41f63fe53b6e5320cd864e6c22545ae5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 19:22:27 -0700 Subject: [PATCH 40/63] allow draining from fluid slot --- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index fafced83e1a..980b7dbc76d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -228,7 +228,7 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) - .accessibility(false, false) + .accessibility(true, false) .onLockFluid(stack -> { if (!isExportHatch) return; From 565f4c1e1846201e6fbf52108cd2c9ca7c9a5e5d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 6 Dec 2024 15:27:35 -0700 Subject: [PATCH 41/63] fix show amount for regulator and voiding cover --- .../api/mui/sync/GTFluidSyncHandler.java | 18 ++++++++++++------ .../covers/filter/SimpleFluidFilter.java | 4 +++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index e87ddeb05a7..e78281f80e4 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -19,6 +19,7 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; +import java.util.function.BooleanSupplier; import java.util.function.Consumer; public class GTFluidSyncHandler extends SyncHandler { @@ -36,7 +37,7 @@ public class GTFluidSyncHandler extends SyncHandler { private boolean canDrainSlot = true; private boolean canFillSlot = true; private boolean phantom; - private boolean showAmount = true; + private BooleanSupplier showAmount = () -> true; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; @@ -118,6 +119,11 @@ public boolean isPhantom() { } public GTFluidSyncHandler showAmount(boolean showAmount) { + this.showAmount = () -> showAmount; + return this; + } + + public GTFluidSyncHandler showAmount(BooleanSupplier showAmount) { this.showAmount = showAmount; return this; } @@ -125,7 +131,7 @@ public GTFluidSyncHandler showAmount(boolean showAmount) { public boolean showAmount() { if (!isPhantom() && phantomFluid != null) return false; - return this.showAmount; + return this.showAmount.getAsBoolean(); } public @NotNull String getFormattedFluidAmount() { @@ -183,9 +189,9 @@ public void tryClickPhantom(MouseData data) { } } else { FluidStack cellFluid = fluidHandlerItem.drain(Integer.MAX_VALUE, false); - if ((this.showAmount || currentFluid == null) && cellFluid != null) { + if ((this.showAmount.getAsBoolean() || currentFluid == null) && cellFluid != null) { if (this.canFillSlot()) { - if (!this.showAmount) { + if (!this.showAmount.getAsBoolean()) { cellFluid.amount = 1; } if (this.tank.fill(cellFluid, true) > 0) { @@ -202,14 +208,14 @@ public void tryClickPhantom(MouseData data) { case 1 -> { if (this.canFillSlot()) { if (currentFluid != null) { - if (this.showAmount) { + if (this.showAmount.getAsBoolean()) { FluidStack toFill = currentFluid.copy(); toFill.amount = 1000; this.tank.fill(toFill, true); } } else if (this.phantomFluid != null) { FluidStack toFill = this.phantomFluid.copy(); - toFill.amount = this.showAmount ? 1 : toFill.amount; + toFill.amount = this.showAmount.getAsBoolean() ? 1 : toFill.amount; this.tank.fill(toFill, true); } } diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index 53f46254cdf..7591c857d73 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -58,9 +58,11 @@ public void configureFilterTanks(int amount) { "FFF", "FFF") .key('F', i -> new GTFluidSlot() + // todo need to pass information about base unit from regulator + // and voiding cover .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) .phantom(true) - .showAmount(false))) + .showAmount(getFilterReader()::shouldShowAmount))) .build().marginRight(4)) .child(createBlacklistUI()); } From 0fb21ad0f4bb89a92410657dfc46228d5d0cb5df Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 6 Dec 2024 16:22:52 -0700 Subject: [PATCH 42/63] set fluid amounts properly remove button clicks simplify syncing slightly --- .../api/mui/sync/GTFluidSyncHandler.java | 19 +++++++++++++++++-- .../covers/filter/SimpleFluidFilter.java | 2 -- .../common/mui/widget/GTFluidSlot.java | 18 ++++-------------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index e78281f80e4..fed383d91d3 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -1,6 +1,7 @@ package gregtech.api.mui.sync; import gregtech.api.util.GTUtility; +import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; @@ -51,6 +52,7 @@ public void detectAndSendChanges(boolean init) { lastFluid = current == null ? null : current.copy(); syncToClient(UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, current)); } else if (current.amount != lastFluid.amount) { + lastFluid.amount = current.amount; syncToClient(UPDATE_AMOUNT, buffer -> buffer.writeInt(current.amount)); } } @@ -85,8 +87,13 @@ public void setFluid(FluidStack fluid) { } public void setAmount(int amount) { - if (getFluid() == null) return; - getFluid().amount = amount; + if (this.tank instanceof SimpleFluidFilterReader.WritableFluidTank writableFluidTank) { + writableFluidTank.setFluidAmount(amount); + return; + } + FluidStack stack = getFluid(); + if (stack == null) return; + stack.amount = amount; } public int getCapacity() { @@ -151,6 +158,14 @@ public void readOnClient(int id, PacketBuffer buf) { } } + public void handlePhantomScroll(MouseData data) { + syncToServer(PHANTOM_SCROLL, data::writeToPacket); + } + + public void handleClick(MouseData data) { + syncToServer(TRY_CLICK_CONTAINER, data::writeToPacket); + } + @Override public void readOnServer(int id, PacketBuffer buf) { if (id == TRY_CLICK_CONTAINER) { diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index 7591c857d73..b36acc61283 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -58,8 +58,6 @@ public void configureFilterTanks(int amount) { "FFF", "FFF") .key('F', i -> new GTFluidSlot() - // todo need to pass information about base unit from regulator - // and voiding cover .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) .phantom(true) .showAmount(getFilterReader()::shouldShowAmount))) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 6731730e249..94c798d6bc5 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -119,10 +119,10 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); if (content != null && this.syncHandler.showAmount()) { - String s = NumberFormat.formatWithMaxDigits(getBaseUnitAmount(content.amount)) + getBaseUnit(); + String amount = NumberFormat.formatWithMaxDigits(content.amount, 3) + "L"; this.textRenderer.setAlignment(Alignment.CenterRight, getArea().width - 1f); this.textRenderer.setPos(0, 12); - this.textRenderer.draw(s); + this.textRenderer.draw(amount); } if (isHovering()) { @@ -132,25 +132,15 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { } } - private double getBaseUnitAmount(double amount) { - return amount / 1000; - } - - private String getBaseUnit() { - return "kL"; - } - @Override public @NotNull Result onMousePressed(int mouseButton) { var data = MouseData.create(mouseButton); if (this.syncHandler.canFillSlot() || this.syncHandler.canDrainSlot()) { - this.syncHandler.syncToServer(GTFluidSyncHandler.TRY_CLICK_CONTAINER, data::writeToPacket); - Interactable.playButtonClickSound(); + this.syncHandler.handleClick(data); return Result.SUCCESS; } else if (this.syncHandler.canLockFluid()) { this.syncHandler.toggleLockFluid(); - Interactable.playButtonClickSound(); return Result.SUCCESS; } return Result.IGNORE; @@ -164,7 +154,7 @@ public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) return false; } MouseData mouseData = MouseData.create(scrollDirection.modifier); - this.syncHandler.syncToServer(GTFluidSyncHandler.PHANTOM_SCROLL, mouseData::writeToPacket); + this.syncHandler.handlePhantomScroll(mouseData); return true; } From a31f28d6cb9f24ac079739e2c5365e6628f464f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 6 Dec 2024 16:39:49 -0700 Subject: [PATCH 43/63] remove unused method improve richtext slightly --- .../multiblockpart/MetaTileEntityFluidHatch.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 980b7dbc76d..12e885f68d8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -12,7 +12,6 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import gregtech.common.metatileentities.storage.MetaTileEntityQuantumTank; @@ -50,7 +49,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.function.Supplier; public class MetaTileEntityFluidHatch extends MetaTileEntityMultiblockNotifiablePart implements IMultiblockAbilityPart, IControllable { @@ -278,7 +276,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .alignment(Alignment.TopLeft) .autoUpdate(true) .textBuilder(richText -> { - richText.add(IKey.lang("gregtech.gui.fluid_amount")).newLine(); + richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); String name = null; FluidStack fluid = fluidSyncHandler.getFluid(); if (fluid != null) { @@ -289,8 +287,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) if (name == null) return; if (name.length() > 25) name = name.substring(0, 25) + "..."; - richText.add(name).newLine(); - richText.add(fluidSyncHandler.getFormattedFluidAmount()).newLine(); + richText.addLine(IKey.str(name)); + richText.addLine(IKey.str(fluidSyncHandler.getFormattedFluidAmount())); })) .child(new GTFluidSlot() .disableBackground() @@ -312,14 +310,6 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .bindPlayerInventory(); } - protected Supplier getFluidName(GTFluidSyncHandler syncHandler) { - return () -> { - if (syncHandler.getFluid() == null && lockedFluid != null) - return lockedFluid.getLocalizedName(); - return syncHandler.getFluidLocalizedName(); - }; - } - @Override public void addInformation(ItemStack stack, @Nullable World player, @NotNull List tooltip, boolean advanced) { From 007c4f0d24a5d8f429f90517c234ee6b14fb1333 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 6 Dec 2024 16:52:33 -0700 Subject: [PATCH 44/63] make adjust overlay easier to see simplify set --- src/main/java/gregtech/api/cover/CoverWithUI.java | 2 ++ src/main/java/gregtech/common/covers/CoverPump.java | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 701532eba79..6c288e08137 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -22,6 +22,7 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.EnumSyncValue; @@ -137,6 +138,7 @@ default IKey createAdjustOverlay(boolean increment) { scale = 0.5f; } return IKey.str(builder.toString()) + .color(Color.WHITE.main) .scale(scale); } diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 7cc596eb1b9..b57e5a33545 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -225,7 +225,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .left(0).width(18) .onMousePressed(mouseButton -> { int val = throughput.getValue() - getIncrementValue(MouseData.create(mouseButton)); - throughput.setValue(val, true, true); + throughput.setValue(val); Interactable.playButtonClickSound(); return true; }) @@ -240,7 +240,7 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { .right(0).width(18) .onMousePressed(mouseButton -> { int val = throughput.getValue() + getIncrementValue(MouseData.create(mouseButton)); - throughput.setValue(val, true, true); + throughput.setValue(val); Interactable.playButtonClickSound(); return true; }) From 51dd8685d621a86329386e9a96c0607b49723064 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 6 Dec 2024 17:46:09 -0700 Subject: [PATCH 45/63] spotless --- src/main/java/gregtech/common/covers/CoverFluidFilter.java | 1 - src/main/java/gregtech/common/covers/CoverItemFilter.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index 42ce332df76..a0b6585ebd7 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -44,7 +44,6 @@ import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index 64fed7d02a8..8c667ad8ce7 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -43,7 +43,6 @@ import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 57441f50e728e9447c4f87bcb2b4305766865d4d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 7 Dec 2024 15:59:55 -0700 Subject: [PATCH 46/63] simplify fluid display for hatch fixed locked fluid tooltip --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 10 ++++++++-- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 10 ++-------- .../java/gregtech/common/mui/widget/GTFluidSlot.java | 8 ++++++-- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index fed383d91d3..56ed3b30c5b 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -142,11 +142,17 @@ public boolean showAmount() { } public @NotNull String getFormattedFluidAmount() { - return String.format("%,d", tank.getFluid() == null ? 0 : tank.getFluid().amount); + var tankFluid = this.tank.getFluid(); + return String.format("%,d", tankFluid == null ? 0 : tankFluid.amount); } public @NotNull String getFluidLocalizedName() { - return tank.getFluid() == null ? "Empty" : tank.getFluid().getLocalizedName(); + var tankFluid = this.tank.getFluid(); + + if (tankFluid == null && getLockedFluid() != null) + return getLockedFluid().getLocalizedName(); + + return tankFluid == null ? "" : tankFluid.getLocalizedName(); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 12e885f68d8..4018fa9a233 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -277,14 +277,8 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .autoUpdate(true) .textBuilder(richText -> { richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); - String name = null; - FluidStack fluid = fluidSyncHandler.getFluid(); - if (fluid != null) { - name = fluid.getLocalizedName(); - } else if (lockedFluid != null) { - name = lockedFluid.getLocalizedName(); - } - if (name == null) return; + String name = fluidSyncHandler.getFluidLocalizedName(); + if (name.isEmpty()) return; if (name.length() > 25) name = name.substring(0, 25) + "..."; richText.addLine(IKey.str(name)); diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 94c798d6bc5..a3ef54386cf 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -49,16 +49,20 @@ public GTFluidSlot() { tooltipBuilder(tooltip -> { if (!isSynced()) return; var fluid = this.syncHandler.getFluid(); + + if (fluid == null) + fluid = this.syncHandler.getLockedFluid(); + if (fluid == null) return; - tooltip.add(fluid.getLocalizedName()).newLine(); + tooltip.addLine(IKey.str(fluid.getLocalizedName())); if (this.syncHandler.showAmount()) tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); // Add various tooltips from the material for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { if (s.isEmpty()) continue; - tooltip.add(s).newLine(); + tooltip.addLine(IKey.str(s)); } if (this.syncHandler.showAmount()) From 43984699b42d6d92fbbc9bba836fb4748b332d9f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 8 Dec 2024 15:45:41 -0700 Subject: [PATCH 47/63] fix fluid locking --- .../api/mui/sync/GTFluidSyncHandler.java | 36 +++++++++++-------- .../MetaTileEntityFluidHatch.java | 33 ++++++----------- .../common/mui/widget/GTFluidSlot.java | 8 ++--- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 56ed3b30c5b..7c5aa8a6000 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -17,11 +17,13 @@ import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.utils.MouseData; +import com.cleanroommc.modularui.value.DynamicValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import java.util.function.Supplier; public class GTFluidSyncHandler extends SyncHandler { @@ -32,7 +34,7 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int LOCK_FLUID = 5; private final IFluidTank tank; - private Consumer onLocked; + private DynamicValue lockedFluid; private FluidStack lastFluid; private FluidStack phantomFluid; private boolean canDrainSlot = true; @@ -57,15 +59,21 @@ public void detectAndSendChanges(boolean init) { } } - public void lockFluid(FluidStack stack) { - final var f = stack == null || stack.amount < 1 ? null : stack; - this.onLocked.accept(f); - this.phantomFluid = f; - syncToServer(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, f)); + public void lockFluid(FluidStack stack, boolean sync) { + if (!canLockFluid()) return; + this.lockedFluid.setValue(stack); + if (sync) sync(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, stack)); } - public GTFluidSyncHandler onLockFluid(Consumer onLocked) { - this.onLocked = onLocked; + public void lockFluid(boolean locked, boolean sync) { + if (locked == (getLockedFluid() != null)) return; + var f = locked ? getFluid() : null; + if (locked && f == null) return; + lockFluid(f, sync); + } + + public GTFluidSyncHandler onLockFluid(Supplier supplier, Consumer consumer) { + this.lockedFluid = new DynamicValue<>(supplier, consumer); return this; } @@ -161,6 +169,7 @@ public void readOnClient(int id, PacketBuffer buf) { case TRY_CLICK_CONTAINER -> replaceCursorItemStack(NetworkUtils.readItemStack(buf)); case UPDATE_TANK -> setFluid(NetworkUtils.readFluidStack(buf)); case UPDATE_AMOUNT -> setAmount(buf.readInt()); + case LOCK_FLUID -> lockFluid(NetworkUtils.readFluidStack(buf), false); } } @@ -190,8 +199,7 @@ public void readOnServer(int id, PacketBuffer buf) { tryScrollPhantom(MouseData.readPacket(buf)); } else if (id == LOCK_FLUID) { var f = NetworkUtils.readFluidStack(buf); - this.onLocked.accept(f); - this.phantomFluid = f; + lockFluid(f, false); } } @@ -446,11 +454,11 @@ public FluidStack getPhantomFluid() { } public FluidStack getLockedFluid() { - return !isPhantom() ? phantomFluid : null; + return !isPhantom() ? lockedFluid.getValue() : null; } public boolean canLockFluid() { - return onLocked != null; + return lockedFluid != null; } public void toggleLockFluid() { @@ -464,9 +472,9 @@ public void toggleLockFluid() { var fluidStack = fluidHandler.getTankProperties()[0].getContents(); if (fluidStack == null) return; - lockFluid(fluidStack.copy()); + lockFluid(fluidStack.copy(), true); } else { - lockFluid(null); + lockFluid(null, true); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 4018fa9a233..4ed3323b911 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -227,17 +227,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) .accessibility(true, false) - .onLockFluid(stack -> { + .onLockFluid(() -> this.lockedFluid, stack -> { if (!isExportHatch) return; - - if (stack == null) { - this.setLocked(false); - this.lockedFluid = null; - } else { - this.setLocked(true); - this.lockedFluid = stack.copy(); - this.lockedFluid.amount = 1; - } + setLocked(stack); }); return GTGuis.createPanel(this, 176, 166) @@ -252,7 +244,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .childIf(isExportHatch, new ToggleButton() .pos(7, 63) .overlay(GTGuiTextures.BUTTON_LOCK) - .value(new BooleanSyncValue(this::isLocked, this::setLocked)) + // todo doing things this way causes flickering if it fails + // due to sync value cache + .value(new BooleanSyncValue(this::isLocked, b -> fluidSyncHandler.lockFluid(b, false))) .addTooltip(true, IKey.lang("gregtech.gui.fluid_lock.tooltip.enabled")) .addTooltip(false, IKey.lang("gregtech.gui.fluid_lock.tooltip.disabled"))) @@ -326,20 +320,15 @@ private boolean isLocked() { return this.locked; } - private void setLocked(boolean locked) { - if (this.locked == locked) return; - this.locked = locked; + private void setLocked(FluidStack fluidStack) { + this.locked = fluidStack != null; + this.lockedFluid = fluidStack == null ? null : fluidStack.copy(); + if (this.lockedFluid != null) + this.lockedFluid.amount = 1; + fluidTank.onContentsChanged(); if (!getWorld().isRemote) { markDirty(); } - if (locked && fluidTank.getFluid() != null) { - this.lockedFluid = fluidTank.getFluid().copy(); - this.lockedFluid.amount = 1; - fluidTank.onContentsChanged(); - return; - } - this.lockedFluid = null; - fluidTank.onContentsChanged(); } protected class HatchFluidTank extends NotifiableFluidTank implements IFilteredFluidContainer, IFilter { diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index a3ef54386cf..2008a38a653 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -141,10 +141,10 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { var data = MouseData.create(mouseButton); if (this.syncHandler.canFillSlot() || this.syncHandler.canDrainSlot()) { this.syncHandler.handleClick(data); - return Result.SUCCESS; - } else if (this.syncHandler.canLockFluid()) { - this.syncHandler.toggleLockFluid(); + if (this.syncHandler.canLockFluid()) + this.syncHandler.toggleLockFluid(); + return Result.SUCCESS; } return Result.IGNORE; @@ -187,7 +187,7 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { this.syncHandler.syncToServer(GTFluidSyncHandler.UPDATE_TANK, buffer -> NetworkUtils.writeFluidStack(buffer, ingredient)); } else { - this.syncHandler.lockFluid(ingredient); + this.syncHandler.lockFluid(ingredient, true); } } From ff78db48d27cb4c99f9e141181bea3823e26953b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:22:54 -0700 Subject: [PATCH 48/63] null instead of empty string --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 10 ++++++---- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 7c5aa8a6000..4e5b55d139a 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -20,6 +20,7 @@ import com.cleanroommc.modularui.value.DynamicValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.BooleanSupplier; import java.util.function.Consumer; @@ -154,13 +155,14 @@ public boolean showAmount() { return String.format("%,d", tankFluid == null ? 0 : tankFluid.amount); } - public @NotNull String getFluidLocalizedName() { + public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); + var lockedFluid = this.lockedFluid.getValue(); - if (tankFluid == null && getLockedFluid() != null) - return getLockedFluid().getLocalizedName(); + if (tankFluid == null && lockedFluid != null) + return lockedFluid.getLocalizedName(); - return tankFluid == null ? "" : tankFluid.getLocalizedName(); + return tankFluid == null ? null : tankFluid.getLocalizedName(); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 4ed3323b911..6a39120af2e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -272,7 +272,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .textBuilder(richText -> { richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); String name = fluidSyncHandler.getFluidLocalizedName(); - if (name.isEmpty()) return; + if (name == null) return; if (name.length() > 25) name = name.substring(0, 25) + "..."; richText.addLine(IKey.str(name)); From d4d70ac222a3fa67640700f1ac7ed1e8d442975d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 8 Dec 2024 16:57:54 -0700 Subject: [PATCH 49/63] mixin to stop jei "delete" tooltip --- .../mixins/jei/IngredientGridMixin.java | 30 +++++++++++++++++++ src/main/resources/mixins.gregtech.jei.json | 17 ++++++----- 2 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 src/main/java/gregtech/mixins/jei/IngredientGridMixin.java diff --git a/src/main/java/gregtech/mixins/jei/IngredientGridMixin.java b/src/main/java/gregtech/mixins/jei/IngredientGridMixin.java new file mode 100644 index 00000000000..2b876ca38b8 --- /dev/null +++ b/src/main/java/gregtech/mixins/jei/IngredientGridMixin.java @@ -0,0 +1,30 @@ +package gregtech.mixins.jei; + +import net.minecraft.client.Minecraft; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import mezz.jei.gui.GuiScreenHelper; +import mezz.jei.gui.overlay.IngredientGrid; +import mezz.jei.gui.overlay.IngredientGridWithNavigation; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +@Mixin(value = IngredientGridWithNavigation.class, remap = false) +public class IngredientGridMixin { + + @Shadow + @Final + private GuiScreenHelper guiScreenHelper; + + @WrapOperation(method = "drawTooltips", + at = @At(value = "INVOKE", + target = "Lmezz/jei/gui/overlay/IngredientGrid;drawTooltips(Lnet/minecraft/client/Minecraft;II)V")) + private void considerExclusions(IngredientGrid instance, Minecraft minecraft, int mouseX, int mouseY, + Operation original) { + if (!guiScreenHelper.isInGuiExclusionArea(mouseX, mouseY)) + original.call(instance, minecraft, mouseX, mouseY); + } +} diff --git a/src/main/resources/mixins.gregtech.jei.json b/src/main/resources/mixins.gregtech.jei.json index 2520843c7d6..47158a7ea6c 100644 --- a/src/main/resources/mixins.gregtech.jei.json +++ b/src/main/resources/mixins.gregtech.jei.json @@ -1,12 +1,13 @@ { - "package" : "gregtech.mixins.jei", - "refmap" : "mixins.gregtech.refmap.json", - "target" : "@env(DEFAULT)", - "minVersion" : "0.8", - "compatibilityLevel" : "JAVA_8", - "mixins" : [ + "package": "gregtech.mixins.jei", + "refmap": "mixins.gregtech.refmap.json", + "target": "@env(DEFAULT)", + "minVersion": "0.8", + "compatibilityLevel": "JAVA_8", + "mixins": [ + "IngredientGridMixin", "JEITooltipMixin" ], - "client" : [], - "server" : [] + "client": [], + "server": [] } From 3cf345f6b97c06554a6038c0380828cb4a08e877 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 8 Dec 2024 18:02:13 -0700 Subject: [PATCH 50/63] add shift click to set and close panel --- .../mui/widget/GhostCircuitSlotWidget.java | 64 ++++++++++--------- .../items/behaviors/IntCircuitBehaviour.java | 7 +- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index d64866951d8..1b666abf798 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -1,5 +1,7 @@ package gregtech.api.mui.widget; +import com.cleanroommc.modularui.api.widget.Interactable; + import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; @@ -97,38 +99,38 @@ private boolean isSelectorPanelOpen() { private void createSelectorPanel() { ItemDrawable circuitPreview = new ItemDrawable(getSyncHandler().getSlot().getStack()); - List> options = new ArrayList<>(); - for (int i = 0; i < 4; i++) { - options.add(new ArrayList<>()); - for (int j = 0; j < 9; j++) { - int index = i * 9 + j; - if (index > 32) break; - options.get(i).add(new ButtonWidget<>() - .size(18) - .background(GTGuiTextures.SLOT, new ItemDrawable( - IntCircuitIngredient.getIntegratedCircuit(index)).asIcon()) - .disableHoverBackground() - .onMousePressed(mouseButton -> { - getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, buf -> buf.writeShort(index)); - circuitPreview.setItem(IntCircuitIngredient.getIntegratedCircuit(index)); - return true; - })); + IPanelHandler.simple(getPanel(), (mainPanel, player) -> { + var panel = GTGuis.createPopupPanel("circuit_selector", 176, 120); + List> options = new ArrayList<>(); + for (int i = 0; i < 4; i++) { + options.add(new ArrayList<>()); + for (int j = 0; j < 9; j++) { + int index = i * 9 + j; + if (index > 32) break; + options.get(i).add(new ButtonWidget<>() + .size(18) + .background(GTGuiTextures.SLOT, new ItemDrawable( + IntCircuitIngredient.getIntegratedCircuit(index)).asIcon()) + .disableHoverBackground() + .onMousePressed(mouseButton -> { + getSyncHandler().syncToServer(SYNC_CIRCUIT_INDEX, buf -> buf.writeShort(index)); + circuitPreview.setItem(IntCircuitIngredient.getIntegratedCircuit(index)); + if (Interactable.hasShiftDown()) panel.animateClose(); + return true; + })); + } } - } - - IPanelHandler.simple(getPanel(), (mainPanel, player) -> GTGuis.createPopupPanel("circuit_selector", 176, 120) - .child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) - .child(circuitPreview.asIcon().size(16).asWidget() - .size(18) - .top(19).alignX(0.5f) - .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) - .child(new Grid() - .left(7).right(7).top(41).height(4 * 18) - .matrix(options) - .minColWidth(18).minRowHeight(18) - .minElementMargin(0, 0)), - true) - .openPanel(); + return panel.child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) + .child(circuitPreview.asIcon().size(16).asWidget() + .size(18) + .top(19).alignX(0.5f) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) + .child(new Grid() + .left(7).right(7).top(41).height(4 * 18) + .matrix(options) + .minColWidth(18).minRowHeight(18) + .minElementMargin(0, 0)); + }, true).openPanel(); } private static class GhostCircuitSyncHandler extends ItemSlotSH { diff --git a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java index 5a7091e838e..94b6397bbd1 100644 --- a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java +++ b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java @@ -1,5 +1,7 @@ package gregtech.common.items.behaviors; +import com.cleanroommc.modularui.api.widget.Interactable; + import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.metaitem.stats.IItemBehaviour; @@ -65,6 +67,7 @@ public ActionResult onItemRightClick(World world, EntityPlayer player @Override public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager) { + var panel = GTGuis.createPanel(guiData.getUsedItemStack(), 176, 120); ItemDrawable circuitPreview = new ItemDrawable(guiData.getUsedItemStack()); for (int i = 0; i <= 32; i++) { int finalI = i; @@ -73,6 +76,7 @@ public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager ItemStack item = IntCircuitIngredient.getIntegratedCircuit(finalI); item.setCount(guiData.getUsedItemStack().getCount()); circuitPreview.setItem(item); + if (Interactable.hasShiftDown()) panel.animateClose(); guiData.getPlayer().setHeldItem(guiData.getHand(), item); })); } @@ -91,8 +95,7 @@ public ModularPanel buildUI(HandGuiData guiData, PanelSyncManager guiSyncManager .syncHandler("config", index)); } } - return GTGuis.createPanel(guiData.getUsedItemStack(), 176, 120) - .child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) + return panel.child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) .child(circuitPreview.asIcon().size(16).asWidget() .size(18) .top(19).alignX(0.5f) From 2420dc33b6917c3cd439815861359e6b90dea839 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 9 Dec 2024 00:56:05 -0700 Subject: [PATCH 51/63] spotless --- .../mui/widget/GhostCircuitSlotWidget.java | 23 +++++++++---------- .../items/behaviors/IntCircuitBehaviour.java | 3 +-- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java index 1b666abf798..aa692fd8583 100644 --- a/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java +++ b/src/main/java/gregtech/api/mui/widget/GhostCircuitSlotWidget.java @@ -1,7 +1,5 @@ package gregtech.api.mui.widget; -import com.cleanroommc.modularui.api.widget.Interactable; - import gregtech.api.capability.impl.GhostCircuitItemStackHandler; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; @@ -14,6 +12,7 @@ import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; @@ -121,16 +120,16 @@ private void createSelectorPanel() { } } return panel.child(IKey.lang("metaitem.circuit.integrated.gui").asWidget().pos(5, 5)) - .child(circuitPreview.asIcon().size(16).asWidget() - .size(18) - .top(19).alignX(0.5f) - .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) - .child(new Grid() - .left(7).right(7).top(41).height(4 * 18) - .matrix(options) - .minColWidth(18).minRowHeight(18) - .minElementMargin(0, 0)); - }, true).openPanel(); + .child(circuitPreview.asIcon().size(16).asWidget() + .size(18) + .top(19).alignX(0.5f) + .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) + .child(new Grid() + .left(7).right(7).top(41).height(4 * 18) + .matrix(options) + .minColWidth(18).minRowHeight(18) + .minElementMargin(0, 0)); + }, true).openPanel(); } private static class GhostCircuitSyncHandler extends ItemSlotSH { diff --git a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java index 94b6397bbd1..f7523d976d1 100644 --- a/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java +++ b/src/main/java/gregtech/common/items/behaviors/IntCircuitBehaviour.java @@ -1,7 +1,5 @@ package gregtech.common.items.behaviors; -import com.cleanroommc.modularui.api.widget.Interactable; - import gregtech.api.capability.IGhostSlotConfigurable; import gregtech.api.items.gui.ItemUIFactory; import gregtech.api.items.metaitem.stats.IItemBehaviour; @@ -23,6 +21,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.HandGuiData; import com.cleanroommc.modularui.screen.ModularPanel; From dd89b43c7d1803ec5b382d1e07b1a836b5da2a88 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Dec 2024 14:51:37 -0700 Subject: [PATCH 52/63] initialize locked fluid value --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 4e5b55d139a..196a8107200 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -35,7 +35,7 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int LOCK_FLUID = 5; private final IFluidTank tank; - private DynamicValue lockedFluid; + private DynamicValue lockedFluid = new DynamicValue<>(() -> null, null); private FluidStack lastFluid; private FluidStack phantomFluid; private boolean canDrainSlot = true; From 1293915c916a0a8d9cef279f330a9b88c7ca9b79 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Dec 2024 15:06:22 -0700 Subject: [PATCH 53/63] sike, no need to initialize --- .../java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 196a8107200..80959241e5f 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -35,7 +35,7 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int LOCK_FLUID = 5; private final IFluidTank tank; - private DynamicValue lockedFluid = new DynamicValue<>(() -> null, null); + private DynamicValue lockedFluid; private FluidStack lastFluid; private FluidStack phantomFluid; private boolean canDrainSlot = true; @@ -157,10 +157,8 @@ public boolean showAmount() { public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); - var lockedFluid = this.lockedFluid.getValue(); - - if (tankFluid == null && lockedFluid != null) - return lockedFluid.getLocalizedName(); + if (tankFluid == null && canLockFluid()) + tankFluid = this.lockedFluid.getValue(); return tankFluid == null ? null : tankFluid.getLocalizedName(); } @@ -456,7 +454,7 @@ public FluidStack getPhantomFluid() { } public FluidStack getLockedFluid() { - return !isPhantom() ? lockedFluid.getValue() : null; + return !isPhantom() && canLockFluid() ? lockedFluid.getValue() : null; } public boolean canLockFluid() { From ef437b89bab09ea5f58f9ab57aedb07ee1754b75 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 18 Dec 2024 19:14:59 -0700 Subject: [PATCH 54/63] sync scroll to client --- .../gregtech/mixins/mui2/ItemSlotSHMixin.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java index 4e9229f0832..9216ecf2c81 100644 --- a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java @@ -4,6 +4,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraftforge.items.ItemHandlerHelper; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularContainer; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.ItemSlotSH; @@ -16,6 +17,8 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.IOException; @@ -72,6 +75,21 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { } } + @Inject(method = "readOnClient", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/widgets/slot/ModularSlot;onSlotChangedReal(Lnet/minecraft/item/ItemStack;ZZZ)V")) + protected void asdf(int id, PacketBuffer buf, CallbackInfo ci) { + if (id == 3) { + this.lastStoredPhantomItem = NetworkUtils.readItemStack(buf); + getSlot().putStack(this.lastStoredPhantomItem.copy()); + } + } + + @Inject(method = "phantomScroll", at = @At("TAIL")) + protected void asdf(MouseData mouseData, CallbackInfo ci) { + syncToClient(3, buffer -> NetworkUtils.writeItemStack(buffer, this.lastStoredPhantomItem)); + } + /** * @author GTCEu - Ghzdude * @reason Implement MUI2 PR#90 From fa8380b682442ace45131d88db2b749fca763b68 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 19 Dec 2024 11:30:11 -0700 Subject: [PATCH 55/63] rename and fix scroll sync --- src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java index 9216ecf2c81..5d53a35d3d0 100644 --- a/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ItemSlotSHMixin.java @@ -75,10 +75,8 @@ public void readOnServer(int id, PacketBuffer buf) throws IOException { } } - @Inject(method = "readOnClient", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/widgets/slot/ModularSlot;onSlotChangedReal(Lnet/minecraft/item/ItemStack;ZZZ)V")) - protected void asdf(int id, PacketBuffer buf, CallbackInfo ci) { + @Inject(method = "readOnClient", at = @At("HEAD")) + protected void handlePhantomScroll(int id, PacketBuffer buf, CallbackInfo ci) { if (id == 3) { this.lastStoredPhantomItem = NetworkUtils.readItemStack(buf); getSlot().putStack(this.lastStoredPhantomItem.copy()); @@ -86,7 +84,7 @@ protected void asdf(int id, PacketBuffer buf, CallbackInfo ci) { } @Inject(method = "phantomScroll", at = @At("TAIL")) - protected void asdf(MouseData mouseData, CallbackInfo ci) { + protected void syncPhantomScroll(MouseData mouseData, CallbackInfo ci) { syncToClient(3, buffer -> NetworkUtils.writeItemStack(buffer, this.lastStoredPhantomItem)); } From 03a2212323ed1134f544af4ebe04afe34d54a4dd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 27 Dec 2024 23:23:41 -0700 Subject: [PATCH 56/63] simplify absent compute --- .../java/gregtech/common/mui/widget/HighlightedTextField.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java b/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java index decaddf4cab..c7f339db275 100644 --- a/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java +++ b/src/main/java/gregtech/common/mui/widget/HighlightedTextField.java @@ -89,7 +89,7 @@ public void runHighlighter(String text) { if (this.highlightRule == null) { return; } - this.cacheMap.computeIfAbsent(text, string -> this.highlightRule.apply(string)); + this.cacheMap.computeIfAbsent(text, this.highlightRule); } } } From 7ab32caa844887508e7ddee8741cb132a2b813c9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 28 Dec 2024 20:30:32 -0700 Subject: [PATCH 57/63] fix scrolling while over jei elements --- .../mixins/mui2/ClientEventHandlerMixin.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java index bbc295e40a8..678de031802 100644 --- a/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java +++ b/src/main/java/gregtech/mixins/mui2/ClientEventHandlerMixin.java @@ -2,15 +2,23 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; +import net.minecraftforge.client.event.GuiScreenEvent; import com.cleanroommc.modularui.ClientEventHandler; import com.cleanroommc.modularui.api.IMuiScreen; import com.cleanroommc.modularui.core.mixin.GuiScreenAccessor; +import com.cleanroommc.modularui.screen.ClientScreenHandler; +import com.cleanroommc.modularui.screen.ModularScreen; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.io.IOException; @Mixin(value = ClientEventHandler.class, remap = false) @SuppressWarnings("UnstableApiUsage") @@ -21,23 +29,32 @@ public abstract class ClientEventHandlerMixin { private static void fixMouseInput(GuiScreen instance) { int button = Mouse.getEventButton(); if (instance instanceof IMuiScreen screen && instance instanceof GuiScreenAccessor acc) { + ModularScreen ms = screen.getScreen(); if (Mouse.getEventButtonState()) { acc.setEventButton(button); acc.setLastMouseEvent(Minecraft.getSystemTime()); - screen.getScreen().onMousePressed(button); + ms.onMousePressed(button); } else if (button != -1) { acc.setEventButton(-1); - screen.getScreen().onMouseRelease(button); + ms.onMouseRelease(button); } else if (acc.getEventButton() != -1 && acc.getLastMouseEvent() > 0L) { long l = Minecraft.getSystemTime() - acc.getLastMouseEvent(); - screen.getScreen().onMouseDrag(button, l); + ms.onMouseDrag(button, l); } } } - private static Character lastChar = null; + @Inject(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$MouseInputEvent$Pre;)V", + at = @At("TAIL")) + private static void fixScrollJei(GuiScreenEvent.MouseInputEvent.Pre event, CallbackInfo ci) throws IOException { + if (!event.isCanceled()) + ClientScreenHandler.onGuiInputLow(event); + } + + @Unique + private static Character gregTech$lastChar = null; @Redirect(method = "onGuiInput(Lnet/minecraftforge/client/event/GuiScreenEvent$KeyboardInputEvent$Pre;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiScreen;handleKeyboardInput()V")) @@ -47,20 +64,15 @@ private static void fixKeyInput(GuiScreen instance) { int key = Keyboard.getEventKey(); boolean state = Keyboard.getEventKeyState(); if (state) { - lastChar = c0; + gregTech$lastChar = c0; screen.getScreen().onKeyPressed(c0, key); - // return doAction(muiScreen, ms -> ms.onKeyPressed(c0, key)) || keyTyped(mcScreen, c0, key); } else { // releasing a key // for some reason when you press E after joining a world the button will not trigger the press event, - // but ony the release event, causing this to be null - if (lastChar == null) return; + // but only the release event, causing this to be null + if (gregTech$lastChar == null) return; // when the key is released, the event char is empty - screen.getScreen().onKeyRelease(lastChar, key); - // if (doAction(muiScreen, ms -> ms.onKeyRelease(lastChar, key))) return true; - // if (key == 0 && c0 >= ' ') { - // return keyTyped(mcScreen, c0, key); - // } + screen.getScreen().onKeyRelease(gregTech$lastChar, key); } } } From 97405abefa251f985f1701ec7fcce3e50b221171 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 28 Dec 2024 20:49:23 -0700 Subject: [PATCH 58/63] add amount desc for fluid slots --- src/main/java/gregtech/common/mui/widget/GTFluidSlot.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 2008a38a653..340af7c1fb7 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -59,6 +59,9 @@ public GTFluidSlot() { if (this.syncHandler.showAmount()) tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); + if (this.syncHandler.isPhantom() && this.syncHandler.showAmount()) + tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); + // Add various tooltips from the material for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { if (s.isEmpty()) continue; From 4fa7eb4fcec84dddddaf4070c68f96f35404b055 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 28 Dec 2024 21:52:42 -0700 Subject: [PATCH 59/63] allow insert for import hatches --- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 6a39120af2e..45dd906a388 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -226,11 +226,8 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) - .accessibility(true, false) - .onLockFluid(() -> this.lockedFluid, stack -> { - if (!isExportHatch) return; - setLocked(stack); - }); + .accessibility(true, !isExportHatch) + .onLockFluid(() -> this.lockedFluid, this::setLocked); return GTGuis.createPanel(this, 176, 166) .child(IKey.lang(getMetaFullName()).asWidget().pos(6, 6)) @@ -321,6 +318,7 @@ private boolean isLocked() { } private void setLocked(FluidStack fluidStack) { + if (!isExportHatch) return; this.locked = fluidStack != null; this.lockedFluid = fluidStack == null ? null : fluidStack.copy(); if (this.lockedFluid != null) From fa2a854810e292f40c0f2cda907f1ef8683011ce Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 29 Dec 2024 14:37:44 -0700 Subject: [PATCH 60/63] draw calls are client only --- src/main/java/gregtech/mixins/mui2/StyledTextMixin.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java index bf252463dec..7130fab4ab9 100644 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -2,6 +2,9 @@ import gregtech.api.mui.UnboxFix; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.AnimatedText; import com.cleanroommc.modularui.drawable.text.StyledText; @@ -98,6 +101,7 @@ public AnimatedText withAnimation() { .shadow(shadow != null && shadow); } + @SideOnly(Side.CLIENT) @ModifyArg(method = "draw", at = @At(value = "INVOKE", target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setColor(I)V")) @@ -105,6 +109,7 @@ public int fixColor(int color, @Local(argsOnly = true) WidgetTheme theme) { return gregTech$defaultTextColor ? theme.getTextColor() : color; } + @SideOnly(Side.CLIENT) @ModifyArg(method = "draw", at = @At(value = "INVOKE", target = "Lcom/cleanroommc/modularui/drawable/text/TextRenderer;setShadow(Z)V")) From db29fe13c5080869a96b9a495d98dd975ab7eedd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:24:09 -0700 Subject: [PATCH 61/63] pass in defaults correctly --- src/main/java/gregtech/mixins/mui2/StyledTextMixin.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java index 7130fab4ab9..41c269111ab 100644 --- a/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java +++ b/src/main/java/gregtech/mixins/mui2/StyledTextMixin.java @@ -77,8 +77,8 @@ public TextWidget asWidget() { .alignment(this.alignment) .scale(this.scale); - ((UnboxFix) text).gregTech$useDefaultTextColor(this.color == null); - ((UnboxFix) text).gregTech$useDefaultShadow(this.shadow == null); + ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); + ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); return text.color(color == null ? 0 : color) .shadow(shadow != null && shadow); @@ -94,8 +94,8 @@ public AnimatedText withAnimation() { .alignment(this.alignment) .scale(this.scale); - ((UnboxFix) text).gregTech$useDefaultTextColor(this.color == null); - ((UnboxFix) text).gregTech$useDefaultShadow(this.shadow == null); + ((UnboxFix) text).gregTech$useDefaultTextColor(this.gregTech$defaultTextColor); + ((UnboxFix) text).gregTech$useDefaultShadow(this.gregTech$defaultShadow); return text.color(color == null ? 0 : color) .shadow(shadow != null && shadow); From 0b532bf9bb42ce57345d2ae04daa6fe698d2d047 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 5 Jan 2025 18:43:34 -0700 Subject: [PATCH 62/63] properly fix lock flickering --- .../api/mui/sync/GTFluidSyncHandler.java | 48 ++++++++++++------- .../MetaTileEntityFluidHatch.java | 26 ++++++---- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 80959241e5f..0c2e05edf67 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -16,8 +16,8 @@ import net.minecraftforge.fluids.capability.IFluidHandlerItem; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.utils.BooleanConsumer; import com.cleanroommc.modularui.utils.MouseData; -import com.cleanroommc.modularui.value.DynamicValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -35,7 +35,9 @@ public class GTFluidSyncHandler extends SyncHandler { public static final int LOCK_FLUID = 5; private final IFluidTank tank; - private DynamicValue lockedFluid; + private Consumer jeiHandler; + private BooleanConsumer lockHandler; + private Supplier lockedFluid; private FluidStack lastFluid; private FluidStack phantomFluid; private boolean canDrainSlot = true; @@ -62,19 +64,26 @@ public void detectAndSendChanges(boolean init) { public void lockFluid(FluidStack stack, boolean sync) { if (!canLockFluid()) return; - this.lockedFluid.setValue(stack); - if (sync) sync(LOCK_FLUID, buffer -> NetworkUtils.writeFluidStack(buffer, stack)); + this.jeiHandler.accept(stack); + if (sync) sync(LOCK_FLUID, buffer -> { + buffer.writeBoolean(stack != null); + NetworkUtils.writeFluidStack(buffer, stack); + }); } public void lockFluid(boolean locked, boolean sync) { - if (locked == (getLockedFluid() != null)) return; - var f = locked ? getFluid() : null; - if (locked && f == null) return; - lockFluid(f, sync); - } - - public GTFluidSyncHandler onLockFluid(Supplier supplier, Consumer consumer) { - this.lockedFluid = new DynamicValue<>(supplier, consumer); + this.lockHandler.accept(locked); + if (sync) sync(LOCK_FLUID, buffer -> { + buffer.writeBoolean(locked); + NetworkUtils.writeFluidStack(buffer, null); + }); + } + + public GTFluidSyncHandler handleLocking(Supplier lockedFluid, Consumer jeiHandler, + BooleanConsumer lockHandler) { + this.lockedFluid = lockedFluid; + this.jeiHandler = jeiHandler; + this.lockHandler = lockHandler; return this; } @@ -158,7 +167,7 @@ public boolean showAmount() { public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); if (tankFluid == null && canLockFluid()) - tankFluid = this.lockedFluid.getValue(); + tankFluid = this.lockedFluid.get(); return tankFluid == null ? null : tankFluid.getLocalizedName(); } @@ -198,8 +207,13 @@ public void readOnServer(int id, PacketBuffer buf) { } else if (id == PHANTOM_SCROLL) { tryScrollPhantom(MouseData.readPacket(buf)); } else if (id == LOCK_FLUID) { - var f = NetworkUtils.readFluidStack(buf); - lockFluid(f, false); + boolean locked = buf.readBoolean(); + var fluidStack = NetworkUtils.readFluidStack(buf); + if (fluidStack == null) { + this.lockHandler.accept(locked); + } else { + this.jeiHandler.accept(fluidStack); + } } } @@ -454,11 +468,11 @@ public FluidStack getPhantomFluid() { } public FluidStack getLockedFluid() { - return !isPhantom() && canLockFluid() ? lockedFluid.getValue() : null; + return !isPhantom() && canLockFluid() ? lockedFluid.get() : null; } public boolean canLockFluid() { - return lockedFluid != null; + return jeiHandler != null && lockHandler != null && lockedFluid != null; } public void toggleLockFluid() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 45dd906a388..009c39f3838 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -4,7 +4,6 @@ import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableFluidTank; -import gregtech.api.gui.widgets.*; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -227,7 +226,11 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmount(false) .accessibility(true, !isExportHatch) - .onLockFluid(() -> this.lockedFluid, this::setLocked); + .handleLocking(() -> this.lockedFluid, fluidStack -> { + setLocked(fluidStack != null); + this.lockedFluid = fluidStack; + this.fluidTank.onContentsChanged(); + }, this::setLocked); return GTGuis.createPanel(this, 176, 166) .child(IKey.lang(getMetaFullName()).asWidget().pos(6, 6)) @@ -317,16 +320,19 @@ private boolean isLocked() { return this.locked; } - private void setLocked(FluidStack fluidStack) { - if (!isExportHatch) return; - this.locked = fluidStack != null; - this.lockedFluid = fluidStack == null ? null : fluidStack.copy(); - if (this.lockedFluid != null) + private void setLocked(boolean locked) { + if (!isExportHatch || this.locked == locked) return; + this.locked = locked; + + if (!getWorld().isRemote) markDirty(); + if (locked && fluidTank.getFluid() != null) { + this.lockedFluid = fluidTank.getFluid().copy(); this.lockedFluid.amount = 1; - fluidTank.onContentsChanged(); - if (!getWorld().isRemote) { - markDirty(); + fluidTank.onContentsChanged(); + return; } + this.lockedFluid = null; + fluidTank.onContentsChanged(); } protected class HatchFluidTank extends NotifiableFluidTank implements IFilteredFluidContainer, IFilter { From 69df09a8202ee00fd4671fa8572b93149b6f0203 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 5 Jan 2025 19:17:06 -0700 Subject: [PATCH 63/63] sync locked handler fill to client fix unlocking slot when there's an item in hand misc --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 4 ++-- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 5 +++++ src/main/java/gregtech/common/mui/widget/GTFluidSlot.java | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 0c2e05edf67..1886be86d31 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -476,8 +476,8 @@ public boolean canLockFluid() { } public void toggleLockFluid() { + var cursorItem = getSyncManager().getCursorItem(); if (getLockedFluid() == null) { - var cursorItem = getSyncManager().getCursorItem(); if (cursorItem.isEmpty()) return; if (cursorItem.getCount() > 1) cursorItem = GTUtility.copy(1, cursorItem); @@ -487,7 +487,7 @@ public void toggleLockFluid() { var fluidStack = fluidHandler.getTankProperties()[0].getContents(); if (fluidStack == null) return; lockFluid(fluidStack.copy(), true); - } else { + } else if (cursorItem.isEmpty()) { lockFluid(null, true); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 009c39f3838..935d40d451f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -35,6 +35,7 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; @@ -53,6 +54,7 @@ public class MetaTileEntityFluidHatch extends MetaTileEntityMultiblockNotifiable implements IMultiblockAbilityPart, IControllable { public static final int INITIAL_INVENTORY_SIZE = 8000; + public static final int LOCK_FILL = GregtechDataCodes.assignId(); // only holding this for convenience protected final HatchFluidTank fluidTank; @@ -166,6 +168,8 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { super.receiveCustomData(dataId, buf); if (dataId == GregtechDataCodes.WORKING_ENABLED) { this.workingEnabled = buf.readBoolean(); + } else if (dataId == LOCK_FILL) { + this.lockedFluid = NetworkUtils.readFluidStack(buf); } } @@ -348,6 +352,7 @@ public int fillInternal(FluidStack resource, boolean doFill) { if (doFill && locked && lockedFluid == null) { lockedFluid = resource.copy(); lockedFluid.amount = 1; + writeCustomData(LOCK_FILL, buffer -> NetworkUtils.writeFluidStack(buffer, lockedFluid)); } return accepted; } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 340af7c1fb7..2530e38a587 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -120,7 +120,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { FluidStack content = this.syncHandler.getFluid(); - if (content == null && this.syncHandler.canLockFluid()) + if (content == null) content = this.syncHandler.getLockedFluid(); GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0);