From fb7b8b1a274e13d4c49022e5fe6f97dd1ecbf7e0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 11 Jan 2025 02:31:59 -0700 Subject: [PATCH 01/57] initial work on adv energy detector --- .../detector/CoverDetectorEnergyAdvanced.java | 100 +++++++++++++++--- .../resources/assets/gregtech/lang/en_us.lang | 4 +- 2 files changed, 88 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 95ebec138aa..f15d69561b7 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -5,8 +5,8 @@ import gregtech.api.cover.CoverableView; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.Widget; import gregtech.api.gui.widgets.*; +import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; @@ -18,12 +18,23 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.text.TextFormatting; import codechicken.lib.raytracer.CuboidRayTraceResult; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.SidedPosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { @@ -37,7 +48,6 @@ public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements public long maxValue = DEFAULT_MAX_EU; private int outputAmount = 0; private boolean usePercent = false; - private WidgetGroup widgetsToUpdate; public CoverDetectorEnergyAdvanced(@NotNull CoverDefinition definition, @NotNull CoverableView coverableView, @NotNull EnumFacing attachedSide) { @@ -81,6 +91,78 @@ public void update() { setRedstoneSignalOutput(outputAmount); } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManager) { + var min = new StringSyncValue(this::getMinValue, this::setMinValue); + var max = new StringSyncValue(this::getMaxValue, this::setMaxValue); + + return GTGuis.defaultPanel(this) + .child(CoverWithUI.createTitleRow(getPickItem())) + .child(Flow.column() + .top(28) + .left(10).right(10) + .coverChildrenHeight() + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang("cover.advanced_energy_detector.min").asWidget()) + .child(new TextFieldWidget() + .right(0) + .size(90, 18) + .onUpdateListener(this::updateWidget) + .value(min))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang("cover.advanced_energy_detector.max").asWidget()) + .child(new TextFieldWidget() + .right(0) + .size(90, 18) + .onUpdateListener(this::updateWidget) + .value(max))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang("cover.advanced_energy_detector.modes_label").asWidget() + .size(72, 18)) + .child(new ToggleButton() + .right(0) + .size(72, 18) + .addTooltipLine(IKey.lang("cover.advanced_energy_detector.modes_tooltip")) + .value(new BooleanSyncValue(this::isUsePercent, this::setUsePercent)) + .overlay(new DynamicDrawable(() -> IKey + .lang("cover.advanced_energy_detector.mode_" + + (isUsePercent() ? "percent" : "eu")) + .format(TextFormatting.WHITE))))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() + .size(72, 18)) + .child(new ToggleButton() + .right(0) + .size(72, 18) + .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) + .value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .overlay(new DynamicDrawable(() -> IKey + .lang("cover.advanced_energy_detector." + + (isInverted() ? "inverted" : "normal")) + .format(TextFormatting.WHITE)))))); + } + + private void updateWidget(TextFieldWidget w) { + w.setMaxLength(getLength()); + w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); + } + @Override public ModularUI createUI(EntityPlayer player) { WidgetGroup group = new WidgetGroup(); @@ -96,7 +178,7 @@ public ModularUI createUI(EntityPlayer player) { // surely this is a good idea :clueless: // construct widgets that need to be updated - this.widgetsToUpdate = constructWidgetsToUpdate(); + // this.widgetsToUpdate = constructWidgetsToUpdate(); // change modes between percent and discrete EU group.addWidget(new LabelWidget(10, 5 + 3 * (SIZE + PADDING), "cover.advanced_energy_detector.modes_label")); @@ -114,7 +196,7 @@ public ModularUI createUI(EntityPlayer player) { return ModularUI.builder(GuiTextures.BACKGROUND, 176 + (3 * SIZE), 108 + (SIZE)) .widget(group) - .widget(widgetsToUpdate) // add synced widgets + // .widget(widgetsToUpdate) // add synced widgets .build(this, player); } @@ -170,16 +252,6 @@ private void setUsePercent(boolean b) { this.minValue = DEFAULT_MIN_EU; this.maxValue = DEFAULT_MAX_EU; } - - // update widgets - updateSyncedWidgets(); - } - - private void updateSyncedWidgets() { - for (Widget widget : widgetsToUpdate.widgets) { - ((TextFieldWidget2) widget).setPostFix(getPostFix()); - ((TextFieldWidget2) widget).setMaxLength(getLength()); - } } private String getPostFix() { diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index bdf8e329563..6adab6bb40e 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1424,7 +1424,7 @@ cover.generic.ender.delete_entry=Delete Entry cover.generic.advanced_detector.latched=Latched cover.generic.advanced_detector.continuous=Continuous -cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. /n§eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 /n§eLatched§7 - output 15 until above max, then output 0 until below min +cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. \n§eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 \n§eLatched§7 - output 15 until above max, then output 0 until below min cover.generic.advanced_detector.invert_label=Redstone Output: cover.generic.advanced_detector.latch_label=Behavior: cover.generic.advanced_detector.invert_tooltip=Toggle to invert the redstone logic @@ -1432,7 +1432,7 @@ cover.generic.advanced_detector.invert_tooltip=Toggle to invert the redstone log cover.advanced_energy_detector.label=Advanced Energy Detector cover.advanced_energy_detector.min=Minimum: cover.advanced_energy_detector.max=Maximum: -cover.advanced_energy_detector.invert_tooltip=Toggle to invert the redstone logic/nBy default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU +cover.advanced_energy_detector.invert_tooltip=Toggle to invert the redstone logic\nBy default, redstone is emitted when less than the minimum EU, and stops emitting when greater than the max EU cover.advanced_energy_detector.normal=Normal cover.advanced_energy_detector.inverted=Inverted cover.advanced_energy_detector.modes_tooltip=Change between using discrete EU values or percentages for comparing min/max against an attached energy storage. From f615a180053895de7bc53057a3f2d0d2b51d86ed Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 12 Jan 2025 19:43:28 -0700 Subject: [PATCH 02/57] move ui method to CoverDetectorBase remove old ui code --- .../covers/detector/CoverDetectorBase.java | 4 ++ .../detector/CoverDetectorEnergyAdvanced.java | 63 ------------------- 2 files changed, 4 insertions(+), 63 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index b4df7c1822a..cc5d81c01c6 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -59,6 +59,10 @@ public int getRedstoneSignalOutput() { return this.redstoneSignalOutput; } + public boolean usesMui2() { + return true; + } + @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index f15d69561b7..219f15f317e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -3,9 +3,6 @@ import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.*; import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; @@ -39,8 +36,6 @@ public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { - private static final int PADDING = 5, SIZE = 18; - private static final long DEFAULT_MIN_EU = 0, DEFAULT_MAX_EU = 2048; private static final int DEFAULT_MIN_PERCENT = 33, DEFAULT_MAX_PERCENT = 66; @@ -91,11 +86,6 @@ public void update() { setRedstoneSignalOutput(outputAmount); } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManager) { var min = new StringSyncValue(this::getMinValue, this::setMinValue); @@ -163,59 +153,6 @@ private void updateWidget(TextFieldWidget w) { w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); } - @Override - public ModularUI createUI(EntityPlayer player) { - WidgetGroup group = new WidgetGroup(); - group.addWidget(new LabelWidget(10, 8, "cover.advanced_energy_detector.label")); - - // get/set min EU - group.addWidget(new LabelWidget(10, 5 + (SIZE + PADDING), "cover.advanced_energy_detector.min")); - group.addWidget(new ImageWidget(72, (SIZE + PADDING), 8 * SIZE, SIZE, GuiTextures.DISPLAY)); - - // get/set max EU - group.addWidget(new LabelWidget(10, 5 + 2 * (SIZE + PADDING), "cover.advanced_energy_detector.max")); - group.addWidget(new ImageWidget(72, 2 * (SIZE + PADDING), 8 * SIZE, SIZE, GuiTextures.DISPLAY)); - - // surely this is a good idea :clueless: - // construct widgets that need to be updated - // this.widgetsToUpdate = constructWidgetsToUpdate(); - - // change modes between percent and discrete EU - group.addWidget(new LabelWidget(10, 5 + 3 * (SIZE + PADDING), "cover.advanced_energy_detector.modes_label")); - group.addWidget( - new CycleButtonWidget(72, 3 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isUsePercent, this::setUsePercent, - "cover.advanced_energy_detector.mode_eu", "cover.advanced_energy_detector.mode_percent") - .setTooltipHoverString("cover.advanced_energy_detector.modes_tooltip")); - - // invert logic button - group.addWidget(new LabelWidget(10, 5 + 4 * (SIZE + PADDING), "cover.generic.advanced_detector.invert_label")); - group.addWidget( - new CycleButtonWidget(72, 4 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isInverted, this::setInverted, - "cover.machine_controller.normal", "cover.machine_controller.inverted") - .setTooltipHoverString("cover.advanced_energy_detector.invert_tooltip")); - - return ModularUI.builder(GuiTextures.BACKGROUND, 176 + (3 * SIZE), 108 + (SIZE)) - .widget(group) - // .widget(widgetsToUpdate) // add synced widgets - .build(this, player); - } - - private WidgetGroup constructWidgetsToUpdate() { - WidgetGroup sync = new WidgetGroup(); - - sync.addWidget( - new TextFieldWidget2(76, 5 + (SIZE + PADDING), 8 * SIZE, SIZE, this::getMinValue, this::setMinValue) - .setAllowedChars(TextFieldWidget2.NATURAL_NUMS) - .setMaxLength(this.getLength()) - .setPostFix(this.getPostFix())); - sync.addWidget( - new TextFieldWidget2(76, 5 + 2 * (SIZE + PADDING), 8 * SIZE, SIZE, this::getMaxValue, this::setMaxValue) - .setAllowedChars(TextFieldWidget2.NATURAL_NUMS) - .setMaxLength(this.getLength()) - .setPostFix(this.getPostFix())); - return sync; - } - private String getMinValue() { return String.valueOf(minValue); } From c2bc860f7ddc71893a2a5f6e179856795ebf2da9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 01:13:31 -0700 Subject: [PATCH 03/57] port advanced item improve advanced energy create GTTextFieldWidget for postfix --- .../detector/CoverDetectorEnergyAdvanced.java | 17 +- .../detector/CoverDetectorItemAdvanced.java | 77 +++++- .../common/mui/widget/GTTextFieldWidget.java | 239 ++++++++++++++++++ 3 files changed, 327 insertions(+), 6 deletions(-) create mode 100644 src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 219f15f317e..444481266f5 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -6,6 +6,7 @@ import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -26,12 +27,12 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { @@ -92,6 +93,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage var max = new StringSyncValue(this::getMaxValue, this::setMaxValue); return GTGuis.defaultPanel(this) + .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column() .top(28) @@ -102,9 +104,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .coverChildrenHeight() .marginBottom(5) .child(IKey.lang("cover.advanced_energy_detector.min").asWidget()) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .right(0) .size(90, 18) + .setTextColor(Color.WHITE.main) + .setPostFix(this::getPostFix) .onUpdateListener(this::updateWidget) .value(min))) .child(Flow.row() @@ -112,9 +116,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .coverChildrenHeight() .marginBottom(5) .child(IKey.lang("cover.advanced_energy_detector.max").asWidget()) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .right(0) .size(90, 18) + .setTextColor(Color.WHITE.main) + .setPostFix(this::getPostFix) .onUpdateListener(this::updateWidget) .value(max))) .child(Flow.row() @@ -145,10 +151,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .overlay(new DynamicDrawable(() -> IKey .lang("cover.advanced_energy_detector." + (isInverted() ? "inverted" : "normal")) - .format(TextFormatting.WHITE)))))); + .format(TextFormatting.WHITE)))))) + .bindPlayerInventory(); } - private void updateWidget(TextFieldWidget w) { + private void updateWidget(GTTextFieldWidget w) { w.setMaxLength(getLength()); w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index e2475756fd5..f81ffe878f6 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -6,6 +6,7 @@ import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.*; +import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.filter.ItemFilterContainer; @@ -18,6 +19,7 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -26,6 +28,17 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.SidedPosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorItemAdvanced extends CoverDetectorItem implements CoverWithUI { @@ -36,7 +49,9 @@ public class CoverDetectorItemAdvanced extends CoverDetectorItem implements Cove private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; - private int min = DEFAULT_MIN, max = DEFAULT_MAX, outputAmount; + private int min = DEFAULT_MIN; + private int max = DEFAULT_MAX; + private int outputAmount; private boolean isLatched = false; protected ItemFilterContainer itemFilter; @@ -52,6 +67,66 @@ public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 tra Textures.DETECTOR_ITEM_ADVANCED.renderSided(getAttachedSide(), plateBox, renderState, pipeline, translation); } + @Override + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + return GTGuis.defaultPanel(this) + .height(166 + 36) + .child(CoverWithUI.createTitleRow(getPickItem())) + .child(Flow.column() + .top(28) + .left(5).right(5) + .coverChildrenHeight() + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang("cover.advanced_item_detector.min").asWidget()) + .child(new TextFieldWidget() + .setTextColor(Color.WHITE.main) + .right(0) + .size(90, 18) + .setPattern(TextFieldWidget.WHOLE_NUMS) + .setMaxLength(10) + .value(new StringSyncValue(this::getMinValue, this::setMinValue)))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang("cover.advanced_item_detector.max").asWidget()) + .child(new TextFieldWidget() + .setTextColor(Color.WHITE.main) + .right(0) + .size(90, 18) + .setPattern(TextFieldWidget.WHOLE_NUMS) + .setMaxLength(10) + .value(new StringSyncValue(this::getMaxValue, this::setMaxValue)))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(new ToggleButton() + .size(72, 18) + .overlay(new DynamicDrawable(() -> { + String lang = "cover.advanced_energy_detector."; + lang += isInverted() ? "inverted" : "normal"; + return IKey.lang(lang).format(TextFormatting.WHITE); + })) + .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) + .value(new BooleanSyncValue(this::isInverted, this::setInverted))) + .child(new ToggleButton() + .size(72, 18) + .right(0) + .overlay(new DynamicDrawable(() -> { + String lang = "cover.generic.advanced_detector."; + lang += isLatched() ? "latched" : "continuous"; + return IKey.lang(lang).format(TextFormatting.WHITE); + })) + .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) + .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) + .child(itemFilter.initUI(guiData, guiSyncManager))) + .bindPlayerInventory(); + } + @Override public ModularUI createUI(EntityPlayer player) { WidgetGroup group = new WidgetGroup(); diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java new file mode 100644 index 00000000000..f65f95c81ff --- /dev/null +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -0,0 +1,239 @@ +package gregtech.common.mui.widget; + +import com.cleanroommc.modularui.api.ITheme; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.value.IStringValue; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.value.StringValue; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; +import com.cleanroommc.modularui.widgets.textfield.BaseTextFieldWidget; +import org.jetbrains.annotations.NotNull; + +import java.awt.*; +import java.text.ParsePosition; +import java.util.Collections; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.regex.Pattern; + +import static com.cleanroommc.modularui.widgets.textfield.TextFieldWidget.parse; + +public class GTTextFieldWidget extends BaseTextFieldWidget { + + Supplier postFix = null; + private IStringValue stringValue; + private Function validator = val -> val; + private boolean numbers = false; + + protected boolean changedMarkedColor = false; + + @Override + public void onInit() { + super.onInit(); + if (this.stringValue == null) { + this.stringValue = new StringValue(""); + } + setText(this.stringValue.getStringValue()); + if (!hasTooltip()) { + tooltipBuilder(tooltip -> tooltip.addLine(IKey.str(getText()))); + } + if (!this.changedMarkedColor) { + this.renderer.setMarkedColor(getMarkedColor()); + } + } + + public int getMarkedColor() { + WidgetTheme theme = getWidgetTheme(getContext().getTheme()); + if (theme instanceof WidgetTextFieldTheme textFieldTheme) { + return textFieldTheme.getMarkedColor(); + } + return ITheme.getDefault().getTextFieldTheme().getMarkedColor(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + if (syncHandler instanceof IStringValueiStringValue && + syncHandler instanceof ValueSyncHandlervalueSyncHandler) { + this.stringValue = iStringValue; + valueSyncHandler.setChangeListener(() -> { + markTooltipDirty(); + setText(this.stringValue.getValue().toString()); + }); + return true; + } + return false; + } + + @Override + public void onUpdate() { + super.onUpdate(); + if (!isFocused()) { + String s = this.stringValue.getStringValue(); + if (!getText().equals(s)) { + setText(s); + } + } + } + + @Override + public void drawText(ModularGuiContext context) { + this.renderer.setSimulate(false); + this.renderer.setPos(getArea().getPadding().left, 0); + this.renderer.setScale(this.scale); + this.renderer.setAlignment(this.textAlignment, -1, getArea().height); + // todo draw postfix better + this.renderer.draw(Collections.singletonList(getText() + this.postFix.get())); + getScrollData().setScrollSize(Math.max(0, (int) this.renderer.getLastWidth())); + } + + @Override + public void drawForeground(ModularGuiContext context) { + if (hasTooltip() && getScrollData().isScrollBarActive(getScrollArea()) && + isHoveringFor(getTooltip().getShowUpTimer())) { + getTooltip().draw(getContext()); + } + } + + public GTTextFieldWidget setPostFix(String postFix) { + this.postFix = () -> postFix; + return getThis(); + } + + public GTTextFieldWidget setPostFix(Supplier postFix) { + this.postFix = postFix; + return getThis(); + } + + @NotNull + public String getText() { + if (this.handler.getText().isEmpty()) { + return ""; + } + if (this.handler.getText().size() > 1) { + throw new IllegalStateException("GTTextFieldWidget can only have one line!"); + } + return this.handler.getText().get(0); + } + + public void setText(@NotNull String text) { + if (this.handler.getText().isEmpty()) { + this.handler.getText().add(text); + } else { + this.handler.getText().set(0, text); + } + } + + @Override + public void onFocus(ModularGuiContext context) { + super.onFocus(context); + Point main = this.handler.getMainCursor(); + if (main.x == 0) { + this.handler.setCursor(main.y, getText().length(), true, true); + } + } + + @Override + public void onRemoveFocus(ModularGuiContext context) { + super.onRemoveFocus(context); + this.setText(this.validator.apply(getText())); + this.stringValue + .setStringValue(this.numbers ? format.parse(getText(), new ParsePosition(0)).toString() : getText()); + } + + @Override + public boolean canHover() { + return true; + } + + public GTTextFieldWidget setMaxLength(int maxLength) { + this.handler.setMaxCharacters(maxLength); + return this; + } + + public GTTextFieldWidget setPattern(Pattern pattern) { + this.handler.setPattern(pattern); + return this; + } + + public GTTextFieldWidget setTextColor(int textColor) { + this.renderer.setColor(textColor); + this.changedTextColor = true; + return this; + } + + public GTTextFieldWidget setMarkedColor(int color) { + this.renderer.setMarkedColor(color); + this.changedMarkedColor = true; + return this; + } + + public GTTextFieldWidget setValidator(Function validator) { + this.validator = validator; + return this; + } + + public GTTextFieldWidget setNumbersLong(Function validator) { + this.numbers = true; + setValidator(val -> { + long num; + if (val.isEmpty()) { + num = 0; + } else { + num = (long) parse(val).doubleValue(); + } + return format.format(validator.apply(num)); + }); + return this; + } + + public GTTextFieldWidget setNumbers(Function validator) { + this.numbers = true; + return setValidator(val -> { + int num; + if (val.isEmpty()) { + num = 0; + } else { + num = (int) parse(val).doubleValue(); + } + return format.format(validator.apply(num)); + }); + } + + public GTTextFieldWidget setNumbersDouble(Function validator) { + this.numbers = true; + return setValidator(val -> { + double num; + if (val.isEmpty()) { + num = 0; + } else { + num = parse(val).doubleValue(); + } + return format.format(validator.apply(num)); + }); + } + + public GTTextFieldWidget setNumbers(Supplier min, Supplier max) { + return setNumbers(val -> Math.min(max.get(), Math.max(min.get(), val))); + } + + public GTTextFieldWidget setNumbersLong(Supplier min, Supplier max) { + return setNumbersLong(val -> Math.min(max.get(), Math.max(min.get(), val))); + } + + public GTTextFieldWidget setNumbers(int min, int max) { + return setNumbers(val -> Math.min(max, Math.max(min, val))); + } + + public GTTextFieldWidget setNumbers() { + return setNumbers(Integer.MIN_VALUE, Integer.MAX_VALUE); + } + + public GTTextFieldWidget value(IStringValue stringValue) { + this.stringValue = stringValue; + setValue(stringValue); + return this; + } +} From b20cfc208c2e9821bf34f0d6d7e488f71ce8029c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 14:20:25 -0700 Subject: [PATCH 04/57] improve post fix rendering improve cursor positioning slightly --- .../common/mui/widget/GTTextFieldWidget.java | 79 +++++++++++++++++-- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index f65f95c81ff..5962f731b2b 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -1,5 +1,7 @@ package gregtech.common.mui.widget; +import net.minecraft.client.renderer.GlStateManager; + import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.value.IStringValue; @@ -10,11 +12,13 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.value.sync.ValueSyncHandler; import com.cleanroommc.modularui.widgets.textfield.BaseTextFieldWidget; +import com.cleanroommc.modularui.widgets.textfield.TextFieldHandler; +import com.cleanroommc.modularui.widgets.textfield.TextFieldRenderer; import org.jetbrains.annotations.NotNull; import java.awt.*; import java.text.ParsePosition; -import java.util.Collections; +import java.util.List; import java.util.function.Function; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -23,13 +27,18 @@ public class GTTextFieldWidget extends BaseTextFieldWidget { - Supplier postFix = null; private IStringValue stringValue; private Function validator = val -> val; private boolean numbers = false; + private final GTTextFieldRenderer renderer; protected boolean changedMarkedColor = false; + public GTTextFieldWidget() { + this.renderer = new GTTextFieldRenderer(this.handler); + super.renderer = this.renderer; + } + @Override public void onInit() { super.onInit(); @@ -84,8 +93,7 @@ public void drawText(ModularGuiContext context) { this.renderer.setPos(getArea().getPadding().left, 0); this.renderer.setScale(this.scale); this.renderer.setAlignment(this.textAlignment, -1, getArea().height); - // todo draw postfix better - this.renderer.draw(Collections.singletonList(getText() + this.postFix.get())); + this.renderer.draw(this.handler.getText()); getScrollData().setScrollSize(Math.max(0, (int) this.renderer.getLastWidth())); } @@ -98,12 +106,15 @@ public void drawForeground(ModularGuiContext context) { } public GTTextFieldWidget setPostFix(String postFix) { - this.postFix = () -> postFix; - return getThis(); + return setPostFix(() -> postFix); } public GTTextFieldWidget setPostFix(Supplier postFix) { - this.postFix = postFix; + return setPostFix(IKey.dynamic(postFix)); + } + + public GTTextFieldWidget setPostFix(IKey postFix) { + this.renderer.setPostFix(postFix); return getThis(); } @@ -236,4 +247,58 @@ public GTTextFieldWidget value(IStringValue stringValue) { setValue(stringValue); return this; } + + private static class GTTextFieldRenderer extends TextFieldRenderer { + + IKey postFix = IKey.EMPTY; + + public GTTextFieldRenderer(TextFieldHandler handler) { + super(handler); + } + + @Override + protected void draw(String text, float x, float y) { + if (this.simulate) return; + GlStateManager.disableBlend(); + GlStateManager.pushMatrix(); + GlStateManager.scale(this.scale, this.scale, 0f); + getFontRenderer().drawString(text + this.postFix.getFormatted(), + x / this.scale, y / this.scale, + this.color, this.shadow); + GlStateManager.popMatrix(); + GlStateManager.enableBlend(); + } + + public void setPostFix(IKey postFix) { + this.postFix = postFix; + } + + @Override + public Point getCursorPos(List lines, int x, int y) { + if (lines.isEmpty()) { + return new Point(); + } + List measuredLines = measureLines(lines); + y -= getStartY(measuredLines.size()) + this.y; + int index = (int) (y / (getFontHeight())); + if (index < 0) return new Point(); + if (index >= measuredLines.size()) + return new Point(measuredLines.get(measuredLines.size() - 1).getText().length(), + measuredLines.size() - 1); + Line line = measuredLines.get(index); + x -= getStartX(line.getWidth()) + this.x; + if (x < 0) return new Point(0, index); + if (x > line.getWidth()) return new Point(line.getText().length(), index); + float currentX = 0; + for (int i = 0; i < line.getText().length(); i++) { + char c = line.getText().charAt(i); + float cw = getFontRenderer().getCharWidth(c) * this.scale; + currentX += cw; + if (currentX >= x + (cw / 2)) { + return new Point(i + 1, index); + } + } + return new Point(); + } + } } From 21df8e74e0e16bf26f4ce8ccc31c8cdb26aa5138 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:00:52 -0700 Subject: [PATCH 05/57] port advanced fluid detector create common ui method in detector base --- .../covers/detector/CoverDetectorBase.java | 34 +++++++++++++ .../detector/CoverDetectorEnergyAdvanced.java | 35 +++---------- .../detector/CoverDetectorFluidAdvanced.java | 50 +++++++++++++++++++ .../detector/CoverDetectorItemAdvanced.java | 33 ++---------- 4 files changed, 95 insertions(+), 57 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index cc5d81c01c6..4b97344f5c2 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -3,6 +3,7 @@ import gregtech.api.cover.CoverBase; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -13,7 +14,16 @@ import net.minecraft.util.text.TextComponentTranslation; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +import java.util.function.Supplier; import static gregtech.api.capability.GregtechDataCodes.UPDATE_INVERTED; @@ -151,4 +161,28 @@ protected static int parseCapped(String value, int minValue, int maxValue, int f } return Math.min(Math.max(parsedValue, minValue), maxValue); } + + protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier getter, + @Nullable Consumer setter) { + return createMinMaxRow(lang, getter, setter, null, null); + } + + protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier getter, + @Nullable Consumer setter, + @Nullable Supplier postFix, + @Nullable Consumer listener) { + return Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(IKey.lang(lang).asWidget()) + .child(new GTTextFieldWidget() + .right(0) + .size(90, 18) + .setTextColor(Color.WHITE.main) + .setPattern(TextFieldWidget.WHOLE_NUMS) + .setPostFix(postFix == null ? IKey.EMPTY::get : postFix) + .onUpdateListener(listener) + .value(new StringSyncValue(getter, setter))); + } } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 444481266f5..a5d6b487ab1 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -27,10 +27,8 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; @@ -89,9 +87,6 @@ public void update() { @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManager) { - var min = new StringSyncValue(this::getMinValue, this::setMinValue); - var max = new StringSyncValue(this::getMaxValue, this::setMaxValue); - return GTGuis.defaultPanel(this) .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) @@ -99,30 +94,12 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .top(28) .left(10).right(10) .coverChildrenHeight() - .child(Flow.row() - .widthRel(1f) - .coverChildrenHeight() - .marginBottom(5) - .child(IKey.lang("cover.advanced_energy_detector.min").asWidget()) - .child(new GTTextFieldWidget() - .right(0) - .size(90, 18) - .setTextColor(Color.WHITE.main) - .setPostFix(this::getPostFix) - .onUpdateListener(this::updateWidget) - .value(min))) - .child(Flow.row() - .widthRel(1f) - .coverChildrenHeight() - .marginBottom(5) - .child(IKey.lang("cover.advanced_energy_detector.max").asWidget()) - .child(new GTTextFieldWidget() - .right(0) - .size(90, 18) - .setTextColor(Color.WHITE.main) - .setPostFix(this::getPostFix) - .onUpdateListener(this::updateWidget) - .value(max))) + .child(createMinMaxRow("cover.advanced_energy_detector.min", + this::getMinValue, this::setMinValue, + this::getPostFix, this::updateWidget)) + .child(createMinMaxRow("cover.advanced_energy_detector.max", + this::getMaxValue, this::setMaxValue, + this::getPostFix, this::updateWidget)) .child(Flow.row() .widthRel(1f) .coverChildrenHeight() diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index 56d7eb246c9..f3f3f1efbaa 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -6,6 +6,7 @@ import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.*; +import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.filter.FluidFilterContainer; @@ -18,6 +19,7 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -28,6 +30,14 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.SidedPosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ToggleButton; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; public class CoverDetectorFluidAdvanced extends CoverDetectorFluid implements CoverWithUI { @@ -64,6 +74,46 @@ public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 tra Textures.DETECTOR_FLUID_ADVANCED.renderSided(getAttachedSide(), plateBox, renderState, pipeline, translation); } + @Override + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + return GTGuis.defaultPanel(this) + .height(202) + .child(CoverWithUI.createTitleRow(getPickItem())) + .child(Flow.column() + .top(28) + .left(5).right(5) + .child(createMinMaxRow("cover.advanced_fluid_detector.min", + this::getMinValue, this::setMinValue, + () -> "L", w -> w.setMaxLength(10))) + .child(createMinMaxRow("cover.advanced_fluid_detector.max", + this::getMaxValue, this::setMaxValue, + () -> "L", w -> w.setMaxLength(10))) + .child(Flow.row() + .widthRel(1f) + .coverChildrenHeight() + .marginBottom(5) + .child(new ToggleButton() + .size(72, 18) + .value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) + .overlay(new DynamicDrawable(() -> { + String lang = "cover.advanced_energy_detector."; + lang += isInverted() ? "inverted" : "normal"; + return IKey.lang(lang).format(TextFormatting.WHITE); + }))) + .child(new ToggleButton() + .size(72, 18) + .right(0) + .overlay(new DynamicDrawable(() -> { + String lang = "cover.generic.advanced_detector."; + lang += isLatched() ? "latched" : "continuous"; + return IKey.lang(lang).format(TextFormatting.WHITE); + })) + .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) + .value(new BooleanSyncValue(this::isLatched, this::setLatched))))) + .bindPlayerInventory(); + } + @Override public ModularUI createUI(EntityPlayer player) { WidgetGroup group = new WidgetGroup(); diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index f81ffe878f6..dfe4af1c20c 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -32,13 +32,10 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorItemAdvanced extends CoverDetectorItem implements CoverWithUI { @@ -70,36 +67,16 @@ public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 tra @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { return GTGuis.defaultPanel(this) - .height(166 + 36) + .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column() .top(28) .left(5).right(5) .coverChildrenHeight() - .child(Flow.row() - .widthRel(1f) - .coverChildrenHeight() - .marginBottom(5) - .child(IKey.lang("cover.advanced_item_detector.min").asWidget()) - .child(new TextFieldWidget() - .setTextColor(Color.WHITE.main) - .right(0) - .size(90, 18) - .setPattern(TextFieldWidget.WHOLE_NUMS) - .setMaxLength(10) - .value(new StringSyncValue(this::getMinValue, this::setMinValue)))) - .child(Flow.row() - .widthRel(1f) - .coverChildrenHeight() - .marginBottom(5) - .child(IKey.lang("cover.advanced_item_detector.max").asWidget()) - .child(new TextFieldWidget() - .setTextColor(Color.WHITE.main) - .right(0) - .size(90, 18) - .setPattern(TextFieldWidget.WHOLE_NUMS) - .setMaxLength(10) - .value(new StringSyncValue(this::getMaxValue, this::setMaxValue)))) + .child(createMinMaxRow("cover.advanced_item_detector.min", this::getMinValue, + this::setMinValue)) + .child(createMinMaxRow("cover.advanced_item_detector.max", this::getMaxValue, + this::setMaxValue)) .child(Flow.row() .widthRel(1f) .coverChildrenHeight() From cb10a2416e087717475e0a70c2009db518956e05 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:08:47 -0700 Subject: [PATCH 06/57] forgor filter ui delete old ui code simplify setters --- .../detector/CoverDetectorFluidAdvanced.java | 46 +------------- .../detector/CoverDetectorItemAdvanced.java | 61 +------------------ 2 files changed, 3 insertions(+), 104 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index f3f3f1efbaa..5b295b7a5ce 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -3,8 +3,6 @@ import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.*; import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; @@ -111,52 +109,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan })) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched))))) + .child(this.fluidFilter.initUI(guiData, guiSyncManager)) .bindPlayerInventory(); } - @Override - public ModularUI createUI(EntityPlayer player) { - WidgetGroup group = new WidgetGroup(); - group.addWidget(new LabelWidget(10, 8, "cover.advanced_fluid_detector.label")); - - // set min fluid amount - group.addWidget(new LabelWidget(10, 5 + (SIZE + PADDING), "cover.advanced_fluid_detector.min")); - group.addWidget(new ImageWidget(98 - 4, (SIZE + PADDING), 4 * SIZE, SIZE, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget2(98, 5 + (SIZE + PADDING), 4 * SIZE, SIZE, - this::getMinValue, this::setMinValue) - .setMaxLength(10) - .setAllowedChars(TextFieldWidget2.WHOLE_NUMS) - .setPostFix("L")); - - // set max fluid amount - group.addWidget(new LabelWidget(10, 5 + 2 * (SIZE + PADDING), "cover.advanced_fluid_detector.max")); - group.addWidget(new ImageWidget(98 - 4, 2 * (SIZE + PADDING), 4 * SIZE, SIZE, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget2(98, 5 + 2 * (SIZE + PADDING), 4 * SIZE, SIZE, - this::getMaxValue, this::setMaxValue) - .setMaxLength(10) - .setAllowedChars(TextFieldWidget2.WHOLE_NUMS) - .setPostFix("L")); - - // invert logic button - // group.addWidget(new LabelWidget(10, 5 + 3 * (SIZE + PADDING), - // "cover.generic.advanced_detector.invert_label")); - group.addWidget( - new CycleButtonWidget(10, 3 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isInverted, this::setInverted, - "cover.advanced_energy_detector.normal", "cover.advanced_energy_detector.inverted") - .setTooltipHoverString("cover.generic.advanced_detector.invert_tooltip")); - group.addWidget( - new CycleButtonWidget(94, 3 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isLatched, this::setLatched, - "cover.generic.advanced_detector.continuous", "cover.generic.advanced_detector.latched") - .setTooltipHoverString("cover.generic.advanced_detector.latch_tooltip")); - - this.fluidFilter.initUI(5 + 4 * (SIZE + PADDING), group::addWidget); - - return ModularUI.builder(GuiTextures.BACKGROUND, 176, 164 + 4 * (SIZE + PADDING)) - .widget(group) - .bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 164) - .build(this, player); - } - private String getMinValue() { return String.valueOf(min); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index dfe4af1c20c..47191dbd8c7 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -3,8 +3,6 @@ import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.*; import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; @@ -104,49 +102,6 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - @Override - public ModularUI createUI(EntityPlayer player) { - WidgetGroup group = new WidgetGroup(); - group.addWidget(new LabelWidget(10, 8, "cover.advanced_item_detector.label")); - - // set min fluid amount - group.addWidget(new LabelWidget(10, 5 + (SIZE + PADDING), "cover.advanced_item_detector.min")); - group.addWidget(new ImageWidget(98 - 4, (SIZE + PADDING), 4 * SIZE, SIZE, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget2(98, 5 + (SIZE + PADDING), 4 * SIZE, SIZE, - this::getMinValue, this::setMinValue) - .setMaxLength(10) - .setAllowedChars(TextFieldWidget2.WHOLE_NUMS)); - - // set max fluid amount - group.addWidget(new LabelWidget(10, 5 + 2 * (SIZE + PADDING), "cover.advanced_item_detector.max")); - group.addWidget(new ImageWidget(98 - 4, 2 * (SIZE + PADDING), 4 * SIZE, SIZE, GuiTextures.DISPLAY)); - group.addWidget(new TextFieldWidget2(98, 5 + 2 * (SIZE + PADDING), 4 * SIZE, SIZE, - this::getMaxValue, this::setMaxValue) - .setMaxLength(10) - .setAllowedChars(TextFieldWidget2.WHOLE_NUMS)); - - // invert logic button - // group.addWidget(new LabelWidget(10, 5 + 3 * (SIZE + PADDING), - // "cover.generic.advanced_detector.invert_label")); - group.addWidget( - new CycleButtonWidget(10, 3 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isInverted, this::setInverted, - "cover.advanced_energy_detector.normal", "cover.advanced_energy_detector.inverted") - .setTooltipHoverString("cover.generic.advanced_detector.invert_tooltip")); - // group.addWidget(new LabelWidget(10, 5 + 4 * (SIZE + PADDING), - // "cover.generic.advanced_detector.latch_label")); - group.addWidget( - new CycleButtonWidget(94, 3 * (SIZE + PADDING), 4 * SIZE, SIZE, this::isLatched, this::setLatched, - "cover.generic.advanced_detector.continuous", "cover.generic.advanced_detector.latched") - .setTooltipHoverString("cover.generic.advanced_detector.latch_tooltip")); - - this.itemFilter.initUI(5 + 4 * (SIZE + PADDING), group::addWidget); - - return ModularUI.builder(GuiTextures.BACKGROUND, 176, 188 + 4 * (SIZE + PADDING)) - .widget(group) - .bindPlayerInventory(player.inventory, GuiTextures.SLOT, 7, 188) - .build(this, player); - } - private String getMinValue() { return String.valueOf(min); } @@ -156,23 +111,11 @@ private String getMaxValue() { } private void setMinValue(String val) { - int parsedValue; - try { - parsedValue = Integer.parseInt(val); - } catch (NumberFormatException e) { - parsedValue = DEFAULT_MIN; - } - this.min = Math.min(max - 1, Math.max(0, parsedValue)); + this.min = CoverDetectorBase.parseCapped(val, 0, this.max - 1, DEFAULT_MIN); } private void setMaxValue(String val) { - int parsedValue; - try { - parsedValue = Integer.parseInt(val); - } catch (NumberFormatException e) { - parsedValue = DEFAULT_MAX; - } - max = Math.max(min + 1, parsedValue); + this.max = CoverDetectorBase.parseCapped(val, this.min + 1, Integer.MAX_VALUE, DEFAULT_MAX); } private void setLatched(boolean isLatched) { From f56fc49a24fa41bf776229685a8f1860074ebf9c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:22:45 -0700 Subject: [PATCH 07/57] move filter into column --- .../common/covers/detector/CoverDetectorFluidAdvanced.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index 5b295b7a5ce..e27bb3331d5 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -108,8 +108,8 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan return IKey.lang(lang).format(TextFormatting.WHITE); })) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) - .value(new BooleanSyncValue(this::isLatched, this::setLatched))))) - .child(this.fluidFilter.initUI(guiData, guiSyncManager)) + .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) + .child(this.fluidFilter.initUI(guiData, guiSyncManager))) .bindPlayerInventory(); } From 68eda2e70bf6869665bcb2be3ea522906cb124bf Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 15:38:50 -0700 Subject: [PATCH 08/57] actually sync isInverted --- .../gregtech/common/covers/detector/CoverDetectorBase.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 4b97344f5c2..33217af96d5 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -58,6 +58,12 @@ private void toggleInvertedWithNotification() { } } + @Override + public void readCustomData(int discriminator, @NotNull PacketBuffer buf) { + if (discriminator == UPDATE_INVERTED) + setInverted(buf.readBoolean()); + } + public final void setRedstoneSignalOutput(int redstoneSignalOutput) { this.redstoneSignalOutput = redstoneSignalOutput; getCoverableView().notifyBlockUpdate(); From 411052da6f12f230359b986c72d5c88dfb8da779 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 12 Jun 2025 23:50:14 -0700 Subject: [PATCH 09/57] fix compile and rebase --- .../covers/detector/CoverDetectorBase.java | 4 +- .../detector/CoverDetectorEnergyAdvanced.java | 4 +- .../detector/CoverDetectorFluidAdvanced.java | 4 +- .../detector/CoverDetectorItemAdvanced.java | 4 +- .../common/mui/widget/GTTextFieldWidget.java | 45 +++++++++++++------ 5 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 33217af96d5..9e2fe50e6f3 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -184,10 +184,10 @@ protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier IKey .lang("cover.advanced_energy_detector.mode_" + (isUsePercent() ? "percent" : "eu")) - .format(TextFormatting.WHITE))))) + .style(TextFormatting.WHITE))))) .child(Flow.row() .widthRel(1f) .coverChildrenHeight() @@ -128,7 +128,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .overlay(new DynamicDrawable(() -> IKey .lang("cover.advanced_energy_detector." + (isInverted() ? "inverted" : "normal")) - .format(TextFormatting.WHITE)))))) + .style(TextFormatting.WHITE)))))) .bindPlayerInventory(); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index e27bb3331d5..2fa4c5731ad 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -97,7 +97,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .overlay(new DynamicDrawable(() -> { String lang = "cover.advanced_energy_detector."; lang += isInverted() ? "inverted" : "normal"; - return IKey.lang(lang).format(TextFormatting.WHITE); + return IKey.lang(lang).style(TextFormatting.WHITE); }))) .child(new ToggleButton() .size(72, 18) @@ -105,7 +105,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .overlay(new DynamicDrawable(() -> { String lang = "cover.generic.advanced_detector."; lang += isLatched() ? "latched" : "continuous"; - return IKey.lang(lang).format(TextFormatting.WHITE); + return IKey.lang(lang).style(TextFormatting.WHITE); })) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 47191dbd8c7..7409091dd29 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -84,7 +84,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .overlay(new DynamicDrawable(() -> { String lang = "cover.advanced_energy_detector."; lang += isInverted() ? "inverted" : "normal"; - return IKey.lang(lang).format(TextFormatting.WHITE); + return IKey.lang(lang).style(TextFormatting.WHITE); })) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) .value(new BooleanSyncValue(this::isInverted, this::setInverted))) @@ -94,7 +94,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .overlay(new DynamicDrawable(() -> { String lang = "cover.generic.advanced_detector."; lang += isLatched() ? "latched" : "continuous"; - return IKey.lang(lang).format(TextFormatting.WHITE); + return IKey.lang(lang).style(TextFormatting.WHITE); })) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index 5962f731b2b..e6fc87b4e8c 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -1,5 +1,7 @@ package gregtech.common.mui.widget; +import gregtech.api.util.GTLog; + import net.minecraft.client.renderer.GlStateManager; import com.cleanroommc.modularui.api.ITheme; @@ -8,6 +10,8 @@ import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.MathUtils; +import com.cleanroommc.modularui.utils.ParseResult; import com.cleanroommc.modularui.value.StringValue; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.value.sync.ValueSyncHandler; @@ -15,21 +19,25 @@ import com.cleanroommc.modularui.widgets.textfield.TextFieldHandler; import com.cleanroommc.modularui.widgets.textfield.TextFieldRenderer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.awt.*; import java.text.ParsePosition; import java.util.List; +import java.util.function.DoubleUnaryOperator; import java.util.function.Function; +import java.util.function.IntUnaryOperator; +import java.util.function.LongUnaryOperator; import java.util.function.Supplier; import java.util.regex.Pattern; -import static com.cleanroommc.modularui.widgets.textfield.TextFieldWidget.parse; - public class GTTextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; private Function validator = val -> val; private boolean numbers = false; + private String mathFailMessage = null; + private double defaultNumber = 0; private final GTTextFieldRenderer renderer; protected boolean changedMarkedColor = false; @@ -109,7 +117,8 @@ public GTTextFieldWidget setPostFix(String postFix) { return setPostFix(() -> postFix); } - public GTTextFieldWidget setPostFix(Supplier postFix) { + public GTTextFieldWidget setPostFix(@Nullable Supplier postFix) { + if (postFix == null) return this; return setPostFix(IKey.dynamic(postFix)); } @@ -186,43 +195,43 @@ public GTTextFieldWidget setValidator(Function validator) { return this; } - public GTTextFieldWidget setNumbersLong(Function validator) { + public GTTextFieldWidget setNumbersLong(LongUnaryOperator validator) { this.numbers = true; setValidator(val -> { long num; if (val.isEmpty()) { num = 0; } else { - num = (long) parse(val).doubleValue(); + num = (long) parse(val); } - return format.format(validator.apply(num)); + return format.format(validator.applyAsLong(num)); }); return this; } - public GTTextFieldWidget setNumbers(Function validator) { + public GTTextFieldWidget setNumbers(IntUnaryOperator validator) { this.numbers = true; return setValidator(val -> { int num; if (val.isEmpty()) { num = 0; } else { - num = (int) parse(val).doubleValue(); + num = (int) parse(val); } - return format.format(validator.apply(num)); + return format.format(validator.applyAsInt(num)); }); } - public GTTextFieldWidget setNumbersDouble(Function validator) { + public GTTextFieldWidget setNumbersDouble(DoubleUnaryOperator validator) { this.numbers = true; return setValidator(val -> { double num; if (val.isEmpty()) { num = 0; } else { - num = parse(val).doubleValue(); + num = parse(val); } - return format.format(validator.apply(num)); + return format.format(validator.applyAsDouble(num)); }); } @@ -248,6 +257,16 @@ public GTTextFieldWidget value(IStringValue stringValue) { return this; } + public double parse(String num) { + ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); + double value = result.getResult(); + if (result.isFailure()) { + this.mathFailMessage = result.getError(); + GTLog.logger.error("Math expression error in {}: {}", this, this.mathFailMessage); + } + return value; + } + private static class GTTextFieldRenderer extends TextFieldRenderer { IKey postFix = IKey.EMPTY; @@ -269,7 +288,7 @@ protected void draw(String text, float x, float y) { GlStateManager.enableBlend(); } - public void setPostFix(IKey postFix) { + public void setPostFix(@NotNull IKey postFix) { this.postFix = postFix; } From 2fecca84ca39dc43983d4100daeeb21a6de8c6c9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 12 Jun 2025 23:55:16 -0700 Subject: [PATCH 10/57] use default number and add setter method move parse --- .../common/mui/widget/GTTextFieldWidget.java | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index e6fc87b4e8c..6548797e335 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -36,7 +36,6 @@ public class GTTextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; private Function validator = val -> val; private boolean numbers = false; - private String mathFailMessage = null; private double defaultNumber = 0; private final GTTextFieldRenderer renderer; @@ -47,6 +46,16 @@ public GTTextFieldWidget() { super.renderer = this.renderer; } + public double parse(String num) { + ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); + double value = result.getResult(); + if (result.isFailure()) { + String mathFailMessage = result.getError(); + GTLog.logger.error("Math expression error in {}: {}", this, mathFailMessage); + } + return value; + } + @Override public void onInit() { super.onInit(); @@ -200,7 +209,7 @@ public GTTextFieldWidget setNumbersLong(LongUnaryOperator validator) { setValidator(val -> { long num; if (val.isEmpty()) { - num = 0; + num = (long) this.defaultNumber; } else { num = (long) parse(val); } @@ -214,7 +223,7 @@ public GTTextFieldWidget setNumbers(IntUnaryOperator validator) { return setValidator(val -> { int num; if (val.isEmpty()) { - num = 0; + num = (int) this.defaultNumber; } else { num = (int) parse(val); } @@ -227,7 +236,7 @@ public GTTextFieldWidget setNumbersDouble(DoubleUnaryOperator validator) { return setValidator(val -> { double num; if (val.isEmpty()) { - num = 0; + num = this.defaultNumber; } else { num = parse(val); } @@ -251,22 +260,17 @@ public GTTextFieldWidget setNumbers() { return setNumbers(Integer.MIN_VALUE, Integer.MAX_VALUE); } + public GTTextFieldWidget setDefaultNumber(double defaultNumber) { + this.defaultNumber = defaultNumber; + return this; + } + public GTTextFieldWidget value(IStringValue stringValue) { this.stringValue = stringValue; setValue(stringValue); return this; } - public double parse(String num) { - ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); - double value = result.getResult(); - if (result.isFailure()) { - this.mathFailMessage = result.getError(); - GTLog.logger.error("Math expression error in {}: {}", this, this.mathFailMessage); - } - return value; - } - private static class GTTextFieldRenderer extends TextFieldRenderer { IKey postFix = IKey.EMPTY; From fe5707b503c4b6e722378d2e6b91b630b4a74d61 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 24 Oct 2025 00:02:41 -0700 Subject: [PATCH 11/57] fix textfield widgets being too tall add postfix for conveyor and pump --- src/main/java/gregtech/common/covers/CoverConveyor.java | 6 +++++- src/main/java/gregtech/common/covers/CoverPump.java | 7 ++++++- .../common/covers/ender/CoverAbstractEnderLink.java | 5 ++++- .../gregtech/common/covers/ender/CoverEnderFluidLink.java | 1 - 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 8e10e7a0cc2..9f98eb82952 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -15,6 +15,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.ItemFilterContainer; +import gregtech.common.mui.widget.GTTextFieldWidget; import gregtech.common.pipelike.itempipe.tile.TileEntityItemPipe; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -548,8 +549,11 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .left(18).right(18) + // todo remove 'keepScrollBarInArea' when this is fixed in mui2 + .keepScrollBarInArea(true) + .setPostFix(" items/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxItemTransferRate) .value(formattedThroughput) diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 29bf0b2b52c..84e095274ce 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -15,6 +15,8 @@ import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.FluidFilterContainer; +import gregtech.common.mui.widget.GTTextFieldWidget; + import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -229,8 +231,11 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .left(18).right(18) + // todo remove 'keepScrollBarInArea' when this is fixed in mui2 + .keepScrollBarInArea(true) + .setPostFix(" L/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxFluidTransferRate) .value(throughputString) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index f37a17d39fd..5dd448be97b 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -154,13 +154,16 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) - .child(new Row().marginBottom(2) + .child(Flow.row().marginBottom(2) .coverChildrenHeight() .child(createPrivateButton()) .child(createColorIcon()) .child(new TextFieldWidget() + // todo remove 'keepScrollBarInArea' when this is fixed in mui2 + .keepScrollBarInArea(true) .height(18) .value(name) + .setTextColor(Color.WHITE.main) .setPattern(COLOR_INPUT_PATTERN) .widthRel(0.5f) .marginRight(2)) diff --git a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java index 4c373dfd41c..0a3f14a990b 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverEnderFluidLink.java @@ -148,7 +148,6 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { var pumpMode = new EnumSyncValue<>(CoverPump.PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("pump_mode", pumpMode); - pumpMode.updateCacheFromSource(true); return super.createWidgets(data, syncManager) .child(getFluidFilterContainer().initUI(data, syncManager)) From 7d4b255c364d14c420703fbe5dc460d9992cfcf1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 24 Oct 2025 00:09:23 -0700 Subject: [PATCH 12/57] cleanup + spotless --- .../gregtech/common/covers/CoverConveyor.java | 1 - .../gregtech/common/covers/CoverPump.java | 2 - .../covers/detector/CoverDetectorBase.java | 59 +++++++++---------- .../detector/CoverDetectorEnergyAdvanced.java | 24 ++++---- .../detector/CoverDetectorFluidAdvanced.java | 24 ++++---- .../detector/CoverDetectorItemAdvanced.java | 28 ++++----- .../covers/ender/CoverAbstractEnderLink.java | 1 - 7 files changed, 59 insertions(+), 80 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 9f98eb82952..d1601c7c887 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -58,7 +58,6 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; 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; import it.unimi.dsi.fastutil.ints.IntList; diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 84e095274ce..a3893e1fb03 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -14,7 +14,6 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.FluidFilterContainer; - import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -57,7 +56,6 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 9e2fe50e6f3..174d858e77e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -16,13 +16,15 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.value.sync.LongSyncValue; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.function.Consumer; +import java.util.function.LongConsumer; +import java.util.function.LongSupplier; import java.util.function.Supplier; import static gregtech.api.capability.GregtechDataCodes.UPDATE_INVERTED; @@ -131,50 +133,43 @@ public boolean canConnectRedstone() { } /** - * Returns parsed result of {@code value} as long, or {@code fallbackValue} if the parse fails. + * Clamps {@code val} as int between {@code minValue} and {@code maxValue}. * - * @param value String to parse - * @param minValue Minimum value - * @param maxValue Maximum value - * @param fallbackValue Fallback value to be used in case of parse failure. + * @param val Current value + * @param minValue Minimum value + * @param maxValue Maximum value * @return Capped value of either parsed result or {@code fallbackValue} */ - protected static long parseCapped(String value, long minValue, long maxValue, long fallbackValue) { - long parsedValue; - try { - parsedValue = Long.parseLong(value); - } catch (NumberFormatException e) { - parsedValue = fallbackValue; - } - return Math.min(Math.max(parsedValue, minValue), maxValue); + protected final long clamp(long val, long minValue, long maxValue) { + return Math.min(Math.max(val, minValue), maxValue); } /** - * Returns parsed result of {@code value} as int, or {@code fallbackValue} if the parse fails. + * Clamps {@code val} as int between {@code minValue} and {@code maxValue}. * - * @param value String to parse - * @param minValue Minimum value - * @param maxValue Maximum value - * @param fallbackValue Fallback value to be used in case of parse failure. + * @param val Current value + * @param minValue Minimum value + * @param maxValue Maximum value * @return Capped value of either parsed result or {@code fallbackValue} */ - protected static int parseCapped(String value, int minValue, int maxValue, int fallbackValue) { - int parsedValue; - try { - parsedValue = Integer.parseInt(value); - } catch (NumberFormatException e) { - parsedValue = fallbackValue; - } - return Math.min(Math.max(parsedValue, minValue), maxValue); + protected final int clamp(int val, int minValue, int maxValue) { + return Math.min(Math.max(val, minValue), maxValue); } - protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier getter, - @Nullable Consumer setter) { + protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplier getter, + @Nullable LongConsumer setter) { return createMinMaxRow(lang, getter, setter, null, null); } - protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier getter, - @Nullable Consumer setter, + protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplier getter, + @Nullable LongConsumer setter, + @Nullable Supplier postFix, + @Nullable Consumer listener) { + return createMinMaxRow(lang, new LongSyncValue(getter, setter), postFix, listener); + } + + protected static Flow createMinMaxRow(@NotNull String lang, + @NotNull LongSyncValue syncValue, @Nullable Supplier postFix, @Nullable Consumer listener) { return Flow.row() @@ -189,6 +184,6 @@ protected static Flow createMinMaxRow(@NotNull String lang, @NotNull Supplier "L", w -> w.setMaxLength(10))) + () -> " L", w -> w.setMaxLength(10))) .child(createMinMaxRow("cover.advanced_fluid_detector.max", this::getMaxValue, this::setMaxValue, - () -> "L", w -> w.setMaxLength(10))) + () -> " L", w -> w.setMaxLength(10))) .child(Flow.row() .widthRel(1f) .coverChildrenHeight() @@ -113,20 +109,20 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - private String getMinValue() { - return String.valueOf(min); + private long getMinValue() { + return min; } - private String getMaxValue() { - return String.valueOf(max); + private long getMaxValue() { + return max; } - private void setMinValue(String val) { - this.min = CoverDetectorBase.parseCapped(val, 0, max - 1, DEFAULT_MIN); + private void setMinValue(long val) { + this.min = clamp((int) val, 0, max - 1); } - private void setMaxValue(String val) { - this.max = CoverDetectorBase.parseCapped(val, min + 1, Integer.MAX_VALUE, DEFAULT_MAX); + private void setMaxValue(long val) { + this.max = clamp((int) val, min + 1, Integer.MAX_VALUE); } private void setLatched(boolean isLatched) { diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 7409091dd29..82e8e76a126 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -3,7 +3,6 @@ import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; -import gregtech.api.gui.widgets.*; import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; @@ -38,9 +37,6 @@ public class CoverDetectorItemAdvanced extends CoverDetectorItem implements CoverWithUI { - private static final int PADDING = 3; - private static final int SIZE = 18; - private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; @@ -71,10 +67,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .top(28) .left(5).right(5) .coverChildrenHeight() - .child(createMinMaxRow("cover.advanced_item_detector.min", this::getMinValue, - this::setMinValue)) - .child(createMinMaxRow("cover.advanced_item_detector.max", this::getMaxValue, - this::setMaxValue)) + .child(createMinMaxRow("cover.advanced_item_detector.min", + this::getMinValue, this::setMinValue)) + .child(createMinMaxRow("cover.advanced_item_detector.max", + this::getMaxValue, this::setMaxValue)) .child(Flow.row() .widthRel(1f) .coverChildrenHeight() @@ -102,20 +98,20 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - private String getMinValue() { - return String.valueOf(min); + private long getMinValue() { + return min; } - private String getMaxValue() { - return String.valueOf(max); + private long getMaxValue() { + return max; } - private void setMinValue(String val) { - this.min = CoverDetectorBase.parseCapped(val, 0, this.max - 1, DEFAULT_MIN); + private void setMinValue(long val) { + this.min = clamp((int) val, 0, this.max - 1); } - private void setMaxValue(String val) { - this.max = CoverDetectorBase.parseCapped(val, this.min + 1, Integer.MAX_VALUE, DEFAULT_MAX); + private void setMaxValue(long val) { + this.max = clamp((int) val, this.min + 1, Integer.MAX_VALUE); } private void setLatched(boolean isLatched) { diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 5dd448be97b..8b61caf173c 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -44,7 +44,6 @@ import com.cleanroommc.modularui.widgets.ListWidget; import com.cleanroommc.modularui.widgets.ToggleButton; 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; import org.jetbrains.annotations.Nullable; From 9d575919f2849856c1562ee7f65cebc0e8731d93 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 24 Oct 2025 00:10:31 -0700 Subject: [PATCH 13/57] add todo --- src/main/java/gregtech/common/covers/CoverDigitalInterface.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 0063a113faa..138a746ebf4 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -450,6 +450,8 @@ public boolean modeLeftClick(EntityPlayer entityPlayer, MODE mode, int slot) { return false; } + // todo port this to mui2 unless that's already done in some other pr + @Override public ModularUI createUI(EntityPlayer player) { WidgetGroup primaryGroup = new WidgetGroup(new Position(0, 10)); From e82a5eb943fe5be03d5d34750a854ab3ab18142a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 24 Oct 2025 02:12:33 -0700 Subject: [PATCH 14/57] port digital interface --- .../java/gregtech/api/mui/GTGuiTextures.java | 16 ++ .../common/covers/CoverDigitalInterface.java | 180 ++++++++++++------ 2 files changed, 140 insertions(+), 56 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 998ad9c1d03..35e98c1d17b 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -458,6 +458,22 @@ private static String id(String path) { public static final UITexture RESEARCH_STATION_OVERLAY = fullImage( "textures/gui/overlay/research_station_overlay.png", ColorType.DEFAULT); + // Texture Areas + public static final UITexture[] BUTTON_FLUID = slice("textures/blocks/cover/cover_interface_fluid_button.png", 18, + 36, false); + public static final UITexture[] BUTTON_ITEM = slice("textures/blocks/cover/cover_interface_item_button.png", 18, 36, + false); + public static final UITexture[] BUTTON_ENERGY = slice("textures/blocks/cover/cover_interface_energy_button.png", 18, + 36, false); + public static final UITexture[] BUTTON_MACHINE = slice("textures/blocks/cover/cover_interface_machine_button.png", + 18, 36, false); + public static final UITexture[] BUTTON_INTERFACE = slice( + "textures/blocks/cover/cover_interface_computer_button.png", 18, 36, false); + public static final UITexture COVER_INTERFACE_MACHINE_ON_PROXY = fullImage( + "textures/blocks/cover/cover_interface_machine_on_proxy.png"); + public static final UITexture COVER_INTERFACE_MACHINE_OFF_PROXY = fullImage( + "textures/blocks/cover/cover_interface_machine_off_proxy.png"); + // BUTTONS public static final UITexture BUTTON = new UITexture.Builder() diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 138a746ebf4..0097a5303bc 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -7,15 +7,14 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.*; import gregtech.api.metatileentity.IFastRenderMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLog; -import gregtech.api.util.Position; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.RenderUtil; @@ -25,6 +24,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -60,6 +60,19 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import codechicken.lib.vec.Rotation; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.factory.SidedPosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.EnumSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.layout.Flow; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -86,11 +99,27 @@ public enum MODE { MACHINE, PROXY; - public static MODE[] VALUES; + public static final MODE[] VALUES; static { VALUES = MODE.values(); } + + public IKey getLangKey(boolean selected) { + return IKey.lang( + "metaitem.cover.digital.mode." + name().toLowerCase() + "." + (selected ? "enabled" : "disabled")); + } + + public IDrawable getOverlay(boolean selected) { + final int i = selected ? 1 : 0; + return switch (this) { + case FLUID -> GTGuiTextures.BUTTON_FLUID[i]; + case ITEM -> GTGuiTextures.BUTTON_ITEM[i]; + case ENERGY -> GTGuiTextures.BUTTON_ENERGY[i]; + case MACHINE -> GTGuiTextures.BUTTON_MACHINE[i]; + case PROXY -> GTGuiTextures.BUTTON_INTERFACE[i]; + }; + } } // run-time data @@ -450,55 +479,94 @@ public boolean modeLeftClick(EntityPlayer entityPlayer, MODE mode, int slot) { return false; } - // todo port this to mui2 unless that's already done in some other pr + @Override + public boolean usesMui2() { + return true; + } @Override - public ModularUI createUI(EntityPlayer player) { - WidgetGroup primaryGroup = new WidgetGroup(new Position(0, 10)); - primaryGroup.addWidget(new LabelWidget(10, 5, "metaitem.cover.digital.name", 0)); - ToggleButtonWidget[] buttons = new ToggleButtonWidget[5]; - buttons[0] = new ToggleButtonWidget(40, 20, 20, 20, GuiTextures.BUTTON_FLUID, () -> this.mode == MODE.FLUID, - (pressed) -> { - if (pressed) setMode(MODE.FLUID); - }).setTooltipText("metaitem.cover.digital.mode.fluid"); - buttons[1] = new ToggleButtonWidget(60, 20, 20, 20, GuiTextures.BUTTON_ITEM, () -> this.mode == MODE.ITEM, - (pressed) -> { - if (pressed) setMode(MODE.ITEM); - }).setTooltipText("metaitem.cover.digital.mode.item"); - buttons[2] = new ToggleButtonWidget(80, 20, 20, 20, GuiTextures.BUTTON_ENERGY, () -> this.mode == MODE.ENERGY, - (pressed) -> { - if (pressed) setMode(MODE.ENERGY); - }).setTooltipText("metaitem.cover.digital.mode.energy"); - buttons[3] = new ToggleButtonWidget(100, 20, 20, 20, GuiTextures.BUTTON_MACHINE, - () -> this.mode == MODE.MACHINE, (pressed) -> { - if (pressed) setMode(MODE.MACHINE); - }).setTooltipText("metaitem.cover.digital.mode.machine"); - buttons[4] = new ToggleButtonWidget(140, 20, 20, 20, GuiTextures.BUTTON_INTERFACE, - () -> this.mode == MODE.PROXY, (pressed) -> { - if (pressed) setMode(MODE.PROXY); - }).setTooltipText("metaitem.cover.digital.mode.proxy"); - primaryGroup.addWidget(new LabelWidget(10, 25, "metaitem.cover.digital.title.mode", 0)); - primaryGroup.addWidget(buttons[0]); - primaryGroup.addWidget(buttons[1]); - primaryGroup.addWidget(buttons[2]); - primaryGroup.addWidget(buttons[3]); - primaryGroup.addWidget(buttons[4]); - - primaryGroup.addWidget(new LabelWidget(10, 50, "monitor.gui.title.slot", 0)); - primaryGroup.addWidget( - new ClickButtonWidget(40, 45, 20, 20, "-1", (data) -> setMode(slot - (data.isShiftClick ? 10 : 1)))); - primaryGroup.addWidget( - new ClickButtonWidget(140, 45, 20, 20, "+1", (data) -> setMode(slot + (data.isShiftClick ? 10 : 1)))); - primaryGroup.addWidget(new ImageWidget(60, 45, 80, 20, GuiTextures.DISPLAY)); - primaryGroup.addWidget(new SimpleTextWidget(100, 55, "", 16777215, () -> Integer.toString(this.slot))); - - primaryGroup.addWidget(new LabelWidget(10, 75, "metaitem.cover.digital.title.spin", 0)); - primaryGroup.addWidget(new ClickButtonWidget(40, 70, 20, 20, "R", (data) -> setMode(this.spin.rotateY()))); - primaryGroup.addWidget(new ImageWidget(60, 70, 80, 20, GuiTextures.DISPLAY)); - primaryGroup.addWidget(new SimpleTextWidget(100, 80, "", 16777215, () -> this.spin.toString())); - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 202).widget(primaryGroup) - .bindPlayerInventory(player.inventory, GuiTextures.SLOT, 8, 120); - return builder.build(this, player); + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + Flow row = Flow.row() + .pos(10, 20) + .coverChildren() + .child(IKey.lang("metaitem.cover.digital.title.mode").asWidget() + .size(30, 20)); + + IntSyncValue slotValue = new IntSyncValue(() -> this.slot, this::setMode); + EnumSyncValue modeValue = new EnumSyncValue<>(MODE.class, this::getMode, this::setMode); + EnumSyncValue spinValue = new EnumSyncValue<>(EnumFacing.class, () -> this.spin, this::setMode); + guiSyncManager.syncValue("slot", slotValue); + guiSyncManager.syncValue("mode", modeValue); + guiSyncManager.syncValue("spin", spinValue); + + for (MODE mode : MODE.VALUES) { + row.child(new ButtonWidget<>() + .size(20) + .onMousePressed(m -> { + modeValue.setValue(mode); + return true; + }) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> tooltip.add(mode.getLangKey(getMode() == mode))) + .disableHoverBackground() + .background(new DynamicDrawable(() -> mode.getOverlay(getMode() == mode)))); + } + + return GTGuis.createPanel(this, 176, 202) + .child(CoverWithUI.createTitleRow(getPickItem()) + .pos(5, 5)) + .child(row) + .child(Flow.row() + .pos(10, 45) + .coverChildren() + .child(IKey.lang("monitor.gui.title.slot").asWidget() + .size(30, 20)) + .child(new ButtonWidget<>() + .size(20) + .overlay(IKey.str("-") + .color(Color.WHITE.main)) + .onMousePressed(m -> { + int s = slotValue.getIntValue(); + s -= Interactable.hasShiftDown() ? 10 : 1; + slotValue.setIntValue(s); + return true; + })) + .child(IKey.dynamic(() -> Integer.toString(this.slot)).asWidget() + .size(80, 20) + .paddingLeft(4) + .color(0xffffff) + .alignment(Alignment.CenterLeft) + .background(GTGuiTextures.DISPLAY)) + .child(new ButtonWidget<>() + .size(20) + .overlay(IKey.str("+") + .color(Color.WHITE.main)) + .onMousePressed(m -> { + int s = slotValue.getIntValue(); + s += Interactable.hasShiftDown() ? 10 : 1; + slotValue.setIntValue(s); + return true; + }))) + .child(Flow.row() + .pos(10, 75) + .coverChildren() + .child(IKey.lang("metaitem.cover.digital.title.spin").asWidget() + .size(30, 20)) + .child(new ButtonWidget<>() + .size(20) + .overlay(IKey.str("R") + .color(Color.WHITE.main)) + .onMousePressed(m -> { + spinValue.setValue(spinValue.getValue().rotateY()); + return true; + })) + .child(IKey.dynamic(() -> spinValue.getValue().toString()).asWidget() + .alignment(Alignment.CenterLeft) + .paddingLeft(4) + .size(80, 20) + .color(0xffffff) + .background(GTGuiTextures.DISPLAY))) + .bindPlayerInventory(); } private void syncAllInfo() { @@ -916,14 +984,14 @@ public T getCapability(@NotNull Capability capability, T defaultValue) { @Override public void renderCover(CCRenderState ccRenderState, Matrix4 translation, IVertexOperation[] ops, Cuboid6 cuboid6, BlockRenderLayer blockRenderLayer) { - codechicken.lib.vec.Rotation rotation = new codechicken.lib.vec.Rotation(0, 0, 1, 0); + Rotation rotation = new Rotation(0, 0, 1, 0); if (this.getAttachedSide().getAxis().isVertical()) { if (this.spin == EnumFacing.WEST) { translation.translate(0, 0, 1); - rotation = new codechicken.lib.vec.Rotation(Math.PI / 2, 0, 1, 0); + rotation = new Rotation(Math.PI / 2, 0, 1, 0); } else if (this.spin == EnumFacing.EAST) { translation.translate(1, 0, 0); - rotation = new codechicken.lib.vec.Rotation(-Math.PI / 2, 0, 1, 0); + rotation = new Rotation(-Math.PI / 2, 0, 1, 0); } else if (this.spin == EnumFacing.SOUTH) { translation.translate(1, 0, 1); rotation = new Rotation(Math.PI, 0, 1, 0); @@ -963,7 +1031,7 @@ public void renderMetaTileEntityFast(CCRenderState renderState, Matrix4 translat public void renderMetaTileEntity(double x, double y, double z, float partialTicks) { GlStateManager.pushMatrix(); /* hack the lightmap */ - net.minecraft.client.renderer.RenderHelper.disableStandardItemLighting(); + RenderHelper.disableStandardItemLighting(); float lastBrightnessX = OpenGlHelper.lastBrightnessX; float lastBrightnessY = OpenGlHelper.lastBrightnessY; OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240.0F, 240.0F); @@ -978,7 +1046,7 @@ public void renderMetaTileEntity(double x, double y, double z, float partialTick /* restore the lightmap */ OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, lastBrightnessX, lastBrightnessY); - net.minecraft.client.renderer.RenderHelper.enableStandardItemLighting(); + RenderHelper.enableStandardItemLighting(); GlStateManager.popMatrix(); } From 54df137504c7d2862300f010c4a8e4f2b8c36bc1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 24 Oct 2025 21:49:34 -0700 Subject: [PATCH 15/57] make slot text field editable --- .../common/covers/CoverDigitalInterface.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 0097a5303bc..73a320040f8 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -20,6 +20,7 @@ import gregtech.client.utils.RenderUtil; import gregtech.common.gui.widget.prospector.widget.WidgetOreList; import gregtech.common.metatileentities.multi.electric.MetaTileEntityPowerSubstation; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -68,6 +69,7 @@ import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.StringValue; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -531,11 +533,14 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan slotValue.setIntValue(s); return true; })) - .child(IKey.dynamic(() -> Integer.toString(this.slot)).asWidget() + .child(new GTTextFieldWidget() + .setNumbers(0, Integer.MAX_VALUE) + .value(new StringValue.Dynamic( + () -> String.valueOf(slotValue.getIntValue()), + s -> slotValue.setIntValue(Integer.parseInt(s)))) .size(80, 20) - .paddingLeft(4) - .color(0xffffff) - .alignment(Alignment.CenterLeft) + .keepScrollBarInArea() + .setTextColor(Color.WHITE.main) .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() .size(20) @@ -564,7 +569,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .alignment(Alignment.CenterLeft) .paddingLeft(4) .size(80, 20) - .color(0xffffff) + .color(Color.WHITE.main) .background(GTGuiTextures.DISPLAY))) .bindPlayerInventory(); } From 76e71ee6b7bba6d0a888d573685eef29619eb4cc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Oct 2025 01:42:21 -0700 Subject: [PATCH 16/57] try improve ender fluid security --- .../virtualregistry/VirtualRegistryMap.java | 3 +- .../covers/ender/CoverAbstractEnderLink.java | 103 ++++++++++++------ .../common/mui/widget/InteractableText.java | 19 ++-- .../ftb/utility/FTBTeamHelper.java | 14 +++ 4 files changed, 97 insertions(+), 42 deletions(-) create mode 100644 src/main/java/gregtech/integration/ftb/utility/FTBTeamHelper.java diff --git a/src/main/java/gregtech/api/util/virtualregistry/VirtualRegistryMap.java b/src/main/java/gregtech/api/util/virtualregistry/VirtualRegistryMap.java index 18a2b9a81e8..e7a29a68261 100644 --- a/src/main/java/gregtech/api/util/virtualregistry/VirtualRegistryMap.java +++ b/src/main/java/gregtech/api/util/virtualregistry/VirtualRegistryMap.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -49,7 +50,7 @@ public void clear() { } public Set getEntryNames(EntryTypes type) { - return registryMap.get(type).keySet(); + return registryMap.getOrDefault(type, Collections.emptyMap()).keySet(); } @Override diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 8b61caf173c..656d3444ec1 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -12,6 +12,7 @@ import gregtech.api.util.virtualregistry.VirtualEnderRegistry; import gregtech.api.util.virtualregistry.VirtualEntry; import gregtech.common.mui.widget.InteractableText; +import gregtech.integration.ftb.utility.FTBTeamHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -24,7 +25,9 @@ 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.value.IBoolValue; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; @@ -96,6 +99,11 @@ protected final UUID getOwner() { return isPrivate ? playerUUID : null; } + protected boolean canAccess(UUID other) { + return this.playerUUID == null || this.playerUUID.equals(other) || + FTBTeamHelper.isSameTeam(this.playerUUID, other); + } + @Override public void readCustomData(int discriminator, @NotNull PacketBuffer buf) { super.readCustomData(discriminator, buf); @@ -137,25 +145,34 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { - var panel = GTGuis.createPanel(this, 176, 192); - - this.playerUUID = guiData.getPlayer().getUniqueID(); - - return panel.child(CoverWithUI.createTitleRow(getPickItem())) + if (!isPrivate()) { + // if we're public, we update the player uuid + // so when set to private, it'll use the latest player uuid + this.playerUUID = guiData.getPlayer().getUniqueID(); + } + return GTGuis.createPanel(this, 176, 192) + .child(CoverWithUI.createTitleRow(getPickItem())) .child(createWidgets(guiData, guiSyncManager)) .bindPlayerInventory(); } protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { - var name = new StringSyncValue(this::getColorStr, this::updateColor); + StringSyncValue name; + UUID uuid = data.getPlayer().getUniqueID(); + + if (canAccess(uuid)) { + name = new StringSyncValue(this::getColorStr, this::updateColor); + } else { + name = new StringSyncValue(this::getColorStr); + } - var entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType()), true); + IPanelHandler entrySelectorSH = syncManager.panel("entry_selector", entrySelector(getType(), uuid), true); return Flow.column().coverChildrenHeight().top(24) .margin(7, 0).widthRel(1f) .child(Flow.row().marginBottom(2) .coverChildrenHeight() - .child(createPrivateButton()) + .child(createPrivateButton(uuid)) .child(createColorIcon()) .child(new TextFieldWidget() // todo remove 'keepScrollBarInArea' when this is fixed in mui2 @@ -181,7 +198,7 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { } return true; }))) - .child(createIoRow()); + .child(createIoRow(uuid)); } protected abstract IWidget createEntrySlot(); @@ -196,29 +213,39 @@ protected IWidget createColorIcon() { .marginRight(2); } - protected IWidget createPrivateButton() { + protected IWidget createPrivateButton(UUID uniqueID) { + BooleanSyncValue syncValue; + if (canAccess(uniqueID)) + syncValue = new BooleanSyncValue(this::isPrivate, this::setPrivate); + else { + syncValue = new BooleanSyncValue(this::isPrivate); + } return new ToggleButton() - .value(new BooleanSyncValue(this::isPrivate, this::setPrivate)) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .value(syncValue) .background(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) .hoverBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[0]) .selectedBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[1]) .selectedHoverBackground(GTGuiTextures.PRIVATE_MODE_BUTTON[1]) - .tooltipBuilder(tooltip -> tooltip.addLine(IKey.lang(this.isPrivate ? - "cover.ender_fluid_link.private.tooltip.enabled" : - "cover.ender_fluid_link.private.tooltip.disabled"))) + .addTooltip(true, IKey.lang("cover.ender_fluid_link.private.tooltip.enabled")) + .addTooltip(false, IKey.lang("cover.ender_fluid_link.private.tooltip.disabled")) .marginRight(2); } - protected IWidget createIoRow() { + protected IWidget createIoRow(UUID uuid) { + BooleanSyncValue syncValue; + if (canAccess(uuid)) { + syncValue = new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled); + } else { + syncValue = new BooleanSyncValue(this::isIoEnabled); + } return Flow.row().marginBottom(2) .coverChildrenHeight() .child(new ToggleButton() - .value(new BooleanSyncValue(this::isIoEnabled, this::setIoEnabled)) - .overlay(IKey.lang(() -> this.ioEnabled ? - "behaviour.soft_hammer.enabled" : - "behaviour.soft_hammer.disabled") - .color(Color.WHITE.darker(1))) + .value(syncValue) + .overlay(true, IKey.lang("behaviour.soft_hammer.enabled") + .color(Color.WHITE.main)) + .overlay(false, IKey.lang("behaviour.soft_hammer.disabled") + .color(Color.WHITE.main)) .widthRel(0.6f) .left(0)); } @@ -254,6 +281,7 @@ private void setPrivate(boolean isPrivate) { @Override public void writeInitialSyncData(PacketBuffer packetBuffer) { packetBuffer.writeString(this.playerUUID == null ? "null" : this.playerUUID.toString()); + packetBuffer.writeBoolean(this.isPrivate); } @Override @@ -261,6 +289,7 @@ public void readInitialSyncData(PacketBuffer packetBuffer) { // does client even need uuid info? just in case String uuidStr = packetBuffer.readString(36); this.playerUUID = uuidStr.equals("null") ? null : UUID.fromString(uuidStr); + this.isPrivate = packetBuffer.readBoolean(); } @Override @@ -285,11 +314,11 @@ public void writeToNBT(@NotNull NBTTagCompound nbt) { nbt.setInteger("Frequency", activeEntry.getColor()); } - protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { + protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type, UUID uuid) { return (syncManager, syncHandler) -> { List rows = new ArrayList<>(); for (String name : VirtualEnderRegistry.getEntryNames(getOwner(), type)) { - rows.add(createRow(name, syncManager, type)); + rows.add(createRow(name, syncManager, type, uuid)); } return GTGuis.createPopupPanel("entry_selector", 168, 112, true) .child(IKey.lang("cover.generic.ender.known_channels") @@ -299,7 +328,6 @@ protected PanelSyncHandler.IPanelBuilder entrySelector(EntryTypes type) { .left(4)) .child(new ListWidget<>() .children(rows) - // .builder(names, name -> createRow(name, syncManager, type)) .background(GTGuiTextures.DISPLAY.asIcon() .width(168 - 8) .height(112 - 20)) @@ -342,13 +370,15 @@ protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { }; } - 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 panelHandler = (PanelSyncHandler) syncManager.panel(syncKey, + protected IWidget createRow(String name, PanelSyncManager syncManager, + EntryTypes type, UUID uuid) { + T entry = VirtualEnderRegistry.getEntry(getOwner(), type, name); + String key = String.format("entry#%s_description", entry.getColorStr()); + String syncKey = PanelSyncManager.makeSyncKey(key, isPrivate ? 1 : 0); + IPanelHandler panelHandler = syncManager.panel(syncKey, entryDescription(key, entry), true); - final var syncHandler = new EnderCoverSyncHandler(); + + EnderCoverSyncHandler syncHandler = new EnderCoverSyncHandler(); syncManager.syncValue(key + "_handler", syncHandler); return Flow.row() @@ -364,8 +394,13 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .size(16) .background(GTGuiTextures.SLOT.asIcon().size(18)) .top(1)) - .child(new InteractableText<>(entry, this::updateColor) - .tooltipAutoUpdate(true) + .child(new InteractableText<>(entry, str -> { + if (canAccess(uuid)) { + updateColor(str); + return true; + } + return false; + }).tooltipAutoUpdate(true) .tooltipBuilder(tooltip -> { String desc = entry.getDescription(); if (!desc.isEmpty()) tooltip.add(desc); @@ -378,6 +413,8 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .overlay(GuiTextures.GEAR) .addTooltipLine(IKey.lang("cover.generic.ender.set_description.tooltip")) .onMousePressed(i -> { + if (!canAccess(uuid)) return false; + // open entry settings if (panelHandler.isPanelOpen()) { panelHandler.closePanel(); @@ -392,6 +429,8 @@ protected IWidget createRow(final String name, final PanelSyncManager syncManage .setEnabledIf(w -> !Objects.equals(entry.getColor(), activeEntry.getColor())) .addTooltipLine(IKey.lang("cover.generic.ender.delete_entry")) .onMousePressed(i -> { + if (!canAccess(uuid)) return false; + // todo option to force delete, maybe as a popup? deleteEntry(getOwner(), name); syncHandler.syncToServer(1, buffer -> { diff --git a/src/main/java/gregtech/common/mui/widget/InteractableText.java b/src/main/java/gregtech/common/mui/widget/InteractableText.java index 0ac02dd22e3..dc3645c252f 100644 --- a/src/main/java/gregtech/common/mui/widget/InteractableText.java +++ b/src/main/java/gregtech/common/mui/widget/InteractableText.java @@ -13,14 +13,14 @@ import com.cleanroommc.modularui.widgets.TextWidget; import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; +import java.util.function.Function; public class InteractableText extends TextWidget> implements Interactable { private final T entry; private final EntryColorSH syncHandler; - public InteractableText(T entry, Consumer setter) { + public InteractableText(T entry, Function setter) { super(IKey.str(entry.getColorStr()) .alignment(Alignment.CenterLeft) .color(Color.WHITE.darker(1))); @@ -32,9 +32,10 @@ public InteractableText(T entry, Consumer setter) { @NotNull @Override public Result onMousePressed(int mouseButton) { - Interactable.playButtonClickSound(); - this.syncHandler.setColor(this.entry.getColorStr()); - this.syncHandler.syncToServer(1, buf -> NetworkUtils.writeStringSafe(buf, this.entry.getColorStr())); + if (this.syncHandler.setColor(this.entry.getColorStr())) { + Interactable.playButtonClickSound(); + this.syncHandler.syncToServer(1, buf -> NetworkUtils.writeStringSafe(buf, this.entry.getColorStr())); + } return Result.SUCCESS; } @@ -45,14 +46,14 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { private static class EntryColorSH extends SyncHandler { - private final Consumer setter; + private final Function setter; - private EntryColorSH(Consumer setter) { + private EntryColorSH(Function setter) { this.setter = setter; } - public void setColor(String c) { - this.setter.accept(c); + public boolean setColor(String c) { + return this.setter.apply(c); } @Override diff --git a/src/main/java/gregtech/integration/ftb/utility/FTBTeamHelper.java b/src/main/java/gregtech/integration/ftb/utility/FTBTeamHelper.java new file mode 100644 index 00000000000..6201b7d95c2 --- /dev/null +++ b/src/main/java/gregtech/integration/ftb/utility/FTBTeamHelper.java @@ -0,0 +1,14 @@ +package gregtech.integration.ftb.utility; + +import gregtech.api.util.Mods; + +import com.feed_the_beast.ftblib.lib.data.FTBLibAPI; + +import java.util.UUID; + +public class FTBTeamHelper { + + public static boolean isSameTeam(UUID first, UUID second) { + return Mods.FTB_UTILITIES.isModLoaded() && FTBLibAPI.arePlayersInSameTeam(first, second); + } +} From 90a4e1f4d28200f952d6f8a511772ffabd7326cd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Oct 2025 01:46:11 -0700 Subject: [PATCH 17/57] delete unused method --- .../util/virtualregistry/VirtualEnderRegistry.java | 13 ------------- .../common/covers/ender/CoverAbstractEnderLink.java | 1 - 2 files changed, 14 deletions(-) diff --git a/src/main/java/gregtech/api/util/virtualregistry/VirtualEnderRegistry.java b/src/main/java/gregtech/api/util/virtualregistry/VirtualEnderRegistry.java index 3d8ccd78224..f4c5e861908 100644 --- a/src/main/java/gregtech/api/util/virtualregistry/VirtualEnderRegistry.java +++ b/src/main/java/gregtech/api/util/virtualregistry/VirtualEnderRegistry.java @@ -7,7 +7,6 @@ import net.minecraft.world.World; import net.minecraft.world.storage.MapStorage; import net.minecraft.world.storage.WorldSavedData; -import net.minecraftforge.fluids.IFluidTank; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -91,18 +90,6 @@ private static VirtualRegistryMap getRegistry(UUID owner) { return VIRTUAL_REGISTRIES.computeIfAbsent(owner, key -> new VirtualRegistryMap()); } - // remove if tank app is removed - public static Map> createTankMap() { - Map> map = new HashMap<>(); - for (var uuid : VIRTUAL_REGISTRIES.keySet()) { - map.put(uuid, new HashMap<>()); - for (var name : getEntryNames(uuid, EntryTypes.ENDER_FLUID)) { - map.get(uuid).put(name, getEntry(uuid, EntryTypes.ENDER_FLUID, name)); - } - } - return map; - } - @Override public final void readFromNBT(NBTTagCompound nbt) { if (nbt.hasKey(PUBLIC_KEY)) { diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 656d3444ec1..a5fb6801b19 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -27,7 +27,6 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.value.IBoolValue; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.GuiTextures; From 599f22db63caf5b734ee4cb8171b95a813fe04e2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 8 Nov 2025 18:59:58 -0700 Subject: [PATCH 18/57] keep values proportional instead of resetting on switching modes --- .../covers/detector/CoverDetectorEnergyAdvanced.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index eb23326917f..7a88d8c4125 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -138,11 +138,11 @@ private void updateWidget(GTTextFieldWidget w) { } private long getMinValue() { - return (minValue); + return minValue; } private long getMaxValue() { - return (maxValue); + return maxValue; } private void setMinValue(long val) { @@ -163,11 +163,11 @@ private void setUsePercent(boolean b) { this.usePercent = b; if (this.usePercent) { // using percent - this.minValue = DEFAULT_MIN_PERCENT; - this.maxValue = DEFAULT_MAX_PERCENT; + this.minValue = (long) Math.ceil(((double) this.minValue / getCoverHolderCapacity()) * 100d); + this.maxValue = (long) Math.ceil(((double) this.maxValue / getCoverHolderCapacity()) * 100d); } else { // using discrete EU - this.minValue = DEFAULT_MIN_EU; - this.maxValue = DEFAULT_MAX_EU; + this.minValue = (long) Math.floor((this.minValue / 100d) * getCoverHolderCapacity()); + this.maxValue = (long) Math.floor((this.maxValue / 100d) * getCoverHolderCapacity()); } } From 8a3d5144663cfe39123d2e07a5b3aaf9261d42d0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 19:02:22 -0700 Subject: [PATCH 19/57] fix rebase --- .../java/gregtech/api/mui/GTGuiTextures.java | 10 +++---- .../gregtech/common/covers/CoverConveyor.java | 8 +++--- .../common/covers/CoverDigitalInterface.java | 8 +++--- .../gregtech/common/covers/CoverPump.java | 8 +++--- .../covers/detector/CoverDetectorBase.java | 9 +++---- .../detector/CoverDetectorEnergyAdvanced.java | 7 ++--- .../detector/CoverDetectorFluidAdvanced.java | 3 ++- .../detector/CoverDetectorItemAdvanced.java | 3 ++- .../covers/ender/CoverAbstractEnderLink.java | 2 -- .../common/mui/widget/GTTextFieldWidget.java | 27 +++++++++---------- 10 files changed, 39 insertions(+), 46 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 35e98c1d17b..80baa6244bf 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -460,15 +460,15 @@ private static String id(String path) { // Texture Areas public static final UITexture[] BUTTON_FLUID = slice("textures/blocks/cover/cover_interface_fluid_button.png", 18, - 36, false); + 36, null); public static final UITexture[] BUTTON_ITEM = slice("textures/blocks/cover/cover_interface_item_button.png", 18, 36, - false); + null); public static final UITexture[] BUTTON_ENERGY = slice("textures/blocks/cover/cover_interface_energy_button.png", 18, - 36, false); + 36, null); public static final UITexture[] BUTTON_MACHINE = slice("textures/blocks/cover/cover_interface_machine_button.png", - 18, 36, false); + 18, 36, null); public static final UITexture[] BUTTON_INTERFACE = slice( - "textures/blocks/cover/cover_interface_computer_button.png", 18, 36, false); + "textures/blocks/cover/cover_interface_computer_button.png", 18, 36, null); public static final UITexture COVER_INTERFACE_MACHINE_ON_PROXY = fullImage( "textures/blocks/cover/cover_interface_machine_on_proxy.png"); public static final UITexture COVER_INTERFACE_MACHINE_OFF_PROXY = fullImage( diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index d1601c7c887..6d3e649335a 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -15,7 +15,6 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.ItemFilterContainer; -import gregtech.common.mui.widget.GTTextFieldWidget; import gregtech.common.pipelike.itempipe.tile.TileEntityItemPipe; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -58,6 +57,7 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; 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; import it.unimi.dsi.fastutil.ints.IntList; @@ -548,11 +548,9 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new GTTextFieldWidget() + .child(new TextFieldWidget() .left(18).right(18) - // todo remove 'keepScrollBarInArea' when this is fixed in mui2 - .keepScrollBarInArea(true) - .setPostFix(" items/s") + // .setPostFix(" items/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxItemTransferRate) .value(formattedThroughput) diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 73a320040f8..e873e69770d 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -20,7 +20,6 @@ import gregtech.client.utils.RenderUtil; import gregtech.common.gui.widget.prospector.widget.WidgetOreList; import gregtech.common.metatileentities.multi.electric.MetaTileEntityPowerSubstation; -import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -67,6 +66,7 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.StringValue; @@ -75,6 +75,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -487,7 +488,7 @@ public boolean usesMui2() { } @Override - public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { Flow row = Flow.row() .pos(10, 20) .coverChildren() @@ -533,13 +534,12 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan slotValue.setIntValue(s); return true; })) - .child(new GTTextFieldWidget() + .child(new TextFieldWidget() .setNumbers(0, Integer.MAX_VALUE) .value(new StringValue.Dynamic( () -> String.valueOf(slotValue.getIntValue()), s -> slotValue.setIntValue(Integer.parseInt(s)))) .size(80, 20) - .keepScrollBarInArea() .setTextColor(Color.WHITE.main) .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index a3893e1fb03..0d8fc467233 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -14,7 +14,6 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.FluidFilterContainer; -import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; @@ -56,6 +55,7 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -229,11 +229,9 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new GTTextFieldWidget() + .child(new TextFieldWidget() .left(18).right(18) - // todo remove 'keepScrollBarInArea' when this is fixed in mui2 - .keepScrollBarInArea(true) - .setPostFix(" L/s") + // .setPostFix(" L/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxFluidTransferRate) .value(throughputString) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 174d858e77e..c64b4741541 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -3,7 +3,6 @@ import gregtech.api.cover.CoverBase; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; -import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -164,25 +163,25 @@ protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplie protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplier getter, @Nullable LongConsumer setter, @Nullable Supplier postFix, - @Nullable Consumer listener) { + @Nullable Consumer listener) { return createMinMaxRow(lang, new LongSyncValue(getter, setter), postFix, listener); } protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSyncValue syncValue, @Nullable Supplier postFix, - @Nullable Consumer listener) { + @Nullable Consumer listener) { return Flow.row() .widthRel(1f) .coverChildrenHeight() .marginBottom(5) .child(IKey.lang(lang).asWidget()) - .child(new GTTextFieldWidget() + .child(new TextFieldWidget() .right(0) .size(90, 18 - 4) .setTextColor(Color.WHITE.main) .setPattern(TextFieldWidget.WHOLE_NUMS) - .setPostFix(postFix) + // .setPostFix(postFix) .onUpdateListener(listener) .value(syncValue)); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 7a88d8c4125..91d7d22f663 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -6,7 +6,6 @@ import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; -import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -27,10 +26,12 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { @@ -86,7 +87,7 @@ public void update() { } @Override - public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManager) { + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManager, UISettings settings) { return GTGuis.defaultPanel(this) .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) @@ -132,7 +133,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .bindPlayerInventory(); } - private void updateWidget(GTTextFieldWidget w) { + private void updateWidget(TextFieldWidget w) { w.setMaxLength(getLength()); w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index e770d3f3ad4..4783aa30b7a 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -31,6 +31,7 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ToggleButton; @@ -69,7 +70,7 @@ public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 tra } @Override - public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { return GTGuis.defaultPanel(this) .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 82e8e76a126..202ccbe31af 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -29,6 +29,7 @@ import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ToggleButton; @@ -59,7 +60,7 @@ public void renderCover(@NotNull CCRenderState renderState, @NotNull Matrix4 tra } @Override - public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager) { + public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { return GTGuis.defaultPanel(this) .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index a5fb6801b19..14e5c5f3316 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -174,8 +174,6 @@ protected Flow createWidgets(GuiData data, PanelSyncManager syncManager) { .child(createPrivateButton(uuid)) .child(createColorIcon()) .child(new TextFieldWidget() - // todo remove 'keepScrollBarInArea' when this is fixed in mui2 - .keepScrollBarInArea(true) .height(18) .value(name) .setTextColor(Color.WHITE.main) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index 6548797e335..f7d0b5ae643 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -4,12 +4,11 @@ import net.minecraft.client.renderer.GlStateManager; -import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.value.IStringValue; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; -import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.utils.MathUtils; import com.cleanroommc.modularui.utils.ParseResult; import com.cleanroommc.modularui.value.StringValue; @@ -31,6 +30,7 @@ import java.util.function.Supplier; import java.util.regex.Pattern; +// todo text is rendering incorrectly, figure out why public class GTTextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; @@ -72,11 +72,7 @@ public void onInit() { } public int getMarkedColor() { - WidgetTheme theme = getWidgetTheme(getContext().getTheme()); - if (theme instanceof WidgetTextFieldTheme textFieldTheme) { - return textFieldTheme.getMarkedColor(); - } - return ITheme.getDefault().getTextFieldTheme().getMarkedColor(); + return getWidgetTheme(getContext().getTheme()).getTheme().getTextColor(); } @Override @@ -105,20 +101,22 @@ public void onUpdate() { } @Override - public void drawText(ModularGuiContext context) { + protected void drawText(ModularGuiContext context, TextFieldTheme widgetTheme) { this.renderer.setSimulate(false); - this.renderer.setPos(getArea().getPadding().left, 0); + this.renderer.setPos(getArea().getPadding().getLeft(), 0); this.renderer.setScale(this.scale); this.renderer.setAlignment(this.textAlignment, -1, getArea().height); this.renderer.draw(this.handler.getText()); - getScrollData().setScrollSize(Math.max(0, (int) this.renderer.getLastWidth())); + getScrollData().setScrollSize(Math.max(0, (int) (this.renderer.getLastActualWidth() + 0.5f))); } @Override public void drawForeground(ModularGuiContext context) { - if (hasTooltip() && getScrollData().isScrollBarActive(getScrollArea()) && - isHoveringFor(getTooltip().getShowUpTimer())) { - getTooltip().draw(getContext()); + RichTooltip tooltip = getTooltip(); + if (tooltip != null && + getScrollData().isScrollBarActive(getScrollArea()) && + isHoveringFor(tooltip.getShowUpTimer())) { + tooltip.draw(getContext()); } } @@ -189,7 +187,6 @@ public GTTextFieldWidget setPattern(Pattern pattern) { public GTTextFieldWidget setTextColor(int textColor) { this.renderer.setColor(textColor); - this.changedTextColor = true; return this; } From 603ea757ff9623f2d1d0c1dac5e68c56e05f787f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 20:21:01 -0700 Subject: [PATCH 20/57] fix GTTextFieldWidget and use again --- .../gregtech/common/covers/CoverConveyor.java | 6 +- .../common/covers/CoverDigitalInterface.java | 4 +- .../gregtech/common/covers/CoverPump.java | 6 +- .../covers/detector/CoverDetectorBase.java | 9 +- .../detector/CoverDetectorEnergyAdvanced.java | 4 +- .../common/mui/widget/GTTextFieldWidget.java | 101 ++++-------------- 6 files changed, 33 insertions(+), 97 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 6d3e649335a..755a4b9e767 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -15,6 +15,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.ItemFilterContainer; +import gregtech.common.mui.widget.GTTextFieldWidget; import gregtech.common.pipelike.itempipe.tile.TileEntityItemPipe; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -57,7 +58,6 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; 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; import it.unimi.dsi.fastutil.ints.IntList; @@ -548,9 +548,9 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncMana return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .left(18).right(18) - // .setPostFix(" items/s") + .setPostFix(" items/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxItemTransferRate) .value(formattedThroughput) diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index e873e69770d..b0f98bc1edd 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -20,6 +20,7 @@ import gregtech.client.utils.RenderUtil; import gregtech.common.gui.widget.prospector.widget.WidgetOreList; import gregtech.common.metatileentities.multi.electric.MetaTileEntityPowerSubstation; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -75,7 +76,6 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -534,7 +534,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan slotValue.setIntValue(s); return true; })) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .setNumbers(0, Integer.MAX_VALUE) .value(new StringValue.Dynamic( () -> String.valueOf(slotValue.getIntValue()), diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 0d8fc467233..776e889ab7f 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -14,6 +14,7 @@ import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleSidedCubeRenderer; import gregtech.common.covers.filter.FluidFilterContainer; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.entity.player.EntityPlayer; @@ -55,7 +56,6 @@ import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -229,9 +229,9 @@ protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { return true; }) .onUpdateListener(w -> w.overlay(createAdjustOverlay(false)))) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .left(18).right(18) - // .setPostFix(" L/s") + .setPostFix(" L/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxFluidTransferRate) .value(throughputString) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index c64b4741541..174d858e77e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -3,6 +3,7 @@ import gregtech.api.cover.CoverBase; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; @@ -163,25 +164,25 @@ protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplie protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplier getter, @Nullable LongConsumer setter, @Nullable Supplier postFix, - @Nullable Consumer listener) { + @Nullable Consumer listener) { return createMinMaxRow(lang, new LongSyncValue(getter, setter), postFix, listener); } protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSyncValue syncValue, @Nullable Supplier postFix, - @Nullable Consumer listener) { + @Nullable Consumer listener) { return Flow.row() .widthRel(1f) .coverChildrenHeight() .marginBottom(5) .child(IKey.lang(lang).asWidget()) - .child(new TextFieldWidget() + .child(new GTTextFieldWidget() .right(0) .size(90, 18 - 4) .setTextColor(Color.WHITE.main) .setPattern(TextFieldWidget.WHOLE_NUMS) - // .setPostFix(postFix) + .setPostFix(postFix) .onUpdateListener(listener) .value(syncValue)); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 91d7d22f663..9e90633a692 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -6,6 +6,7 @@ import gregtech.api.mui.GTGuis; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; +import gregtech.common.mui.widget.GTTextFieldWidget; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -31,7 +32,6 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { @@ -133,7 +133,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .bindPlayerInventory(); } - private void updateWidget(TextFieldWidget w) { + private void updateWidget(GTTextFieldWidget w) { w.setMaxLength(getLength()); w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); } diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index f7d0b5ae643..81efdfa9a6d 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -2,13 +2,10 @@ import gregtech.api.util.GTLog; -import net.minecraft.client.renderer.GlStateManager; - import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.value.IStringValue; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.TextFieldTheme; import com.cleanroommc.modularui.utils.MathUtils; import com.cleanroommc.modularui.utils.ParseResult; import com.cleanroommc.modularui.value.StringValue; @@ -22,7 +19,6 @@ import java.awt.*; import java.text.ParsePosition; -import java.util.List; import java.util.function.DoubleUnaryOperator; import java.util.function.Function; import java.util.function.IntUnaryOperator; @@ -30,17 +26,15 @@ import java.util.function.Supplier; import java.util.regex.Pattern; -// todo text is rendering incorrectly, figure out why public class GTTextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; private Function validator = val -> val; private boolean numbers = false; private double defaultNumber = 0; + private boolean tooltipOverride = false; private final GTTextFieldRenderer renderer; - protected boolean changedMarkedColor = false; - public GTTextFieldWidget() { this.renderer = new GTTextFieldRenderer(this.handler); super.renderer = this.renderer; @@ -65,14 +59,8 @@ public void onInit() { setText(this.stringValue.getStringValue()); if (!hasTooltip()) { tooltipBuilder(tooltip -> tooltip.addLine(IKey.str(getText()))); + tooltipOverride = false; } - if (!this.changedMarkedColor) { - this.renderer.setMarkedColor(getMarkedColor()); - } - } - - public int getMarkedColor() { - return getWidgetTheme(getContext().getTheme()).getTheme().getTextColor(); } @Override @@ -100,21 +88,11 @@ public void onUpdate() { } } - @Override - protected void drawText(ModularGuiContext context, TextFieldTheme widgetTheme) { - this.renderer.setSimulate(false); - this.renderer.setPos(getArea().getPadding().getLeft(), 0); - this.renderer.setScale(this.scale); - this.renderer.setAlignment(this.textAlignment, -1, getArea().height); - this.renderer.draw(this.handler.getText()); - getScrollData().setScrollSize(Math.max(0, (int) (this.renderer.getLastActualWidth() + 0.5f))); - } - @Override public void drawForeground(ModularGuiContext context) { RichTooltip tooltip = getTooltip(); if (tooltip != null && - getScrollData().isScrollBarActive(getScrollArea()) && + (tooltipOverride || getScrollData().isScrollBarActive(getScrollArea())) && isHoveringFor(tooltip.getShowUpTimer())) { tooltip.draw(getContext()); } @@ -153,15 +131,6 @@ public void setText(@NotNull String text) { } } - @Override - public void onFocus(ModularGuiContext context) { - super.onFocus(context); - Point main = this.handler.getMainCursor(); - if (main.x == 0) { - this.handler.setCursor(main.y, getText().length(), true, true); - } - } - @Override public void onRemoveFocus(ModularGuiContext context) { super.onRemoveFocus(context); @@ -185,17 +154,6 @@ public GTTextFieldWidget setPattern(Pattern pattern) { return this; } - public GTTextFieldWidget setTextColor(int textColor) { - this.renderer.setColor(textColor); - return this; - } - - public GTTextFieldWidget setMarkedColor(int color) { - this.renderer.setMarkedColor(color); - this.changedMarkedColor = true; - return this; - } - public GTTextFieldWidget setValidator(Function validator) { this.validator = validator; return this; @@ -268,9 +226,15 @@ public GTTextFieldWidget value(IStringValue stringValue) { return this; } + @Override + public @NotNull RichTooltip tooltip() { + tooltipOverride = true; + return super.tooltip(); + } + private static class GTTextFieldRenderer extends TextFieldRenderer { - IKey postFix = IKey.EMPTY; + private @Nullable IKey postFix = null; public GTTextFieldRenderer(TextFieldHandler handler) { super(handler); @@ -278,47 +242,18 @@ public GTTextFieldRenderer(TextFieldHandler handler) { @Override protected void draw(String text, float x, float y) { - if (this.simulate) return; - GlStateManager.disableBlend(); - GlStateManager.pushMatrix(); - GlStateManager.scale(this.scale, this.scale, 0f); - getFontRenderer().drawString(text + this.postFix.getFormatted(), - x / this.scale, y / this.scale, - this.color, this.shadow); - GlStateManager.popMatrix(); - GlStateManager.enableBlend(); + if (postFix != null) { + text += postFix.getFormatted(); + } + super.draw(text, x, y); } - public void setPostFix(@NotNull IKey postFix) { - this.postFix = postFix; + private static boolean isNumber(String text) { + return !BaseTextFieldWidget.LETTERS.matcher(text).matches(); } - @Override - public Point getCursorPos(List lines, int x, int y) { - if (lines.isEmpty()) { - return new Point(); - } - List measuredLines = measureLines(lines); - y -= getStartY(measuredLines.size()) + this.y; - int index = (int) (y / (getFontHeight())); - if (index < 0) return new Point(); - if (index >= measuredLines.size()) - return new Point(measuredLines.get(measuredLines.size() - 1).getText().length(), - measuredLines.size() - 1); - Line line = measuredLines.get(index); - x -= getStartX(line.getWidth()) + this.x; - if (x < 0) return new Point(0, index); - if (x > line.getWidth()) return new Point(line.getText().length(), index); - float currentX = 0; - for (int i = 0; i < line.getText().length(); i++) { - char c = line.getText().charAt(i); - float cw = getFontRenderer().getCharWidth(c) * this.scale; - currentX += cw; - if (currentX >= x + (cw / 2)) { - return new Point(i + 1, index); - } - } - return new Point(); + public void setPostFix(@NotNull IKey postFix) { + this.postFix = postFix; } } } From 8487d259dc0fc5efed3cd0ecca5f57ca801851ea Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:47:31 -0700 Subject: [PATCH 21/57] clamp values when switching modes --- .../covers/detector/CoverDetectorEnergyAdvanced.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 9e90633a692..b82b7d7c9f9 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -163,13 +163,16 @@ private boolean isUsePercent() { private void setUsePercent(boolean b) { this.usePercent = b; + long minValue, maxValue; if (this.usePercent) { // using percent - this.minValue = (long) Math.ceil(((double) this.minValue / getCoverHolderCapacity()) * 100d); - this.maxValue = (long) Math.ceil(((double) this.maxValue / getCoverHolderCapacity()) * 100d); + minValue = (long) Math.ceil(((double) this.minValue / getCoverHolderCapacity()) * 100d); + maxValue = (long) Math.ceil(((double) this.maxValue / getCoverHolderCapacity()) * 100d); } else { // using discrete EU - this.minValue = (long) Math.floor((this.minValue / 100d) * getCoverHolderCapacity()); - this.maxValue = (long) Math.floor((this.maxValue / 100d) * getCoverHolderCapacity()); + minValue = (long) Math.floor((this.minValue / 100d) * getCoverHolderCapacity()); + maxValue = (long) Math.floor((this.maxValue / 100d) * getCoverHolderCapacity()); } + this.minValue = clamp(minValue, 0, maxValue - 1); + this.maxValue = clamp(maxValue, minValue + 1, isUsePercent() ? 100 : Integer.MAX_VALUE); } private String getPostFix() { From 8047f888e361223d042bc00245ec27c96771009b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 22:13:55 -0700 Subject: [PATCH 22/57] do not attach for creative emitter --- .../gregtech/common/covers/detector/CoverDetectorEnergy.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergy.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergy.java index 5363b7a48ca..286902aad32 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergy.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergy.java @@ -7,6 +7,7 @@ import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.metatileentities.multi.electric.MetaTileEntityPowerSubstation; +import gregtech.common.metatileentities.storage.MetaTileEntityCreativeEnergy; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -27,7 +28,9 @@ public CoverDetectorEnergy(@NotNull CoverDefinition definition, @NotNull Coverab @Override public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing side) { - return coverable.getCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, null) != null || + // do not attach for creative energy emitter + if (coverable instanceof MetaTileEntityCreativeEnergy) return false; + return coverable.hasCapability(GregtechCapabilities.CAPABILITY_ENERGY_CONTAINER, null) || coverable instanceof MetaTileEntityPowerSubstation; // todo check this } From 6b76e4bc05f78bff6943a75defbc9e860d8b98d0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 22:32:16 -0700 Subject: [PATCH 23/57] fix unit overwrite and redundant method call missed `coverChildrenHeight()` in CoverDetectorFluidAdvanced --- .../common/covers/detector/CoverDetectorBase.java | 3 ++- .../detector/CoverDetectorEnergyAdvanced.java | 13 ++++++++----- .../covers/detector/CoverDetectorFluidAdvanced.java | 8 ++++++-- .../covers/detector/CoverDetectorItemAdvanced.java | 7 +++++-- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 174d858e77e..279a75fcee9 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -173,11 +173,12 @@ protected static Flow createMinMaxRow(@NotNull String lang, @Nullable Supplier postFix, @Nullable Consumer listener) { return Flow.row() - .widthRel(1f) + .name("min/max row") .coverChildrenHeight() .marginBottom(5) .child(IKey.lang(lang).asWidget()) .child(new GTTextFieldWidget() + .name("min/max field") .right(0) .size(90, 18 - 4) .setTextColor(Color.WHITE.main) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index b82b7d7c9f9..e658c857dfd 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -36,8 +36,8 @@ public class CoverDetectorEnergyAdvanced extends CoverDetectorEnergy implements CoverWithUI { - private static final long DEFAULT_MIN_EU = 0, DEFAULT_MAX_EU = 2048; - private static final int DEFAULT_MIN_PERCENT = 33, DEFAULT_MAX_PERCENT = 66; + private static final long DEFAULT_MIN_EU = 0; + private static final long DEFAULT_MAX_EU = 2048; public long minValue = DEFAULT_MIN_EU; public long maxValue = DEFAULT_MAX_EU; @@ -92,8 +92,9 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column() + .name("min/max parent column") .top(28) - .left(10).right(10) + .margin(10, 0) .coverChildrenHeight() .child(createMinMaxRow("cover.advanced_energy_detector.min", this::getMinValue, this::setMinValue, @@ -102,12 +103,13 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage this::getMaxValue, this::setMaxValue, this::getPostFix, this::updateWidget)) .child(Flow.row() - .widthRel(1f) + .name("mode row") .coverChildrenHeight() .marginBottom(5) .child(IKey.lang("cover.advanced_energy_detector.modes_label").asWidget() .size(72, 18)) .child(new ToggleButton() + .name("mode button") .right(0) .size(72, 18) .addTooltipLine(IKey.lang("cover.advanced_energy_detector.modes_tooltip")) @@ -117,11 +119,12 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage (isUsePercent() ? "percent" : "eu")) .style(TextFormatting.WHITE))))) .child(Flow.row() - .widthRel(1f) + .name("inverted row") .coverChildrenHeight() .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() .size(72, 18)) .child(new ToggleButton() + .name("inverted button") .right(0) .size(72, 18) .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index 4783aa30b7a..b753edbaf77 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -75,8 +75,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column() + .name("min/max parent column") .top(28) - .left(5).right(5) + .margin(5, 0) + .coverChildrenHeight() .child(createMinMaxRow("cover.advanced_fluid_detector.min", this::getMinValue, this::setMinValue, () -> " L", w -> w.setMaxLength(10))) @@ -84,10 +86,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan this::getMaxValue, this::setMaxValue, () -> " L", w -> w.setMaxLength(10))) .child(Flow.row() - .widthRel(1f) + .name("config row") .coverChildrenHeight() .marginBottom(5) .child(new ToggleButton() + .name("inverted button") .size(72, 18) .value(new BooleanSyncValue(this::isInverted, this::setInverted)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) @@ -97,6 +100,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan return IKey.lang(lang).style(TextFormatting.WHITE); }))) .child(new ToggleButton() + .name("latch button") .size(72, 18) .right(0) .overlay(new DynamicDrawable(() -> { diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 202ccbe31af..f16e55ae20e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -65,18 +65,20 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .height(202) .child(CoverWithUI.createTitleRow(getPickItem())) .child(Flow.column() + .name("min/max parent column") .top(28) - .left(5).right(5) + .margin(5, 0) .coverChildrenHeight() .child(createMinMaxRow("cover.advanced_item_detector.min", this::getMinValue, this::setMinValue)) .child(createMinMaxRow("cover.advanced_item_detector.max", this::getMaxValue, this::setMaxValue)) .child(Flow.row() - .widthRel(1f) + .name("config row") .coverChildrenHeight() .marginBottom(5) .child(new ToggleButton() + .name("inverted button") .size(72, 18) .overlay(new DynamicDrawable(() -> { String lang = "cover.advanced_energy_detector."; @@ -86,6 +88,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) .value(new BooleanSyncValue(this::isInverted, this::setInverted))) .child(new ToggleButton() + .name("latch button") .size(72, 18) .right(0) .overlay(new DynamicDrawable(() -> { From 778996ae38a97bce90bbbc0bb844055f87082f80 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:09:14 -0700 Subject: [PATCH 24/57] return the creative handler(s) in capability directly fix oversight from filter being set to error instead of null --- .../common/covers/filter/BaseFilterContainer.java | 8 ++------ .../storage/MetaTileEntityCreativeChest.java | 11 ++++++++++- .../storage/MetaTileEntityCreativeTank.java | 9 +++++++++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index b2a08d4f580..556eeadb8b5 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -81,11 +81,7 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { if (ItemStack.areItemStacksEqual(stack, getFilterStack())) return; - if (stack.isEmpty()) { - setFilter(null); - } else if (isItemValid(stack)) { - setFilter(BaseFilter.getFilterFromStack(stack)); - } + setFilter(BaseFilter.getFilterFromStack(stack)); super.setStackInSlot(slot, stack); } @@ -140,7 +136,7 @@ public final boolean hasFilter() { } public final void setFilter(@Nullable BaseFilter newFilter) { - this.currentFilter = newFilter; + this.currentFilter = BaseFilter.ERROR_FILTER == newFilter ? null : newFilter; if (hasFilter()) { this.currentFilter.setDirtyNotifiable(this.dirtyNotifiable); this.currentFilter.setMaxTransferSize(this.maxTransferSize); diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java index 29b350c41e9..469d5e3df4e 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeChest.java @@ -19,6 +19,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; @@ -60,7 +61,7 @@ public MetaTileEntityCreativeChest(ResourceLocation metaTileEntityId) { protected void initializeInventory() { super.initializeInventory(); this.modifiableHandler = new ModifiableHandler(); - this.itemInventory = this.creativeHandler = new CreativeItemStackHandler(1); + this.creativeHandler = new CreativeItemStackHandler(1); } @Override @@ -194,6 +195,14 @@ public IItemHandler getTypeValue() { return this.creativeHandler; } + @Override + public T getCapability(Capability capability, EnumFacing side) { + if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { + return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(this.creativeHandler); + } + return super.getCapability(capability, side); + } + // todo try to refactor this with mui2 rc6 protected class ModifiableHandler extends QuantumChestItemHandler implements IItemHandlerModifiable { diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java index a6218aa7323..843e7387bdc 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCreativeTank.java @@ -17,6 +17,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.world.World; +import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; @@ -157,6 +158,14 @@ public void addInformation(ItemStack stack, @Nullable World player, List // do not append the normal tooltips } + @Override + public T getCapability(Capability capability, EnumFacing side) { + if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { + return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(this.fluidTank); + } + return super.getCapability(capability, side); + } + private class CreativeFluidTank extends FluidTank { private final FluidTank internal; From 7b4f75d5fc63b319cc8343e7c4f4b4f50e52bbab Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:16:39 -0700 Subject: [PATCH 25/57] delete deprecated ui code/classes --- .../gregtech/api/cover/CoverUIFactory.java | 53 ------------------- .../java/gregtech/api/cover/CoverWithUI.java | 18 +------ .../gregtech/common/covers/CoverConveyor.java | 5 -- .../common/covers/CoverDigitalInterface.java | 5 -- .../common/covers/CoverFluidFilter.java | 5 -- .../common/covers/CoverItemFilter.java | 5 -- .../common/covers/CoverMachineController.java | 5 -- .../gregtech/common/covers/CoverPump.java | 5 -- .../gregtech/common/covers/CoverStorage.java | 5 -- .../covers/detector/CoverDetectorBase.java | 4 -- .../covers/ender/CoverAbstractEnderLink.java | 5 -- src/main/java/gregtech/core/CoreModule.java | 2 - 12 files changed, 1 insertion(+), 116 deletions(-) delete mode 100644 src/main/java/gregtech/api/cover/CoverUIFactory.java diff --git a/src/main/java/gregtech/api/cover/CoverUIFactory.java b/src/main/java/gregtech/api/cover/CoverUIFactory.java deleted file mode 100644 index 1716cbeda27..00000000000 --- a/src/main/java/gregtech/api/cover/CoverUIFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -package gregtech.api.cover; - -import gregtech.api.GregTechAPI; -import gregtech.api.capability.GregtechTileCapabilities; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.UIFactory; -import gregtech.api.util.GTUtility; - -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.network.PacketBuffer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumFacing; -import net.minecraft.util.math.BlockPos; - -@Deprecated -public final class CoverUIFactory extends UIFactory { - - public static final CoverUIFactory INSTANCE = new CoverUIFactory(); - - private CoverUIFactory() {} - - public void init() { - GregTechAPI.UI_FACTORY_REGISTRY.register(2, GTUtility.gregtechId("cover_behavior_factory"), this); - } - - @Override - protected ModularUI createUITemplate(CoverWithUI holder, EntityPlayer entityPlayer) { - return holder.createUI(entityPlayer); - } - - @Override - protected CoverWithUI readHolderFromSyncData(PacketBuffer syncData) { - BlockPos blockPos = syncData.readBlockPos(); - EnumFacing attachedSide = EnumFacing.VALUES[syncData.readByte()]; - TileEntity tileEntity = Minecraft.getMinecraft().world.getTileEntity(blockPos); - CoverableView coverable = tileEntity == null ? null : - tileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_COVER_HOLDER, attachedSide); - if (coverable != null) { - Cover cover = coverable.getCoverAtSide(attachedSide); - if (cover instanceof CoverWithUI coverWithUI) { - return coverWithUI; - } - } - return null; - } - - @Override - protected void writeHolderToSyncData(PacketBuffer syncData, CoverWithUI cover) { - syncData.writeBlockPos(cover.getPos()); - syncData.writeByte(cover.getAttachedSide().ordinal()); - } -} diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index b557e38cced..367f81b8b04 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -1,13 +1,11 @@ package gregtech.api.cover; import gregtech.api.gui.IUIHolder; -import gregtech.api.gui.ModularUI; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GregTechGuiScreen; import gregtech.api.mui.factory.CoverGuiFactory; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; @@ -39,22 +37,8 @@ public interface CoverWithUI extends Cover, IUIHolder, IGuiHolder { - @ApiStatus.Experimental - default boolean usesMui2() { - return false; - } - default void openUI(EntityPlayerMP player) { - if (usesMui2()) { - CoverGuiFactory.open(player, this); - } else { - CoverUIFactory.INSTANCE.openUI(this, player); - } - } - - @Deprecated - default ModularUI createUI(EntityPlayer player) { - return null; + CoverGuiFactory.open(player, this); } @ApiStatus.NonExtendable diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 755a4b9e767..d072f2b5379 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -498,11 +498,6 @@ public T getCapability(Capability capability, T defaultValue) { return defaultValue; } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { var panel = GTGuis.createPanel(this, 176, 192 + 18); diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index b0f98bc1edd..0305d15b89a 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -482,11 +482,6 @@ public boolean modeLeftClick(EntityPlayer entityPlayer, MODE mode, int slot) { return false; } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { Flow row = Flow.row() diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index d5d7ae1086e..f5fd7745f41 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -139,11 +139,6 @@ public boolean canPipePassThrough() { return EnumActionResult.SUCCESS; } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { var filteringMode = new EnumSyncValue<>(FluidFilterMode.class, this::getFilterMode, this::setFilterMode); diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index 274afc462d3..3cd1a926b37 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -142,11 +142,6 @@ public boolean testItemStack(ItemStack stack) { return itemFilterContainer.test(stack); } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { var filteringMode = new EnumSyncValue<>(ItemFilterMode.class, this::getFilterMode, this::setFilterMode); diff --git a/src/main/java/gregtech/common/covers/CoverMachineController.java b/src/main/java/gregtech/common/covers/CoverMachineController.java index 3a97582a9bc..8f076c37319 100644 --- a/src/main/java/gregtech/common/covers/CoverMachineController.java +++ b/src/main/java/gregtech/common/covers/CoverMachineController.java @@ -106,11 +106,6 @@ public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing s return EnumActionResult.SUCCESS; } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { EnumSyncValue controllerModeValue = new EnumSyncValue<>(ControllerMode.class, diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 776e889ab7f..87c83ff3001 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -184,11 +184,6 @@ protected boolean checkInputFluid(FluidStack fluidStack) { return fluidFilterContainer.test(fluidStack); } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { var panel = GTGuis.createPanel(this, 176, 192); diff --git a/src/main/java/gregtech/common/covers/CoverStorage.java b/src/main/java/gregtech/common/covers/CoverStorage.java index addf992cd3b..24dc4ac49d1 100644 --- a/src/main/java/gregtech/common/covers/CoverStorage.java +++ b/src/main/java/gregtech/common/covers/CoverStorage.java @@ -81,11 +81,6 @@ public void onRemoval() { return EnumActionResult.SUCCESS; } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { guiSyncManager.registerSlotGroup("item_inv", this.storageHandler.getSlots()); diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index 279a75fcee9..bb7a20efcbe 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -77,10 +77,6 @@ public int getRedstoneSignalOutput() { return this.redstoneSignalOutput; } - public boolean usesMui2() { - return true; - } - @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 14e5c5f3316..254060d5da1 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -137,11 +137,6 @@ public void updateColor(String str) { } } - @Override - public boolean usesMui2() { - return true; - } - @Override public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncManager, UISettings settings) { if (!isPrivate()) { diff --git a/src/main/java/gregtech/core/CoreModule.java b/src/main/java/gregtech/core/CoreModule.java index f4121bb3ecb..9fa5c6c7edf 100644 --- a/src/main/java/gregtech/core/CoreModule.java +++ b/src/main/java/gregtech/core/CoreModule.java @@ -7,7 +7,6 @@ import gregtech.api.block.coil.CoilManager; import gregtech.api.capability.SimpleCapabilityManager; import gregtech.api.cover.CoverDefinition; -import gregtech.api.cover.CoverUIFactory; import gregtech.api.fluids.GTFluidRegistration; import gregtech.api.gui.UIFactory; import gregtech.api.items.gui.PlayerInventoryUIFactory; @@ -152,7 +151,6 @@ public void preInit(FMLPreInitializationEvent event) { logger.info("Registering GTCEu UI Factories"); MetaTileEntityUIFactory.INSTANCE.init(); PlayerInventoryUIFactory.INSTANCE.init(); - CoverUIFactory.INSTANCE.init(); logger.info("Registering addon UI Factories"); MinecraftForge.EVENT_BUS.post(new GregTechAPI.RegisterEvent<>(UI_FACTORY_REGISTRY, UIFactory.class)); UI_FACTORY_REGISTRY.freeze(); From 74479832e4fe7b67ca9c4df87548b49ef1fe5805 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:22:07 -0700 Subject: [PATCH 26/57] improve latch tooltip --- src/main/resources/assets/gregtech/lang/en_us.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 6adab6bb40e..d4f46ec53cc 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1424,7 +1424,7 @@ cover.generic.ender.delete_entry=Delete Entry cover.generic.advanced_detector.latched=Latched cover.generic.advanced_detector.continuous=Continuous -cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. \n§eContinuous§7 - Default; values less than the minimum output 0; values higher than the maximum output 15; values between min and max output between 0 and 15 \n§eLatched§7 - output 15 until above max, then output 0 until below min +cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. \n§eContinuous§7 - Default\n Values less than the minimum output 0\n Values higher than the maximum output 15\n Values between min and max output between 0 and 15 \n§eLatched§7\n Output 15 until above max, then output 0 until below min cover.generic.advanced_detector.invert_label=Redstone Output: cover.generic.advanced_detector.latch_label=Behavior: cover.generic.advanced_detector.invert_tooltip=Toggle to invert the redstone logic From 80eec6cea40c7790aee7a62efc2208b03b094591 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:48:07 -0700 Subject: [PATCH 27/57] fix incorrect postfix --- .../covers/detector/CoverDetectorFluidAdvanced.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index b753edbaf77..c7e2eb1bab9 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -4,6 +4,7 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTUtility; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.filter.FluidFilterContainer; @@ -81,10 +82,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .coverChildrenHeight() .child(createMinMaxRow("cover.advanced_fluid_detector.min", this::getMinValue, this::setMinValue, - () -> " L", w -> w.setMaxLength(10))) + this::getPostFix, w -> w.setMaxLength(10))) .child(createMinMaxRow("cover.advanced_fluid_detector.max", this::getMaxValue, this::setMaxValue, - () -> " L", w -> w.setMaxLength(10))) + this::getPostFix, w -> w.setMaxLength(10))) .child(Flow.row() .name("config row") .coverChildrenHeight() @@ -114,6 +115,10 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } + private @NotNull String getPostFix() { + return " mL"; + } + private long getMinValue() { return min; } @@ -127,7 +132,7 @@ private void setMinValue(long val) { } private void setMaxValue(long val) { - this.max = clamp((int) val, min + 1, Integer.MAX_VALUE); + this.max = GTUtility.safeCastLongToInt(clamp(val, min + 1, Long.MAX_VALUE)); } private void setLatched(boolean isLatched) { From 4fa7784e725a2c5a6bcf8d51965ca9cc8e8765f6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:50:20 -0700 Subject: [PATCH 28/57] add missing long method to GTTextFieldWidget add missing tooltip override usage use proper supplier interfaces use MathHelper clamp --- .../covers/detector/CoverDetectorBase.java | 3 ++- .../detector/CoverDetectorEnergyAdvanced.java | 2 +- .../common/mui/widget/GTTextFieldWidget.java | 20 +++++++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index bb7a20efcbe..f269869e61e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -11,6 +11,7 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.TextComponentTranslation; import codechicken.lib.raytracer.CuboidRayTraceResult; @@ -149,7 +150,7 @@ protected final long clamp(long val, long minValue, long maxValue) { * @return Capped value of either parsed result or {@code fallbackValue} */ protected final int clamp(int val, int minValue, int maxValue) { - return Math.min(Math.max(val, minValue), maxValue); + return MathHelper.clamp(val, minValue, maxValue); } protected static Flow createMinMaxRow(@NotNull String lang, @NotNull LongSupplier getter, diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index e658c857dfd..4521d11ff09 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -138,7 +138,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage private void updateWidget(GTTextFieldWidget w) { w.setMaxLength(getLength()); - w.setNumbers(0, isUsePercent() ? 100 : Integer.MAX_VALUE); + w.setNumbersLong(0, isUsePercent() ? 100 : Long.MAX_VALUE); } private long getMinValue() { diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index 81efdfa9a6d..69d0e62b47b 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -2,6 +2,8 @@ import gregtech.api.util.GTLog; +import net.minecraft.util.math.MathHelper; + import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.value.IStringValue; import com.cleanroommc.modularui.screen.RichTooltip; @@ -21,7 +23,9 @@ import java.text.ParsePosition; import java.util.function.DoubleUnaryOperator; import java.util.function.Function; +import java.util.function.IntSupplier; import java.util.function.IntUnaryOperator; +import java.util.function.LongSupplier; import java.util.function.LongUnaryOperator; import java.util.function.Supplier; import java.util.regex.Pattern; @@ -57,7 +61,7 @@ public void onInit() { this.stringValue = new StringValue(""); } setText(this.stringValue.getStringValue()); - if (!hasTooltip()) { + if (!hasTooltip() && !tooltipOverride) { tooltipBuilder(tooltip -> tooltip.addLine(IKey.str(getText()))); tooltipOverride = false; } @@ -199,16 +203,20 @@ public GTTextFieldWidget setNumbersDouble(DoubleUnaryOperator validator) { }); } - public GTTextFieldWidget setNumbers(Supplier min, Supplier max) { - return setNumbers(val -> Math.min(max.get(), Math.max(min.get(), val))); + public GTTextFieldWidget setNumbers(IntSupplier min, IntSupplier max) { + return setNumbers(val -> Math.min(max.getAsInt(), Math.max(min.getAsInt(), val))); + } + + public GTTextFieldWidget setNumbersLong(LongSupplier min, LongSupplier max) { + return setNumbersLong(val -> Math.min(max.getAsLong(), Math.max(min.getAsLong(), val))); } - public GTTextFieldWidget setNumbersLong(Supplier min, Supplier max) { - return setNumbersLong(val -> Math.min(max.get(), Math.max(min.get(), val))); + public GTTextFieldWidget setNumbersLong(long min, long max) { + return setNumbersLong(val -> Math.min(Math.max(val, min), max)); } public GTTextFieldWidget setNumbers(int min, int max) { - return setNumbers(val -> Math.min(max, Math.max(min, val))); + return setNumbers(val -> MathHelper.clamp(val, min, max)); } public GTTextFieldWidget setNumbers() { From 0f1bfb37779339dddb8cb6001e9f04f6d924bc45 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 16 Nov 2025 23:52:36 -0700 Subject: [PATCH 29/57] delete unused method --- .../java/gregtech/common/mui/widget/GTTextFieldWidget.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index 69d0e62b47b..b908022bf36 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -19,7 +19,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.awt.*; import java.text.ParsePosition; import java.util.function.DoubleUnaryOperator; import java.util.function.Function; @@ -256,10 +255,6 @@ protected void draw(String text, float x, float y) { super.draw(text, x, y); } - private static boolean isNumber(String text) { - return !BaseTextFieldWidget.LETTERS.matcher(text).matches(); - } - public void setPostFix(@NotNull IKey postFix) { this.postFix = postFix; } From c869979535df64fd9af7b03aeadfb945bdb9968f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 00:32:11 -0700 Subject: [PATCH 30/57] replace anonymous class with GTTextFieldWidget add string consumer when enter is pressed --- .../covers/ender/CoverAbstractEnderLink.java | 18 ++++---------- .../common/mui/widget/GTTextFieldWidget.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java index 254060d5da1..c200f506267 100644 --- a/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java +++ b/src/main/java/gregtech/common/covers/ender/CoverAbstractEnderLink.java @@ -11,6 +11,7 @@ import gregtech.api.util.virtualregistry.EntryTypes; import gregtech.api.util.virtualregistry.VirtualEnderRegistry; import gregtech.api.util.virtualregistry.VirtualEntry; +import gregtech.common.mui.widget.GTTextFieldWidget; import gregtech.common.mui.widget.InteractableText; import gregtech.integration.ftb.utility.FTBTeamHelper; @@ -49,7 +50,6 @@ 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.ArrayList; import java.util.List; @@ -339,21 +339,13 @@ protected PanelSyncHandler.IPanelBuilder entryDescription(String key, T entry) { .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()); + .child(new GTTextFieldWidget() + .onTextAccept(string -> { if (syncHandler.isPanelOpen()) { syncHandler.closePanel(); } - } - return result; - } - }.setTextColor(Color.WHITE.darker(1)) + }) + .setTextColor(Color.WHITE.darker(1)) .value(sync) .widthRel(0.95f) .height(18) diff --git a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java index b908022bf36..485312f57db 100644 --- a/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java +++ b/src/main/java/gregtech/common/mui/widget/GTTextFieldWidget.java @@ -18,8 +18,10 @@ import com.cleanroommc.modularui.widgets.textfield.TextFieldRenderer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.lwjgl.input.Keyboard; import java.text.ParsePosition; +import java.util.function.Consumer; import java.util.function.DoubleUnaryOperator; import java.util.function.Function; import java.util.function.IntSupplier; @@ -37,6 +39,7 @@ public class GTTextFieldWidget extends BaseTextFieldWidget { private double defaultNumber = 0; private boolean tooltipOverride = false; private final GTTextFieldRenderer renderer; + private Consumer onTextAccept = null; public GTTextFieldWidget() { this.renderer = new GTTextFieldRenderer(this.handler); @@ -91,6 +94,19 @@ public void onUpdate() { } } + @Override + public @NotNull Result onKeyPressed(char character, int keyCode) { + Result result = super.onKeyPressed(character, keyCode); + if (result == Result.SUCCESS) switch (keyCode) { + case Keyboard.KEY_RETURN, Keyboard.KEY_NUMPADENTER -> { + if (this.onTextAccept != null) { + this.onTextAccept.accept(getText()); + } + } + } + return result; + } + @Override public void drawForeground(ModularGuiContext context) { RichTooltip tooltip = getTooltip(); @@ -115,6 +131,14 @@ public GTTextFieldWidget setPostFix(IKey postFix) { return getThis(); } + /** + * @param onTextAccept Called when {@link Keyboard#KEY_RETURN} or {@link Keyboard#KEY_NUMPADENTER} is pressed. + */ + public GTTextFieldWidget onTextAccept(Consumer onTextAccept) { + this.onTextAccept = onTextAccept; + return this; + } + @NotNull public String getText() { if (this.handler.getText().isEmpty()) { From f92b357a72171f7822d01cd7a7208ed95245bda0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 01:13:05 -0700 Subject: [PATCH 31/57] delete deprecated filter ui code --- .../covers/filter/FluidFilterContainer.java | 37 --------- .../common/covers/filter/IFilter.java | 5 -- .../covers/filter/ItemFilterContainer.java | 38 --------- .../filter/OreDictionaryItemFilter.java | 4 - .../covers/filter/SimpleFluidFilter.java | 11 --- .../covers/filter/SimpleItemFilter.java | 18 ----- .../common/covers/filter/SmartItemFilter.java | 9 --- .../covers/filter/WidgetGroupFluidFilter.java | 78 ------------------- .../covers/filter/WidgetGroupItemFilter.java | 77 ------------------ .../electric/MetaTileEntityItemCollector.java | 2 +- 10 files changed, 1 insertion(+), 278 deletions(-) delete mode 100644 src/main/java/gregtech/common/covers/filter/WidgetGroupFluidFilter.java delete mode 100644 src/main/java/gregtech/common/covers/filter/WidgetGroupItemFilter.java diff --git a/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java b/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java index 7dee10a1032..df2bc6d54de 100644 --- a/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/FluidFilterContainer.java @@ -5,51 +5,14 @@ import net.minecraft.item.ItemStack; import com.cleanroommc.modularui.api.drawable.IKey; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; - public class FluidFilterContainer extends BaseFilterContainer { public FluidFilterContainer(IDirtyNotifiable dirtyNotifiable) { super(dirtyNotifiable); } - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void initUI(int y, Consumer widgetGroup) { - widgetGroup.accept(new gregtech.api.gui.widgets.LabelWidget(10, y, "cover.pump.fluid_filter.title")); - widgetGroup.accept(new gregtech.api.gui.widgets.SlotWidget(this, 0, 10, y + 15) - .setBackgroundTexture(gregtech.api.gui.GuiTextures.SLOT, - gregtech.api.gui.GuiTextures.FILTER_SLOT_OVERLAY)); - - this.initFilterUI(y + 15, widgetGroup); - this.blacklistUI(y + 15, widgetGroup, () -> true); - } - - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void initFilterUI(int y, Consumer widgetGroup) { - widgetGroup.accept(new WidgetGroupFluidFilter(y, this::getFilter, this::showGlobalTransferLimitSlider)); - } - - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void blacklistUI(int y, Consumer widgetGroup, BooleanSupplier showBlacklistButton) { - gregtech.api.gui.widgets.ServerWidgetGroup blacklistButton = new gregtech.api.gui.widgets.ServerWidgetGroup( - this::hasFilter); - blacklistButton.addWidget(new gregtech.api.gui.widgets.ToggleButtonWidget(144, y, 18, 18, - gregtech.api.gui.GuiTextures.BUTTON_BLACKLIST, - this::isBlacklistFilter, this::setBlacklistFilter).setPredicate(showBlacklistButton) - .setTooltipText("cover.filter.blacklist")); - widgetGroup.accept(blacklistButton); - } - @Override protected boolean isItemValid(ItemStack stack) { var filter = BaseFilter.getFilterFromStack(stack); diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index 05441442eb0..13d44332cbb 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -12,13 +12,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.function.Consumer; - public interface IFilter { - @Deprecated - default void initUI(Consumer widgetGroup) {} - /** Uses Cleanroom MUI */ @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager); diff --git a/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java b/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java index 514d3d80e31..6d1705edf86 100644 --- a/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/ItemFilterContainer.java @@ -1,56 +1,18 @@ package gregtech.common.covers.filter; -import gregtech.api.gui.widgets.LabelWidget; -import gregtech.api.gui.widgets.ServerWidgetGroup; -import gregtech.api.gui.widgets.SlotWidget; -import gregtech.api.gui.widgets.ToggleButtonWidget; import gregtech.api.util.IDirtyNotifiable; import net.minecraft.item.ItemStack; import com.cleanroommc.modularui.api.drawable.IKey; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.function.BooleanSupplier; -import java.util.function.Consumer; - public class ItemFilterContainer extends BaseFilterContainer { public ItemFilterContainer(IDirtyNotifiable dirtyNotifiable) { super(dirtyNotifiable); } - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void initUI(int y, Consumer widgetGroup) { - widgetGroup.accept(new LabelWidget(10, y, "cover.conveyor.item_filter.title")); - widgetGroup.accept(new SlotWidget(this, 0, 10, y + 15) - .setBackgroundTexture(gregtech.api.gui.GuiTextures.SLOT, - gregtech.api.gui.GuiTextures.FILTER_SLOT_OVERLAY)); - - this.initFilterUI(y + 38, widgetGroup); - } - - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void initFilterUI(int y, Consumer widgetGroup) { - widgetGroup.accept(new WidgetGroupItemFilter(y, this::getFilter)); - } - - /** @deprecated uses old builtin MUI */ - @Deprecated - @ApiStatus.ScheduledForRemoval(inVersion = "2.10") - public void blacklistUI(int y, Consumer widgetGroup, BooleanSupplier showBlacklistButton) { - ServerWidgetGroup blacklistButton = new ServerWidgetGroup(this::hasFilter); - blacklistButton.addWidget(new ToggleButtonWidget(144, y, 20, 20, gregtech.api.gui.GuiTextures.BUTTON_BLACKLIST, - this::isBlacklistFilter, this::setBlacklistFilter).setPredicate(showBlacklistButton) - .setTooltipText("cover.filter.blacklist")); - widgetGroup.accept(blacklistButton); - } - @Override protected boolean isItemValid(ItemStack stack) { var filter = BaseFilter.getFilterFromStack(stack); diff --git a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java index 1bfed239a08..4133e499ef0 100644 --- a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java @@ -37,7 +37,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.function.Consumer; public class OreDictionaryItemFilter extends BaseFilter { @@ -70,9 +69,6 @@ protected void clearCache() { this.noOreDictMatch.clear(); } - @Override - public void initUI(Consumer widgetGroup) {} - @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { return GTGuis.createPopupPanel("ore_dict_filter", 188, 76, false) diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index 25bbbf64362..380355a5192 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -15,8 +15,6 @@ import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; - public class SimpleFluidFilter extends BaseFilter { private static final int MAX_FLUID_SLOTS = 9; @@ -92,15 +90,6 @@ public boolean testFluid(FluidStack toTest) { return false; } - @Override - public void initUI(Consumer widgetGroup) { - for (int i = 0; i < 9; ++i) { - widgetGroup.accept((new gregtech.api.gui.widgets.PhantomFluidWidget(10 + 18 * (i % 3), 18 * (i / 3), 18, 18, - filterReader.getFluidTank(i))) - .setBackgroundTexture(gregtech.api.gui.GuiTextures.SLOT)); - } - } - @Override public int getTransferLimit(FluidStack fluidStack, int transferSize) { int limit = 0; diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index abd858833a5..6173e4b2aa1 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -1,9 +1,6 @@ package gregtech.common.covers.filter; import gregtech.api.cover.CoverWithUI; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.widgets.PhantomSlotWidget; -import gregtech.api.gui.widgets.ToggleButtonWidget; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.TextFormattingUtil; @@ -30,8 +27,6 @@ import com.cleanroommc.modularui.widgets.slot.SlotGroup; import org.jetbrains.annotations.NotNull; -import java.util.function.Consumer; - public class SimpleItemFilter extends BaseFilter { private static final int MAX_MATCH_SLOTS = 9; @@ -79,19 +74,6 @@ public int getTransferLimit(ItemStack stack, int transferSize) { return getTransferLimit(matchedSlot, transferSize); } - @Override - public void initUI(Consumer widgetGroup) { - for (int i = 0; i < 9; i++) { - widgetGroup.accept(new PhantomSlotWidget(filterReader, i, 10 + 18 * (i % 3), 18 * (i / 3)) - .setBackgroundTexture(GuiTextures.SLOT)); - } - widgetGroup.accept(new ToggleButtonWidget(74, 0, 20, 20, GuiTextures.BUTTON_FILTER_DAMAGE, - filterReader::isIgnoreDamage, filterReader::setIgnoreDamage) - .setTooltipText("cover.item_filter.ignore_damage")); - widgetGroup.accept(new ToggleButtonWidget(99, 0, 20, 20, GuiTextures.BUTTON_FILTER_NBT, - filterReader::isIgnoreNBT, filterReader::setIgnoreNBT).setTooltipText("cover.item_filter.ignore_nbt")); - } - @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { return GTGuis.createPopupPanel("simple_item_filter", 98, 81, false) diff --git a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java index b86f37b0cde..34f82cd9591 100644 --- a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java @@ -1,7 +1,6 @@ package gregtech.common.covers.filter; import gregtech.api.cover.CoverWithUI; -import gregtech.api.gui.widgets.CycleButtonWidget; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.recipes.Recipe; @@ -27,7 +26,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; -import java.util.function.Consumer; public class SmartItemFilter extends BaseFilter { @@ -89,13 +87,6 @@ public FilterType getType() { return FilterType.ITEM; } - @Override - public void initUI(Consumer widgetGroup) { - widgetGroup.accept(new CycleButtonWidget(10, 0, 75, 20, - SmartFilteringMode.class, filterReader::getFilteringMode, filterReader::setFilteringMode) - .setTooltipHoverString("cover.smart_item_filter.filtering_mode.description")); - } - @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { return GTGuis.createPopupPanel("smart_item_filter", 98 + 27, 81, false) diff --git a/src/main/java/gregtech/common/covers/filter/WidgetGroupFluidFilter.java b/src/main/java/gregtech/common/covers/filter/WidgetGroupFluidFilter.java deleted file mode 100644 index c43d7487467..00000000000 --- a/src/main/java/gregtech/common/covers/filter/WidgetGroupFluidFilter.java +++ /dev/null @@ -1,78 +0,0 @@ -package gregtech.common.covers.filter; - -import gregtech.api.gui.widgets.AbstractWidgetGroup; -import gregtech.api.util.GTLog; -import gregtech.api.util.Position; - -import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; - -import org.jetbrains.annotations.ApiStatus; - -import java.io.IOException; -import java.util.function.Supplier; - -/** - * @deprecated in favor of new MUI - */ -@Deprecated -@ApiStatus.ScheduledForRemoval(inVersion = "2.10") -public class WidgetGroupFluidFilter extends AbstractWidgetGroup { - - private final Supplier fluidFilterSupplier; - private final Supplier showTipSupplier; - private BaseFilter fluidFilter; - - public WidgetGroupFluidFilter(int yPosition, Supplier fluidFilterSupplier, - Supplier showTipSupplier) { - super(new Position(18 + 5, yPosition)); - this.fluidFilterSupplier = fluidFilterSupplier; - this.showTipSupplier = showTipSupplier; - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - BaseFilter newFluidFilter = fluidFilterSupplier.get(); - if (fluidFilter != newFluidFilter) { - clearAllWidgets(); - this.fluidFilter = newFluidFilter; - if (fluidFilter != null) { - this.fluidFilter.initUI(this::addWidget); - } - writeUpdateInfo(2, buffer -> { - if (fluidFilter != null) { - buffer.writeBoolean(true); - buffer.writeItemStack(fluidFilter.getContainerStack()); - } else { - buffer.writeBoolean(false); - } - }); - } - // if (fluidFilter != null && showTipSupplier != null && fluidFilter.showTip != showTipSupplier.get()) { - // fluidFilter.showTip = showTipSupplier.get(); - // writeUpdateInfo(3, buffer -> buffer.writeBoolean(fluidFilter.showTip)); - // } - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - if (id == 2) { - clearAllWidgets(); - if (buffer.readBoolean()) { - ItemStack stack; - try { - stack = buffer.readItemStack(); - } catch (IOException e) { - GTLog.logger.warn(e); - return; - } - this.fluidFilter = BaseFilter.getFilterFromStack(stack); - this.fluidFilter.initUI(this::addWidget); - } - } else if (id == 3) { - // fluidFilter.showTip = buffer.readBoolean(); - } - } -} diff --git a/src/main/java/gregtech/common/covers/filter/WidgetGroupItemFilter.java b/src/main/java/gregtech/common/covers/filter/WidgetGroupItemFilter.java deleted file mode 100644 index 9f26302fb2f..00000000000 --- a/src/main/java/gregtech/common/covers/filter/WidgetGroupItemFilter.java +++ /dev/null @@ -1,77 +0,0 @@ -package gregtech.common.covers.filter; - -import gregtech.api.gui.widgets.AbstractWidgetGroup; -import gregtech.api.util.Position; - -import net.minecraft.network.PacketBuffer; - -import org.jetbrains.annotations.ApiStatus; - -import java.io.IOException; -import java.util.function.Supplier; - -/** - * @deprecated in favor of new MUI - */ -@Deprecated -@ApiStatus.ScheduledForRemoval(inVersion = "2.10") -public class WidgetGroupItemFilter extends AbstractWidgetGroup { - - private final Supplier itemFilterSupplier; - private BaseFilter itemFilter; - private int maxStackSize = 1; - - public WidgetGroupItemFilter(int yPosition, Supplier itemFilterSupplier) { - super(new Position(0, yPosition)); - this.itemFilterSupplier = itemFilterSupplier; - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - BaseFilter newItemFilter = itemFilterSupplier.get(); - if (itemFilter != newItemFilter) { - clearAllWidgets(); - this.itemFilter = newItemFilter; - if (itemFilter != null) { - this.itemFilter.initUI(this::addWidget); - } - writeUpdateInfo(2, buffer -> { - if (itemFilter != null) { - buffer.writeBoolean(true); - buffer.writeItemStack(itemFilter.getContainerStack()); - } else { - buffer.writeBoolean(false); - } - }); - } - int newMaxStackSize = itemFilter == null ? 1 : itemFilter.getMaxTransferSize(); - if (maxStackSize != newMaxStackSize) { - this.maxStackSize = newMaxStackSize; - writeUpdateInfo(3, buffer -> buffer.writeVarInt(maxStackSize)); - } - } - - @Override - public void readUpdateInfo(int id, PacketBuffer buffer) { - super.readUpdateInfo(id, buffer); - if (id == 2) { - clearAllWidgets(); - if (buffer.readBoolean()) { - // int filterId = buffer.readVarInt(); - try { - this.itemFilter = BaseFilter.getFilterFromStack(buffer.readItemStack()); - this.itemFilter.initUI(this::addWidget); - this.itemFilter.setMaxTransferSize(maxStackSize); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } else if (id == 3) { - this.maxStackSize = buffer.readVarInt(); - if (itemFilter != null) { - itemFilter.setMaxTransferSize(maxStackSize); - } - } - } -} diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java index 1128819ff6d..3f1c4243cbb 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java @@ -252,7 +252,7 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { } } - this.itemFilter.initUI(45 + rowSize * 18 + 5, builder::widget); +// this.itemFilter.initUI(45 + rowSize * 18 + 5, builder::widget); builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 45 + rowSize * 18 + 105); return builder.build(getHolder(), entityPlayer); } From 93a29cc0597ed23774316de585448218ff4f6708 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 01:48:51 -0700 Subject: [PATCH 32/57] make panel handler based on stack translation key spotless --- .../java/gregtech/api/cover/CoverWithUI.java | 19 +++++++++++++++++-- .../covers/filter/BaseFilterContainer.java | 16 +++++++++------- .../common/covers/filter/IFilter.java | 6 ++++++ .../electric/MetaTileEntityItemCollector.java | 2 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 367f81b8b04..4794811d947 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -15,6 +15,7 @@ import com.cleanroommc.modularui.api.IGuiHolder; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; @@ -28,6 +29,7 @@ import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.ApiStatus; @@ -35,6 +37,8 @@ import java.util.function.BooleanSupplier; +import java.util.function.Supplier; + public interface CoverWithUI extends Cover, IUIHolder, IGuiHolder { default void openUI(EntityPlayerMP player) { @@ -88,11 +92,22 @@ default void markAsDirty() { * Create the Title bar widget for a Cover. */ static Flow createTitleRow(ItemStack stack) { + return createTitleRow(() -> stack); + } + + /** + * Create the Title bar widget for a Cover. + */ + static Flow createTitleRow(Supplier stack) { + ItemDrawable itemDrawable = new ItemDrawable(); return Flow.row() .pos(4, 4) .height(16).coverChildrenWidth() - .child(new ItemDrawable(stack).asWidget().size(16).marginRight(4)) - .child(IKey.str(stack.getDisplayName()) + .child(new Widget<>() + .overlay(new DynamicDrawable(() -> itemDrawable.setItem(stack.get()))) + .size(16) + .marginRight(4)) + .child(IKey.dynamic(() -> stack.get().getDisplayName()) .color(UI_TITLE_COLOR) .asWidget().heightRel(1.0f)); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 556eeadb8b5..1ce3b4398b5 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -206,15 +206,15 @@ public void handleLegacyNBT(NBTTagCompound nbt) { getFilter().getFilterReader().handleLegacyNBT(nbt); } + public IPanelHandler getFilterHandler(PanelSyncManager syncManager) { + if (hasFilter()) { + return getFilter().createPanelHandler(syncManager); + } + return BaseFilter.ERROR_FILTER.createPanelHandler(syncManager); + } + /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { - IPanelHandler panel = manager.panel("filter_panel", (syncManager, syncHandler) -> { - if (hasFilter()) { - return getFilter().createPopupPanel(syncManager); - } - return BaseFilter.ERROR_FILTER.createPopupPanel(syncManager); - }, true); - return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() @@ -222,6 +222,7 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { .filter(this::isItemValid) .singletonSlotGroup(101) .changeListener((newItem, onlyAmountChanged, client, init) -> { + IPanelHandler panel = getFilterHandler(manager); if (!isItemValid(newItem) || (newItem.isEmpty() && panel.isPanelOpen())) { panel.closePanel(); } @@ -234,6 +235,7 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .setEnabledIf(w -> hasFilter()) .onMousePressed(i -> { + IPanelHandler panel = getFilterHandler(manager); if (!panel.isPanelOpen()) { setMaxTransferSize(getMaxTransferSize()); panel.openPanel(); diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index 13d44332cbb..8cfb9099035 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -6,6 +6,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; @@ -27,6 +28,11 @@ public interface IFilter { @NotNull Widget createWidgets(PanelSyncManager syncManager); + default IPanelHandler createPanelHandler(PanelSyncManager syncManager) { + return syncManager.panel(getContainerStack().getTranslationKey(), (syncManager1, syncHandler) -> + createPopupPanel(syncManager).child(createWidgets(syncManager)), true); + } + ItemStack getContainerStack(); void setDirtyNotifiable(@Nullable IDirtyNotifiable dirtyNotifiable); diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java index 3f1c4243cbb..f28489a4add 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityItemCollector.java @@ -252,7 +252,7 @@ protected ModularUI createUI(EntityPlayer entityPlayer) { } } -// this.itemFilter.initUI(45 + rowSize * 18 + 5, builder::widget); + // this.itemFilter.initUI(45 + rowSize * 18 + 5, builder::widget); builder.bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 7, 45 + rowSize * 18 + 105); return builder.build(getHolder(), entityPlayer); } From afbfeef7939187ca3db56f1d8e575fd66bc09a06 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 01:58:48 -0700 Subject: [PATCH 33/57] nvm, that doesn't work --- .../gregtech/common/covers/filter/BaseFilterContainer.java | 4 ++-- src/main/java/gregtech/common/covers/filter/IFilter.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 1ce3b4398b5..3f8a7e8ca73 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -215,6 +215,8 @@ public IPanelHandler getFilterHandler(PanelSyncManager syncManager) { /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { + IPanelHandler panel = getFilterHandler(manager); + return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() @@ -222,7 +224,6 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { .filter(this::isItemValid) .singletonSlotGroup(101) .changeListener((newItem, onlyAmountChanged, client, init) -> { - IPanelHandler panel = getFilterHandler(manager); if (!isItemValid(newItem) || (newItem.isEmpty() && panel.isPanelOpen())) { panel.closePanel(); } @@ -235,7 +236,6 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .setEnabledIf(w -> hasFilter()) .onMousePressed(i -> { - IPanelHandler panel = getFilterHandler(manager); if (!panel.isPanelOpen()) { setMaxTransferSize(getMaxTransferSize()); panel.openPanel(); diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index 8cfb9099035..20779d4b313 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -30,7 +30,7 @@ public interface IFilter { default IPanelHandler createPanelHandler(PanelSyncManager syncManager) { return syncManager.panel(getContainerStack().getTranslationKey(), (syncManager1, syncHandler) -> - createPopupPanel(syncManager).child(createWidgets(syncManager)), true); + createPopupPanel(syncManager), true); } ItemStack getContainerStack(); From ac69d8fcb1d916676c91f3f4b605ae8178cf17a3 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 03:46:10 -0700 Subject: [PATCH 34/57] brachy is gonna hate this fixes changing the filter in the filter slot by making a new panel handler and utilizing sync actions and `getOrCreateSyncHandler()` this is what 330am brain comes up with even god lives in fear of this abomination --- .../common/covers/filter/BaseFilter.java | 2 +- .../covers/filter/BaseFilterContainer.java | 31 ++++++++++++++++--- .../common/covers/filter/IFilter.java | 12 ++++--- .../filter/OreDictionaryItemFilter.java | 4 +-- .../covers/filter/SimpleFluidFilter.java | 4 +-- .../covers/filter/SimpleItemFilter.java | 4 +-- .../common/covers/filter/SmartItemFilter.java | 4 +-- 7 files changed, 43 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilter.java b/src/main/java/gregtech/common/covers/filter/BaseFilter.java index 1bc6bc8f2d6..836c59709fa 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilter.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilter.java @@ -34,7 +34,7 @@ public BaseFilterReader getFilterReader() { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { + public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { return GTGuis.createPopupPanel("error", 100, 100) .child(createWidgets(syncManager)); } diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 3f8a7e8ca73..01d75cb2313 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -3,6 +3,7 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.mui.GTGuiTextures; import gregtech.api.util.IDirtyNotifiable; +import gregtech.api.util.ItemStackHashStrategy; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -25,6 +26,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; + public abstract class BaseFilterContainer extends ItemStackHandler { private int maxTransferSize = 1; @@ -206,16 +210,27 @@ public void handleLegacyNBT(NBTTagCompound nbt) { getFilter().getFilterReader().handleLegacyNBT(nbt); } - public IPanelHandler getFilterHandler(PanelSyncManager syncManager) { + public IPanelHandler getFilterHandler(PanelSyncManager syncManager, int id) { if (hasFilter()) { - return getFilter().createPanelHandler(syncManager); + return getFilter().createPanelHandler(syncManager, id); } - return BaseFilter.ERROR_FILTER.createPanelHandler(syncManager); + return BaseFilter.ERROR_FILTER.createPanelHandler(syncManager, id); } /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { - IPanelHandler panel = getFilterHandler(manager); + // i bet brachy is gonna really hate this, but it *does* work + AtomicReference test = new AtomicReference<>(getFilterHandler(manager, 0)); + AtomicInteger counter = new AtomicInteger(1); + AtomicReference oldStack = new AtomicReference<>(getFilterStack()); + manager.registerSyncedAction("update_filter_panel", packet -> { + if (hasFilter()) { + oldStack.set(getFilterStack()); + // make new panel handler only when we have a filter + test.set(getFilterHandler(manager, counter.getAndIncrement())); + } + }); + ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingItemDamageCount(); return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) @@ -224,9 +239,14 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { .filter(this::isItemValid) .singletonSlotGroup(101) .changeListener((newItem, onlyAmountChanged, client, init) -> { - if (!isItemValid(newItem) || (newItem.isEmpty() && panel.isPanelOpen())) { + IPanelHandler panel = test.get(); + if (!isItemValid(newItem) || + (!strategy.equals(oldStack.get(), newItem) && panel.isPanelOpen())) { panel.closePanel(); } + if (!init && client && !strategy.equals(oldStack.get(), newItem)) { + manager.callSyncedAction("update_filter_panel", packetBuffer -> {}); + } })) .size(18).marginRight(2) .background(GTGuiTextures.SLOT, GTGuiTextures.FILTER_SLOT_OVERLAY.asIcon().size(16))) @@ -236,6 +256,7 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .setEnabledIf(w -> hasFilter()) .onMousePressed(i -> { + IPanelHandler panel = test.get(); if (!panel.isPanelOpen()) { setMaxTransferSize(getMaxTransferSize()); panel.openPanel(); diff --git a/src/main/java/gregtech/common/covers/filter/IFilter.java b/src/main/java/gregtech/common/covers/filter/IFilter.java index 20779d4b313..1bbde04af5d 100644 --- a/src/main/java/gregtech/common/covers/filter/IFilter.java +++ b/src/main/java/gregtech/common/covers/filter/IFilter.java @@ -8,6 +8,7 @@ import com.cleanroommc.modularui.api.IPanelHandler; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; @@ -17,7 +18,7 @@ public interface IFilter { /** Uses Cleanroom MUI */ @NotNull - ModularPanel createPopupPanel(PanelSyncManager syncManager); + ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName); /** Uses Cleanroom MUI */ @NotNull @@ -28,9 +29,12 @@ public interface IFilter { @NotNull Widget createWidgets(PanelSyncManager syncManager); - default IPanelHandler createPanelHandler(PanelSyncManager syncManager) { - return syncManager.panel(getContainerStack().getTranslationKey(), (syncManager1, syncHandler) -> - createPopupPanel(syncManager), true); + default IPanelHandler createPanelHandler(PanelSyncManager syncManager, int id) { + String translationKey = getContainerStack().getTranslationKey(); + return syncManager.getOrCreateSyncHandler(translationKey, id, PanelSyncHandler.class, () -> { + String key = PanelSyncManager.makeSyncKey(translationKey, id); + return (PanelSyncHandler) syncManager.panel(key, (psm, $) -> createPopupPanel(psm, key), true); + }); } ItemStack getContainerStack(); diff --git a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java index 4133e499ef0..75f2ed81afd 100644 --- a/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/OreDictionaryItemFilter.java @@ -70,8 +70,8 @@ protected void clearCache() { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("ore_dict_filter", 188, 76, false) + public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { + return GTGuis.createPopupPanel(panelName, 188, 76, false) .padding(7) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22)); diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index 380355a5192..f7b276a8f59 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -36,8 +36,8 @@ public void configureFilterTanks(int amount) { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("simple_fluid_filter", 98, 81, false) + public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { + return GTGuis.createPopupPanel(panelName, 98, 81, false) .padding(4) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22)); diff --git a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java index 6173e4b2aa1..d4eb282053b 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleItemFilter.java @@ -75,8 +75,8 @@ public int getTransferLimit(ItemStack stack, int transferSize) { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("simple_item_filter", 98, 81, false) + public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { + return GTGuis.createPopupPanel(panelName, 98, 81, false) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22).left(4)); } diff --git a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java index 34f82cd9591..f35becde25d 100644 --- a/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SmartItemFilter.java @@ -88,8 +88,8 @@ public FilterType getType() { } @Override - public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager) { - return GTGuis.createPopupPanel("smart_item_filter", 98 + 27, 81, false) + public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { + return GTGuis.createPopupPanel(panelName, 98 + 27, 81, false) .child(CoverWithUI.createTitleRow(getContainerStack())) .child(createWidgets(syncManager).top(22).left(4)); } From 733d82518f5236a099b1e143b7cb4c1fd635700b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 04:09:12 -0700 Subject: [PATCH 35/57] add todo --- .../java/gregtech/common/covers/filter/BaseFilterContainer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 01d75cb2313..d5fbc204080 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -232,6 +232,7 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { }); ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingItemDamageCount(); + // todo could i use a dynamic synced widget for this row? return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() From bb6a4ce3de0725f756dd9a250ee2a7a0dd612be4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:25:15 -0700 Subject: [PATCH 36/57] clean up a bit --- .../covers/filter/BaseFilterContainer.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index d5fbc204080..412479de279 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -210,24 +210,17 @@ public void handleLegacyNBT(NBTTagCompound nbt) { getFilter().getFilterReader().handleLegacyNBT(nbt); } - public IPanelHandler getFilterHandler(PanelSyncManager syncManager, int id) { - if (hasFilter()) { - return getFilter().createPanelHandler(syncManager, id); - } - return BaseFilter.ERROR_FILTER.createPanelHandler(syncManager, id); - } - /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { // i bet brachy is gonna really hate this, but it *does* work - AtomicReference test = new AtomicReference<>(getFilterHandler(manager, 0)); - AtomicInteger counter = new AtomicInteger(1); + AtomicReference filterPanel = new AtomicReference<>(); AtomicReference oldStack = new AtomicReference<>(getFilterStack()); + AtomicInteger counter = new AtomicInteger(); + if (hasFilter()) filterPanel.set(getFilter().createPanelHandler(manager, counter.getAndIncrement())); manager.registerSyncedAction("update_filter_panel", packet -> { if (hasFilter()) { - oldStack.set(getFilterStack()); // make new panel handler only when we have a filter - test.set(getFilterHandler(manager, counter.getAndIncrement())); + filterPanel.set(getFilter().createPanelHandler(manager, counter.getAndIncrement())); } }); ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingItemDamageCount(); @@ -240,12 +233,14 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { .filter(this::isItemValid) .singletonSlotGroup(101) .changeListener((newItem, onlyAmountChanged, client, init) -> { - IPanelHandler panel = test.get(); - if (!isItemValid(newItem) || - (!strategy.equals(oldStack.get(), newItem) && panel.isPanelOpen())) { + if (strategy.equals(oldStack.get(), newItem)) return; + oldStack.set(newItem); + + IPanelHandler panel = filterPanel.get(); + if (panel != null && panel.isPanelOpen()) { panel.closePanel(); } - if (!init && client && !strategy.equals(oldStack.get(), newItem)) { + if (client) { manager.callSyncedAction("update_filter_panel", packetBuffer -> {}); } })) @@ -257,7 +252,8 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .setEnabledIf(w -> hasFilter()) .onMousePressed(i -> { - IPanelHandler panel = test.get(); + IPanelHandler panel = filterPanel.get(); + if (panel == null) return false; if (!panel.isPanelOpen()) { setMaxTransferSize(getMaxTransferSize()); panel.openPanel(); From 9f397474de7f75e5e415d8c1232128d50a11216e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 18 Nov 2025 02:35:31 -0700 Subject: [PATCH 37/57] use predicate --- .../gregtech/common/mui/widget/InteractableText.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/InteractableText.java b/src/main/java/gregtech/common/mui/widget/InteractableText.java index dc3645c252f..83141681f2d 100644 --- a/src/main/java/gregtech/common/mui/widget/InteractableText.java +++ b/src/main/java/gregtech/common/mui/widget/InteractableText.java @@ -13,14 +13,14 @@ import com.cleanroommc.modularui.widgets.TextWidget; import org.jetbrains.annotations.NotNull; -import java.util.function.Function; +import java.util.function.Predicate; public class InteractableText extends TextWidget> implements Interactable { private final T entry; private final EntryColorSH syncHandler; - public InteractableText(T entry, Function setter) { + public InteractableText(T entry, Predicate setter) { super(IKey.str(entry.getColorStr()) .alignment(Alignment.CenterLeft) .color(Color.WHITE.darker(1))); @@ -46,14 +46,14 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { private static class EntryColorSH extends SyncHandler { - private final Function setter; + private final Predicate setter; - private EntryColorSH(Function setter) { + private EntryColorSH(Predicate setter) { this.setter = setter; } public boolean setColor(String c) { - return this.setter.apply(c); + return this.setter.test(c); } @Override From e2e8b82cd1c8d1591e691eb95efa41ee5b805d4c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 23 Nov 2025 15:03:47 -0700 Subject: [PATCH 38/57] fix cover filters not saving and syncing allowFlow fix CoverItemFilter filtermode syncing --- .../java/gregtech/common/covers/CoverFluidFilter.java | 4 ++++ src/main/java/gregtech/common/covers/CoverItemFilter.java | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverFluidFilter.java b/src/main/java/gregtech/common/covers/CoverFluidFilter.java index f5fd7745f41..c0d9ff4c375 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidFilter.java +++ b/src/main/java/gregtech/common/covers/CoverFluidFilter.java @@ -89,6 +89,7 @@ public void onAttachment(@NotNull CoverableView coverableView, @NotNull EnumFaci @Override public void writeInitialSyncData(@NotNull PacketBuffer packetBuffer) { packetBuffer.writeByte(this.filterMode.ordinal()); + packetBuffer.writeBoolean(this.allowFlow); packetBuffer.writeBoolean(this.fluidFilterContainer.hasFilter()); if (this.fluidFilterContainer.hasFilter()) { packetBuffer.writeItemStack(this.fluidFilterContainer.getFilterStack()); @@ -98,6 +99,7 @@ public void writeInitialSyncData(@NotNull PacketBuffer packetBuffer) { @Override public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { this.filterMode = FluidFilterMode.VALUES[packetBuffer.readByte()]; + this.allowFlow = packetBuffer.readBoolean(); if (!packetBuffer.readBoolean()) return; try { this.fluidFilterContainer.setFilterStack(packetBuffer.readItemStack()); @@ -203,6 +205,7 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); tagCompound.setInteger("FilterMode", this.filterMode.ordinal()); tagCompound.setTag("Filter", this.fluidFilterContainer.serializeNBT()); + tagCompound.setBoolean("allowFlow", this.allowFlow); } @Override @@ -216,6 +219,7 @@ public void readFromNBT(@NotNull NBTTagCompound tagCompound) { } else { this.fluidFilterContainer.deserializeNBT(tagCompound.getCompoundTag("Filter")); } + this.allowFlow = tagCompound.getBoolean("allowFlow"); } private class FluidHandlerFiltered extends FluidHandlerDelegate { diff --git a/src/main/java/gregtech/common/covers/CoverItemFilter.java b/src/main/java/gregtech/common/covers/CoverItemFilter.java index 3cd1a926b37..b64c75a5ee1 100644 --- a/src/main/java/gregtech/common/covers/CoverItemFilter.java +++ b/src/main/java/gregtech/common/covers/CoverItemFilter.java @@ -81,17 +81,19 @@ public void onAttachment(@NotNull CoverableView coverableView, @NotNull EnumFaci @Override public void writeInitialSyncData(@NotNull PacketBuffer packetBuffer) { + packetBuffer.writeByte(this.filterMode.ordinal()); + packetBuffer.writeBoolean(this.allowFlow); packetBuffer.writeBoolean(itemFilterContainer.hasFilter()); if (itemFilterContainer.hasFilter()) { - packetBuffer.writeByte(this.filterMode.ordinal()); packetBuffer.writeItemStack(this.itemFilterContainer.getFilterStack()); } } @Override public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { - if (!packetBuffer.readBoolean()) return; this.filterMode = ItemFilterMode.VALUES[packetBuffer.readByte()]; + this.allowFlow = packetBuffer.readBoolean(); + if (!packetBuffer.readBoolean()) return; try { this.itemFilterContainer.setFilterStack(packetBuffer.readItemStack()); } catch (IOException e) { @@ -191,6 +193,7 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); tagCompound.setInteger("FilterMode", filterMode.ordinal()); tagCompound.setTag("Filter", this.itemFilterContainer.serializeNBT()); + tagCompound.setBoolean("allowFlow", this.allowFlow); } @Override @@ -204,6 +207,7 @@ public void readFromNBT(@NotNull NBTTagCompound tagCompound) { } else { this.itemFilterContainer.deserializeNBT(tagCompound.getCompoundTag("Filter")); } + this.allowFlow = tagCompound.getBoolean("allowFlow"); } @Override From 78b200b8724050b3e3900cc9c4b8438f0e345c62 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 23 Nov 2025 19:24:08 -0700 Subject: [PATCH 39/57] todo --- .../gregtech/common/covers/filter/BaseFilterContainer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 412479de279..2b784ac08a1 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -213,6 +213,9 @@ public void handleLegacyNBT(NBTTagCompound nbt) { /** Uses Cleanroom MUI */ public IWidget initUI(GuiData data, PanelSyncManager manager) { // i bet brachy is gonna really hate this, but it *does* work + // todo Find a better way to handle the filter popup panel than making + // a new panel handler every time it changes + // Could use a DynamicSyncedWidget or a client only panel in a future PR AtomicReference filterPanel = new AtomicReference<>(); AtomicReference oldStack = new AtomicReference<>(getFilterStack()); AtomicInteger counter = new AtomicInteger(); @@ -225,7 +228,6 @@ public IWidget initUI(GuiData data, PanelSyncManager manager) { }); ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingItemDamageCount(); - // todo could i use a dynamic synced widget for this row? return Flow.row().coverChildrenHeight() .marginBottom(2).widthRel(1f) .child(new ItemSlot() From 2fe7a4e23a137506d9ebe735a3d52c67cd0f7a9e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Nov 2025 16:52:18 -0700 Subject: [PATCH 40/57] spotless? --- .../gregtech/common/covers/filter/BaseFilterContainer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java index 2b784ac08a1..8c050a2e394 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilterContainer.java @@ -214,8 +214,8 @@ public void handleLegacyNBT(NBTTagCompound nbt) { public IWidget initUI(GuiData data, PanelSyncManager manager) { // i bet brachy is gonna really hate this, but it *does* work // todo Find a better way to handle the filter popup panel than making - // a new panel handler every time it changes - // Could use a DynamicSyncedWidget or a client only panel in a future PR + // a new panel handler every time it changes + // Could use a DynamicSyncedWidget or a client only panel in a future PR AtomicReference filterPanel = new AtomicReference<>(); AtomicReference oldStack = new AtomicReference<>(getFilterStack()); AtomicInteger counter = new AtomicInteger(); From 8dd76cb54facdcd039f3e4f09f61b5c3e94b81f5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Nov 2025 17:02:07 -0700 Subject: [PATCH 41/57] properly support long counts for items and fluids --- .../detector/CoverDetectorFluidAdvanced.java | 25 ++++++++++--------- .../detector/CoverDetectorItemAdvanced.java | 24 +++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index c7e2eb1bab9..052b5e681cf 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -4,7 +4,6 @@ import gregtech.api.cover.CoverWithUI; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuis; -import gregtech.api.util.GTUtility; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; import gregtech.common.covers.filter.FluidFilterContainer; @@ -44,7 +43,9 @@ public class CoverDetectorFluidAdvanced extends CoverDetectorFluid implements Co private static final int DEFAULT_MIN = 1000; // 1 Bucket private static final int DEFAULT_MAX = 16000; // 16 Buckets - private int min = DEFAULT_MIN, max = DEFAULT_MAX, outputAmount; + private long min = DEFAULT_MIN; + private long max = DEFAULT_MAX; + private int outputAmount; private boolean isLatched = false; protected FluidFilterContainer fluidFilter; @@ -128,11 +129,11 @@ private long getMaxValue() { } private void setMinValue(long val) { - this.min = clamp((int) val, 0, max - 1); + this.min = clamp(val, 0, max - 1); } private void setMaxValue(long val) { - this.max = GTUtility.safeCastLongToInt(clamp(val, min + 1, Long.MAX_VALUE)); + this.max = clamp(val, min + 1, Long.MAX_VALUE); } private void setLatched(boolean isLatched) { @@ -174,8 +175,8 @@ public void update() { @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); - tagCompound.setInteger("min", this.min); - tagCompound.setInteger("max", this.max); + tagCompound.setLong("min", this.min); + tagCompound.setLong("max", this.max); tagCompound.setBoolean("isLatched", this.isLatched); tagCompound.setTag("filter", this.fluidFilter.serializeNBT()); } @@ -183,8 +184,8 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { @Override public void readFromNBT(@NotNull NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.min = tagCompound.getInteger("min"); - this.max = tagCompound.getInteger("max"); + this.min = tagCompound.getLong("min"); + this.max = tagCompound.getLong("max"); this.isLatched = tagCompound.getBoolean("isLatched"); this.fluidFilter.deserializeNBT(tagCompound.getCompoundTag("filter")); } @@ -192,16 +193,16 @@ public void readFromNBT(@NotNull NBTTagCompound tagCompound) { @Override public void writeInitialSyncData(@NotNull PacketBuffer packetBuffer) { super.writeInitialSyncData(packetBuffer); - packetBuffer.writeInt(this.min); - packetBuffer.writeInt(this.max); + packetBuffer.writeLong(this.min); + packetBuffer.writeLong(this.max); packetBuffer.writeBoolean(this.isLatched); } @Override public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { super.readInitialSyncData(packetBuffer); - this.min = packetBuffer.readInt(); - this.max = packetBuffer.readInt(); + this.min = packetBuffer.readLong(); + this.max = packetBuffer.readLong(); this.isLatched = packetBuffer.readBoolean(); } } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index f16e55ae20e..87ca2a8fd0c 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -41,8 +41,8 @@ public class CoverDetectorItemAdvanced extends CoverDetectorItem implements Cove private static final int DEFAULT_MIN = 64; private static final int DEFAULT_MAX = 512; - private int min = DEFAULT_MIN; - private int max = DEFAULT_MAX; + private long min = DEFAULT_MIN; + private long max = DEFAULT_MAX; private int outputAmount; private boolean isLatched = false; protected ItemFilterContainer itemFilter; @@ -111,11 +111,11 @@ private long getMaxValue() { } private void setMinValue(long val) { - this.min = clamp((int) val, 0, this.max - 1); + this.min = clamp(val, 0, this.max - 1); } private void setMaxValue(long val) { - this.max = clamp((int) val, this.min + 1, Integer.MAX_VALUE); + this.max = clamp(val, this.min + 1, Long.MAX_VALUE); } private void setLatched(boolean isLatched) { @@ -163,8 +163,8 @@ public void update() { @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); - tagCompound.setInteger("min", this.min); - tagCompound.setInteger("max", this.max); + tagCompound.setLong("min", this.min); + tagCompound.setLong("max", this.max); tagCompound.setBoolean("isLatched", this.isLatched); tagCompound.setTag("filter", this.itemFilter.serializeNBT()); } @@ -172,8 +172,8 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { @Override public void readFromNBT(@NotNull NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.min = tagCompound.getInteger("min"); - this.max = tagCompound.getInteger("max"); + this.min = tagCompound.getLong("min"); + this.max = tagCompound.getLong("max"); this.isLatched = tagCompound.getBoolean("isLatched"); this.itemFilter.deserializeNBT(tagCompound.getCompoundTag("filter")); } @@ -181,16 +181,16 @@ public void readFromNBT(@NotNull NBTTagCompound tagCompound) { @Override public void writeInitialSyncData(@NotNull PacketBuffer packetBuffer) { super.writeInitialSyncData(packetBuffer); - packetBuffer.writeInt(this.min); - packetBuffer.writeInt(this.max); + packetBuffer.writeLong(this.min); + packetBuffer.writeLong(this.max); packetBuffer.writeBoolean(this.isLatched); } @Override public void readInitialSyncData(@NotNull PacketBuffer packetBuffer) { super.readInitialSyncData(packetBuffer); - this.min = packetBuffer.readInt(); - this.max = packetBuffer.readInt(); + this.min = packetBuffer.readLong(); + this.max = packetBuffer.readLong(); this.isLatched = packetBuffer.readBoolean(); } } From 6d7cf813e33edae49f8c5f026ef58d5734fa9ebb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Nov 2025 22:30:33 -0700 Subject: [PATCH 42/57] replace dynamic drawables with supplier lang key use slotValue directly as value --- .../common/covers/CoverDigitalInterface.java | 6 +----- .../detector/CoverDetectorEnergyAdvanced.java | 19 ++++++++++--------- .../detector/CoverDetectorFluidAdvanced.java | 13 ++++++------- .../detector/CoverDetectorItemAdvanced.java | 13 ++++++------- 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 0305d15b89a..793e0eb50a3 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -70,7 +70,6 @@ import com.cleanroommc.modularui.screen.UISettings; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.StringValue; import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -493,7 +492,6 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan IntSyncValue slotValue = new IntSyncValue(() -> this.slot, this::setMode); EnumSyncValue modeValue = new EnumSyncValue<>(MODE.class, this::getMode, this::setMode); EnumSyncValue spinValue = new EnumSyncValue<>(EnumFacing.class, () -> this.spin, this::setMode); - guiSyncManager.syncValue("slot", slotValue); guiSyncManager.syncValue("mode", modeValue); guiSyncManager.syncValue("spin", spinValue); @@ -531,9 +529,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan })) .child(new GTTextFieldWidget() .setNumbers(0, Integer.MAX_VALUE) - .value(new StringValue.Dynamic( - () -> String.valueOf(slotValue.getIntValue()), - s -> slotValue.setIntValue(Integer.parseInt(s)))) + .value(slotValue) .size(80, 20) .setTextColor(Color.WHITE.main) .background(GTGuiTextures.DISPLAY)) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 4521d11ff09..663be13d30d 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -24,7 +24,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; @@ -114,10 +113,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .size(72, 18) .addTooltipLine(IKey.lang("cover.advanced_energy_detector.modes_tooltip")) .value(new BooleanSyncValue(this::isUsePercent, this::setUsePercent)) - .overlay(new DynamicDrawable(() -> IKey - .lang("cover.advanced_energy_detector.mode_" + - (isUsePercent() ? "percent" : "eu")) - .style(TextFormatting.WHITE))))) + .overlay(IKey.lang(() -> { + String lang = "cover.advanced_energy_detector.mode_"; + lang += isUsePercent() ? "percent" : "eu"; + return lang; + }).style(TextFormatting.WHITE)))) .child(Flow.row() .name("inverted row") .coverChildrenHeight() @@ -129,10 +129,11 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .size(72, 18) .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) .value(new BooleanSyncValue(this::isInverted, this::setInverted)) - .overlay(new DynamicDrawable(() -> IKey - .lang("cover.advanced_energy_detector." + - (isInverted() ? "inverted" : "normal")) - .style(TextFormatting.WHITE)))))) + .overlay(IKey.lang(() -> { + String lang = "cover.advanced_energy_detector."; + lang += (isInverted() ? "inverted" : "normal"); + return lang; + }).style(TextFormatting.WHITE))))) .bindPlayerInventory(); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index 052b5e681cf..fc2859a9863 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -28,7 +28,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; @@ -96,20 +95,20 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .size(72, 18) .value(new BooleanSyncValue(this::isInverted, this::setInverted)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) - .overlay(new DynamicDrawable(() -> { + .overlay(IKey.lang(() -> { String lang = "cover.advanced_energy_detector."; lang += isInverted() ? "inverted" : "normal"; - return IKey.lang(lang).style(TextFormatting.WHITE); - }))) + return lang; + }).style(TextFormatting.WHITE))) .child(new ToggleButton() .name("latch button") .size(72, 18) .right(0) - .overlay(new DynamicDrawable(() -> { + .overlay(IKey.lang(() -> { String lang = "cover.generic.advanced_detector."; lang += isLatched() ? "latched" : "continuous"; - return IKey.lang(lang).style(TextFormatting.WHITE); - })) + return lang; + }).style(TextFormatting.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) .child(this.fluidFilter.initUI(guiData, guiSyncManager))) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 87ca2a8fd0c..6349403794b 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -26,7 +26,6 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.SidedPosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.UISettings; @@ -80,22 +79,22 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .child(new ToggleButton() .name("inverted button") .size(72, 18) - .overlay(new DynamicDrawable(() -> { + .overlay(IKey.lang(() -> { String lang = "cover.advanced_energy_detector."; lang += isInverted() ? "inverted" : "normal"; - return IKey.lang(lang).style(TextFormatting.WHITE); - })) + return lang; + }).style(TextFormatting.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) .value(new BooleanSyncValue(this::isInverted, this::setInverted))) .child(new ToggleButton() .name("latch button") .size(72, 18) .right(0) - .overlay(new DynamicDrawable(() -> { + .overlay(IKey.lang(() -> { String lang = "cover.generic.advanced_detector."; lang += isLatched() ? "latched" : "continuous"; - return IKey.lang(lang).style(TextFormatting.WHITE); - })) + return lang; + }).style(TextFormatting.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) .child(itemFilter.initUI(guiData, guiSyncManager))) From d2aa8619f670c614dcfe3a10575dcac8c1cd0582 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Nov 2025 22:36:27 -0700 Subject: [PATCH 43/57] use flow as return type --- src/main/java/gregtech/common/covers/CoverConveyor.java | 3 +-- src/main/java/gregtech/common/covers/CoverFluidRegulator.java | 4 ++-- src/main/java/gregtech/common/covers/CoverFluidVoiding.java | 3 +-- .../gregtech/common/covers/CoverFluidVoidingAdvanced.java | 4 ++-- src/main/java/gregtech/common/covers/CoverItemVoiding.java | 3 +-- .../java/gregtech/common/covers/CoverItemVoidingAdvanced.java | 3 +-- src/main/java/gregtech/common/covers/CoverPump.java | 3 +-- src/main/java/gregtech/common/covers/CoverRoboticArm.java | 3 +-- 8 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index d072f2b5379..6b36ab09764 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -55,7 +55,6 @@ import com.cleanroommc.modularui.value.sync.IntSyncValue; 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.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -509,7 +508,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); diff --git a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java index a3cf6bcbf96..cde55bd098f 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java +++ b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java @@ -1,5 +1,6 @@ package gregtech.common.covers; +import com.cleanroommc.modularui.widgets.layout.Flow; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuiTextures; @@ -28,7 +29,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; 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.textfield.TextFieldWidget; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.apache.logging.log4j.message.FormattedMessage; @@ -249,7 +249,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected Flow createUI(GuiData data, PanelSyncManager syncManager) { var transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); transferMode.updateCacheFromSource(true); syncManager.syncValue("transfer_mode", transferMode); diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java index a1374655bdf..b39ca770bf2 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoiding.java @@ -31,7 +31,6 @@ import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; 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.Flow; import org.jetbrains.annotations.NotNull; @@ -77,7 +76,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected Flow createUI(GuiData data, PanelSyncManager syncManager) { BooleanSyncValue isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); return super.createUI(data, syncManager) diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java index 84f722c39c6..83afff6cbe1 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java @@ -1,5 +1,6 @@ package gregtech.common.covers; +import com.cleanroommc.modularui.widgets.layout.Flow; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuiTextures; @@ -28,7 +29,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; 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.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -107,7 +107,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected Flow createUI(GuiData data, PanelSyncManager syncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); syncManager.syncValue("voiding_mode", voidingMode); diff --git a/src/main/java/gregtech/common/covers/CoverItemVoiding.java b/src/main/java/gregtech/common/covers/CoverItemVoiding.java index 95cfa8c8241..a69c9da98f8 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoiding.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoiding.java @@ -28,7 +28,6 @@ import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; 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.Flow; import org.jetbrains.annotations.NotNull; @@ -78,7 +77,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { BooleanSyncValue isWorking = new BooleanSyncValue(this::isWorkingEnabled, this::setWorkingEnabled); return super.createUI(data, guiSyncManager) diff --git a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java index 1a716509505..d66e93c1a69 100644 --- a/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverItemVoidingAdvanced.java @@ -25,7 +25,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; 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.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -95,7 +94,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { var voidingMode = new EnumSyncValue<>(VoidingMode.class, this::getVoidingMode, this::setVoidingMode); guiSyncManager.syncValue("voiding_mode", voidingMode); diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 87c83ff3001..93b29e58bcb 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -53,7 +53,6 @@ import com.cleanroommc.modularui.value.sync.IntSyncValue; 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.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; @@ -195,7 +194,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .bindPlayerInventory(); } - protected ParentWidget createUI(GuiData data, PanelSyncManager syncManager) { + protected Flow createUI(GuiData data, PanelSyncManager syncManager) { var manualIOmode = new EnumSyncValue<>(ManualImportExportMode.class, this::getManualImportExportMode, this::setManualImportExportMode); diff --git a/src/main/java/gregtech/common/covers/CoverRoboticArm.java b/src/main/java/gregtech/common/covers/CoverRoboticArm.java index 31918dbcaac..159453207e7 100644 --- a/src/main/java/gregtech/common/covers/CoverRoboticArm.java +++ b/src/main/java/gregtech/common/covers/CoverRoboticArm.java @@ -27,7 +27,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; 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.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -198,7 +197,7 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan } @Override - protected ParentWidget createUI(GuiData data, PanelSyncManager guiSyncManager) { + protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { EnumSyncValue transferMode = new EnumSyncValue<>(TransferMode.class, this::getTransferMode, this::setTransferMode); guiSyncManager.syncValue("transfer_mode", transferMode); From 93d503834e909d1a6fe4750754ddfad473cf4dd7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Nov 2025 22:57:40 -0700 Subject: [PATCH 44/57] use throughput directly as value --- src/main/java/gregtech/common/covers/CoverConveyor.java | 6 +----- src/main/java/gregtech/common/covers/CoverPump.java | 6 +----- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 6b36ab09764..08430e499dd 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -520,16 +520,12 @@ protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { IntSyncValue throughput = new IntSyncValue(this::getTransferRate, this::setTransferRate); - StringSyncValue formattedThroughput = new StringSyncValue(throughput::getStringValue, - throughput::setStringValue); - EnumSyncValue distributionMode = new EnumSyncValue<>(DistributionMode.class, this::getDistributionMode, this::setDistributionMode); guiSyncManager.syncValue("manual_io", manualIOmode); guiSyncManager.syncValue("conveyor_mode", conveyorMode); guiSyncManager.syncValue("distribution_mode", distributionMode); - guiSyncManager.syncValue("throughput", throughput); if (createThroughputRow()) column.child(Flow.row().coverChildrenHeight() @@ -547,7 +543,7 @@ protected Flow createUI(GuiData data, PanelSyncManager guiSyncManager) { .setPostFix(" items/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxItemTransferRate) - .value(formattedThroughput) + .value(throughput) .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() .right(0).width(18) diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 93b29e58bcb..7aebeb4af59 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -200,14 +200,10 @@ protected Flow createUI(GuiData data, PanelSyncManager syncManager) { var throughput = new IntSyncValue(this::getTransferRate, this::setTransferRate); - var throughputString = new StringSyncValue( - throughput::getStringValue, throughput::setStringValue); - var pumpMode = new EnumSyncValue<>(PumpMode.class, this::getPumpMode, this::setPumpMode); syncManager.syncValue("manual_io", manualIOmode); syncManager.syncValue("pump_mode", pumpMode); - syncManager.syncValue("throughput", throughput); var column = Flow.column().top(24).margin(7, 0) .widthRel(1f).coverChildrenHeight(); @@ -228,7 +224,7 @@ protected Flow createUI(GuiData data, PanelSyncManager syncManager) { .setPostFix(" L/s") .setTextColor(Color.WHITE.darker(1)) .setNumbers(1, maxFluidTransferRate) - .value(throughputString) + .value(throughput) .background(GTGuiTextures.DISPLAY)) .child(new ButtonWidget<>() .right(0).width(18) From 8dd1b377a385badba332d0a651a3e29de163ab39 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Nov 2025 23:01:40 -0700 Subject: [PATCH 45/57] spotless --- src/main/java/gregtech/api/cover/CoverWithUI.java | 1 - src/main/java/gregtech/common/covers/CoverConveyor.java | 1 - src/main/java/gregtech/common/covers/CoverFluidRegulator.java | 2 +- .../java/gregtech/common/covers/CoverFluidVoidingAdvanced.java | 2 +- src/main/java/gregtech/common/covers/CoverPump.java | 1 - 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 4794811d947..88e19d9d25c 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -36,7 +36,6 @@ import org.jetbrains.annotations.NotNull; import java.util.function.BooleanSupplier; - import java.util.function.Supplier; public interface CoverWithUI extends Cover, IUIHolder, IGuiHolder { diff --git a/src/main/java/gregtech/common/covers/CoverConveyor.java b/src/main/java/gregtech/common/covers/CoverConveyor.java index 08430e499dd..7cdd1b9f85b 100644 --- a/src/main/java/gregtech/common/covers/CoverConveyor.java +++ b/src/main/java/gregtech/common/covers/CoverConveyor.java @@ -54,7 +54,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; diff --git a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java index cde55bd098f..f87ab8b9957 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidRegulator.java +++ b/src/main/java/gregtech/common/covers/CoverFluidRegulator.java @@ -1,6 +1,5 @@ package gregtech.common.covers; -import com.cleanroommc.modularui.widgets.layout.Flow; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuiTextures; @@ -29,6 +28,7 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.apache.logging.log4j.message.FormattedMessage; diff --git a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java index 83afff6cbe1..b8be41ff6d3 100644 --- a/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java +++ b/src/main/java/gregtech/common/covers/CoverFluidVoidingAdvanced.java @@ -1,6 +1,5 @@ package gregtech.common.covers; -import com.cleanroommc.modularui.widgets.layout.Flow; import gregtech.api.cover.CoverDefinition; import gregtech.api.cover.CoverableView; import gregtech.api.mui.GTGuiTextures; @@ -29,6 +28,7 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/gregtech/common/covers/CoverPump.java b/src/main/java/gregtech/common/covers/CoverPump.java index 7aebeb4af59..c595a56774a 100644 --- a/src/main/java/gregtech/common/covers/CoverPump.java +++ b/src/main/java/gregtech/common/covers/CoverPump.java @@ -52,7 +52,6 @@ import com.cleanroommc.modularui.value.sync.EnumSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; From bf5ede22891bb68d307d5118ec8bf050f40ae1d3 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:27:25 -0700 Subject: [PATCH 46/57] add CoverUIFactory back and mark for removal add notes --- .../gregtech/api/cover/CoverUIFactory.java | 56 +++++++++++++++++++ .../java/gregtech/api/cover/CoverWithUI.java | 24 +++++++- 2 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 src/main/java/gregtech/api/cover/CoverUIFactory.java diff --git a/src/main/java/gregtech/api/cover/CoverUIFactory.java b/src/main/java/gregtech/api/cover/CoverUIFactory.java new file mode 100644 index 00000000000..8d8fe0ec860 --- /dev/null +++ b/src/main/java/gregtech/api/cover/CoverUIFactory.java @@ -0,0 +1,56 @@ +package gregtech.api.cover; + +import gregtech.api.GregTechAPI; +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.gui.ModularUI; +import gregtech.api.gui.UIFactory; +import gregtech.api.util.GTUtility; + +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.PacketBuffer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; + +import org.jetbrains.annotations.ApiStatus; + +@Deprecated +@ApiStatus.ScheduledForRemoval(inVersion = "2.10") +public final class CoverUIFactory extends UIFactory { + + public static final CoverUIFactory INSTANCE = new CoverUIFactory(); + + private CoverUIFactory() {} + + public void init() { + GregTechAPI.UI_FACTORY_REGISTRY.register(2, GTUtility.gregtechId("cover_behavior_factory"), this); + } + + @Override + protected ModularUI createUITemplate(CoverWithUI holder, EntityPlayer entityPlayer) { + return holder.createUI(entityPlayer); + } + + @Override + protected CoverWithUI readHolderFromSyncData(PacketBuffer syncData) { + BlockPos blockPos = syncData.readBlockPos(); + EnumFacing attachedSide = EnumFacing.VALUES[syncData.readByte()]; + TileEntity tileEntity = Minecraft.getMinecraft().world.getTileEntity(blockPos); + CoverableView coverable = tileEntity == null ? null : + tileEntity.getCapability(GregtechTileCapabilities.CAPABILITY_COVER_HOLDER, attachedSide); + if (coverable != null) { + Cover cover = coverable.getCoverAtSide(attachedSide); + if (cover instanceof CoverWithUI coverWithUI) { + return coverWithUI; + } + } + return null; + } + + @Override + protected void writeHolderToSyncData(PacketBuffer syncData, CoverWithUI cover) { + syncData.writeBlockPos(cover.getPos()); + syncData.writeByte(cover.getAttachedSide().ordinal()); + } +} diff --git a/src/main/java/gregtech/api/cover/CoverWithUI.java b/src/main/java/gregtech/api/cover/CoverWithUI.java index 88e19d9d25c..4cf44149d9f 100644 --- a/src/main/java/gregtech/api/cover/CoverWithUI.java +++ b/src/main/java/gregtech/api/cover/CoverWithUI.java @@ -1,11 +1,11 @@ package gregtech.api.cover; -import gregtech.api.gui.IUIHolder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GregTechGuiScreen; import gregtech.api.mui.factory.CoverGuiFactory; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.IStringSerializable; @@ -38,10 +38,28 @@ import java.util.function.BooleanSupplier; import java.util.function.Supplier; -public interface CoverWithUI extends Cover, IUIHolder, IGuiHolder { +public interface CoverWithUI extends Cover, IGuiHolder, gregtech.api.gui.IUIHolder { + + @ApiStatus.Experimental + default boolean usesMui2() { + // this is gonna cause problems if implementing classes expect this to be false + // all of our covers use mui2 though + return true; + } default void openUI(EntityPlayerMP player) { - CoverGuiFactory.open(player, this); + if (usesMui2()) { + CoverGuiFactory.open(player, this); + } else { + // todo remove in 2.10 + CoverUIFactory.INSTANCE.openUI(this, player); + } + } + + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.10") + default gregtech.api.gui.ModularUI createUI(EntityPlayer player) { + return null; } @ApiStatus.NonExtendable From c52eaadc1ac951bca580150d465c12ec94d2f223 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 20:47:46 -0700 Subject: [PATCH 47/57] make item/fluid detectors unplaceable on creative chest/tank --- .../gregtech/common/covers/detector/CoverDetectorFluid.java | 4 +++- .../gregtech/common/covers/detector/CoverDetectorItem.java | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluid.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluid.java index e3b0a26db68..f40fc28746f 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluid.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluid.java @@ -4,6 +4,7 @@ import gregtech.api.cover.CoverableView; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; +import gregtech.common.metatileentities.storage.MetaTileEntityCreativeTank; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -28,7 +29,8 @@ public CoverDetectorFluid(@NotNull CoverDefinition definition, @NotNull Coverabl @Override public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing side) { - return coverable.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null) != null; + if (coverable instanceof MetaTileEntityCreativeTank) return false; + return coverable.hasCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, null); } @Override diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItem.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItem.java index 00df1e03792..c9cfeb43bc1 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItem.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItem.java @@ -4,6 +4,7 @@ import gregtech.api.cover.CoverableView; import gregtech.api.util.RedstoneUtil; import gregtech.client.renderer.texture.Textures; +import gregtech.common.metatileentities.storage.MetaTileEntityCreativeChest; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; @@ -26,7 +27,8 @@ public CoverDetectorItem(@NotNull CoverDefinition definition, @NotNull Coverable @Override public boolean canAttach(@NotNull CoverableView coverable, @NotNull EnumFacing side) { - return coverable.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null) != null; + if (coverable instanceof MetaTileEntityCreativeChest) return false; + return coverable.hasCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null); } @Override From 099672b3b5f4987f29b14937c2e4b62c10ae9dd7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:29:14 -0700 Subject: [PATCH 48/57] drain and fill at the same time for our phantom fluid slots move locking call into sync handlers' handle click method on server --- .../api/mui/sync/GTFluidSyncHandler.java | 35 ++++++++++--------- .../common/mui/widget/GTFluidSlot.java | 3 -- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index bccbfd49be0..8f511e86f49 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -304,6 +304,8 @@ public void handleClick(MouseData data) { public void readOnServer(int id, PacketBuffer buf) { if (id == TRY_CLICK_CONTAINER) { var data = MouseData.readPacket(buf); + if (canLockFluid()) + toggleLockFluid(); if (isPhantom()) { tryClickPhantom(data); } else { @@ -316,14 +318,6 @@ public void readOnServer(int id, PacketBuffer buf) { setFluid(fluid); } else if (id == PHANTOM_SCROLL) { tryScrollPhantom(MouseData.readPacket(buf)); - } else if (id == LOCK_FLUID) { - boolean locked = buf.readBoolean(); - var fluidStack = NetworkUtils.readFluidStack(buf); - if (fluidStack == null) { - this.lockHandler.accept(locked); - } else { - this.jeiHandler.accept(fluidStack); - } } } @@ -341,19 +335,26 @@ public void tryClickPhantom(MouseData data) { } } else { FluidStack cellFluid = fluidHandlerItem.drain(Integer.MAX_VALUE, false); - if ((this.showAmountOnSlot.getAsBoolean() || currentFluid == null) && cellFluid != null) { + if (!GTUtility.areFluidStacksEqual(cellFluid, currentFluid)) { + + // drain existing + if (this.canDrainSlot()) { + int amt = data.shift ? Integer.MAX_VALUE : 1000; + this.tank.drain(amt, true); + } + + // then fill if (this.canFillSlot()) { - if (!this.showAmountOnSlot.getAsBoolean()) { - cellFluid.amount = 1; + FluidStack fill; + if (this.showAmountOnSlot.getAsBoolean() && !GTUtility.isEmpty(cellFluid)) { + fill = GTUtility.copy(cellFluid); + } else { + fill = GTUtility.copy(1, cellFluid); } - if (this.tank.fill(cellFluid, true) > 0) { - this.phantomFluid = cellFluid.copy(); + if (fill == null || this.tank.fill(fill, true) > 0) { + this.phantomFluid = fill; } } - } else { - if (this.canDrainSlot()) { - this.tank.drain(data.shift ? Integer.MAX_VALUE : 1000, true); - } } } } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 23c14ab82ca..2de42778c68 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -117,9 +117,6 @@ public void draw(ModularGuiContext context, WidgetThemeEntry widgetTheme) { this.syncHandler.canFillSlot() || this.syncHandler.canDrainSlot()) { this.syncHandler.handleClick(data); - if (this.syncHandler.canLockFluid()) - this.syncHandler.toggleLockFluid(); - return Result.SUCCESS; } return Result.IGNORE; From 5a1f59611beae9ba8654f74100029278e6e818e4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 21:42:08 -0700 Subject: [PATCH 49/57] use default values when energy capacity is zero prevent redundant sets --- .../detector/CoverDetectorEnergyAdvanced.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 663be13d30d..9a7222cd423 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -165,13 +165,25 @@ private boolean isUsePercent() { } private void setUsePercent(boolean b) { + if (isUsePercent() == b) return; this.usePercent = b; + if (getCoverHolderCapacity() == 0) { + // can't use capacity, use default values + this.minValue = DEFAULT_MIN_EU; + this.maxValue = isUsePercent() ? 100 : DEFAULT_MAX_EU; + return; + } + + // todo should precision be increased for percent? + // for large eu values switching modes starts to break down long minValue, maxValue; - if (this.usePercent) { // using percent + if (this.usePercent) { + // using percent minValue = (long) Math.ceil(((double) this.minValue / getCoverHolderCapacity()) * 100d); maxValue = (long) Math.ceil(((double) this.maxValue / getCoverHolderCapacity()) * 100d); - } else { // using discrete EU + } else { + // using discrete EU minValue = (long) Math.floor((this.minValue / 100d) * getCoverHolderCapacity()); maxValue = (long) Math.floor((this.maxValue / 100d) * getCoverHolderCapacity()); } From a87782ca9925e10be473fea5d394cb935b3aba18 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 22:22:34 -0700 Subject: [PATCH 50/57] deserialize legacy int min and max --- .../common/covers/detector/CoverDetectorBase.java | 2 ++ .../detector/CoverDetectorEnergyAdvanced.java | 2 +- .../detector/CoverDetectorFluidAdvanced.java | 15 +++++++++++---- .../detector/CoverDetectorItemAdvanced.java | 15 +++++++++++---- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java index f269869e61e..8e14f5fadb9 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorBase.java @@ -32,6 +32,8 @@ public abstract class CoverDetectorBase extends CoverBase { + protected static final String MIN_KEY = "min"; + protected static final String MAX_KEY = "max"; protected static final String NBT_KEY_IS_INVERTED = "isInverted"; private boolean isInverted = false; diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 9a7222cd423..8affd56febe 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -176,7 +176,7 @@ private void setUsePercent(boolean b) { } // todo should precision be increased for percent? - // for large eu values switching modes starts to break down + // for large eu values switching modes starts to break down long minValue, maxValue; if (this.usePercent) { // using percent diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index fc2859a9863..08693f1de8e 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -17,6 +17,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -174,8 +175,8 @@ public void update() { @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); - tagCompound.setLong("min", this.min); - tagCompound.setLong("max", this.max); + tagCompound.setLong(MIN_KEY, this.min); + tagCompound.setLong(MAX_KEY, this.max); tagCompound.setBoolean("isLatched", this.isLatched); tagCompound.setTag("filter", this.fluidFilter.serializeNBT()); } @@ -183,8 +184,14 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { @Override public void readFromNBT(@NotNull NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.min = tagCompound.getLong("min"); - this.max = tagCompound.getLong("max"); + if (tagCompound.hasKey(MIN_KEY, Constants.NBT.TAG_INT)) { + // if one of them is int, so is the other + this.min = tagCompound.getInteger(MIN_KEY); + this.max = tagCompound.getInteger(MAX_KEY); + } else { + this.min = tagCompound.getLong(MIN_KEY); + this.max = tagCompound.getLong(MAX_KEY); + } this.isLatched = tagCompound.getBoolean("isLatched"); this.fluidFilter.deserializeNBT(tagCompound.getCompoundTag("filter")); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 6349403794b..7ffb1c4062f 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -17,6 +17,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -162,8 +163,8 @@ public void update() { @Override public void writeToNBT(@NotNull NBTTagCompound tagCompound) { super.writeToNBT(tagCompound); - tagCompound.setLong("min", this.min); - tagCompound.setLong("max", this.max); + tagCompound.setLong(MIN_KEY, this.min); + tagCompound.setLong(MAX_KEY, this.max); tagCompound.setBoolean("isLatched", this.isLatched); tagCompound.setTag("filter", this.itemFilter.serializeNBT()); } @@ -171,8 +172,14 @@ public void writeToNBT(@NotNull NBTTagCompound tagCompound) { @Override public void readFromNBT(@NotNull NBTTagCompound tagCompound) { super.readFromNBT(tagCompound); - this.min = tagCompound.getLong("min"); - this.max = tagCompound.getLong("max"); + if (tagCompound.hasKey(MIN_KEY, Constants.NBT.TAG_INT)) { + // if one of them is int, so is the other + this.min = tagCompound.getInteger(MIN_KEY); + this.max = tagCompound.getInteger(MAX_KEY); + } else { + this.min = tagCompound.getLong(MIN_KEY); + this.max = tagCompound.getLong(MAX_KEY); + } this.isLatched = tagCompound.getBoolean("isLatched"); this.itemFilter.deserializeNBT(tagCompound.getCompoundTag("filter")); } From 34b9bda348588aca53b78fc83ead7b6d28470902 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 22:27:32 -0700 Subject: [PATCH 51/57] use passed in name for error panel --- src/main/java/gregtech/common/covers/filter/BaseFilter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/filter/BaseFilter.java b/src/main/java/gregtech/common/covers/filter/BaseFilter.java index 836c59709fa..c5591a5021b 100644 --- a/src/main/java/gregtech/common/covers/filter/BaseFilter.java +++ b/src/main/java/gregtech/common/covers/filter/BaseFilter.java @@ -35,7 +35,7 @@ public BaseFilterReader getFilterReader() { @Override public @NotNull ModularPanel createPopupPanel(PanelSyncManager syncManager, String panelName) { - return GTGuis.createPopupPanel("error", 100, 100) + return GTGuis.createPopupPanel(panelName, 100, 100) .child(createWidgets(syncManager)); } From 564d328db90ac27bede0911d68e5d4a82d9a6e4e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 23:02:58 -0700 Subject: [PATCH 52/57] simplify lang key overlay --- .../detector/CoverDetectorEnergyAdvanced.java | 41 +++++++++---------- .../detector/CoverDetectorFluidAdvanced.java | 19 ++++----- .../detector/CoverDetectorItemAdvanced.java | 19 ++++----- 3 files changed, 35 insertions(+), 44 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 8affd56febe..42310509d23 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -16,7 +16,6 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.text.TextFormatting; import codechicken.lib.raytracer.CuboidRayTraceResult; import codechicken.lib.render.CCRenderState; @@ -113,27 +112,25 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .size(72, 18) .addTooltipLine(IKey.lang("cover.advanced_energy_detector.modes_tooltip")) .value(new BooleanSyncValue(this::isUsePercent, this::setUsePercent)) - .overlay(IKey.lang(() -> { - String lang = "cover.advanced_energy_detector.mode_"; - lang += isUsePercent() ? "percent" : "eu"; - return lang; - }).style(TextFormatting.WHITE)))) - .child(Flow.row() - .name("inverted row") - .coverChildrenHeight() - .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() - .size(72, 18)) - .child(new ToggleButton() - .name("inverted button") - .right(0) - .size(72, 18) - .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) - .value(new BooleanSyncValue(this::isInverted, this::setInverted)) - .overlay(IKey.lang(() -> { - String lang = "cover.advanced_energy_detector."; - lang += (isInverted() ? "inverted" : "normal"); - return lang; - }).style(TextFormatting.WHITE))))) + .overlay(true, IKey.lang("cover.advanced_energy_detector.mode_percent") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.advanced_energy_detector.mode_eu") + .style(IKey.WHITE))))) + .child(Flow.row() + .name("inverted row") + .coverChildrenHeight() + .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() + .size(72, 18)) + .child(new ToggleButton() + .name("inverted button") + .right(0) + .size(72, 18) + .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) + .value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .overlay(true, IKey.lang("cover.advanced_energy_detector.inverted") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.advanced_energy_detector.normal") + .style(IKey.WHITE)))) .bindPlayerInventory(); } diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java index 08693f1de8e..0a05cb08ffb 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorFluidAdvanced.java @@ -16,7 +16,6 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; @@ -96,20 +95,18 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .size(72, 18) .value(new BooleanSyncValue(this::isInverted, this::setInverted)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) - .overlay(IKey.lang(() -> { - String lang = "cover.advanced_energy_detector."; - lang += isInverted() ? "inverted" : "normal"; - return lang; - }).style(TextFormatting.WHITE))) + .overlay(true, IKey.lang("cover.advanced_energy_detector.inverted") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.advanced_energy_detector.normal") + .style(IKey.WHITE))) .child(new ToggleButton() .name("latch button") .size(72, 18) .right(0) - .overlay(IKey.lang(() -> { - String lang = "cover.generic.advanced_detector."; - lang += isLatched() ? "latched" : "continuous"; - return lang; - }).style(TextFormatting.WHITE)) + .overlay(true, IKey.lang("cover.generic.advanced_detector.latched") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.generic.advanced_detector.continuous") + .style(IKey.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) .child(this.fluidFilter.initUI(guiData, guiSyncManager))) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java index 7ffb1c4062f..e3368e8ddd5 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorItemAdvanced.java @@ -16,7 +16,6 @@ import net.minecraft.util.EnumActionResult; import net.minecraft.util.EnumFacing; import net.minecraft.util.EnumHand; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.common.util.Constants; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; @@ -80,22 +79,20 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager guiSyncMan .child(new ToggleButton() .name("inverted button") .size(72, 18) - .overlay(IKey.lang(() -> { - String lang = "cover.advanced_energy_detector."; - lang += isInverted() ? "inverted" : "normal"; - return lang; - }).style(TextFormatting.WHITE)) + .overlay(true, IKey.lang("cover.advanced_energy_detector.inverted") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.advanced_energy_detector.normal") + .style(IKey.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.invert_tooltip")) .value(new BooleanSyncValue(this::isInverted, this::setInverted))) .child(new ToggleButton() .name("latch button") .size(72, 18) .right(0) - .overlay(IKey.lang(() -> { - String lang = "cover.generic.advanced_detector."; - lang += isLatched() ? "latched" : "continuous"; - return lang; - }).style(TextFormatting.WHITE)) + .overlay(true, IKey.lang("cover.generic.advanced_detector.latched") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.generic.advanced_detector.continuous") + .style(IKey.WHITE)) .addTooltipLine(IKey.lang("cover.generic.advanced_detector.latch_tooltip")) .value(new BooleanSyncValue(this::isLatched, this::setLatched)))) .child(itemFilter.initUI(guiData, guiSyncManager))) From 52cdca52316e90a3175a190ee219b98a88e9fd0b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 1 Dec 2025 23:17:48 -0700 Subject: [PATCH 53/57] add color to the numbers --- src/main/resources/assets/gregtech/lang/en_us.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index d4f46ec53cc..3429aad9618 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -1424,7 +1424,7 @@ cover.generic.ender.delete_entry=Delete Entry cover.generic.advanced_detector.latched=Latched cover.generic.advanced_detector.continuous=Continuous -cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. \n§eContinuous§7 - Default\n Values less than the minimum output 0\n Values higher than the maximum output 15\n Values between min and max output between 0 and 15 \n§eLatched§7\n Output 15 until above max, then output 0 until below min +cover.generic.advanced_detector.latch_tooltip=Change the redstone behavior of this Cover. \n§eContinuous§7 - Default\n Values less than the minimum output §b0§7\n Values higher than the maximum output §b15§7\n Values between min and max output between §b0§7 and §b15§7 \n§eLatched§7\n Output §b15§7 until above max, then output §b0§7 until below min cover.generic.advanced_detector.invert_label=Redstone Output: cover.generic.advanced_detector.latch_label=Behavior: cover.generic.advanced_detector.invert_tooltip=Toggle to invert the redstone logic From 3f4db583656063510b365174fbf46e249a10dc1d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:34:20 -0700 Subject: [PATCH 54/57] don't handle stack tag in constructor implement tank interface instead of extending add todo --- .../readers/SimpleFluidFilterReader.java | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java index ea38dafd569..c3e8ae7ba6f 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java @@ -5,7 +5,8 @@ import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidTank; import org.jetbrains.annotations.Nullable; @@ -19,10 +20,6 @@ public class SimpleFluidFilterReader extends BaseFilterReader { public SimpleFluidFilterReader(ItemStack container, int slots) { super(container, slots); fluidTanks = new WritableFluidTank[slots]; - for (int i = 0; i < fluidTanks.length; i++) { - fluidTanks[i] = new WritableFluidTank(this, getInventoryNbt().getCompoundTagAt(i)); - } - setCapacity(getStackTag().hasKey(CAPACITY) ? getCapacity() : 1000); } public final boolean shouldShowAmount() { @@ -40,10 +37,15 @@ public void setCapacity(int capacity) { } public int getCapacity() { + if (!getStackTag().hasKey(CAPACITY)) + getStackTag().setInteger(CAPACITY, 1000); return getStackTag().getInteger(CAPACITY); } public WritableFluidTank getFluidTank(int i) { + if (fluidTanks[i] == null) { + fluidTanks[i] = new WritableFluidTank(i); + } return fluidTanks[i]; } @@ -78,25 +80,27 @@ public void handleLegacyNBT(NBTTagCompound tag) { } } - public class WritableFluidTank extends FluidTank { + public class WritableFluidTank implements IFluidTank { - private final NBTTagCompound fluidTank; - private final SimpleFluidFilterReader filterReader; protected static final String FLUID_AMOUNT = "Amount"; protected static final String FLUID = "Fluid"; protected static final String EMPTY = "Empty"; - protected WritableFluidTank(SimpleFluidFilterReader filterReader, NBTTagCompound fluidTank) { - super(0); - this.filterReader = filterReader; - this.fluidTank = fluidTank; + private final int index; + + public WritableFluidTank(int index) { + this.index = index; + } + + private NBTTagCompound getTank() { + return getInventoryNbt().getCompoundTagAt(this.index); } public void setFluidAmount(int amount) { if (amount <= 0) { setFluid(null); - } else if (this.fluidTank.hasKey(FLUID)) { - this.fluidTank + } else if (this.getTank().hasKey(FLUID)) { + this.getTank() .getCompoundTag(FLUID) .setInteger(FLUID_AMOUNT, amount); markDirty(); @@ -104,7 +108,7 @@ public void setFluidAmount(int amount) { } public boolean isEmpty() { - return !this.fluidTank.hasKey(FLUID); + return !this.getTank().hasKey(FLUID); } protected @Nullable NBTTagCompound getFluidTag() { @@ -112,7 +116,7 @@ public boolean isEmpty() { return null; } - return this.fluidTank.getCompoundTag(FLUID); + return this.getTank().getCompoundTag(FLUID); } @Override @@ -121,40 +125,43 @@ public boolean isEmpty() { } @Override + public FluidTankInfo getInfo() { + return new FluidTankInfo(this); + } + + // @Override public void setFluid(@Nullable FluidStack stack) { if (stack == null) { - this.fluidTank.removeTag(FLUID); + this.getTank().removeTag(FLUID); } else { - this.fluidTank.setTag(FLUID, stack.writeToNBT(new NBTTagCompound())); + this.getTank().setTag(FLUID, stack.writeToNBT(new NBTTagCompound())); } markDirty(); } - public boolean showAmount() { - return this.filterReader.shouldShowAmount(); - } - @Override public int getFluidAmount() { - return this.fluidTank + return this.getTank() .getCompoundTag(FLUID) .getInteger(FLUID_AMOUNT); } @Override public int getCapacity() { - return this.filterReader.getCapacity(); + return SimpleFluidFilterReader.this.getCapacity(); } // getFluid() is checked for nullability, suppress @SuppressWarnings("DataFlowIssue") @Override public int fill(FluidStack resource, boolean doFill) { + // todo this class amd filter readers really should not be handling show amount + // in a future pr if (isEmpty() || !getFluid().isFluidEqual(resource)) { setFluid(resource); - if (!showAmount()) setFluidAmount(1); + if (!shouldShowAmount()) setFluidAmount(1); return resource.amount; - } else if (showAmount()) { + } else if (shouldShowAmount()) { var fluid = getFluid(); int accepted = Math.min(resource.amount, getCapacity() - fluid.amount); fluid.amount += accepted; From 9ae81031aad94172aec1f8dd5f2bd903e3f57342 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:34:34 -0700 Subject: [PATCH 55/57] really --- .../common/covers/filter/readers/SimpleFluidFilterReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java index c3e8ae7ba6f..5bf9abf4bc8 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java @@ -156,7 +156,7 @@ public int getCapacity() { @Override public int fill(FluidStack resource, boolean doFill) { // todo this class amd filter readers really should not be handling show amount - // in a future pr + // in a future pr if (isEmpty() || !getFluid().isFluidEqual(resource)) { setFluid(resource); if (!shouldShowAmount()) setFluidAmount(1); From 1caad4ee3d3066cb97e29cb2eb6aa35c0d095016 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 2 Dec 2025 18:44:08 -0700 Subject: [PATCH 56/57] =?UTF-8?q?not=20sponsored=20by=20AMD=E2=84=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/covers/filter/readers/SimpleFluidFilterReader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java index 5bf9abf4bc8..c9ea2a4032a 100644 --- a/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java +++ b/src/main/java/gregtech/common/covers/filter/readers/SimpleFluidFilterReader.java @@ -155,7 +155,7 @@ public int getCapacity() { @SuppressWarnings("DataFlowIssue") @Override public int fill(FluidStack resource, boolean doFill) { - // todo this class amd filter readers really should not be handling show amount + // todo this class and filter readers really should not be handling show amount // in a future pr if (isEmpty() || !getFluid().isFluidEqual(resource)) { setFluid(resource); From 354908b1cc961a000b85820e510bf46b4557c09f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 8 Dec 2025 21:21:37 -0700 Subject: [PATCH 57/57] i accidentally the parenthesis --- .../detector/CoverDetectorEnergyAdvanced.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java index 42310509d23..d100e97289b 100644 --- a/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java +++ b/src/main/java/gregtech/common/covers/detector/CoverDetectorEnergyAdvanced.java @@ -115,22 +115,22 @@ public ModularPanel buildUI(SidedPosGuiData guiData, PanelSyncManager syncManage .overlay(true, IKey.lang("cover.advanced_energy_detector.mode_percent") .style(IKey.WHITE)) .overlay(false, IKey.lang("cover.advanced_energy_detector.mode_eu") + .style(IKey.WHITE)))) + .child(Flow.row() + .name("inverted row") + .coverChildrenHeight() + .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() + .size(72, 18)) + .child(new ToggleButton() + .name("inverted button") + .right(0) + .size(72, 18) + .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) + .value(new BooleanSyncValue(this::isInverted, this::setInverted)) + .overlay(true, IKey.lang("cover.advanced_energy_detector.inverted") + .style(IKey.WHITE)) + .overlay(false, IKey.lang("cover.advanced_energy_detector.normal") .style(IKey.WHITE))))) - .child(Flow.row() - .name("inverted row") - .coverChildrenHeight() - .child(IKey.lang("cover.generic.advanced_detector.invert_label").asWidget() - .size(72, 18)) - .child(new ToggleButton() - .name("inverted button") - .right(0) - .size(72, 18) - .addTooltipLine(IKey.lang("cover.advanced_energy_detector.invert_tooltip")) - .value(new BooleanSyncValue(this::isInverted, this::setInverted)) - .overlay(true, IKey.lang("cover.advanced_energy_detector.inverted") - .style(IKey.WHITE)) - .overlay(false, IKey.lang("cover.advanced_energy_detector.normal") - .style(IKey.WHITE)))) .bindPlayerInventory(); }