From 8fb559540d11c3b22f40712eb27bc02d779243ed Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 19:41:22 +0100 Subject: [PATCH 1/7] Research station UI --- .../common/data/mui/GTMultiblockTextUtil.java | 18 +++++ .../research/ResearchStationMachine.java | 69 +++++++++++++++++++ 2 files changed, 87 insertions(+) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java index 4e215ea5954..1524276b211 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -107,6 +107,24 @@ public static TextWidget addProgressLine(IWorkableMultiController rlMachine, .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); } + + public static TextWidget addProgressLinePercentOnly(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isFormed)); + BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isActive())); + DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, + () -> new DoubleSyncValue(() -> rlMachine.getRecipeLogic().getProgressPercent())); + + return IKey.dynamic(() -> { + int currentProgress = (int) (progressPercent.getDoubleValue() * 100); + return Component.translatable("gtceu.multiblock.progress_percent", currentProgress); + }) + .color(Color.WHITE.main) + .asWidget() + .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); + } + public static TextWidget addEnergyTierLine(WorkableElectricMultiblockMachine rlMachine, PanelSyncManager syncManager) { BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index a2184f44fa0..79bc67df34e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -9,12 +9,30 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.mui.drawable.Icon; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.ListWidget; +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockPanelUtil; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockTextUtil; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -96,6 +114,57 @@ public boolean regressWhenWaiting() { return false; } + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 164); + + var panelUtil = new GTMultiblockPanelUtil(this); + + panel.child(GTMuiWidgets.createTitleBar(this.getDefinition(), 176)) + .child(new ParentWidget<>() + .widthRel(0.95f) + .heightRel(.45f) + .margin(4, 0) + .left(3).top(5) + .child(new Row() + .child(getMainTextPanel(syncManager, 170, 70)))) + .child(new Column() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .bottom(16) + .padding(0, 8, 4, 4) + .childPadding(2) + .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .child(GTMuiWidgets.createPowerButton(this, syncManager)) + .child(GTMuiWidgets.createVoidingButton(this, syncManager))) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + + return panel; + } + + + public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int height) { + + var parentWidget = new ParentWidget<>(); + var listWidget = new ListWidget<>() + .width(width - 6) + .height(height - 6) + .childSeparator(Icon.EMPTY_2PX) + .crossAxisAlignment(Alignment.CrossAxis.START) + .alignX(Alignment.CenterLeft); + parentWidget.size(width, height) + .background(GTGuiTextures.MUI_DISPLAY); + + listWidget.child(GTMultiblockTextUtil.addEnergyTierLine(this, syncManager)); + listWidget.child(GTMultiblockTextUtil.addEnergyUsageLine(this, syncManager)); + listWidget.child(GTMultiblockTextUtil.addOutputLines(this, syncManager)); + listWidget.child(GTMultiblockTextUtil.addProgressLinePercentOnly(this, syncManager)); + parentWidget.child(listWidget.left(3).top(3)); + return parentWidget; + } + + // @Override // public void addDisplayText(List textList) { // MultiblockDisplayText.builder(textList, isFormed()) From dab5a7e44e3ae9ec6c1697057f4c8324ecfb7030 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 19:47:39 +0100 Subject: [PATCH 2/7] spotless --- .../gtceu/common/data/mui/GTMultiblockTextUtil.java | 10 +++++----- .../electric/research/ResearchStationMachine.java | 6 +----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java index 1524276b211..492715e183c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -107,8 +107,8 @@ public static TextWidget addProgressLine(IWorkableMultiController rlMachine, .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); } - - public static TextWidget addProgressLinePercentOnly(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + public static TextWidget addProgressLinePercentOnly(IWorkableMultiController rlMachine, + PanelSyncManager syncManager) { BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, () -> new BooleanSyncValue(rlMachine::isFormed)); BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, @@ -117,9 +117,9 @@ public static TextWidget addProgressLinePercentOnly(IWorkableMultiController () -> new DoubleSyncValue(() -> rlMachine.getRecipeLogic().getProgressPercent())); return IKey.dynamic(() -> { - int currentProgress = (int) (progressPercent.getDoubleValue() * 100); - return Component.translatable("gtceu.multiblock.progress_percent", currentProgress); - }) + int currentProgress = (int) (progressPercent.getDoubleValue() * 100); + return Component.translatable("gtceu.multiblock.progress_percent", currentProgress); + }) .color(Color.WHITE.main) .asWidget() .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index 79bc67df34e..ab44095e194 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.mui.drawable.Icon; @@ -25,7 +24,6 @@ import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; - import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; @@ -33,6 +31,7 @@ import com.gregtechceu.gtceu.common.data.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; + import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -143,9 +142,7 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet return panel; } - public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int height) { - var parentWidget = new ParentWidget<>(); var listWidget = new ListWidget<>() .width(width - 6) @@ -164,7 +161,6 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h return parentWidget; } - // @Override // public void addDisplayText(List textList) { // MultiblockDisplayText.builder(textList, isFormed()) From 6522e079b7126e65b83a330bd3e2116abee13af1 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 20:08:22 +0100 Subject: [PATCH 3/7] Add addWorkingStatusLine --- .../data/mui/GTMultiblockPanelUtil.java | 2 +- .../common/data/mui/GTMultiblockTextUtil.java | 34 +++++++++++++++++++ .../research/ResearchStationMachine.java | 19 ++++------- 3 files changed, 41 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java index 5b1599d201e..e7c09880277 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockPanelUtil.java @@ -44,7 +44,7 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h listWidget.child(GTMultiblockTextUtil.addEnergyTierLine(workableElectricMachine, syncManager)); listWidget.child(GTMultiblockTextUtil.addEnergyUsageLine(workableElectricMachine, syncManager)); } - + listWidget.child(GTMultiblockTextUtil.addWorkingStatusLine(rlMachine, syncManager)); listWidget.child(GTMultiblockTextUtil.addParallelLine(rlMachine, syncManager)); listWidget.child(GTMultiblockTextUtil.addBatchModeLine(rlMachine, syncManager)); listWidget.child(GTMultiblockTextUtil.addSubtickParallelsLine(rlMachine, syncManager)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java index 492715e183c..d468e6f7bcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -240,6 +240,40 @@ public static TextWidget addSteamUsageLine(SteamEnergyRecipeHandler steamRH, .setEnabledIf((w) -> hasSteamHandler.getBoolValue()); } + public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + return addWorkingStatusLine(rlMachine, syncManager, + Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), + Component.translatable("gtceu.multiblock.running").withStyle(ChatFormatting.GREEN), + Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY)); + } + + public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager, + Component workPaused, Component runningPerfectly, + Component idling) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isFormed)); + BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isActive())); + BooleanSyncValue isWorkingEnabled = syncManager.getOrCreateSyncHandler("isWorkingEnabled", + BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isWorkingEnabled())); + + return IKey + .dynamic(() -> { + if (!isFormed.getBoolValue()) return Component.empty(); + if (!isWorkingEnabled.getBoolValue()) { + return workPaused; + } + if (isActive.getBoolValue()) { + return runningPerfectly; + } + return idling; + }) + .color(Color.WHITE.main) + .asWidget() + .setEnabledIf((w) -> isFormed.getBoolValue()); + } + public static DynamicSyncedWidget addOutputLines(IWorkableMultiController rlmachine, PanelSyncManager syncManager) { GenericSyncValue recipeSyncValue = syncManager.getOrCreateSyncHandler("GTRecipe", diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index ab44095e194..2b7a137381f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -32,7 +32,9 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTGuis; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; import lombok.Getter; @@ -153,6 +155,10 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h parentWidget.size(width, height) .background(GTGuiTextures.MUI_DISPLAY); + listWidget.child(GTMultiblockTextUtil.addWorkingStatusLine(this, syncManager, + Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), + Component.translatable("gtceu.multiblock.research_station.researching").withStyle(ChatFormatting.GREEN), + Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY))); listWidget.child(GTMultiblockTextUtil.addEnergyTierLine(this, syncManager)); listWidget.child(GTMultiblockTextUtil.addEnergyUsageLine(this, syncManager)); listWidget.child(GTMultiblockTextUtil.addOutputLines(this, syncManager)); @@ -161,19 +167,6 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h return parentWidget; } - // @Override - // public void addDisplayText(List textList) { - // MultiblockDisplayText.builder(textList, isFormed()) - // .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - // .setWorkingStatusKeys("gtceu.multiblock.idling", "gtceu.multiblock.work_paused", - // "gtceu.multiblock.research_station.researching") - // .addEnergyUsageLine(energyContainer) - // .addEnergyTierLine(tier) - // .addWorkingStatusLine() - // // .addComputationUsageExactLine(computationProvider.getMaxCWUt()) // TODO: (Onion) - // .addProgressLineOnlyPercent(recipeLogic.getProgressPercent()); - // } - public static class ResearchStationRecipeLogic extends RecipeLogic { public ResearchStationRecipeLogic(ResearchStationMachine metaTileEntity) { From 721a63521770a18cd1e48cfb9279db200e86c5ac Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 20:20:22 +0100 Subject: [PATCH 4/7] switch to suppliers --- .../common/data/mui/GTMultiblockTextUtil.java | 19 ++++++++++--------- .../research/ResearchStationMachine.java | 7 ++++--- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java index d468e6f7bcf..421b272cfa7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -34,6 +34,7 @@ import net.minecraftforge.fluids.FluidStack; import java.util.Optional; +import java.util.function.Supplier; public class GTMultiblockTextUtil { @@ -242,14 +243,15 @@ public static TextWidget addSteamUsageLine(SteamEnergyRecipeHandler steamRH, public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { return addWorkingStatusLine(rlMachine, syncManager, - Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), - Component.translatable("gtceu.multiblock.running").withStyle(ChatFormatting.GREEN), - Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY)); + () -> Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), + () -> Component.translatable("gtceu.multiblock.running").withStyle(ChatFormatting.GREEN), + () -> Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY)); } public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager, - Component workPaused, Component runningPerfectly, - Component idling) { + Supplier workPaused, + Supplier runningPerfectly, + Supplier idling) { BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, () -> new BooleanSyncValue(rlMachine::isFormed)); BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, @@ -262,14 +264,13 @@ public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMach .dynamic(() -> { if (!isFormed.getBoolValue()) return Component.empty(); if (!isWorkingEnabled.getBoolValue()) { - return workPaused; + return workPaused.get(); } if (isActive.getBoolValue()) { - return runningPerfectly; + return runningPerfectly.get(); } - return idling; + return idling.get(); }) - .color(Color.WHITE.main) .asWidget() .setEnabledIf((w) -> isFormed.getBoolValue()); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index 2b7a137381f..9198aac1e40 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -156,9 +156,10 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h .background(GTGuiTextures.MUI_DISPLAY); listWidget.child(GTMultiblockTextUtil.addWorkingStatusLine(this, syncManager, - Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), - Component.translatable("gtceu.multiblock.research_station.researching").withStyle(ChatFormatting.GREEN), - Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY))); + () -> Component.translatable("gtceu.multiblock.work_paused").withStyle(ChatFormatting.GOLD), + () -> Component.translatable("gtceu.multiblock.research_station.researching") + .withStyle(ChatFormatting.GREEN), + () -> Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY))); listWidget.child(GTMultiblockTextUtil.addEnergyTierLine(this, syncManager)); listWidget.child(GTMultiblockTextUtil.addEnergyUsageLine(this, syncManager)); listWidget.child(GTMultiblockTextUtil.addOutputLines(this, syncManager)); From 25da9ccc473c3e07b13610ca3043c1d0a93b0719 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 21:56:37 +0100 Subject: [PATCH 5/7] Data bank MUI --- .../common/data/mui/GTMultiblockTextUtil.java | 29 +++++ .../electric/research/DataBankMachine.java | 102 ++++++++++++++++-- 2 files changed, 120 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java index 421b272cfa7..c86a0c2821d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMultiblockTextUtil.java @@ -69,6 +69,35 @@ public static TextWidget addEnergyUsageLine(WorkableElectricMultiblockMachine .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); } + public static TextWidget addEnergyUsageExactLine(WorkableElectricMultiblockMachine weMachine, + PanelSyncManager syncManager) { + LongSyncValue energyUsage = syncManager.getOrCreateSyncHandler("energyUsage", LongSyncValue.class, + () -> new LongSyncValue(() -> { + var energyList = weMachine.getEnergyContainer(); + return Math.max(energyList.getInputVoltage(), energyList.getOutputVoltage()); + })); + return addEnergyUsageExactLine(weMachine, syncManager, energyUsage); + } + + public static TextWidget addEnergyUsageExactLine(WorkableElectricMultiblockMachine weMachine, + PanelSyncManager syncManager, LongSyncValue energyUsage) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(weMachine::isFormed)); + + return IKey.dynamic(() -> { + if (energyUsage.getLongValue() <= 0) return Component.empty(); + String energyFormatted = FormattingUtil.formatNumbers(energyUsage.getLongValue()); + // wrap in text component to keep it from being formatted + Component voltageName = Component.literal( + GTValues.VNF[GTUtil.getTierByVoltage(energyUsage.getLongValue())]); + + return Component.translatable("gtceu.multiblock.energy_consumption", + energyFormatted, voltageName).withStyle(ChatFormatting.GRAY); + }) + .asWidget() + .setEnabledIf(widget -> isFormed.getBoolValue()); + } + public static IKey addEnergyTierLine(boolean formed, int tier) { if (!formed || tier < GTValues.ULV || tier > GTValues.MAX) return IKey.EMPTY; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java index 39d188d78e4..11ccae07f1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java @@ -9,12 +9,35 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.drawable.Icon; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.LongSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.ListWidget; +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockPanelUtil; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockTextUtil; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.config.ConfigHolder; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.network.chat.Component; import net.minecraft.server.TickTask; @@ -172,18 +195,75 @@ public void tick() { updateTickSubscription(); } - // @Override - // public void addDisplayText(List textList) { - // MultiblockDisplayText.builder(textList, isFormed()) - // .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display - // .setWorkingStatusKeys( - // "gtceu.multiblock.idling", - // "gtceu.multiblock.idling", - // "gtceu.multiblock.data_bank.providing") - // .addEnergyUsageExactLine(getEnergyUsage()) - // .addWorkingStatusLine(); - // } + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 164); + + var panelUtil = new GTMultiblockPanelUtil(this); + + panel.child(GTMuiWidgets.createTitleBar(this.getDefinition(), 176)) + .child(new ParentWidget<>() + .widthRel(0.95f) + .heightRel(.45f) + .margin(4, 0) + .left(3).top(5) + .child(new Row() + .child(getMainTextPanel(syncManager, 170, 70)))) + .child(new Column() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .bottom(16) + .padding(0, 8, 4, 4) + .childPadding(2) + .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .child(GTMuiWidgets.createPowerButton(this, syncManager)) + .child(GTMuiWidgets.createVoidingButton(this, syncManager))) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + + return panel; + } + public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int height) { + var parentWidget = new ParentWidget<>(); + var listWidget = new ListWidget<>() + .width(width - 6) + .height(height - 6) + .childSeparator(Icon.EMPTY_2PX) + .crossAxisAlignment(Alignment.CrossAxis.START) + .alignX(Alignment.CenterLeft); + parentWidget.size(width, height) + .background(GTGuiTextures.MUI_DISPLAY); + + LongSyncValue energyStoredSyncValue = new LongSyncValue(this::getEnergyUsage); + syncManager.syncValue("dataBankEnergyStored", energyStoredSyncValue); + listWidget.child(GTMultiblockTextUtil.addEnergyUsageExactLine(this, syncManager, energyStoredSyncValue)); + listWidget.child(addWorkingStatusLine(this, syncManager)); + parentWidget.child(listWidget.left(3).top(3)); + return parentWidget; + } + + public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(rlMachine::isFormed)); + BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isActive())); + BooleanSyncValue isWorkingEnabled = syncManager.getOrCreateSyncHandler("isWorkingEnabled", + BooleanSyncValue.class, + () -> new BooleanSyncValue(() -> rlMachine.getRecipeLogic().isWorkingEnabled())); + + return IKey + .dynamic(() -> { + if (!isFormed.getBoolValue()) return Component.empty(); + if (!isWorkingEnabled.getBoolValue() || !isActive.getBoolValue()) { + return Component.translatable("gtceu.multiblock.idling").withStyle(ChatFormatting.GRAY); + } + return Component.translatable("gtceu.multiblock.data_bank.providing") + .withStyle(ChatFormatting.GREEN); + }) + .asWidget() + .setEnabledIf((w) -> isFormed.getBoolValue()); + } /* * @Override * protected void addWarningText(List textList) { From d4b88aa6e6d00fb7eb2a0a515de632f4b2d77fa6 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Sun, 15 Feb 2026 15:21:18 +0100 Subject: [PATCH 6/7] Migrate cleanroom to MUI2 --- .../multiblock/electric/CleanroomMachine.java | 224 ++++++++++++++---- .../network/ByteBufAdapters.java | 2 + 2 files changed, 174 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index ecf4beccd52..4512a6cea2a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -18,13 +18,32 @@ import com.gregtechceu.gtceu.api.machine.trait.CleanroomProviderTrait; import com.gregtechceu.gtceu.api.machine.trait.CleanroomReceiverTrait; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; +import com.gregtechceu.gtceu.api.mui.drawable.Icon; +import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; +import com.gregtechceu.gtceu.api.mui.utils.Alignment; +import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.GenericSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.IntSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.LongSyncValue; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.value.sync.StringSyncValue; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widget.Widget; +import com.gregtechceu.gtceu.api.mui.widgets.ListWidget; +import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.pattern.BlockPattern; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; import com.gregtechceu.gtceu.api.pattern.Predicates; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.data.GTMachines; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.common.data.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.common.item.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.electric.HullMachine; import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeCombustionEngineMachine; @@ -34,16 +53,21 @@ import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveBlastFurnaceMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitivePumpMachine; import com.gregtechceu.gtceu.common.machine.trait.CleanroomLogic; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.common.mui.GTGuis; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.recipe.CustomTags; import com.gregtechceu.gtceu.utils.GTUtil; import com.lowdragmc.lowdraglib.utils.BlockInfo; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; import net.minecraft.util.Mth; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; @@ -66,6 +90,7 @@ import static com.gregtechceu.gtceu.api.pattern.Predicates.*; import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.utils.serialization.network.ByteBufAdapters.COMPONENT; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -452,58 +477,153 @@ protected boolean isMachineBanned(MetaMachine machine) { return machine instanceof PrimitivePumpMachine; } - /* - * @Override - * public void addDisplayText(List textList) { - * if (isFormed()) { - * var maxVoltage = getMaxVoltage(); - * if (maxVoltage > 0) { - * String voltageName = GTValues.VNF[GTUtil.getFloorTierByVoltage(maxVoltage)]; - * textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); - * } - * - * if (cleanroomType != null) { - * textList.add(Component.translatable(cleanroomType.getTranslationKey())); - * } - * - * if (!isWorkingEnabled()) { - * textList.add(Component.translatable("gtceu.multiblock.work_paused")); - * - * } else if (isActive()) { - * textList.add(Component.translatable("gtceu.multiblock.running")); - * int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); - * double maxInSec = (float) recipeLogic.getDuration() / 20.0f; - * double currentInSec = (float) recipeLogic.getProgress() / 20.0f; - * textList.add( - * Component.translatable("gtceu.multiblock.progress", String.format("%.2f", (float) currentInSec), - * String.format("%.2f", (float) maxInSec), currentProgress)); - * } else { - * textList.add(Component.translatable("gtceu.multiblock.idling")); - * } - * - * if (recipeLogic.isWaiting()) { - * textList.add(Component.translatable("gtceu.multiblock.waiting") - * .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - * } - * - * if (cleanroomProviderTrait.isActive()) { - * textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_state")); - * } else { - * textList.add(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")); - * } - * textList.add(Component.translatable("gtceu.multiblock.cleanroom.clean_amount", this.cleanAmount)); - * textList.add(Component.translatable("gtceu.multiblock.dimensions.0")); - * textList.add(Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, - * fDist + bDist + 1)); - * } else { - * Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") - * .withStyle(ChatFormatting.GRAY); - * textList.add(Component.translatable("gtceu.multiblock.invalid_structure") - * .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) - * .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); - * } - * } - */ + @Override + public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) { + var panel = GTGuis.createPanel(this, 176, 176); + + panel.child(GTMuiWidgets.createTitleBar(this.getDefinition(), 176)) + .child(new ParentWidget<>() + .widthRel(0.95f) + .heightRel(.45f) + .margin(4, 0) + .left(3).top(5) + .child(Flow.row() + .child(getMainTextPanel(syncManager, 170, 84)))) + .child(Flow.column() + .coverChildren() + .leftRel(1.0f) + .reverseLayout(true) + .bottom(16) + .padding(0, 8, 4, 4) + .childPadding(2) + .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) + .child(GTMuiWidgets.createPowerButton(this, syncManager)) + .child(GTMuiWidgets.createVoidingButton(this, syncManager)) + .excludeAreaInXei()) + .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); + return panel; + } + + public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int height) { + var parentWidget = new ParentWidget<>(); + var listWidget = new ListWidget<>(); + listWidget + .width(width - 6) + .height(height - 6) + .childSeparator(Icon.EMPTY_2PX) + .crossAxisAlignment(Alignment.CrossAxis.START) + .alignX(Alignment.CenterLeft) + .left(3) + .top(3); + parentWidget.size(width, height) + .background(GTGuiTextures.MUI_DISPLAY); + // Machine generic sync handlers + BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, + () -> new BooleanSyncValue(this::isFormed)); + BooleanSyncValue workingEnabled = syncManager.getOrCreateSyncHandler("workingEnabled", BooleanSyncValue.class, + () -> new BooleanSyncValue(this.recipeLogic::isWorkingEnabled, this.recipeLogic::setWorkingEnabled)); + BooleanSyncValue active = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class, + () -> new BooleanSyncValue(this.recipeLogic::isActive)); + BooleanSyncValue waiting = syncManager.getOrCreateSyncHandler("isWaiting", BooleanSyncValue.class, + () -> new BooleanSyncValue(this.recipeLogic::isWaiting)); + + // Energy bank specific sync handlers + // These will not be called anywhere else, so we can create them directly instead of using + // getOrCreateSyncHandler + + LongSyncValue maxVoltage = new LongSyncValue(this::getMaxVoltage); + syncManager.syncValue("maxVoltage", maxVoltage); + + StringSyncValue cleanroomTranslationKey = new StringSyncValue(() -> { + if (this.cleanroomType == null) return ""; + return this.cleanroomType.getTranslationKey(); + }); + syncManager.syncValue("cleanroomTranslationKey", cleanroomTranslationKey); + + BooleanSyncValue cleanroomTypeIsNull = new BooleanSyncValue(() -> this.cleanroomType == null); + syncManager.syncValue("cleanroomTypeIsNull", cleanroomTypeIsNull); + + BooleanSyncValue cleanroomProviderTraitIsActive = new BooleanSyncValue( + () -> this.cleanroomProviderTrait != null && this.cleanroomProviderTrait.isActive()); + syncManager.syncValue("cleanroomProviderTrait", cleanroomProviderTraitIsActive); + + IntSyncValue cleanAmount = new IntSyncValue(() -> this.cleanAmount); + syncManager.syncValue("cleanAmount", cleanAmount); + + GenericSyncValue distComponent = new GenericSyncValue.Builder<>(Component.class) + .adapter(COMPONENT) + .getter(() -> Component.translatable("gtceu.multiblock.dimensions.1", lDist + rDist + 1, hDist + 1, + fDist + bDist + 1)) + .build(); + syncManager.syncValue("distComponent", distComponent); + + listWidget.child(IKey.dynamic(() -> { + Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + .withStyle(ChatFormatting.GRAY); + return Component.translatable("gtceu.multiblock.invalid_structure") + .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip))); + }) + .asWidget() + .setEnabledIf((widget) -> !isFormed.getBoolValue())); + + listWidget.child(IKey.dynamic(() -> { + String voltageName = GTValues.VNF[GTUtil.getFloorTierByVoltage(maxVoltage.getLongValue())]; + return Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage.getLongValue(), + voltageName); + }) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && maxVoltage.getLongValue() > 0)); + + listWidget.child(IKey.dynamic(() -> { + if (cleanroomTypeIsNull.getBoolValue()) { + return Component.empty(); + } else { + return Component.translatable(cleanroomTranslationKey.getStringValue()); + } + }) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && !cleanroomTypeIsNull.getBoolValue())); + + listWidget.child(IKey.dynamic(() -> Component.translatable("gtceu.multiblock.work_paused")) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && !workingEnabled.getBoolValue())); + + GTMultiblockTextUtil.addProgressLine(this, syncManager); + + listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.idling")) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && workingEnabled.getBoolValue() && + !active.getBoolValue())); + + listWidget.child(IKey + .lang(Component.translatable("gtceu.multiblock.waiting") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && waiting.getBoolValue())); + + listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.cleanroom.clean_state")) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && cleanroomProviderTraitIsActive.getBoolValue())); + listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.cleanroom.dirty_state")) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue() && !cleanroomProviderTraitIsActive.getBoolValue())); + + listWidget.child(IKey.dynamic( + () -> Component.translatable("gtceu.multiblock.cleanroom.clean_amount", cleanAmount.getIntValue())) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue())); + + listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.dimensions.0")) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue())); + listWidget.child(IKey.dynamic(() -> distComponent.getValue()) + .asWidget() + .setEnabledIf((widget) -> isFormed.getBoolValue())); + + parentWidget.child(listWidget); + return parentWidget; + } /** * Adjust the cleanroom's clean amount diff --git a/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java b/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java index 84f566e7a10..cd83e2065fd 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/serialization/network/ByteBufAdapters.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -28,6 +29,7 @@ public class ByteBufAdapters { public static final IByteBufAdapter STRING = makeAdapter(NetworkUtils::readStringSafe, NetworkUtils::writeStringSafe, null); public static final IByteBufAdapter BYTE_BUF = makeAdapter(NetworkUtils::readByteBuf, NetworkUtils::writeByteBuf, null); public static final IByteBufAdapter FRIENDLY_BYTE_BUF = makeAdapter(NetworkUtils::readFriendlyByteBuf, NetworkUtils::writeByteBuf, null); + public static final IByteBufAdapter COMPONENT = makeAdapter(FriendlyByteBuf::readComponent, FriendlyByteBuf::writeComponent, Objects::equals); // spotless:on public static final IByteBufAdapter BYTE_ARR = new IByteBufAdapter<>() { From 180c9f902e63de0c385c02e0eeadd16e9ae33707 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Sun, 15 Feb 2026 15:32:44 +0100 Subject: [PATCH 7/7] Actually child util function creation --- .../common/machine/multiblock/electric/CleanroomMachine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 4512a6cea2a..37b0ec55c0e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -589,7 +589,7 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h .asWidget() .setEnabledIf((widget) -> isFormed.getBoolValue() && !workingEnabled.getBoolValue())); - GTMultiblockTextUtil.addProgressLine(this, syncManager); + listWidget.child(GTMultiblockTextUtil.addProgressLine(this, syncManager)); listWidget.child(IKey.lang(Component.translatable("gtceu.multiblock.idling")) .asWidget()