From 8fb559540d11c3b22f40712eb27bc02d779243ed Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Fri, 13 Feb 2026 19:41:22 +0100 Subject: [PATCH 1/6] 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/6] 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/6] 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/6] 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/6] 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 deba170eb14f1a459c973c17d21f6e94e79fc7f1 Mon Sep 17 00:00:00 2001 From: jurrejelle Date: Tue, 17 Feb 2026 23:04:08 +0100 Subject: [PATCH 6/6] Merge conflicts + spotless --- .../common/data/mui/GTMultiblockTextUtil.java | 16 ---------------- .../electric/research/DataBankMachine.java | 5 +++-- 2 files changed, 3 insertions(+), 18 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 2990f3451af..743f25e6886 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 @@ -137,11 +137,7 @@ public static TextWidget addProgressLine(WorkableMultiblockMachine rlMachine, .setEnabledIf(widget -> isFormed.getBoolValue() && isActive.getBoolValue()); } -<<<<<<< jj/mui2/data-bank - public static TextWidget addProgressLinePercentOnly(IWorkableMultiController rlMachine, -======= public static TextWidget addProgressLinePercentOnly(WorkableMultiblockMachine rlMachine, ->>>>>>> mui2-refactor PanelSyncManager syncManager) { BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, () -> new BooleanSyncValue(rlMachine::isFormed)); @@ -274,23 +270,15 @@ public static TextWidget addSteamUsageLine(SteamEnergyRecipeHandler steamRH, .setEnabledIf((w) -> hasSteamHandler.getBoolValue()); } -<<<<<<< jj/mui2/data-bank - public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { -======= public static TextWidget addWorkingStatusLine(WorkableMultiblockMachine rlMachine, PanelSyncManager syncManager) { ->>>>>>> mui2-refactor 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)); } -<<<<<<< jj/mui2/data-bank - public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager, -======= public static TextWidget addWorkingStatusLine(WorkableMultiblockMachine rlMachine, PanelSyncManager syncManager, ->>>>>>> mui2-refactor Supplier workPaused, Supplier runningPerfectly, Supplier idling) { @@ -317,11 +305,7 @@ public static TextWidget addWorkingStatusLine(WorkableMultiblockMachine rlMac .setEnabledIf((w) -> isFormed.getBoolValue()); } -<<<<<<< jj/mui2/data-bank - public static DynamicSyncedWidget addOutputLines(IWorkableMultiController rlmachine, -======= public static DynamicSyncedWidget addOutputLines(WorkableMultiblockMachine rlmachine, ->>>>>>> mui2-refactor PanelSyncManager syncManager) { GenericSyncValue recipeSyncValue = syncManager.getOrCreateSyncHandler("GTRecipe", GenericSyncValue.class, 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 11ccae07f1a..8e592c18136 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,9 +9,9 @@ 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.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; @@ -243,7 +243,8 @@ public Widget getMainTextPanel(PanelSyncManager syncManager, int width, int h return parentWidget; } - public static TextWidget addWorkingStatusLine(IWorkableMultiController rlMachine, PanelSyncManager syncManager) { + public static TextWidget addWorkingStatusLine(WorkableMultiblockMachine rlMachine, + PanelSyncManager syncManager) { BooleanSyncValue isFormed = syncManager.getOrCreateSyncHandler("isFormed", BooleanSyncValue.class, () -> new BooleanSyncValue(rlMachine::isFormed)); BooleanSyncValue isActive = syncManager.getOrCreateSyncHandler("isActive", BooleanSyncValue.class,