From fa43ed0acb9aebef5e142586cc983eda01840a2e Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+techlord22@users.noreply.github.com> Date: Tue, 9 Jul 2024 19:57:42 -0400 Subject: [PATCH 001/264] start --- .../api/metatileentity/MetaTileEntity.java | 2 +- .../multiblock/FuelMultiblockController.java | 30 ++ .../multiblock/IProgressBarMultiblock.java | 20 ++ .../MultiMapMultiblockController.java | 36 ++- .../multiblock/MultiblockWithDisplayBase.java | 41 ++- .../multiblock/ProgressBarMultiblock.java | 43 +++ .../multiblock/ui/MultiblockUIFactory.java | 292 ++++++++++++++++++ .../java/gregtech/api/mui/GTGuiTextures.java | 54 +++- .../api/mui/sync/BigIntegerSyncValue.java | 92 ++++++ .../api/mui/sync/FixedIntArraySyncValue.java | 90 ++++++ .../multi/MetaTileEntityLargeBoiler.java | 168 ++++++---- .../MetaTileEntityActiveTransformer.java | 2 +- .../electric/MetaTileEntityCleanroom.java | 2 +- .../electric/MetaTileEntityDataBank.java | 2 +- .../electric/MetaTileEntityFluidDrill.java | 83 ++--- .../electric/MetaTileEntityFusionReactor.java | 3 +- .../multi/electric/MetaTileEntityHPCA.java | 100 +++--- .../electric/MetaTileEntityLargeMiner.java | 2 +- .../MetaTileEntityPowerSubstation.java | 47 ++- .../MetaTileEntityResearchStation.java | 2 +- .../MetaTileEntityCentralMonitor.java | 2 +- .../MetaTileEntityLargeCombustionEngine.java | 219 +++++++------ .../generator/MetaTileEntityLargeTurbine.java | 237 ++++++++------ .../multiblockpart/MetaTileEntityItemBus.java | 8 +- .../MetaTileEntitySteamItemBus.java | 4 +- .../storage/MetaTileEntityCrate.java | 4 +- .../resources/assets/gregtech/lang/en_us.lang | 62 ++-- 27 files changed, 1226 insertions(+), 421 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java create mode 100644 src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java create mode 100644 src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 308bf0c8aaf..58decc88a6d 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -492,7 +492,7 @@ public GTGuiTheme getUITheme() { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { return null; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index fb3a1993fc2..33cb838f455 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -5,6 +5,7 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; +import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.GTUtility; import gregtech.api.util.TextComponentUtil; @@ -16,8 +17,13 @@ import net.minecraft.util.text.Style; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.Tooltip; +import com.cleanroommc.modularui.value.sync.StringSyncValue; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -138,6 +144,7 @@ protected int[] getTotalFluidAmount(FluidStack testStack, IMultipleTankHandler m return new int[] { fluidAmount, fluidCapacity }; } + @Deprecated protected void addFuelText(List textList) { // Fuel int fuelStored = 0; @@ -170,4 +177,27 @@ protected void addFuelText(List textList) { "0 / 0 L")); } } + + /** + * @param tooltip the tooltip to populate + * @param amounts the sync value containing an array of [fuel stored, fuel capacity] + * @param fuelNameValue the name of the fuel + */ + protected void createFuelTooltip(@NotNull Tooltip tooltip, @NotNull FixedIntArraySyncValue amounts, + @NotNull StringSyncValue fuelNameValue) { + tooltip.setAutoUpdate(true); + if (isStructureFormed()) { + Fluid fluid = fuelNameValue.getStringValue() == null ? null : + FluidRegistry.getFluid(fuelNameValue.getStringValue()); + if (fluid == null) { + tooltip.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.fuel_none")); + } else { + tooltip.addLine( + IKey.lang("gregtech.multiblock.large_combustion_engine.fuel_amount", amounts.getValue()[0], + amounts.getValue()[1], fluid.getLocalizedName(new FluidStack(fluid, 1)))); + } + } else { + tooltip.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java index 77567e09af2..21258d166a5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java @@ -2,11 +2,19 @@ import gregtech.api.gui.GuiTextures; import gregtech.api.gui.resources.TextureArea; +import gregtech.api.mui.GTGuiTextures; import net.minecraft.util.text.ITextComponent; +import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.screen.Tooltip; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + import java.util.List; +@ApiStatus.ScheduledForRemoval +@Deprecated public interface IProgressBarMultiblock { default boolean showProgressBar() { @@ -24,14 +32,26 @@ default int getNumProgressBars() { double getFillPercentage(int index); /** Textures for the progress bar(s). */ + @Deprecated default TextureArea getProgressBarTexture(int index) { return GuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW; } + default UITexture getProgressBarTexture2(int index) { + return GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW; + } + + default int getProgressBarTextureHeight(int index) { + return 18; + } + /** * Add hover text to your progress bar(s). * * @param index The index, 0, 1, or 2, of your progress bar. Only relevant if you have multiple bars. */ + @Deprecated default void addBarHoverText(List hoverList, int index) {} + + default void addBarHoverText2(@NotNull Tooltip tooltip, int index) {} } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index f80337e10c8..46d566082b9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -3,12 +3,9 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IMultipleRecipeMaps; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.RecipeMap; -import gregtech.api.util.LocalizationUtils; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -25,6 +22,13 @@ import net.minecraftforge.fml.relauncher.SideOnly; import codechicken.lib.raytracer.CuboidRayTraceResult; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -133,17 +137,23 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM } @Override - protected @NotNull Widget getFlexButton(int x, int y, int width, int height) { + public void createExtraButtons(@NotNull ModularPanel parentPanel, @NotNull PanelSyncManager panelSyncManager, + @NotNull List> list) { if (getAvailableRecipeMaps() != null && getAvailableRecipeMaps().length > 1) { - return new ImageCycleButtonWidget(x, y, width, height, GuiTextures.BUTTON_MULTI_MAP, - getAvailableRecipeMaps().length, this::getRecipeMapIndex, this::setRecipeMapIndex) - .shouldUseBaseBackground().singleTexture() - .setTooltipHoverString(i -> LocalizationUtils - .format("gregtech.multiblock.multiple_recipemaps.header") + " " + - LocalizationUtils.format( - "recipemap." + getAvailableRecipeMaps()[i].getUnlocalizedName() + ".name")); + IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); + panelSyncManager.syncValue("recipemap_state", recipeMapValue); + list.add(new CycleButtonWidget() + .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) + .background(GTGuiTextures.BUTTON) + .disableHoverBackground() // TODO find out why this needs to be called + .value(new IntValue.Dynamic(recipeMapValue::getIntValue, recipeMapValue::setIntValue)) + .length(getAvailableRecipeMaps().length) + .tooltipBuilder(t -> t.setAutoUpdate(true) + .addLine(IKey.comp( + IKey.lang("gregtech.multiblock.multiple_recipemaps.value", + IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] + .getTranslationKey())))))); } - return super.getFlexButton(x, y, width, height); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 46b3c774658..8d4db51fc29 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -13,6 +13,7 @@ import gregtech.api.gui.widgets.ImageWidget; import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.gui.widgets.ProgressWidget; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.unification.OreDictUnifier; @@ -33,6 +34,9 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -439,7 +443,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { if (shouldShowVoidingModeButton()) { builder.widget(new ImageCycleButtonWidget(173, 161, 18, 18, GuiTextures.BUTTON_VOID_MULTIBLOCK, 4, this::getVoidingMode, this::setVoidingMode) - .setTooltipHoverString(MultiblockWithDisplayBase::getVoidingModeTooltip)); + .setTooltipHoverString(this::getVoidingModeTooltip)); } else { builder.widget(new ImageWidget(173, 161, 18, 18, GuiTextures.BUTTON_VOID_NONE) .setTooltip("gregtech.gui.multiblock_voiding_not_supported")); @@ -463,13 +467,30 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { return builder; } + /** + * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no + * additional functionality for this Multiblock. + *
+ * Size will be 18x18. + * + * @param parentPanel the parent panel containing the button + * @param panelSyncManager the sync manager for synchronizing widgets + * @param list the list of widgets to append to + */ + public void createExtraButtons(@NotNull ModularPanel parentPanel, + @NotNull PanelSyncManager panelSyncManager, + @NotNull List> list) {} + /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder * stating that there is no additional functionality for this Multiblock. *
*
* Parameters should be passed directly to the created widget. Size will be 18x18. + * + * @deprecated {@link #createExtraButtons(ModularPanel, PanelSyncManager, List)} */ + @Deprecated @SuppressWarnings("SameParameterValue") @NotNull protected Widget getFlexButton(int x, int y, int width, int height) { @@ -507,15 +528,15 @@ protected void addErrorText(List textList) { .addMufflerObstructedLine(hasMufflerMechanics() && !isMufflerFaceFree()); } - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return true; } - protected int getVoidingMode() { + public final int getVoidingMode() { return voidingMode.ordinal(); } - protected void setVoidingMode(int mode) { + public final void setVoidingMode(int mode) { this.voidingMode = VoidingMode.VALUES[mode]; this.voidingFluids = mode >= 2; @@ -533,10 +554,20 @@ protected void setVoidingMode(int mode) { markDirty(); } - protected static String getVoidingModeTooltip(int mode) { + public @NotNull String getVoidingModeTooltip(int mode) { return VoidingMode.VALUES[mode].getName(); } + @Override + public boolean usesMui2() { + return true; + } + + @Override + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + return new MultiblockUIFactory<>(this, guiData, panelSyncManager).buildUI(); + } + @Override protected ModularUI createUI(EntityPlayer entityPlayer) { return createUITemplate(entityPlayer).build(getHolder(), entityPlayer); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java new file mode 100644 index 00000000000..8f5813018ea --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java @@ -0,0 +1,43 @@ +package gregtech.api.metatileentity.multiblock; + +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import org.jetbrains.annotations.NotNull; + +public interface ProgressBarMultiblock { + + int getProgressBarCount(); + + @NotNull + ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index); + + /** + * @return the amount of columns in the progress bar grid + */ + default int getProgressBarCols() { + int count = getProgressBarCount(); + return switch (count) { + case 0, 1, 2, 3 -> count; + case 4 -> 2; + case 5, 6 -> 3; + case 7, 8 -> 4; + default -> throw new UnsupportedOperationException("Cannot compute progress bar cols for count " + count); + }; + } + + /** + * @return the amount of rows in the progress bar grid + */ + default int getProgressBarRows() { + int count = getProgressBarCount(); + if (count <= 3) { + return 1; + } + + if (count <= 8) { + return 2; + } + + throw new UnsupportedOperationException("Cannot compute progress bar rows for count " + count); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java new file mode 100644 index 00000000000..06310666c69 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -0,0 +1,292 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import gregtech.api.capability.GregtechTileCapabilities; +import gregtech.api.capability.IControllable; +import gregtech.api.capability.IDistinctBusController; +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.BoolValue; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Row; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class MultiblockUIFactory { + + private final T mte; + + protected ModularPanel rootPanel; + + protected final PosGuiData guiData; + protected final PanelSyncManager panelSyncManager; + + protected final Column rootColumn = new Column(); + + protected final Row screenRow = new Row(); + protected int screenHeight = 117; + + protected final Row inventoryRow = new Row(); + + protected final Column buttonColumn = new Column(); + + public MultiblockUIFactory(@NotNull T mte, @NotNull PosGuiData guiData, + @NotNull PanelSyncManager panelSyncManager) { + this.mte = mte; + this.guiData = guiData; + this.panelSyncManager = panelSyncManager; + } + + public @NotNull ModularPanel buildUI() { + this.rootPanel = createRootPanel().child(rootColumn); + + createBars(); + createScreen(); + // TODO createExtras() hook for overrides? + createInventory(); + createButtons(); + createPowerButton(); + + return rootPanel; + } + + protected @NotNull ModularPanel createRootPanel() { + return GTGuis.createPanel(mte, 198, 208); + } + + protected void createBars() { + if (!(mte instanceof ProgressBarMultiblock progressMulti)) { + return; + } + + final int count = progressMulti.getProgressBarCount(); + if (count < 1) { + return; + } + + final int rows = progressMulti.getProgressBarRows(); + final int cols = progressMulti.getProgressBarCols(); + + Column column = new Column(); + rootColumn.child(column); + + for (int r = 0; r < rows; r++) { + screenHeight -= (r + 1) * 8; + + Row row = new Row() + .size(Bars.FULL_WIDTH, Bars.HEIGHT) + .left(4); + + int from = r * cols; + int to = Math.min(from + cols, cols); + + if (to - from > 1) { + // TODO MUI2 bug workaround, should be able to apply this to every row but it crashes with single + // element rows + row.mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); + } + + for (int i = from; i < to; i++) { + row.top(screenHeight + 6) + .child(progressMulti.createProgressBar(panelSyncManager, i) + .height(Bars.HEIGHT) + .width(cols == 3 ? Bars.THIRD_WIDTH : cols == 2 ? Bars.HALF_WIDTH : Bars.FULL_WIDTH) + .direction(ProgressWidget.Direction.RIGHT)); + } + + column.child(row); + } + } + + protected void createScreen() { + screenRow.size(Screen.WIDTH, screenHeight) + .left(4) + .top(4) + .background(GTGuiTextures.DISPLAY); + rootColumn.child(screenRow); + } + + protected void createInventory() { + inventoryRow.size(Screen.WIDTH, 81) + .left(4) + .bottom(3); + + Column inventory = new Column() + .child(SlotGroupWidget.playerInventory() + .left(3) + .bottom(4)); + + inventoryRow.child(inventory); + rootColumn.child(inventoryRow); + } + + protected void createButtons() { + buttonColumn.size(18, 54) + .right(3) + .top(0); + inventoryRow.child(buttonColumn); + + createExtraButton(); + createDistinctButton(); + createVoidingButton(); + } + + protected void createExtraButton() { + List> list = new ArrayList<>(); + mte.createExtraButtons(rootPanel, panelSyncManager, list); + if (list.isEmpty()) { + list.add(new Widget<>() + .background(GTGuiTextures.BUTTON) + .overlay(GTGuiTextures.BUTTON_NO_FLEX) + .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")))); + } + + if (list.size() == 1) { + buttonColumn.child(list.get(0).size(18, 18)); + return; + } + + PanelSyncHandler popupPanel = panelSyncManager.panel("throttle_panel", rootPanel, + (syncManager, syncHandler) -> { + ModularPanel panel = GTGuis.createPopupPanel("extra_buttons", Screen.WIDTH, screenHeight); + Row row = new Row().height(18) + .margin(4) + .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); + panel.child(row); + for (var widget : list) { + row.child(widget.size(18, 18)); + } + return panel; + }); + + buttonColumn.child(new ButtonWidget<>() + .size(18, 18) + .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) // TODO texture + .background(GTGuiTextures.BUTTON) // TODO make this work + .onMousePressed(i -> { + if (popupPanel.isPanelOpen()) { + popupPanel.closePanel(); + } else { + popupPanel.openPanel(); + } + Interactable.playButtonClickSound(); + return true; + })); + } + + protected void createDistinctButton() { + if (mte instanceof IDistinctBusController distinct && distinct.canBeDistinct()) { + BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); + panelSyncManager.syncValue("distinct_state", distinctValue); + + buttonColumn.child(new CycleButtonWidget() + .top(18) + .size(18, 18) + .value(new BoolValue.Dynamic(distinctValue::getBoolValue, distinctValue::setBoolValue)) + .textureGetter( + i -> i == 0 ? GTGuiTextures.BUTTON_NO_DISTINCT_BUSES : GTGuiTextures.BUTTON_DISTINCT_BUSES) + .background(GTGuiTextures.BUTTON) + .tooltipBuilder(t -> t.setAutoUpdate(true) + .addLine(distinctValue.getBoolValue() ? + IKey.lang("gregtech.multiblock.universal.distinct_enabled") : + IKey.lang("gregtech.multiblock.universal.distinct_disabled")))); + } else { + buttonColumn.child(new Widget<>() + .top(18) + .size(18, 18) + .background(GTGuiTextures.BUTTON, GTGuiTextures.BUTTON_NO_DISTINCT_BUSES) + .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")))); + } + } + + protected void createVoidingButton() { + if (mte.shouldShowVoidingModeButton()) { + IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); + panelSyncManager.syncValue("voiding_state", voidingValue); + + buttonColumn.child(new CycleButtonWidget() + .top(36) + .size(18, 18) + .textureGetter(i -> switch (i) { + case 1 -> GTGuiTextures.BUTTON_VOID_ITEM; + case 2 -> GTGuiTextures.BUTTON_VOID_FLUID; + case 3 -> GTGuiTextures.BUTTON_VOID_ITEM_FLUID; + default -> GTGuiTextures.BUTTON_VOID_DISABLED; + }) + .background(GTGuiTextures.BUTTON) + .value(new IntValue.Dynamic(voidingValue::getIntValue, voidingValue::setIntValue)) + .length(4) + .tooltipBuilder(t -> t.setAutoUpdate(true) + .addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue()))))); + } else { + buttonColumn.child(new Widget<>() + .top(36) + .size(18, 18) + .background(GTGuiTextures.BUTTON, GTGuiTextures.BUTTON_VOID_NONE) + .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported")))); + } + } + + protected void createPowerButton() { + // todo in the future, refactor so that this multis are instanceof IControllable. + IControllable controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); + if (controllable != null) { + BooleanSyncValue workingStateValue = new BooleanSyncValue(controllable::isWorkingEnabled, + controllable::setWorkingEnabled); + panelSyncManager.syncValue("working_state", workingStateValue); + + Column column = new Column() + .size(18, 29) + .right(3) + .bottom(-2); + + inventoryRow.child(column); + column.child(new CycleButtonWidget() + .top(5) + .size(18, 18) + .textureGetter(i -> i == 0 ? GTGuiTextures.BUTTON_POWER_OFF : GTGuiTextures.BUTTON_POWER_ON) + .background(GTGuiTextures.BUTTON) + .value(new BoolValue.Dynamic(workingStateValue::getBoolValue, workingStateValue::setBoolValue))) + .child(new Widget<>() + .background(GTGuiTextures.BUTTON_POWER_DETAIL) + .bottom(0) + .size(18, 6)); + } + } + + public static final class Screen { + + public static int WIDTH = 190; + + private Screen() {} + } + + public static final class Bars { + + public static int FULL_WIDTH = Screen.WIDTH; + public static int HALF_WIDTH = 94; + public static int THIRD_WIDTH = 62; + public static int HEIGHT = 7; + + private Bars() {} + } +} diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index f34c08a936a..849b528f3d5 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -362,8 +362,30 @@ public static class IDs { public static final UITexture BUTTON_CROSS = fullImage("textures/gui/widget/button_cross.png"); public static final UITexture BUTTON_REDSTONE_ON = fullImage("textures/gui/widget/button_redstone_on.png"); public static final UITexture BUTTON_REDSTONE_OFF = fullImage("textures/gui/widget/button_redstone_off.png"); - public static final UITexture BUTTON_THROTTLE_PLUS = fullImage("textures/gui/widget/button_throttle_plus.png"); - public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png"); + public static final UITexture BUTTON_POWER_ON = fullImage("textures/gui/widget/button_power.png", true); // TODO fix + public static final UITexture BUTTON_POWER_OFF = fullImage("textures/gui/widget/button_power.png", true); // TODO + // fix + public static final UITexture BUTTON_POWER_DETAIL = fullImage("textures/gui/widget/button_power_detail.png", true); + public static final UITexture BUTTON_VOID_DISABLED = fullImage("textures/gui/widget/button_void_multiblock.png", + true); // TODO fix + public static final UITexture BUTTON_VOID_ITEM = fullImage("textures/gui/widget/button_void_multiblock.png", true); // TODO + // fix + public static final UITexture BUTTON_VOID_FLUID = fullImage("textures/gui/widget/button_void_multiblock.png", true); // TODO + // fix + public static final UITexture BUTTON_VOID_ITEM_FLUID = fullImage("textures/gui/widget/button_void_multiblock.png", + true); // TODO fix + public static final UITexture BUTTON_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); + public static final UITexture BUTTON_DISTINCT_BUSES = fullImage("textures/gui/widget/button_distinct_buses.png", + true); + public static final UITexture BUTTON_NO_DISTINCT_BUSES = fullImage( + "textures/gui/widget/button_no_distinct_buses.png", true); + public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); + public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); + public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); + public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png", + true); // TODO new texture + public static final UITexture BUTTON_THROTTLE_PLUS = fullImage("textures/gui/widget/button_throttle_plus.png", + true); // TODO remove this // PROGRESS BARS public static final UITexture PROGRESS_BAR_ARC_FURNACE = progressBar( @@ -466,9 +488,9 @@ public static class IDs { .adaptable(1) .build(); public static final UITexture PROGRESS_BAR_BOILER_FUEL_BRONZE = progressBar( - "textures/gui/progress_bar/progress_bar_boiler_fuel_bronze.png", 18, 36); + "textures/gui/progress_bar/progress_bar_boiler_fuel_bronze.png", 18, 36, true); public static final UITexture PROGRESS_BAR_BOILER_FUEL_STEEL = progressBar( - "textures/gui/progress_bar/progress_bar_boiler_fuel_steel.png", 18, 36); + "textures/gui/progress_bar/progress_bar_boiler_fuel_steel.png", 18, 36, true); public static final UITexture PROGRESS_BAR_BOILER_HEAT = progressBar( "textures/gui/progress_bar/progress_bar_boiler_heat.png", true); public static final UITexture PROGRESS_BAR_ASSEMBLY_LINE = progressBar( @@ -480,9 +502,9 @@ public static class IDs { public static final UITexture PROGRESS_BAR_DISTILLATION_TOWER = progressBar( "textures/gui/progress_bar/progress_bar_distillation_tower.png", 66, 116, true); public static final UITexture PROGRESS_BAR_SOLAR_BRONZE = progressBar( - "textures/gui/progress_bar/progress_bar_solar_bronze.png", 10, 20); + "textures/gui/progress_bar/progress_bar_solar_bronze.png", 10, 20, true); public static final UITexture PROGRESS_BAR_SOLAR_STEEL = progressBar( - "textures/gui/progress_bar/progress_bar_solar_steel.png", 10, 20); + "textures/gui/progress_bar/progress_bar_solar_steel.png", 10, 20, true); public static final UITexture PROGRESS_BAR_RESEARCH_STATION_1 = progressBar( "textures/gui/progress_bar/progress_bar_research_station_1.png", 54, 10, true); public static final UITexture PROGRESS_BAR_RESEARCH_STATION_2 = progressBar( @@ -490,25 +512,25 @@ public static class IDs { public static final UITexture PROGRESS_BAR_RESEARCH_STATION_BASE = fullImage( "textures/gui/progress_bar/progress_bar_research_station_base.png", true); public static final UITexture PROGRESS_BAR_FUSION_ENERGY = progressBar( - "textures/gui/progress_bar/progress_bar_fusion_energy.png", 94, 14); + "textures/gui/progress_bar/progress_bar_fusion_energy.png", 94, 14, true); public static final UITexture PROGRESS_BAR_FUSION_HEAT = progressBar( - "textures/gui/progress_bar/progress_bar_fusion_heat.png", 94, 14); + "textures/gui/progress_bar/progress_bar_fusion_heat.png", 94, 14, true); public static final UITexture PROGRESS_BAR_MULTI_ENERGY_YELLOW = progressBar( - "textures/gui/progress_bar/progress_bar_multi_energy_yellow.png", 190, 14); + "textures/gui/progress_bar/progress_bar_multi_energy_yellow.png", 190, 14, true); public static final UITexture PROGRESS_BAR_HPCA_COMPUTATION = progressBar( - "textures/gui/progress_bar/progress_bar_hpca_computation.png", 94, 14); + "textures/gui/progress_bar/progress_bar_hpca_computation.png", 94, 14, true); public static final UITexture PROGRESS_BAR_LCE_FUEL = progressBar( - "textures/gui/progress_bar/progress_bar_lce_fuel.png", 62, 14); + "textures/gui/progress_bar/progress_bar_lce_fuel.png", 62, 14, true); public static final UITexture PROGRESS_BAR_LCE_LUBRICANT = progressBar( - "textures/gui/progress_bar/progress_bar_lce_lubricant.png", 62, 14); + "textures/gui/progress_bar/progress_bar_lce_lubricant.png", 62, 14, true); public static final UITexture PROGRESS_BAR_LCE_OXYGEN = progressBar( - "textures/gui/progress_bar/progress_bar_lce_oxygen.png", 62, 14); + "textures/gui/progress_bar/progress_bar_lce_oxygen.png", 62, 14, true); public static final UITexture PROGRESS_BAR_TURBINE_ROTOR_SPEED = progressBar( - "textures/gui/progress_bar/progress_bar_turbine_rotor_speed.png", 62, 14); + "textures/gui/progress_bar/progress_bar_turbine_rotor_speed.png", 62, 14, true); public static final UITexture PROGRESS_BAR_TURBINE_ROTOR_DURABILITY = progressBar( - "textures/gui/progress_bar/progress_bar_turbine_rotor_durability.png", 62, 14); + "textures/gui/progress_bar/progress_bar_turbine_rotor_durability.png", 62, 14, true); public static final UITexture PROGRESS_BAR_FLUID_RIG_DEPLETION = progressBar( - "textures/gui/progress_bar/progress_bar_fluid_rig_depletion.png", 190, 14); + "textures/gui/progress_bar/progress_bar_fluid_rig_depletion.png", 190, 14, true); // MISC diff --git a/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java b/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java new file mode 100644 index 00000000000..6b48af3f85a --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java @@ -0,0 +1,92 @@ +package gregtech.api.mui.sync; + +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.api.value.sync.IStringSyncValue; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.math.BigInteger; +import java.util.Objects; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class BigIntegerSyncValue extends ValueSyncHandler implements IStringSyncValue { + + private BigInteger cache = BigInteger.ZERO; + private final Supplier getter; + private final @Nullable Consumer setter; + + public BigIntegerSyncValue(@NotNull Supplier<@NotNull BigInteger> getter, + @Nullable Consumer<@NotNull BigInteger> setter) { + this.getter = getter; + this.setter = setter; + } + + @Contract("null, _, null, _ -> fail") + public BigIntegerSyncValue(@Nullable Supplier<@NotNull BigInteger> clientGetter, + @Nullable Consumer<@NotNull BigInteger> clientSetter, + @Nullable Supplier<@NotNull BigInteger> serverGetter, + @Nullable Consumer<@NotNull BigInteger> serverSetter) { + if (clientGetter == null && serverGetter == null) { + throw new NullPointerException("Client or server getter must not be null!"); + } + if (NetworkUtils.isClient()) { + this.getter = clientGetter != null ? clientGetter : serverGetter; + this.setter = clientSetter != null ? clientSetter : serverSetter; + } else { + this.getter = serverGetter != null ? serverGetter : clientGetter; + this.setter = serverSetter != null ? serverSetter : clientSetter; + } + this.cache = this.getter.get(); + } + + @Override + public void setStringValue(String value, boolean setSource, boolean sync) { + setValue(new BigInteger(value), setSource, sync); + } + + @Override + public String getStringValue() { + return cache.toString(); + } + + @Override + public void setValue(BigInteger value, boolean setSource, boolean sync) { + this.cache = value; + if (setSource && this.setter != null) { + this.setter.accept(value); + } + if (sync) { + sync(0, this::write); + } + } + + @Override + public boolean updateCacheFromSource(boolean isFirstSync) { + if (this.getter != null && (isFirstSync || !Objects.equals(this.getter.get(), this.cache))) { + setValue(this.getter.get(), false, false); + return true; + } + return false; + } + + @Override + public void write(@NotNull PacketBuffer buffer) throws IOException { + buffer.writeByteArray(cache.toByteArray()); + } + + @Override + public void read(@NotNull PacketBuffer buffer) throws IOException { + this.cache = new BigInteger(buffer.readByteArray()); + } + + @Override + public BigInteger getValue() { + return this.cache; + } +} diff --git a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java new file mode 100644 index 00000000000..381dcbc6c6c --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java @@ -0,0 +1,90 @@ +package gregtech.api.mui.sync; + +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.Arrays; +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * Sync Value for an array with fixed length. + *

+ * Does not create new arrays. + */ +public class FixedIntArraySyncValue extends ValueSyncHandler { + + private final int[] cache; + private final Supplier getter; + private final @Nullable Consumer setter; + + public FixedIntArraySyncValue(@NotNull Supplier getter, @Nullable Consumer setter, int size) { + this.getter = getter; + this.setter = setter; + this.cache = new int[size]; + } + + @Contract("null, _, null, _ -> fail") + public FixedIntArraySyncValue(@Nullable Supplier clientGetter, @Nullable Consumer clientSetter, + @Nullable Supplier serverGetter, @Nullable Consumer serverSetter) { + if (clientGetter == null && serverGetter == null) { + throw new NullPointerException("Client or server getter must not be null!"); + } + if (NetworkUtils.isClient()) { + this.getter = clientGetter != null ? clientGetter : serverGetter; + this.setter = clientSetter != null ? clientSetter : serverSetter; + } else { + this.getter = serverGetter != null ? serverGetter : clientGetter; + this.setter = serverSetter != null ? serverSetter : clientSetter; + } + this.cache = this.getter.get(); + } + + @Override + public void setValue(int @NotNull [] value, boolean setSource, boolean sync) { + if (value.length != cache.length) { + throw new IllegalArgumentException("Incompatible array lengths"); + } + System.arraycopy(value, 0, cache, 0, value.length); + if (setSource && this.setter != null) { + this.setter.accept(value); + } + if (sync) { + sync(0, this::write); + } + } + + @Override + public boolean updateCacheFromSource(boolean isFirstSync) { + if (this.getter != null && (isFirstSync || !Arrays.equals(this.getter.get(), this.cache))) { + setValue(this.getter.get(), false, false); + return true; + } + return false; + } + + @Override + public void write(@NotNull PacketBuffer buffer) throws IOException { + for (int i : cache) { + buffer.writeVarInt(i); + } + } + + @Override + public void read(@NotNull PacketBuffer buffer) throws IOException { + for (int i = 0; i < cache.length; i++) { + cache[i] = buffer.readVarInt(); + } + } + + @Override + public int[] getValue() { + return this.cache; + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 6921ca44d5f..829b3226bf8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -4,16 +4,13 @@ import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.Widget; -import gregtech.api.gui.Widget.ClickData; -import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.ClickButtonWidget; -import gregtech.api.gui.widgets.WidgetGroup; import gregtech.api.metatileentity.MTETrait; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -29,7 +26,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; @@ -41,13 +37,27 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.ItemDrawable; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.IntValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncHandler; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; -public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase implements IProgressBarMultiblock { +public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase implements ProgressBarMultiblock { public final BoilerType boilerType; protected BoilerRecipeLogic recipeLogic; @@ -151,8 +161,7 @@ private TextFormatting getNumberColor(int number) { protected void addWarningText(List textList) { super.addWarningText(textList); if (isStructureFormed()) { - int[] waterAmount = getWaterAmount(); - if (waterAmount[0] == 0) { + if (getWaterFilled() == 0) { textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, @@ -162,23 +171,57 @@ protected void addWarningText(List textList) { } @Override - protected @NotNull Widget getFlexButton(int x, int y, int width, int height) { - WidgetGroup group = new WidgetGroup(x, y, width, height); - group.addWidget(new ClickButtonWidget(0, 0, 9, 18, "", this::decrementThrottle) - .setButtonTexture(GuiTextures.BUTTON_THROTTLE_MINUS) - .setTooltipText("gregtech.multiblock.large_boiler.throttle_decrement")); - group.addWidget(new ClickButtonWidget(9, 0, 9, 18, "", this::incrementThrottle) - .setButtonTexture(GuiTextures.BUTTON_THROTTLE_PLUS) - .setTooltipText("gregtech.multiblock.large_boiler.throttle_increment")); - return group; + public void createExtraButtons(@NotNull ModularPanel parentPanel, @NotNull PanelSyncManager panelSyncManager, + @NotNull List> list) { + IntSyncValue syncValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); + syncValue.updateCacheFromSource(true); + panelSyncManager.syncValue("boiler_throttle", syncValue); + + PanelSyncHandler panel = panelSyncManager.panel("throttle_panel", parentPanel, + (syncManager, syncHandler) -> GTGuis.createPopupPanel("boiler_throttle", 116, 53) + .child(new Row() + .pos(4, 4) + .height(16).coverChildrenWidth() + .child(new ItemDrawable(getStackForm()) + .asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") + .asWidget() + .heightRel(1.0f))) + .child(new Row() + // TODO add inc/dec buttons + .child(new TextFieldWidget() + .size(40, 20) + .left(38) + .top(20) + .setTextColor(Color.WHITE.darker(1)) // TODO proper color + .setNumbers(0, 100) + .value(new IntValue.Dynamic(syncValue::getIntValue, + syncValue::setIntValue)) // TODO show % sign + .background(GTGuiTextures.DISPLAY)))); + + list.add(new ButtonWidget<>() + .width(18) + .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) + .background(GTGuiTextures.BUTTON) // TODO make this work + .onMousePressed(i -> { + if (panel.isPanelOpen()) { + panel.closePanel(); + } else { + panel.openPanel(); + } + Interactable.playButtonClickSound(); + return true; + })); } - private void incrementThrottle(ClickData clickData) { - this.throttlePercentage = MathHelper.clamp(throttlePercentage + 5, 25, 100); + private void setThrottlePercentage(int amount) { + this.throttlePercentage = amount; } - private void decrementThrottle(ClickData clickData) { - this.throttlePercentage = MathHelper.clamp(throttlePercentage - 5, 25, 100); + private int getThrottlePercentage() { + return this.throttlePercentage; } @Override @@ -187,7 +230,7 @@ public boolean isActive() { } @Override - protected BlockPattern createStructurePattern() { + protected @NotNull BlockPattern createStructurePattern() { return FactoryBlockPattern.start() .aisle("XXX", "CCC", "CCC", "CCC") .aisle("XXX", "CPC", "CPC", "CCC") @@ -311,61 +354,70 @@ protected boolean shouldUpdate(MTETrait trait) { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } @Override - public double getFillPercentage(int index) { - if (!isStructureFormed()) return 0; - int[] waterAmount = getWaterAmount(); - if (waterAmount[1] == 0) return 0; // no water capacity - return (1.0 * waterAmount[0]) / waterAmount[1]; + public int getProgressBarCount() { + return 1; } @Override - public TextureArea getProgressBarTexture(int index) { - return GuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION; + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + IntSyncValue waterFilledValue = new IntSyncValue(this::getWaterFilled, null); + IntSyncValue waterCapacityValue = new IntSyncValue(this::getWaterCapacity, null); + panelSyncManager.syncValue("water_filled", waterFilledValue); + panelSyncManager.syncValue("water_capacity", waterCapacityValue); + + return new ProgressWidget() + .progress(() -> waterCapacityValue.getIntValue() == 0 ? 0 : + waterFilledValue.getIntValue() * 1.0 / waterCapacityValue.getIntValue()) + .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + if (waterFilledValue.getIntValue() == 0) { + t.addLine(IKey.lang("gregtech.multiblock.large_boiler.no_water")); + } else { + t.addLine(IKey.lang("gregtech.multiblock.large_boiler.water_bar_hover", + waterFilledValue.getIntValue(), waterCapacityValue.getIntValue())); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } - @Override - public void addBarHoverText(List hoverList, int index) { - if (!isStructureFormed()) { - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.invalid_structure")); - } else { - int[] waterAmount = getWaterAmount(); - if (waterAmount[0] == 0) { - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - } else { - ITextComponent waterInfo = TextComponentUtil.translationWithColor( - TextFormatting.BLUE, - "%s / %s L", - waterAmount[0], waterAmount[1]); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.water_bar_hover", - waterInfo)); + /** + * @return the total amount of water filling the inputs + */ + private int getWaterFilled() { + if (!isStructureFormed()) return 0; + List tanks = getAbilities(MultiblockAbility.IMPORT_FLUIDS); + int filled = 0; + for (IFluidTank tank : tanks) { + if (tank == null || tank.getFluid() == null) continue; + if (CommonFluidFilters.BOILER_FLUID.test(tank.getFluid())) { + filled += tank.getFluidAmount(); } } + return filled; } /** - * Returns an int[] of {AmountFilled, Capacity} where capacity is the sum of hatches with some water in them. - * If there is no water in the boiler (or the structure isn't formed, both of these values will be zero. + * @return the total capacity for water-containing inputs */ - private int[] getWaterAmount() { - if (!isStructureFormed()) return new int[] { 0, 0 }; + private int getWaterCapacity() { + if (!isStructureFormed()) return 0; List tanks = getAbilities(MultiblockAbility.IMPORT_FLUIDS); - int filled = 0, capacity = 0; + int capacity = 0; for (IFluidTank tank : tanks) { if (tank == null || tank.getFluid() == null) continue; if (CommonFluidFilters.BOILER_FLUID.test(tank.getFluid())) { - filled += tank.getFluidAmount(); capacity += tank.getCapacity(); } } - return new int[] { filled, capacity }; + return capacity; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index d22e681fad3..721be147b02 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -208,7 +208,7 @@ protected void addDisplayText(List textList) { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 99f1d89726e..c502855dc5e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -780,7 +780,7 @@ public List getMatchingShapes() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index 5b52829f001..432bb59a2d0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -226,7 +226,7 @@ protected ICubeRenderer getFrontOverlay() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index dca07a39e5f..87f4a7ea701 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -8,12 +8,12 @@ import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidDrillLogic; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -48,6 +48,10 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ProgressWidget; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,7 +60,7 @@ import java.util.List; public class MetaTileEntityFluidDrill extends MultiblockWithDisplayBase - implements ITieredMetaTileEntity, IWorkable, IProgressBarMultiblock { + implements ITieredMetaTileEntity, IWorkable, ProgressBarMultiblock { private final FluidDrillLogic minerLogic; private final int tier; @@ -110,7 +114,7 @@ protected void updateFormedValid() { } @Override - protected BlockPattern createStructurePattern() { + protected @NotNull BlockPattern createStructurePattern() { return FactoryBlockPattern.start() .aisle("XXX", "#F#", "#F#", "#F#", "###", "###", "###") .aisle("XXX", "FCF", "FCF", "FCF", "#F#", "#F#", "#F#") @@ -367,50 +371,49 @@ public T getCapability(Capability capability, EnumFacing side) { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } - @Override - public boolean showProgressBar() { - return tier > GTValues.MV; // only show for T2/3 fluid rigs - } - - @Override - public double getFillPercentage(int index) { - int numOperationsLeft = BedrockFluidVeinHandler.getOperationsRemaining(getWorld(), minerLogic.getChunkX(), - minerLogic.getChunkZ()); - int maxOperations = BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS; - return 1.0 * numOperationsLeft / maxOperations; + public boolean allowsExtendedFacing() { + return false; } @Override - public TextureArea getProgressBarTexture(int index) { - return GuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION; + public int getProgressBarCount() { + // only show for T2/3 fluid rigs + return tier > GTValues.MV ? 1 : 0; } @Override - public void addBarHoverText(List hoverList, int index) { - int numOperationsLeft = BedrockFluidVeinHandler.getOperationsRemaining(getWorld(), minerLogic.getChunkX(), - minerLogic.getChunkZ()); - int maxOperations = BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS; - int percentage = (int) Math.round(1.0 * numOperationsLeft / maxOperations * 100); - TextFormatting color = percentage > 40 ? TextFormatting.GREEN : - percentage > 10 ? TextFormatting.YELLOW : TextFormatting.RED; - - if (numOperationsLeft == 0) { - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.fluid_rig.vein_depleted")); - } else { - ITextComponent veinInfo = TextComponentUtil.stringWithColor(color, percentage + "%"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.fluid_rig.vein_depletion", - veinInfo)); - } - } - - public boolean allowsExtendedFacing() { - return false; + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + IntSyncValue operationsValue = new IntSyncValue(() -> BedrockFluidVeinHandler.getOperationsRemaining(getWorld(), + minerLogic.getChunkX(), minerLogic.getChunkZ()), null); + panelSyncManager.syncValue("operations_remaining", operationsValue); + + return new ProgressWidget() + .progress(() -> operationsValue.getIntValue() * 1.0 / BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS) + .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + if (operationsValue.getIntValue() == 0) { + t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depleted")); + } else { + // TODO working dynamic color substitutions into IKey.lang + int percent = (int) Math.round(100.0 * operationsValue.getIntValue() / + BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS); + if (percent > 40) { + t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.high", percent)); + } else if (percent > 10) { + t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.medium", percent)); + } else { + t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.low", percent)); + } + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index f9db6f997d9..8a5e1d068a9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -19,7 +19,6 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; -import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -412,7 +411,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { // Voiding Mode Button builder.widget(new ImageCycleButtonWidget(173, 189, 18, 18, GuiTextures.BUTTON_VOID_MULTIBLOCK, 4, this::getVoidingMode, this::setVoidingMode) - .setTooltipHoverString(MultiblockWithDisplayBase::getVoidingModeTooltip)); + .setTooltipHoverString(this::getVoidingModeTooltip)); // Distinct Buses Unavailable Image builder.widget(new ImageWidget(173, 171, 18, 18, GuiTextures.BUTTON_NO_DISTINCT_BUSES) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index f1bf2dc9593..24ebc9a6ca7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -13,6 +13,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -53,6 +55,10 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; @@ -67,7 +73,7 @@ import static gregtech.api.util.RelativeDirection.*; public class MetaTileEntityHPCA extends MultiblockWithDisplayBase - implements IOpticalComputationProvider, IControllable, IProgressBarMultiblock { + implements IOpticalComputationProvider, IControllable, ProgressBarMultiblock { private static final double IDLE_TEMPERATURE = 200; private static final double DAMAGE_TEMPERATURE = 1000; @@ -409,15 +415,6 @@ protected void addDisplayText(List textList) { .addWorkingStatusLine(); } - private TextFormatting getDisplayTemperatureColor() { - if (temperature < 500) { - return TextFormatting.GREEN; - } else if (temperature < 750) { - return TextFormatting.YELLOW; - } - return TextFormatting.RED; - } - @Override protected void addWarningText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed(), false) @@ -465,7 +462,7 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } @@ -529,40 +526,61 @@ public T getCapability(Capability capability, EnumFacing side) { } @Override - public int getNumProgressBars() { + public int getProgressBarCount() { return 2; } @Override - public double getFillPercentage(int index) { - return index == 0 ? 1.0 * hpcaHandler.cachedCWUt / hpcaHandler.getMaxCWUt() : - Math.min(1.0, temperature / DAMAGE_TEMPERATURE); - } - - @Override - public TextureArea getProgressBarTexture(int index) { - return index == 0 ? GuiTextures.PROGRESS_BAR_HPCA_COMPUTATION : GuiTextures.PROGRESS_BAR_FUSION_HEAT; - } - - @Override - public void addBarHoverText(List hoverList, int index) { - if (index == 0) { - ITextComponent cwutInfo = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.computation", - cwutInfo)); - } else { - ITextComponent tempInfo = TextComponentUtil.stringWithColor( - getDisplayTemperatureColor(), - Math.round(temperature / 10.0D) + "°C"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.temperature", - tempInfo)); - } + public com.cleanroommc.modularui.widgets.@NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, + int index) { + return switch (index) { + case 0 -> { + IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt, null); + IntSyncValue maxCWUtValue = new IntSyncValue(hpcaHandler::getMaxCWUt, null); + panelSyncManager.syncValue("current_cwut", currentCWUtValue); + panelSyncManager.syncValue("max_cwut", maxCWUtValue); + + yield new com.cleanroommc.modularui.widgets.ProgressWidget() + .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) + .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.computation", + currentCWUtValue.getIntValue(), maxCWUtValue.getIntValue())); + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); + } + case 1 -> { + DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature, null); + panelSyncManager.syncValue("temperature", temperatureValue); + + yield new com.cleanroommc.modularui.widgets.ProgressWidget() + .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + double temp = temperatureValue.getDoubleValue(); + int degrees = (int) Math.round(temp / 10.0); + + // TODO working dynamic color substitutions into IKey.lang + if (temp < 500) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.low", degrees)); + } else if (temp < 750) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.medium", degrees)); + } else { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.high", degrees)); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); + } + default -> throw new IllegalStateException("Invalid index received " + index); + }; } // Handles the logic of this structure's specific HPCA component grid diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index cc2b78fa6ba..ec77f1e21e3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -550,7 +550,7 @@ public List getDataInfo() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index c189c803800..408148207a8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -18,6 +18,9 @@ import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.BigIntegerSyncValue; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.BlockInfo; @@ -52,6 +55,9 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; @@ -68,7 +74,7 @@ import static gregtech.api.util.RelativeDirection.*; public class MetaTileEntityPowerSubstation extends MultiblockWithDisplayBase - implements IControllable, IProgressBarMultiblock { + implements IControllable, ProgressBarMultiblock { // Structure Constants public static final int MAX_BATTERY_LAYERS = 18; @@ -233,7 +239,7 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } @@ -580,23 +586,32 @@ public long getAverageOutLastSec() { } @Override - public double getFillPercentage(int index) { - if (energyBank == null) return 0; - return energyBank.getStored().doubleValue() / energyBank.getCapacity().doubleValue(); + public int getProgressBarCount() { + return 1; } @Override - public void addBarHoverText(List hoverList, int index) { - String stored = energyBank != null ? TextFormattingUtil.formatNumbers(energyBank.getStored()) : "0"; - String capacity = energyBank != null ? TextFormattingUtil.formatNumbers(energyBank.getCapacity()) : "0"; - - ITextComponent energyInfo = TextComponentUtil.stringWithColor( - TextFormatting.YELLOW, - stored + " / " + capacity + " EU"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.energy_stored", - energyInfo)); + public @NotNull ProgressWidget createProgressBar(@NotNull PanelSyncManager panelSyncManager, int index) { + BigIntegerSyncValue energyStoredValue = new BigIntegerSyncValue( + () -> energyBank == null ? BigInteger.ZERO : energyBank.getStored(), null); + BigIntegerSyncValue energyCapacityValue = new BigIntegerSyncValue( + () -> energyBank == null ? BigInteger.ZERO : energyBank.getCapacity(), null); + panelSyncManager.syncValue("energy_stored", energyStoredValue); + panelSyncManager.syncValue("energy_capacity", energyCapacityValue); + + return new ProgressWidget() + .progress( + () -> energyStoredValue.getValue().doubleValue() / energyCapacityValue.getValue().doubleValue()) + .texture(GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + t.addLine(IKey.lang("gregtech.multiblock.energy_stored", energyStoredValue.getValue(), + energyCapacityValue.getValue())); + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } public static class PowerStationEnergyBank { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 50923590e11..cef0e7958e7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -201,7 +201,7 @@ protected ICubeRenderer getFrontOverlay() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 4deeabb9a9f..7fbac5668a6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -296,7 +296,7 @@ protected void addDisplayText(List textList) { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 5bdd31eafc8..978271998ac 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -6,16 +6,17 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; import gregtech.api.fluids.store.FluidStorageKeys; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.metatileentity.multiblock.*; import gregtech.api.metatileentity.multiblock.FuelMultiblockController; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.IProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -23,7 +24,6 @@ import gregtech.api.unification.material.Materials; import gregtech.api.util.RelativeDirection; import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; @@ -39,16 +39,22 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +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.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; -public class MetaTileEntityLargeCombustionEngine extends FuelMultiblockController implements IProgressBarMultiblock { +public class MetaTileEntityLargeCombustionEngine extends FuelMultiblockController implements ProgressBarMultiblock { private final int tier; private final boolean isExtreme; @@ -126,7 +132,7 @@ public void addInformation(ItemStack stack, @Nullable World player, List } @Override - protected BlockPattern createStructurePattern() { + protected @NotNull BlockPattern createStructurePattern() { return FactoryBlockPattern.start() .aisle("XXX", "XDX", "XXX") .aisle("XCX", "CGC", "XCX") @@ -216,7 +222,7 @@ private boolean checkIntakesObstructed() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } @@ -225,107 +231,136 @@ public boolean isBoostAllowed() { } @Override - public int getNumProgressBars() { + public int getProgressBarCount() { return 3; } @Override - public double getFillPercentage(int index) { - if (index == 0) { - int[] fuelAmount = new int[2]; - if (getInputFluidInventory() != null) { - MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - if (recipeLogic.getInputFluidStack() != null) { - FluidStack testStack = recipeLogic.getInputFluidStack().copy(); - testStack.amount = Integer.MAX_VALUE; - fuelAmount = getTotalFluidAmount(testStack, getInputFluidInventory()); - } + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + return switch (index) { + case 0 -> { + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null, 2); + StringSyncValue fuelNameValue = new StringSyncValue(() -> { + FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); + if (stack == null) { + return null; + } + Fluid fluid = stack.getFluid(); + if (fluid == null) { + return null; + } + return fluid.getName(); + }, null); + panelSyncManager.syncValue("fuel_amount", fuelValue); + panelSyncManager.syncValue("fuel_name", fuelNameValue); + + yield new ProgressWidget() + .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : + 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } - return fuelAmount[1] != 0 ? 1.0 * fuelAmount[0] / fuelAmount[1] : 0; - } else if (index == 1) { - int[] lubricantAmount = new int[2]; - if (getInputFluidInventory() != null) { - lubricantAmount = getTotalFluidAmount(Materials.Lubricant.getFluid(Integer.MAX_VALUE), - getInputFluidInventory()); + case 1 -> { + FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null, 2); + panelSyncManager.syncValue("lubricant_amount", lubricantValue); + + yield new ProgressWidget() + .progress(() -> lubricantValue.getValue()[1] == 0 ? 0 : + 1.0 * lubricantValue.getValue()[0] / lubricantValue.getValue()[1]) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + if (lubricantValue.getValue()[0] == 0) { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); + } else { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.lubricant_amount", + lubricantValue.getValue()[0], lubricantValue.getValue()[1])); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } - return lubricantAmount[1] != 0 ? 1.0 * lubricantAmount[0] / lubricantAmount[1] : 0; - } else { - int[] oxygenAmount = new int[2]; - if (getInputFluidInventory() != null) { - if (isBoostAllowed()) { - FluidStack oxygenStack = isExtreme ? - Materials.Oxygen.getFluid(FluidStorageKeys.LIQUID, Integer.MAX_VALUE) : - Materials.Oxygen.getFluid(Integer.MAX_VALUE); - oxygenAmount = getTotalFluidAmount(oxygenStack, getInputFluidInventory()); - } + case 2 -> { + FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null, 2); + BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed, null); + panelSyncManager.syncValue("oxygen_amount", oxygenValue); + panelSyncManager.syncValue("boost_allowed", boostValue); + + yield new ProgressWidget() + .progress(() -> oxygenValue.getValue()[1] == 0 ? 0 : + 1.0 * oxygenValue.getValue()[0] / oxygenValue.getValue()[1]) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_OXYGEN, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + if (boostValue.getBoolValue()) { + if (oxygenValue.getValue()[0] == 0) { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_none")); + } else if (isExtreme) { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount", + oxygenValue.getValue()[0], oxygenValue.getValue()[1])); + } else { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_amount", + oxygenValue.getValue()[0], oxygenValue.getValue()[1])); + } + } else if (isExtreme) { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed")); + } else { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed")); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } - return oxygenAmount[1] != 0 ? 1.0 * oxygenAmount[0] / oxygenAmount[1] : 0; - } + default -> throw new IllegalStateException("Invalid index received " + index); + }; } - @Override - public TextureArea getProgressBarTexture(int index) { - if (index == 0) { - return GuiTextures.PROGRESS_BAR_LCE_FUEL; - } else if (index == 1) { - return GuiTextures.PROGRESS_BAR_LCE_LUBRICANT; - } else { - return GuiTextures.PROGRESS_BAR_LCE_OXYGEN; + /** + * @return an array of [fuel stored, fuel capacity] + */ + private int[] getFuelAmount() { + if (getInputFluidInventory() != null) { + MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + if (recipeLogic.getInputFluidStack() != null) { + FluidStack testStack = recipeLogic.getInputFluidStack().copy(); + testStack.amount = Integer.MAX_VALUE; + return getTotalFluidAmount(testStack, getInputFluidInventory()); + } } + return new int[2]; } - @Override - public void addBarHoverText(List hoverList, int index) { - if (index == 0) { - addFuelText(hoverList); - } else if (index == 1) { - // Lubricant - int lubricantStored = 0; - int lubricantCapacity = 0; - if (isStructureFormed() && getInputFluidInventory() != null) { - // Hunt for tanks with lubricant in them - int[] lubricantAmount = getTotalFluidAmount(Materials.Lubricant.getFluid(Integer.MAX_VALUE), - getInputFluidInventory()); - lubricantStored = lubricantAmount[0]; - lubricantCapacity = lubricantAmount[1]; - } + /** + * @return an array of [lubricant stored, lubricant capacity] + */ + private int[] getLubricantAmount() { + if (getInputFluidInventory() != null) { + return getTotalFluidAmount(Materials.Lubricant.getFluid(Integer.MAX_VALUE), + getInputFluidInventory()); + } + return new int[2]; + } - ITextComponent lubricantInfo = TextComponentUtil.stringWithColor( - TextFormatting.GOLD, - TextFormattingUtil.formatNumbers(lubricantStored) + " / " + - TextFormattingUtil.formatNumbers(lubricantCapacity) + " L"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.large_combustion_engine.lubricant_amount", - lubricantInfo)); - } else { - // Oxygen/LOX + /** + * @return an array of [oxygen stored, oxygen capacity] + */ + private int[] getOxygenAmount() { + if (getInputFluidInventory() != null) { if (isBoostAllowed()) { - int oxygenStored = 0; - int oxygenCapacity = 0; - if (isStructureFormed() && getInputFluidInventory() != null) { - // Hunt for tanks with Oxygen or LOX (depending on tier) in them - FluidStack oxygenStack = isExtreme ? - Materials.Oxygen.getFluid(FluidStorageKeys.LIQUID, Integer.MAX_VALUE) : - Materials.Oxygen.getFluid(Integer.MAX_VALUE); - int[] oxygenAmount = getTotalFluidAmount(oxygenStack, getInputFluidInventory()); - oxygenStored = oxygenAmount[0]; - oxygenCapacity = oxygenAmount[1]; - } - - ITextComponent oxygenInfo = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(oxygenStored) + " / " + - TextFormattingUtil.formatNumbers(oxygenCapacity) + " L"); - String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount" : - "gregtech.multiblock.large_combustion_engine.oxygen_amount"; - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, key, oxygenInfo)); - } else { - String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed" : - "gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed"; - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, key)); + FluidStack oxygenStack = isExtreme ? + Materials.Oxygen.getFluid(FluidStorageKeys.LIQUID, Integer.MAX_VALUE) : + Materials.Oxygen.getFluid(Integer.MAX_VALUE); + return getTotalFluidAmount(oxygenStack, getInputFluidInventory()); } } + return new int[2]; } private static class LargeCombustionEngineWorkableHandler extends MultiblockFuelRecipeLogic { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 16522799167..f0f6e2138c5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -4,12 +4,13 @@ import gregtech.api.capability.IRotorHolder; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -25,18 +26,24 @@ import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +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.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; public class MetaTileEntityLargeTurbine extends FuelMultiblockController - implements ITieredMetaTileEntity, IProgressBarMultiblock { + implements ITieredMetaTileEntity, ProgressBarMultiblock { public final int tier; @@ -256,114 +263,150 @@ public boolean canVoidRecipeFluidOutputs() { } @Override - protected boolean shouldShowVoidingModeButton() { + public boolean shouldShowVoidingModeButton() { return false; } @Override - public int getNumProgressBars() { + public int getProgressBarCount() { return 3; } @Override - public double getFillPercentage(int index) { - if (index == 0) { - int[] fuelAmount = new int[2]; - if (getInputFluidInventory() != null) { - MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - if (recipeLogic.getInputFluidStack() != null) { - FluidStack testStack = recipeLogic.getInputFluidStack().copy(); - testStack.amount = Integer.MAX_VALUE; - fuelAmount = getTotalFluidAmount(testStack, getInputFluidInventory()); - } + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + return switch (index) { + case 0 -> { + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null, 2); + StringSyncValue fuelNameValue = new StringSyncValue(() -> { + FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); + if (stack == null) { + return null; + } + Fluid fluid = stack.getFluid(); + if (fluid == null) { + return null; + } + return fluid.getName(); + }, null); + panelSyncManager.syncValue("fuel_amount", fuelValue); + panelSyncManager.syncValue("fuel_name", fuelNameValue); + + yield new ProgressWidget() + .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : + 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } - return fuelAmount[1] != 0 ? 1.0 * fuelAmount[0] / fuelAmount[1] : 0; - } else if (index == 1) { - IRotorHolder rotorHolder = getRotorHolder(); - return rotorHolder != null ? 1.0 * rotorHolder.getRotorSpeed() / rotorHolder.getMaxRotorHolderSpeed() : 0; - } else { - IRotorHolder rotorHolder = getRotorHolder(); - return rotorHolder != null ? 1.0 * rotorHolder.getRotorDurabilityPercent() / 100 : 0; - } - } - - @Override - public TextureArea getProgressBarTexture(int index) { - if (index == 0) { - return GuiTextures.PROGRESS_BAR_LCE_FUEL; - } else if (index == 1) { - return GuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED; - } else { - return GuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY; - } - } + case 1 -> { + IntSyncValue rotorSpeedValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getRotorSpeed(); + }, null); - @Override - public void addBarHoverText(List hoverList, int index) { - if (index == 0) { - // Fuel - addFuelText(hoverList); - } else if (index == 1) { - // Rotor speed - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null || rotorHolder.getRotorEfficiency() <= 0) { - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.turbine.no_rotor")); - } else { - int rotorSpeed = rotorHolder.getRotorSpeed(); - int rotorMaxSpeed = rotorHolder.getMaxRotorHolderSpeed(); - ITextComponent rpmTranslated = TextComponentUtil.translationWithColor( - getRotorSpeedColor(rotorSpeed, rotorMaxSpeed), - "gregtech.multiblock.turbine.rotor_rpm_unit_name"); - ITextComponent rotorInfo = TextComponentUtil.translationWithColor( - getRotorSpeedColor(rotorSpeed, rotorMaxSpeed), - "%s / %s %s", - TextFormattingUtil.formatNumbers(rotorSpeed), - TextFormattingUtil.formatNumbers(rotorMaxSpeed), - rpmTranslated); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.turbine.rotor_speed", - rotorInfo)); + IntSyncValue rotorMaxSpeedValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getMaxRotorHolderSpeed(); + }, null); + + panelSyncManager.syncValue("rotor_speed", rotorSpeedValue); + panelSyncManager.syncValue("rotor_max_speed", rotorMaxSpeedValue); + + yield new ProgressWidget() + .progress(() -> rotorMaxSpeedValue.getIntValue() == 0 ? 0 : + 1.0 * rotorSpeedValue.getIntValue() / rotorMaxSpeedValue.getIntValue()) + .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + int speed = rotorSpeedValue.getIntValue(); + int maxSpeed = rotorMaxSpeedValue.getIntValue(); + float percent = maxSpeed == 0 ? 0 : 1.0f * speed / maxSpeed; + + // TODO working dynamic color substitutions into IKey.lang + if (percent < 0.4) { + t.addLine( + IKey.lang("gregtech.multiblock.turbine.rotor_speed.low", speed, maxSpeed)); + } else if (percent < 0.8) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_speed.medium", speed, + maxSpeed)); + } else { + t.addLine( + IKey.lang("gregtech.multiblock.turbine.rotor_speed.high", speed, maxSpeed)); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } - } else { - // Rotor durability - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null || rotorHolder.getRotorEfficiency() <= 0) { - // No rotor found - hoverList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.turbine.no_rotor")); - } else { - int rotorDurability = rotorHolder.getRotorDurabilityPercent(); - ITextComponent rotorInfo = TextComponentUtil.stringWithColor( - getRotorDurabilityColor(rotorDurability), - rotorDurability + "%"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.turbine.rotor_durability", - rotorInfo)); + case 2 -> { + IntSyncValue durabilityValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getRotorDurabilityPercent(); + }, null); + IntSyncValue efficiencyValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getRotorEfficiency(); + }, null); + + panelSyncManager.syncValue("rotor_durability", durabilityValue); + panelSyncManager.syncValue("rotor_efficiency", efficiencyValue); + + yield new ProgressWidget() + .progress(() -> durabilityValue.getIntValue() / 100.0) + .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY, + MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipBuilder(t -> { + t.setAutoUpdate(true); + if (isStructureFormed()) { + if (efficiencyValue.getIntValue() <= 0) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.no_rotor")); + } else { + int durability = durabilityValue.getIntValue(); + // TODO working dynamic color substitutions into IKey.lang + if (durability > 40) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.high", + durability)); + } else if (durability > MIN_DURABILITY_TO_WARN) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.medium", + durability)); + } else { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.low", + durability)); + } + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + }); } - } + default -> throw new IllegalStateException("Invalid index received " + index); + }; } - private TextFormatting getRotorDurabilityColor(int durability) { - if (durability > 40) { - return TextFormatting.GREEN; - } else if (durability > MIN_DURABILITY_TO_WARN) { - return TextFormatting.YELLOW; - } else { - return TextFormatting.RED; - } - } - - private TextFormatting getRotorSpeedColor(int rotorSpeed, int maxRotorSpeed) { - double speedRatio = 1.0 * rotorSpeed / maxRotorSpeed; - if (speedRatio < 0.4) { - return TextFormatting.RED; - } else if (speedRatio < 0.8) { - return TextFormatting.YELLOW; - } else { - return TextFormatting.GREEN; + /** + * @return an array of [fuel stored, fuel capacity] + */ + private int[] getFuelAmount() { + if (getInputFluidInventory() != null) { + MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + if (recipeLogic.getInputFluidStack() != null) { + FluidStack testStack = recipeLogic.getInputFluidStack().copy(); + testStack.amount = Integer.MAX_VALUE; + return getTotalFluidAmount(testStack, getInputFluidInventory()); + } } + return new int[2]; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index ce931470e6a..9cf39460989 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -267,9 +267,9 @@ public boolean usesMui2() { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { int rowSize = (int) Math.sqrt(getInventorySize()); - guiSyncManager.registerSlotGroup("item_inv", rowSize); + panelSyncManager.registerSlotGroup("item_inv", rowSize); int backgroundWidth = Math.max( 9 * 18 + 18 + 14 + 5, // Player Inv width @@ -297,9 +297,9 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) } BooleanSyncValue workingStateValue = new BooleanSyncValue(() -> workingEnabled, val -> workingEnabled = val); - guiSyncManager.syncValue("working_state", workingStateValue); + panelSyncManager.syncValue("working_state", workingStateValue); BooleanSyncValue collapseStateValue = new BooleanSyncValue(() -> autoCollapse, val -> autoCollapse = val); - guiSyncManager.syncValue("collapse_state", collapseStateValue); + panelSyncManager.syncValue("collapse_state", collapseStateValue); boolean hasGhostCircuit = hasGhostCircuitInventory() && this.circuitInventory != null; diff --git a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java index 633ca974bac..c73bcb442a9 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamItemBus.java @@ -87,8 +87,8 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { - guiSyncManager.registerSlotGroup("item_inv", 2); + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + panelSyncManager.registerSlotGroup("item_inv", 2); List> widgets = new ArrayList<>(); for (int i = 0; i < 2; i++) { diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java index d837e3bcd80..e4a8392b074 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityCrate.java @@ -140,8 +140,8 @@ public boolean usesMui2() { } @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { - guiSyncManager.registerSlotGroup("item_inv", rowSize); + public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + panelSyncManager.registerSlotGroup("item_inv", rowSize); int rows = inventorySize / rowSize; List> widgets = new ArrayList<>(); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 3f0ed24b9d8..99b69220bd2 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5660,10 +5660,10 @@ gregtech.gui.fluid_voiding.tooltip.enabled=Excess Fluid Voiding Enabled gregtech.gui.fluid_voiding.tooltip.disabled=Excess Fluid Voiding Disabled gregtech.gui.item_voiding.tooltip.enabled=Excess Item Voiding Enabled gregtech.gui.item_voiding.tooltip.disabled=Excess Item Voiding Disabled -gregtech.gui.multiblock_item_voiding=Voiding Mode/n§7Voiding §6Items -gregtech.gui.multiblock_fluid_voiding=Voiding Mode/n§7Voiding §9Fluids -gregtech.gui.multiblock_item_fluid_voiding=Voiding Mode/n§7Voiding §6Items §7and §9Fluids -gregtech.gui.multiblock_no_voiding=Voiding Mode/n§7Voiding Nothing +gregtech.gui.multiblock_item_voiding=Voiding Mode\n§7Voiding §6Items +gregtech.gui.multiblock_fluid_voiding=Voiding Mode\n§7Voiding §9Fluids +gregtech.gui.multiblock_item_fluid_voiding=Voiding Mode\n§7Voiding §6Items §7and §9Fluids +gregtech.gui.multiblock_no_voiding=Voiding Mode\n§7Voiding Nothing gregtech.gui.multiblock_voiding_not_supported=This Multiblock does not support Voiding Mode gregtech.gui.me_network.online=Network: §aOnline§r gregtech.gui.me_network.offline=Network: §4Offline§r @@ -5799,7 +5799,7 @@ gregtech.multiblock.idling=Idling. gregtech.multiblock.not_enough_energy=Machine needs more energy! gregtech.multiblock.not_enough_energy_output=Energy Dynamo Tier Too Low! gregtech.multiblock.progress=Progress: %s%% -gregtech.multiblock.invalid_structure=Invalid structure. +gregtech.multiblock.invalid_structure=§cInvalid structure. gregtech.multiblock.invalid_structure.tooltip=This block is a controller of the multiblock structure. For building help, see structure template in JEI. gregtech.multiblock.validation_failed=Invalid amount of inputs/outputs. gregtech.multiblock.max_energy_per_tick=Max EU/t: %s (%s) @@ -5819,16 +5819,17 @@ gregtech.multiblock.universal.problem.wire_cutter=Wires burned out. (Wire Cutter gregtech.multiblock.universal.problem.crowbar=That doesn't belong there. (Crowbar) gregtech.multiblock.universal.muffler_obstructed=Muffler Hatch is Obstructed! gregtech.multiblock.universal.muffler_obstructed_desc=Muffler Hatch must have a block of airspace in front of it. -gregtech.multiblock.universal.distinct_enabled=Distinct Buses: §aEnabled§r/nEach Item Input Bus will be treated separately for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc. -gregtech.multiblock.universal.distinct_disabled=Distinct Buses: §cDisabled§r/nEach Item Input Bus will be treated as a combined input for recipe lookup. +gregtech.multiblock.universal.distinct_enabled=Distinct Buses: §aEnabled§r\nEach Item Input Bus will be treated separately for recipe lookup. Useful for things like Programmed Circuits, Extruder Shapes, etc. +gregtech.multiblock.universal.distinct_disabled=Distinct Buses: §cDisabled§r\nEach Item Input Bus will be treated as a combined input for recipe lookup. gregtech.multiblock.universal.distinct_not_supported=This Multiblock does not support Distinct Buses gregtech.multiblock.universal.no_flex_button=This Multiblock has no additional functionality with this Button. gregtech.multiblock.parallel=Max Parallels: %s gregtech.multiblock.multiple_recipemaps.header=Machine Mode: +gregtech.multiblock.multiple_recipemaps.value=Machine Mode: %s gregtech.multiblock.multiple_recipemaps.tooltip=Screwdriver the controller to change which machine mode to use. gregtech.multiblock.multiple_recipemaps_recipes.tooltip=Machine Modes: §e%s§r gregtech.multiblock.multiple_recipemaps.switch_message=The machine must be off to switch modes! -gregtech.multiblock.energy_stored=Energy: %s +gregtech.multiblock.energy_stored=§7Energy: §e%,d / %,d EU gregtech.multiblock.preview.zoom=Use mousewheel or right-click + drag to zoom gregtech.multiblock.preview.rotate=Click and drag to rotate @@ -5858,15 +5859,17 @@ gregtech.multiblock.multi_furnace.heating_coil_discount_hover=Energy usage modif gregtech.multiblock.multi_furnace.parallel_hover=Multi Smelter Parallels, determined by coil tier gregtech.multiblock.distillation_tower.distilling_fluid=Distilling %s -gregtech.multiblock.large_combustion_engine.fuel_amount=Fuel: %s -gregtech.multiblock.large_combustion_engine.no_lubricant=No Lubricant! -gregtech.multiblock.large_combustion_engine.lubricant_amount=Lubricant: %s -gregtech.multiblock.large_combustion_engine.oxygen_amount=Oxygen: %s -gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount=Liquid Oxygen: %s +gregtech.multiblock.large_combustion_engine.fuel_none=§cNo Fuel! +gregtech.multiblock.large_combustion_engine.fuel_amount=§7Fuel: %,d / %,d L (§6%s§7) +gregtech.multiblock.large_combustion_engine.no_lubricant=§cNo Lubricant! +gregtech.multiblock.large_combustion_engine.lubricant_amount=§7Lubricant: §6%,d / %,d L +gregtech.multiblock.large_combustion_engine.oxygen_none=§cNo Booster! +gregtech.multiblock.large_combustion_engine.oxygen_amount=Oxygen: §b%,d / %,d L +gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount=Liquid Oxygen: §b%,d / %,d L gregtech.multiblock.large_combustion_engine.oxygen_boosted=Oxygen boosted. gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted=Liquid Oxygen boosted. -gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed=Upgrade the Dynamo Hatch to enable Oxygen Boosting. -gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed=Upgrade the Dynamo Hatch to enable Liquid Oxygen Boosting. +gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed=§eUpgrade the Dynamo Hatch to enable Oxygen Boosting. +gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed=§eUpgrade the Dynamo Hatch to enable Liquid Oxygen Boosting. gregtech.multiblock.large_combustion_engine.supply_oxygen_to_boost=Supply Oxygen to boost. gregtech.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost=Supply Liquid Oxygen to boost. gregtech.multiblock.large_combustion_engine.obstructed=Engine Intakes Obstructed! @@ -5874,11 +5877,13 @@ gregtech.multiblock.large_combustion_engine.obstructed.desc=Engine Intakes must gregtech.multiblock.turbine.fuel_amount=Fuel: %sL %s gregtech.multiblock.turbine.fuel_needed=Consumes %s per %s ticks -gregtech.multiblock.turbine.rotor_speed=Rotor Speed: %s -gregtech.multiblock.turbine.rotor_rpm_unit_name=RPM -gregtech.multiblock.turbine.rotor_durability=Rotor Durability: %s -gregtech.multiblock.turbine.rotor_durability_low=Rotor durability low! -gregtech.multiblock.turbine.no_rotor=No Rotor in Rotor Holder! +gregtech.multiblock.turbine.rotor_speed.high=§7Rotor Speed: §a%,d / %,d RPM +gregtech.multiblock.turbine.rotor_speed.medium=§7Rotor Speed: §e%,d / %,d RPM +gregtech.multiblock.turbine.rotor_speed.low=§7Rotor Speed: §c%,d / %,d RPM +gregtech.multiblock.turbine.rotor_durability.high=§7Rotor Durability: §a%,d%% +gregtech.multiblock.turbine.rotor_durability.medium=§7Rotor Durability: §e%,d%% +gregtech.multiblock.turbine.rotor_durability.low=§cRotor durability low! +gregtech.multiblock.turbine.no_rotor=§eNo Rotor in Rotor Holder! gregtech.multiblock.turbine.efficiency=Turbine Efficiency: %s gregtech.multiblock.turbine.energy_per_tick=Output EU/t: %s (%s) gregtech.multiblock.turbine.obstructed=Turbine Face Obstructed! @@ -5888,14 +5893,15 @@ gregtech.multiblock.turbine.efficiency_tooltip=Each Rotor Holder above %s§7 add gregtech.multiblock.large_boiler.efficiency=Efficiency: %s gregtech.multiblock.large_boiler.steam_output=Steam Output: %s gregtech.multiblock.large_boiler.throttle=Throttle: %s +gregtech.multiblock.large_boiler.throttle.title=Boiler Throttle gregtech.multiblock.large_boiler.throttle.tooltip=Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time) gregtech.multiblock.large_boiler.throttle_increment=Increase throttle by §a+5%%§r/n§7Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time) gregtech.multiblock.large_boiler.throttle_decrement=Decrease throttle by §c-5%%§r/n§7Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time) gregtech.multiblock.large_boiler.rate_tooltip=§7Produces §f%d L §7of Steam with §f1 Coal gregtech.multiblock.large_boiler.heat_time_tooltip=§7Takes §f%,d seconds §7to heat up gregtech.multiblock.large_boiler.explosion_tooltip=Will explode if provided Fuel with no Water -gregtech.multiblock.large_boiler.water_bar_hover=Water: %s -gregtech.multiblock.large_boiler.no_water=No Water! +gregtech.multiblock.large_boiler.water_bar_hover=§7Water: §9%,d / %,d L +gregtech.multiblock.large_boiler.no_water=§eNo Water! gregtech.machine.miner.done=Done! gregtech.machine.miner.working=Working... @@ -5913,8 +5919,10 @@ gregtech.multiblock.miner.both_modes=Chunk Mode: §aEnabled§r/nSilk Touch Mode: gregtech.multiblock.fluid_rig.drilled_fluid=Fluid: %s gregtech.multiblock.fluid_rig.no_fluid_in_area=None in Area. gregtech.multiblock.fluid_rig.fluid_amount=Pumping Rate: %s -gregtech.multiblock.fluid_rig.vein_depletion=Vein Size: %s -gregtech.multiblock.fluid_rig.vein_depleted=Vein Depleted. +gregtech.multiblock.fluid_rig.vein_depletion.high=§7Vein Size: §a%,d%% +gregtech.multiblock.fluid_rig.vein_depletion.medium=§7Vein Size: §e%,d%% +gregtech.multiblock.fluid_rig.vein_depletion.low=§7Vein Size: §c%,d%% +gregtech.multiblock.fluid_rig.vein_depleted=§cVein Depleted. gregtech.multiblock.miner.drilling=Drilling. gregtech.multiblock.pyrolyse_oven.speed=Processing Speed: %s @@ -5949,9 +5957,11 @@ gregtech.multiblock.power_substation.under_one_hour_left=Less than 1 hour until gregtech.multiblock.data_bank.providing=Providing data. -gregtech.multiblock.hpca.computation=Providing: %s +gregtech.multiblock.hpca.computation=§7Providing: §b%,d / %,d CWU/t gregtech.multiblock.hpca.energy=Using: %s / %s EU/t (%s) -gregtech.multiblock.hpca.temperature=Temperature: %s +gregtech.multiblock.hpca.temperature.high=§7Temperature: §c%,d°C +gregtech.multiblock.hpca.temperature.medium=§7Temperature: §e%,d°C +gregtech.multiblock.hpca.temperature.low=§7Temperature: §a%,d°C gregtech.multiblock.hpca.hover_for_info=Hover for details gregtech.multiblock.hpca.error_damaged=Damaged component in structure! gregtech.multiblock.hpca.error_temperature=Temperature above 100C, components may be damaged! From 663eb20f8d1dfb3cbabb97403c96a7cee5cc27ad Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 18 Nov 2024 20:35:48 -0700 Subject: [PATCH 002/264] add KeyUtil for handling IKeys port MultiblockDisplayText to mui2 --- .../multiblock/MultiblockDisplayTextPort.java | 493 ++++++++++++++++++ src/main/java/gregtech/api/util/KeyUtil.java | 49 ++ 2 files changed, 542 insertions(+) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java create mode 100644 src/main/java/gregtech/api/util/KeyUtil.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java new file mode 100644 index 00000000000..fa2ff072c13 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -0,0 +1,493 @@ +package gregtech.api.metatileentity.multiblock; + +import gregtech.api.GTValues; +import gregtech.api.capability.IEnergyContainer; +import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.ConfigHolder; + +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.LongSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.LongSupplier; + +public class MultiblockDisplayTextPort { + + /** + * Construct a new Multiblock Display Text builder. + *
+ * Automatically adds the "Invalid Structure" line if the structure is not formed. + */ + public static Builder builder(List> textList, boolean isStructureFormed, PanelSyncManager manager) { + return builder(textList, isStructureFormed, true, manager); + } + + public static Builder builder(List> textList, boolean isStructureFormed, + boolean showIncompleteStructureWarning, PanelSyncManager manager) { + return new Builder(textList, isStructureFormed, showIncompleteStructureWarning, manager); + } + + public static class Builder { + + private final List> textList; + private Function> widgetFunction = key -> key.asWidget() + .widthRel(1f).height(12); + private final boolean isStructureFormed; + private final PanelSyncManager manager; + + private boolean isWorkingEnabled, isActive; + + // Keys for the three-state working system, can be set custom by multiblocks. + private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); + private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); + private IKey runningKey = IKey.lang("gregtech.multiblock.running"); + + private static final IKey RED = IKey.str(TextFormatting.RED.toString()); + private static final IKey GRAY = IKey.str(TextFormatting.GRAY.toString()); + private static final IKey AQUA = IKey.str(TextFormatting.AQUA.toString()); + private static final IKey RESET = IKey.str(TextFormatting.RESET.toString()); + + private Builder(List> textList, boolean isStructureFormed, + boolean showIncompleteStructureWarning, PanelSyncManager manager) { + this.textList = textList; + this.isStructureFormed = isStructureFormed; + this.manager = manager; + + if (!isStructureFormed && showIncompleteStructureWarning) { + var base = KeyUtil.coloredTranslation(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + var hover = KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.invalid_structure.tooltip"); + addKey(base).addTooltipLine(hover); + } + } + + /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ + public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { + this.isWorkingEnabled = isWorkingEnabled; + this.isActive = isActive; + return this; + } + + /** + * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. + * You still must call {@link Builder#addWorkingStatusLine()} for these to appear! + *
+ * Pass any key as null for it to continue to use the default key. + * + * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". + * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". + * @param runningKey The translation key for the Running state, or "isActive". + */ + public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { + if (idlingKey != null) this.idlingKey = IKey.str(idlingKey); + if (pausedKey != null) this.pausedKey = IKey.str(pausedKey); + if (runningKey != null) this.runningKey = IKey.str(runningKey); + return this; + } + + /** + * Adds the max EU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the passed energy container has greater than zero capacity. + */ + public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { + if (!isStructureFormed || energyContainer == null) return this; + + var capacity = syncedGetter(energyContainer::getEnergyCapacity); + manager.syncValue("energy_capacity", capacity); + capacity.updateCacheFromSource(true); + + var voltage = syncedGetter( + () -> Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage())); + manager.syncValue("energy_voltage", voltage); + voltage.updateCacheFromSource(true); + + if (capacity.getLongValue() > 0) { + long maxVoltage = voltage.getLongValue(); + + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + var bodyText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); + var hoverText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_hover"); + addKey(bodyText).addTooltipLine(hoverText); + } + return this; + } + + /** + * Adds the max Recipe Tier that this multiblock can use for recipe lookup. + *
+ * Added if the structure is formed and if the passed tier is a valid energy tier index for + * {@link GTValues#VNF}. + */ + public Builder addEnergyTierLine(int tier) { + if (!isStructureFormed) return this; + if (tier < GTValues.ULV || tier > GTValues.MAX) return this; + + var bodyText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); + var hoverText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier_hover"); + addKey(bodyText).addTooltipLine(hoverText); + return this; + } + + /** + * Adds the exact EU/t that this multiblock needs to run. + *
+ * Added if the structure is formed and if the passed value is greater than zero. + */ + public Builder addEnergyUsageExactLine(long energyUsage) { + if (!isStructureFormed) return this; + if (energyUsage > 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.unformattedString( + GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); + + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce. + *
+ * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. + */ + public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { + if (!isStructureFormed) return this; + if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.unformattedString( + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp + * outputting multis. + *
+ * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than + * zero. + */ + public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { + if (!isStructureFormed) return this; + if (maxVoltage != 0 && amperage != 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.unformattedString( + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_amps", + energyFormatted, amperage, voltageName)); + } + return this; + } + + /** + * Adds the max CWU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the max CWU/t is greater than zero. + */ + public Builder addComputationUsageLine(int maxCWUt) { + if (!isStructureFormed) return this; + if (maxCWUt > 0) { + var computation = KeyUtil.coloredString(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.computation.max", computation)); + } + return this; + } + + /** + * Adds a currently used CWU/t line. + *
+ * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. + */ + public Builder addComputationUsageExactLine(int currentCWUt) { + if (!isStructureFormed) return this; + if (isActive && currentCWUt > 0) { + var computation = KeyUtil.coloredString(TextFormatting.AQUA, + TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.computation.usage", computation)); + } + return this; + } + + /** + * Adds a three-state indicator line, showing if the machine is running, paused, or idling. + *
+ * Added if the structure is formed. + */ + public Builder addWorkingStatusLine() { + if (!isStructureFormed) return this; + + if (!isWorkingEnabled) { + return addWorkPausedLine(false); + } else if (isActive) { + return addRunningPerfectlyLine(false); + } else { + return addIdlingLine(false); + } + } + + /** + * Adds the "Work Paused." line. + *
+ * Added if working is not enabled, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addWorkPausedLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || !isWorkingEnabled) { + addKey(KeyUtil.withColor(TextFormatting.GOLD, pausedKey)); + } + return this; + } + + /** + * Adds the "Running Perfectly." line. + *
+ * Added if machine is active, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addRunningPerfectlyLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || isActive) { + addKey(KeyUtil.withColor(TextFormatting.GREEN, runningKey)); + } + return this; + } + + /** + * Adds the "Idling." line. + *
+ * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addIdlingLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || (isWorkingEnabled && !isActive)) { + addKey(KeyUtil.withColor(TextFormatting.GRAY, idlingKey)); + } + return this; + } + + /** + * Adds a simple progress line that displays progress as a percentage. + *
+ * Added if structure is formed and the machine is active. + * + * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. + */ + public Builder addProgressLine(double progressPercent) { // todo + if (!isStructureFormed || !isActive) return this; + int currentProgress = (int) (progressPercent * 100); + addKey(KeyUtil.unformattedLang("gregtech.multiblock.progress", currentProgress)); + return this; + } + + /** + * Adds a line indicating how many parallels this multi can potentially perform. + *
+ * Added if structure is formed and the number of parallels is greater than one. + */ + public Builder addParallelsLine(int numParallels) { + if (!isStructureFormed) return this; + if (numParallels > 1) { + var parallels = KeyUtil.coloredString(TextFormatting.DARK_PURPLE, + TextFormattingUtil.formatNumbers(numParallels)); + + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.parallel", parallels)); + } + return this; + } + + /** + * Adds a warning line when the machine is low on power. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowPowerLine(boolean isLowPower) { + if (!isStructureFormed) return this; + if (isLowPower) { + addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy")); + } + return this; + } + + /** + * Adds a warning line when the machine is low on computation. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowComputationLine(boolean isLowComputation) { + if (!isStructureFormed) return this; + if (isLowComputation) { + addKey(IKey.comp(IKey.str(TextFormatting.YELLOW.toString()), + IKey.lang("gregtech.multiblock.computation.not_enough_computation"))); + } + return this; + } + + /** + * Adds a warning line when the machine's dynamo tier is too low for current conditions. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowDynamoTierLine(boolean isTooLow) { + if (!isStructureFormed) return this; + if (isTooLow) { + addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy_output")); + } + return this; + } + + /** + * Adds warning line(s) when the machine has maintenance problems. + *
+ * Added if there are any maintenance problems, one line per problem as well as a header.
+ * Will check the config setting for if maintenance is enabled automatically. + */ + public Builder addMaintenanceProblemLines(byte maintenanceProblems) { + if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; + if (maintenanceProblems < 63) { + boolean hasAddedHeader = false; + + // Wrench + if ((maintenanceProblems & 1) == 0) { + hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wrench")); + } + + // Screwdriver + if (((maintenanceProblems >> 1) & 1) == 0) { + hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.screwdriver")); + } + + // Soft Mallet + if (((maintenanceProblems >> 2) & 1) == 0) { + hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.soft_mallet")); + } + + // Hammer + if (((maintenanceProblems >> 3) & 1) == 0) { + hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.hard_hammer")); + } + + // Wire Cutters + if (((maintenanceProblems >> 4) & 1) == 0) { + hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wire_cutter")); + } + + // Crowbar + if (((maintenanceProblems >> 5) & 1) == 0) { + addMaintenanceProblemHeader(hasAddedHeader); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.crowbar")); + } + } + return this; + } + + private boolean addMaintenanceProblemHeader(boolean hasAddedHeader) { + if (!hasAddedHeader) { + addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + "gregtech.multiblock.universal.has_problems")); + } + return true; + } + + /** + * Adds two error lines when the machine's muffler hatch is obstructed. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addMufflerObstructedLine(boolean isObstructed) { + if (!isStructureFormed) return this; + if (isObstructed) { + addKey(KeyUtil.coloredTranslation(TextFormatting.RED, + "gregtech.multiblock.universal.muffler_obstructed")); + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.universal.muffler_obstructed_desc")); + } + return this; + } + + /** + * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. + *
+ * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. + */ + public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + if (!isStructureFormed || !isActive || fuelName == null) return this; + + addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.turbine.fuel_needed", + KeyUtil.coloredString(TextFormatting.RED, fuelName), + KeyUtil.coloredNumber(TextFormatting.AQUA, previousRecipeDuration))); + + return this; + } + + /** Insert an empty line into the text list. */ + public Builder addEmptyLine() { + addKey(IKey.EMPTY); // this is going to cause problems maybe + return this; + } + + /** Add custom text dynamically, allowing for custom application logic. */ + public Builder addCustom(Consumer> customConsumer) { + customConsumer.accept(this::addKey); + return this; + } + + private Widget addKey(IKey key) { + var w = this.widgetFunction.apply(key); + this.textList.add(w); + return w; + } + + private static LongSyncValue syncedGetter(LongSupplier getter) { + return new LongSyncValue(getter, l -> {}); + } + + public Builder widgetFunction(Function> widgetFunction) { + this.widgetFunction = widgetFunction; + return this; + } + } +} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java new file mode 100644 index 00000000000..2c32c66ff9f --- /dev/null +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -0,0 +1,49 @@ +package gregtech.api.util; + +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; + +public class KeyUtil { + + public static final IKey RESET = toColor(TextFormatting.RESET); + + public static IKey toColor(TextFormatting formatting) { + return IKey.str(formatting.toString()); + } + + public static IKey withColor(TextFormatting formatting, IKey... keys) { + if (keys == null) return toColor(formatting); + if (keys.length == 1) return IKey.comp(toColor(formatting), keys[0], RESET); + return IKey.comp(toColor(formatting), IKey.comp(keys), RESET); + } + + public static IKey coloredTranslation(TextFormatting formatting, String lang, Object... args) { + if (args == null || args.length == 0) return withColor(formatting, IKey.lang(lang)); + Object[] fixedArgs = new Object[args.length]; + for (int i = 0; i < args.length; i++) { + fixedArgs[i] = IKey.str(args[i].toString() + formatting); + } + return withColor(formatting, IKey.lang(lang, fixedArgs)); + } + + public static IKey coloredString(TextFormatting formatting, String string) { + return IKey.comp(toColor(formatting), IKey.str(string), RESET); + } + + public static IKey coloredNumber(TextFormatting formatting, long number) { + return coloredString(formatting, TextFormattingUtil.formatNumbers(number)); + } + + public static IKey coloredNumber(TextFormatting formatting, long number, String suffix) { + return coloredString(formatting, TextFormattingUtil.formatNumbers(number) + suffix); + } + + public static IKey unformattedString(String s) { + return coloredString(TextFormatting.RESET, s); + } + + public static IKey unformattedLang(String lang, Object... args) { + return coloredTranslation(TextFormatting.RESET, lang, args); + } +} From f76bf7e45216bbb638fd6a318ad1fff73e79dbc1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 18 Nov 2024 20:38:55 -0700 Subject: [PATCH 003/264] multiblocks have `createUIFactory` to override for custom ui almost everything mui2 related is moved into MultiblockUIFactory fix issues with cyclebutton widget textures fix syncing (at least for EBF) probably other things i don't feel like writing about --- .../MultiMapMultiblockController.java | 43 ++- .../multiblock/MultiblockWithDisplayBase.java | 30 +- .../RecipeMapMultiblockController.java | 39 +++ .../multiblock/ui/MultiblockUIFactory.java | 312 ++++++++++-------- .../java/gregtech/api/mui/GTGuiTextures.java | 29 +- .../multi/MetaTileEntityLargeBoiler.java | 90 ++--- .../MetaTileEntityElectricBlastFurnace.java | 63 ++++ 7 files changed, 378 insertions(+), 228 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 46d566082b9..0b1d5a606e9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -3,6 +3,7 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IMultipleRecipeMaps; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.RecipeMap; @@ -24,7 +25,6 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; @@ -137,23 +137,30 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM } @Override - public void createExtraButtons(@NotNull ModularPanel parentPanel, @NotNull PanelSyncManager panelSyncManager, - @NotNull List> list) { - if (getAvailableRecipeMaps() != null && getAvailableRecipeMaps().length > 1) { - IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); - panelSyncManager.syncValue("recipemap_state", recipeMapValue); - list.add(new CycleButtonWidget() - .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) - .background(GTGuiTextures.BUTTON) - .disableHoverBackground() // TODO find out why this needs to be called - .value(new IntValue.Dynamic(recipeMapValue::getIntValue, recipeMapValue::setIntValue)) - .length(getAvailableRecipeMaps().length) - .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(IKey.comp( - IKey.lang("gregtech.multiblock.multiple_recipemaps.value", - IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] - .getTranslationKey())))))); - } + protected MultiblockUIFactory createUIFactory() { + IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); + return new MultiblockUIFactory<>(this) { + + @Override + public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { + if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) + return null; + + return new CycleButtonWidget() + .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) + .background(GTGuiTextures.BUTTON) + // TODO find out why this needs to be called + .disableHoverBackground() + .value(recipeMapValue) + .length(getAvailableRecipeMaps().length) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(IKey.comp( + IKey.lang("gregtech.multiblock.multiple_recipemaps.value", + IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] + .getTranslationKey()))))); + } + }; } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 8d4db51fc29..a49d8b0818a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -5,7 +5,6 @@ import gregtech.api.capability.*; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.Widget; import gregtech.api.gui.Widget.ClickData; import gregtech.api.gui.resources.TextureArea; import gregtech.api.gui.widgets.AdvancedTextWidget; @@ -49,6 +48,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; + private final MultiblockUIFactory uiFactory; private boolean voidingItems = false; private boolean voidingFluids = false; @@ -88,6 +88,7 @@ public MultiblockWithDisplayBase(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.maintenance_problems = 0b000000; this.voidingMode = VoidingMode.VOID_NONE; + this.uiFactory = createUIFactory(); } /** @@ -471,29 +472,14 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no * additional functionality for this Multiblock. *
- * Size will be 18x18. - * - * @param parentPanel the parent panel containing the button - * @param panelSyncManager the sync manager for synchronizing widgets - * @param list the list of widgets to append to - */ - public void createExtraButtons(@NotNull ModularPanel parentPanel, - @NotNull PanelSyncManager panelSyncManager, - @NotNull List> list) {} - - /** - * Add a custom third button to the Multiblock UI. By default, this is a placeholder - * stating that there is no additional functionality for this Multiblock. - *
*
* Parameters should be passed directly to the created widget. Size will be 18x18. * - * @deprecated {@link #createExtraButtons(ModularPanel, PanelSyncManager, List)} + * @deprecated {@link #createFlexButton(ModularPanel, PanelSyncManager)} */ @Deprecated @SuppressWarnings("SameParameterValue") - @NotNull - protected Widget getFlexButton(int x, int y, int width, int height) { + protected gregtech.api.gui.@NotNull Widget getFlexButton(int x, int y, int width, int height) { return new ImageWidget(x, y, width, height, GuiTextures.BUTTON_NO_FLEX) .setTooltip("gregtech.multiblock.universal.no_flex_button"); } @@ -563,9 +549,13 @@ public boolean usesMui2() { return true; } + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory<>(this); + } + @Override - public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - return new MultiblockUIFactory<>(this, guiData, panelSyncManager).buildUI(); + public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + return this.uiFactory.buildUI(guiData, panelSyncManager); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 02ba5655857..6244272518c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -1,9 +1,11 @@ package gregtech.api.metatileentity.multiblock; import gregtech.api.GTValues; +import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IDistinctBusController; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.impl.EnergyContainerHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; @@ -42,6 +44,7 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDisplayBase implements IDataInfoProvider, ICleanroomReceiver, IDistinctBusController { + public static final int UPDATE_ENERGY = GregtechDataCodes.assignId(); public final RecipeMap recipeMap; protected MultiblockRecipeLogic recipeMapWorkable; protected IItemHandlerModifiable inputInventory; @@ -102,6 +105,13 @@ public boolean checkRecipe(@NotNull Recipe recipe, boolean consumeIfSuccess) { protected void formStructure(PatternMatchContext context) { super.formStructure(context); initializeAbilities(); + writeCustomData(UPDATE_ENERGY, buf -> { + buf.writeLong(energyContainer.getEnergyCapacity()); + buf.writeLong(energyContainer.getInputVoltage()); + buf.writeLong(energyContainer.getInputAmperage()); + buf.writeLong(energyContainer.getOutputVoltage()); + buf.writeLong(energyContainer.getOutputAmperage()); + }); } @Override @@ -254,12 +264,41 @@ public void readFromNBT(NBTTagCompound data) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeBoolean(isDistinct); + buf.writeLong(energyContainer.getEnergyCapacity()); + buf.writeLong(energyContainer.getInputVoltage()); + buf.writeLong(energyContainer.getInputAmperage()); + buf.writeLong(energyContainer.getOutputVoltage()); + buf.writeLong(energyContainer.getOutputAmperage()); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); isDistinct = buf.readBoolean(); + + long capacity = buf.readLong(), + inVoltage = buf.readLong(), + inAmps = buf.readLong(), + outVoltage = buf.readLong(), + outAmps = buf.readLong(); + + this.energyContainer = new EnergyContainerHandler(this, capacity, + inVoltage, inAmps, outVoltage, outAmps); + } + + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == UPDATE_ENERGY) { + long capacity = buf.readLong(), + inVoltage = buf.readLong(), + inAmps = buf.readLong(), + outVoltage = buf.readLong(), + outAmps = buf.readLong(); + + this.energyContainer = new EnergyContainerHandler(this, capacity, + inVoltage, inAmps, outVoltage, outAmps); + } } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 06310666c69..d1beb842fdd 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -3,30 +3,30 @@ import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.IDistinctBusController; +import gregtech.api.metatileentity.multiblock.MultiblockDisplayTextPort; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.value.BoolValue; -import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.ButtonWidget; +import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; import com.cleanroommc.modularui.widgets.CycleButtonWidget; -import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -35,11 +35,6 @@ public class MultiblockUIFactory { private final T mte; - protected ModularPanel rootPanel; - - protected final PosGuiData guiData; - protected final PanelSyncManager panelSyncManager; - protected final Column rootColumn = new Column(); protected final Row screenRow = new Row(); @@ -49,24 +44,78 @@ public class MultiblockUIFactory { protected final Column buttonColumn = new Column(); - public MultiblockUIFactory(@NotNull T mte, @NotNull PosGuiData guiData, - @NotNull PanelSyncManager panelSyncManager) { + public MultiblockUIFactory(@NotNull T mte) { this.mte = mte; - this.guiData = guiData; - this.panelSyncManager = panelSyncManager; } - public @NotNull ModularPanel buildUI() { - this.rootPanel = createRootPanel().child(rootColumn); + public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + var list = new ArrayList>(); + configureDisplayText(list, panelSyncManager); + var displayText = new Column() + .padding(4, 4); + + list.forEach(displayText::child); + + var panel = createRootPanel(); - createBars(); - createScreen(); + // todo indicator widget + // IndicatorImageWidget(174, 101, 17, 17, getLogo()) + // .setWarningStatus(getWarningLogo(), this::addWarningText) + // .setErrorStatus(getErrorLogo(), this::addErrorText)) + + // todo voiding mode button + // ImageCycleButtonWidget(173, 161, 18, 18) + + // createBars(); // TODO createExtras() hook for overrides? - createInventory(); - createButtons(); - createPowerButton(); + // createInventory(); + + return panel.child(createScreen() + .child(displayText)) + .child(new Row() + .child(SlotGroupWidget.playerInventory().left(4)) + .child(createButtons(panel, panelSyncManager))); + } - return rootPanel; + /** + * Returns a list of text indicating any current warnings in this Multiblock. + * Recommended to only display warnings if the structure is already formed. + */ + protected void configureWarningText(List> textList, PanelSyncManager manager) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false, manager) + .addMaintenanceProblemLines(mte.getMaintenanceProblems()); + } + + /** + * Returns a list of translation keys indicating any current errors in this Multiblock. + * Prioritized over any warnings provided by {@link #configureWarningText(List, PanelSyncManager)}. + */ + protected void configureErrorText(List> textList, PanelSyncManager manager) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), manager) + .addMufflerObstructedLine(mte.hasMufflerMechanics() && !mte.isMufflerFaceFree()); + } + + /** + * Called serverside to obtain text displayed in GUI + * each element of list is displayed on new line + * to use translation, use TextComponentTranslation + */ + protected void configureDisplayText(List> textList, PanelSyncManager manager) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), manager); + } + + /** + * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no + * additional functionality for this Multiblock. + *
+ * Size will be 18x18. + * + * @param mainPanel the main panel, needed for creating popup panels + * @param panelSyncManager the sync manager for synchronizing widgets + */ + public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { + return null; } protected @NotNull ModularPanel createRootPanel() { @@ -106,23 +155,22 @@ protected void createBars() { } for (int i = from; i < to; i++) { - row.top(screenHeight + 6) - .child(progressMulti.createProgressBar(panelSyncManager, i) - .height(Bars.HEIGHT) - .width(cols == 3 ? Bars.THIRD_WIDTH : cols == 2 ? Bars.HALF_WIDTH : Bars.FULL_WIDTH) - .direction(ProgressWidget.Direction.RIGHT)); + // row.top(screenHeight + 6) + // .child(progressMulti.createProgressBar(panelSyncManager, i) + // .height(Bars.HEIGHT) + // .width(cols == 3 ? Bars.THIRD_WIDTH : cols == 2 ? Bars.HALF_WIDTH : Bars.FULL_WIDTH) + // .direction(ProgressWidget.Direction.RIGHT)); } column.child(row); } } - protected void createScreen() { - screenRow.size(Screen.WIDTH, screenHeight) - .left(4) - .top(4) - .background(GTGuiTextures.DISPLAY); - rootColumn.child(screenRow); + protected ParentWidget createScreen() { + return new ScrollWidget<>(new VerticalScrollData()) + .background(GTGuiTextures.DISPLAY) + .size(190, 109) + .pos(4, 4); } protected void createInventory() { @@ -139,138 +187,130 @@ protected void createInventory() { rootColumn.child(inventoryRow); } - protected void createButtons() { - buttonColumn.size(18, 54) - .right(3) - .top(0); - inventoryRow.child(buttonColumn); - - createExtraButton(); - createDistinctButton(); - createVoidingButton(); - } - - protected void createExtraButton() { - List> list = new ArrayList<>(); - mte.createExtraButtons(rootPanel, panelSyncManager, list); - if (list.isEmpty()) { - list.add(new Widget<>() - .background(GTGuiTextures.BUTTON) - .overlay(GTGuiTextures.BUTTON_NO_FLEX) - .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")))); - } - - if (list.size() == 1) { - buttonColumn.child(list.get(0).size(18, 18)); - return; + @NotNull + protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { + var flexButton = createFlexButton(mainPanel, panelSyncManager); + if (flexButton == null) { + // 173, 125, 18, 18 + flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() + .size(18) + // .pos(173, 125) + .marginBottom(5); } - - PanelSyncHandler popupPanel = panelSyncManager.panel("throttle_panel", rootPanel, - (syncManager, syncHandler) -> { - ModularPanel panel = GTGuis.createPopupPanel("extra_buttons", Screen.WIDTH, screenHeight); - Row row = new Row().height(18) - .margin(4) - .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); - panel.child(row); - for (var widget : list) { - row.child(widget.size(18, 18)); - } - return panel; - }); - - buttonColumn.child(new ButtonWidget<>() - .size(18, 18) - .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) // TODO texture - .background(GTGuiTextures.BUTTON) // TODO make this work - .onMousePressed(i -> { - if (popupPanel.isPanelOpen()) { - popupPanel.closePanel(); - } else { - popupPanel.openPanel(); - } - Interactable.playButtonClickSound(); - return true; - })); + var powerButton = createPowerButton(mainPanel, panelSyncManager); + + return new Column() + .right(4) + .bottom(7) + .size(18, 77) + .child(createDistinctButton(mainPanel, panelSyncManager)) + .child(createVoidingButton(mainPanel, panelSyncManager)) + .child(flexButton) + .childIf(powerButton != null, powerButton); } - protected void createDistinctButton() { + // protected void createExtraButton() { + // List> list = new ArrayList<>(); + // mte.createExtraButtons(rootPanel, panelSyncManager, list); + // if (list.isEmpty()) { + // list.add(new Widget<>() + // .background(GTGuiTextures.BUTTON) + // .overlay(GTGuiTextures.BUTTON_NO_FLEX) + // .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")))); + // } + // + // if (list.size() == 1) { + // buttonColumn.child(list.get(0).size(18, 18)); + // return; + // } + // + // PanelSyncHandler popupPanel = panelSyncManager.panel("throttle_panel", rootPanel, + // (syncManager, syncHandler) -> { + // ModularPanel panel = GTGuis.createPopupPanel("extra_buttons", Screen.WIDTH, screenHeight); + // Row row = new Row().height(18) + // .margin(4) + // .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); + // panel.child(row); + // for (var widget : list) { + // row.child(widget.size(18, 18)); + // } + // return panel; + // }); + // + // buttonColumn.child(new ButtonWidget<>() + // .size(18, 18) + // .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) // TODO texture + // .background(GTGuiTextures.BUTTON) // TODO make this work + // .onMousePressed(i -> { + // if (popupPanel.isPanelOpen()) { + // popupPanel.closePanel(); + // } else { + // popupPanel.openPanel(); + // } + // Interactable.playButtonClickSound(); + // return true; + // })); + // } + + protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { if (mte instanceof IDistinctBusController distinct && distinct.canBeDistinct()) { BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); - panelSyncManager.syncValue("distinct_state", distinctValue); - buttonColumn.child(new CycleButtonWidget() - .top(18) + return new CycleButtonWidget() + // .top(18) .size(18, 18) - .value(new BoolValue.Dynamic(distinctValue::getBoolValue, distinctValue::setBoolValue)) + .value(distinctValue) .textureGetter( i -> i == 0 ? GTGuiTextures.BUTTON_NO_DISTINCT_BUSES : GTGuiTextures.BUTTON_DISTINCT_BUSES) .background(GTGuiTextures.BUTTON) - .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(distinctValue.getBoolValue() ? - IKey.lang("gregtech.multiblock.universal.distinct_enabled") : - IKey.lang("gregtech.multiblock.universal.distinct_disabled")))); + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? + IKey.lang("gregtech.multiblock.universal.distinct_enabled") : + IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); } else { - buttonColumn.child(new Widget<>() - .top(18) + return new Widget<>() + // .top(18) .size(18, 18) .background(GTGuiTextures.BUTTON, GTGuiTextures.BUTTON_NO_DISTINCT_BUSES) - .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")))); + .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported"))); } } - protected void createVoidingButton() { + protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (mte.shouldShowVoidingModeButton()) { IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); - panelSyncManager.syncValue("voiding_state", voidingValue); - buttonColumn.child(new CycleButtonWidget() - .top(36) + return new CycleButtonWidget() .size(18, 18) - .textureGetter(i -> switch (i) { - case 1 -> GTGuiTextures.BUTTON_VOID_ITEM; - case 2 -> GTGuiTextures.BUTTON_VOID_FLUID; - case 3 -> GTGuiTextures.BUTTON_VOID_ITEM_FLUID; - default -> GTGuiTextures.BUTTON_VOID_DISABLED; - }) + .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) .background(GTGuiTextures.BUTTON) - .value(new IntValue.Dynamic(voidingValue::getIntValue, voidingValue::setIntValue)) + .value(voidingValue) .length(4) .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue()))))); + .addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); } else { - buttonColumn.child(new Widget<>() - .top(36) + return GTGuiTextures.BUTTON_VOID_NONE.asWidget() .size(18, 18) - .background(GTGuiTextures.BUTTON, GTGuiTextures.BUTTON_VOID_NONE) - .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported")))); + .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported"))); } } - protected void createPowerButton() { + @Nullable + protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { // todo in the future, refactor so that this multis are instanceof IControllable. IControllable controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); - if (controllable != null) { - BooleanSyncValue workingStateValue = new BooleanSyncValue(controllable::isWorkingEnabled, - controllable::setWorkingEnabled); - panelSyncManager.syncValue("working_state", workingStateValue); - - Column column = new Column() - .size(18, 29) - .right(3) - .bottom(-2); - - inventoryRow.child(column); - column.child(new CycleButtonWidget() - .top(5) - .size(18, 18) - .textureGetter(i -> i == 0 ? GTGuiTextures.BUTTON_POWER_OFF : GTGuiTextures.BUTTON_POWER_ON) - .background(GTGuiTextures.BUTTON) - .value(new BoolValue.Dynamic(workingStateValue::getBoolValue, workingStateValue::setBoolValue))) - .child(new Widget<>() - .background(GTGuiTextures.BUTTON_POWER_DETAIL) - .bottom(0) - .size(18, 6)); - } + if (controllable == null) return null; + + BooleanSyncValue workingStateValue = new BooleanSyncValue(controllable::isWorkingEnabled, + controllable::setWorkingEnabled); + + return new CycleButtonWidget() + .size(18) + .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) + .disableHoverBackground() + .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) + .value(workingStateValue); } public static final class Screen { diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 849b528f3d5..1c7a842dd8d 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -362,18 +362,25 @@ public static class IDs { public static final UITexture BUTTON_CROSS = fullImage("textures/gui/widget/button_cross.png"); public static final UITexture BUTTON_REDSTONE_ON = fullImage("textures/gui/widget/button_redstone_on.png"); public static final UITexture BUTTON_REDSTONE_OFF = fullImage("textures/gui/widget/button_redstone_off.png"); - public static final UITexture BUTTON_POWER_ON = fullImage("textures/gui/widget/button_power.png", true); // TODO fix - public static final UITexture BUTTON_POWER_OFF = fullImage("textures/gui/widget/button_power.png", true); // TODO - // fix + + /** + * 0 = OFF
+ * 1 = ON
+ */ + public static final UITexture[] BUTTON_POWER = slice("textures/gui/widget/button_power.png", + 18, 36, 18, 18, true); + public static final UITexture BUTTON_POWER_DETAIL = fullImage("textures/gui/widget/button_power_detail.png", true); - public static final UITexture BUTTON_VOID_DISABLED = fullImage("textures/gui/widget/button_void_multiblock.png", - true); // TODO fix - public static final UITexture BUTTON_VOID_ITEM = fullImage("textures/gui/widget/button_void_multiblock.png", true); // TODO - // fix - public static final UITexture BUTTON_VOID_FLUID = fullImage("textures/gui/widget/button_void_multiblock.png", true); // TODO - // fix - public static final UITexture BUTTON_VOID_ITEM_FLUID = fullImage("textures/gui/widget/button_void_multiblock.png", - true); // TODO fix + + /** + * 0 = DISABLED
+ * 1 = ITEM VOID
+ * 2 = FLUID VOID
+ * 3 = VOID BOTH
+ **/ + public static final UITexture[] MULTIBLOCK_VOID = slice("textures/gui/widget/button_void_multiblock.png", + 18, 72, 18, 18, true); + public static final UITexture BUTTON_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); public static final UITexture BUTTON_DISTINCT_BUSES = fullImage("textures/gui/widget/button_distinct_buses.png", true); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 829b3226bf8..2351b3d1126 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -42,7 +42,6 @@ import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.value.IntValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -171,49 +170,54 @@ protected void addWarningText(List textList) { } @Override - public void createExtraButtons(@NotNull ModularPanel parentPanel, @NotNull PanelSyncManager panelSyncManager, - @NotNull List> list) { + protected MultiblockUIFactory createUIFactory() { IntSyncValue syncValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); - syncValue.updateCacheFromSource(true); - panelSyncManager.syncValue("boiler_throttle", syncValue); - - PanelSyncHandler panel = panelSyncManager.panel("throttle_panel", parentPanel, - (syncManager, syncHandler) -> GTGuis.createPopupPanel("boiler_throttle", 116, 53) - .child(new Row() - .pos(4, 4) - .height(16).coverChildrenWidth() - .child(new ItemDrawable(getStackForm()) - .asWidget() - .size(16) - .marginRight(4)) - .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") - .asWidget() - .heightRel(1.0f))) - .child(new Row() - // TODO add inc/dec buttons - .child(new TextFieldWidget() - .size(40, 20) - .left(38) - .top(20) - .setTextColor(Color.WHITE.darker(1)) // TODO proper color - .setNumbers(0, 100) - .value(new IntValue.Dynamic(syncValue::getIntValue, - syncValue::setIntValue)) // TODO show % sign - .background(GTGuiTextures.DISPLAY)))); - - list.add(new ButtonWidget<>() - .width(18) - .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) - .background(GTGuiTextures.BUTTON) // TODO make this work - .onMousePressed(i -> { - if (panel.isPanelOpen()) { - panel.closePanel(); - } else { - panel.openPanel(); - } - Interactable.playButtonClickSound(); - return true; - })); + return new MultiblockUIFactory<>(this) { + + @Override + public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { + PanelSyncHandler panel = panelSyncManager.panel("throttle_panel", mainPanel, + (syncManager, syncHandler) -> GTGuis.createPopupPanel("boiler_throttle", 116, 53) + .child(new Row() + .pos(4, 4) + .height(16).coverChildrenWidth() + .child(new ItemDrawable(getStackForm()) + .asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") + .asWidget() + .heightRel(1.0f))) + .child(new Row() + // TODO add inc/dec buttons + .child(new TextFieldWidget() + .size(40, 20) + .left(38) + .top(20) + // TODO proper color + .setTextColor(Color.WHITE.darker(1)) + .setNumbers(0, 100) + // TODO show % sign + .value(syncValue) + .background(GTGuiTextures.DISPLAY)))); + + return new ButtonWidget<>() + .width(18) + .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) + // TODO make this work + .background(GTGuiTextures.BUTTON) + .onMousePressed(i -> { + if (panel.isPanelOpen()) { + panel.closePanel(); + } else { + panel.openPanel(); + } + Interactable.playButtonClickSound(); + return true; + }); + } + }; } private void setThrottlePercentage(int amount) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 89c277d7c8d..decee7f6c25 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -3,6 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.IHeatingCoilBlockStats; +import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IHeatingCoil; import gregtech.api.capability.impl.HeatingCoilRecipeLogic; import gregtech.api.metatileentity.MetaTileEntity; @@ -10,7 +11,10 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; +import gregtech.api.metatileentity.multiblock.MultiblockDisplayTextPort; +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -19,6 +23,7 @@ import gregtech.api.recipes.RecipeMaps; import gregtech.api.recipes.properties.impl.TemperatureProperty; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -34,6 +39,7 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; @@ -45,17 +51,23 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.function.Consumer; import static gregtech.api.util.RelativeDirection.*; public class MetaTileEntityElectricBlastFurnace extends RecipeMapMultiblockController implements IHeatingCoil { + private static final int UPDATE_TEMP = GregtechDataCodes.assignId(); private int blastFurnaceTemperature; public MetaTileEntityElectricBlastFurnace(ResourceLocation metaTileEntityId) { @@ -68,6 +80,25 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { return new MetaTileEntityElectricBlastFurnace(metaTileEntityId); } + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeInt(blastFurnaceTemperature); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.blastFurnaceTemperature = buf.readInt(); + } + + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == UPDATE_TEMP) + this.blastFurnaceTemperature = buf.readInt(); + } + @Override protected void addDisplayText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed()) @@ -92,6 +123,37 @@ protected void addDisplayText(List textList) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } + @Override + protected MultiblockUIFactory createUIFactory() { + IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, i -> {}); + return new MultiblockUIFactory<>(this) { + + @Override + protected void configureDisplayText(List> textList, PanelSyncManager manager) { + MultiblockDisplayTextPort.builder(textList, isStructureFormed(), manager) + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(adder -> addHeatCapacity(adder, manager)) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + private void addHeatCapacity(Consumer adder, PanelSyncManager manager) { + if (isStructureFormed()) { + manager.syncValue("temperature", temp); + temp.updateCacheFromSource(true); + var heatString = KeyUtil.coloredNumber(TextFormatting.RED, + temp.getIntValue(), "K"); + + adder.accept(KeyUtil.coloredTranslation(TextFormatting.GRAY, + "gregtech.multiblock.blast_furnace.max_temperature", heatString)); + } + } + }; + } + @Override protected void formStructure(PatternMatchContext context) { super.formStructure(context); @@ -104,6 +166,7 @@ protected void formStructure(PatternMatchContext context) { // the subtracted tier gives the starting level (exclusive) of the +100K heat bonus this.blastFurnaceTemperature += 100 * Math.max(0, GTUtility.getFloorTierByVoltage(getEnergyContainer().getInputVoltage()) - GTValues.MV); + writeCustomData(UPDATE_TEMP, buffer -> buffer.writeInt(this.blastFurnaceTemperature)); } @Override From 6f73ea5680113343f8ba84335fdd493b4491e0d7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 18 Nov 2024 21:44:53 -0700 Subject: [PATCH 004/264] `coloredTanslation()` -> `coloredLang()` fix distinct bus button more work on MultiblockUIFactory bars work again --- .../multiblock/MultiblockDisplayTextPort.java | 48 ++++----- .../multiblock/ui/MultiblockUIFactory.java | 99 ++++++++----------- .../java/gregtech/api/mui/GTGuiTextures.java | 9 +- src/main/java/gregtech/api/util/KeyUtil.java | 4 +- .../multi/MetaTileEntityLargeBoiler.java | 5 +- .../MetaTileEntityElectricBlastFurnace.java | 2 +- 6 files changed, 79 insertions(+), 88 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index fa2ff072c13..dbc134056f2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -62,8 +62,8 @@ private Builder(List> textList, boolean isStructureFormed, this.manager = manager; if (!isStructureFormed && showIncompleteStructureWarning) { - var base = KeyUtil.coloredTranslation(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); - var hover = KeyUtil.coloredTranslation(TextFormatting.GRAY, + var base = KeyUtil.coloredLang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + var hover = KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); addKey(base).addTooltipLine(hover); } @@ -117,9 +117,9 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { // wrap in text component to keep it from being formatted IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - var bodyText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + var bodyText = KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); - var hoverText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + var hoverText = KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); addKey(bodyText).addTooltipLine(hoverText); } @@ -136,9 +136,9 @@ public Builder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; if (tier < GTValues.ULV || tier > GTValues.MAX) return this; - var bodyText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + var bodyText = KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); - var hoverText = KeyUtil.coloredTranslation(TextFormatting.GRAY, + var hoverText = KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier_hover"); addKey(bodyText).addTooltipLine(hoverText); return this; @@ -157,7 +157,7 @@ public Builder addEnergyUsageExactLine(long energyUsage) { var voltageName = KeyUtil.unformattedString( GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); } return this; @@ -176,7 +176,7 @@ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { var voltageName = KeyUtil.unformattedString( GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); } return this; @@ -197,7 +197,7 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { var voltageName = KeyUtil.unformattedString( GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_amps", energyFormatted, amperage, voltageName)); } @@ -213,7 +213,7 @@ public Builder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; if (maxCWUt > 0) { var computation = KeyUtil.coloredString(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.computation.max", computation)); } return this; @@ -229,7 +229,7 @@ public Builder addComputationUsageExactLine(int currentCWUt) { if (isActive && currentCWUt > 0) { var computation = KeyUtil.coloredString(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.computation.usage", computation)); } return this; @@ -319,7 +319,7 @@ public Builder addParallelsLine(int numParallels) { var parallels = KeyUtil.coloredString(TextFormatting.DARK_PURPLE, TextFormattingUtil.formatNumbers(numParallels)); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.parallel", parallels)); } return this; @@ -333,7 +333,7 @@ public Builder addParallelsLine(int numParallels) { public Builder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; if (isLowPower) { - addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); } return this; @@ -361,7 +361,7 @@ public Builder addLowComputationLine(boolean isLowComputation) { public Builder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; if (isTooLow) { - addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); } return this; @@ -381,42 +381,42 @@ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { // Wrench if ((maintenanceProblems & 1) == 0) { hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wrench")); } // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.screwdriver")); } // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.soft_mallet")); } // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.hard_hammer")); } // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wire_cutter")); } // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { addMaintenanceProblemHeader(hasAddedHeader); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.crowbar")); } } @@ -425,7 +425,7 @@ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { private boolean addMaintenanceProblemHeader(boolean hasAddedHeader) { if (!hasAddedHeader) { - addKey(KeyUtil.coloredTranslation(TextFormatting.YELLOW, + addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); } return true; @@ -439,9 +439,9 @@ private boolean addMaintenanceProblemHeader(boolean hasAddedHeader) { public Builder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; if (isObstructed) { - addKey(KeyUtil.coloredTranslation(TextFormatting.RED, + addKey(KeyUtil.coloredLang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.muffler_obstructed_desc")); } return this; @@ -455,7 +455,7 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { if (!isStructureFormed || !isActive || fuelName == null) return this; - addKey(KeyUtil.coloredTranslation(TextFormatting.GRAY, + addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.coloredString(TextFormatting.RED, fuelName), KeyUtil.coloredNumber(TextFormatting.AQUA, previousRecipeDuration))); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index d1beb842fdd..5d97d34974c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -8,6 +8,9 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.util.KeyUtil; + +import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; @@ -22,6 +25,7 @@ import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; import com.cleanroommc.modularui.widgets.CycleButtonWidget; +import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.cleanroommc.modularui.widgets.layout.Row; @@ -34,15 +38,8 @@ public class MultiblockUIFactory { private final T mte; - - protected final Column rootColumn = new Column(); - - protected final Row screenRow = new Row(); - protected int screenHeight = 117; - - protected final Row inventoryRow = new Row(); - - protected final Column buttonColumn = new Column(); + protected static final int DEFAULT_HEIGHT = 202; + protected static final int DEFAULT_WIDTH = 198; public MultiblockUIFactory(@NotNull T mte) { this.mte = mte; @@ -66,14 +63,16 @@ public MultiblockUIFactory(@NotNull T mte) { // todo voiding mode button // ImageCycleButtonWidget(173, 161, 18, 18) - // createBars(); // TODO createExtras() hook for overrides? - // createInventory(); + var bars = createBars(panel, panelSyncManager); return panel.child(createScreen() .child(displayText)) + .childIf(bars != null, bars) .child(new Row() - .child(SlotGroupWidget.playerInventory().left(4)) + .bottom(7) + .height(77) + .child(SlotGroupWidget.playerInventory(0).left(4)) .child(createButtons(panel, panelSyncManager))); } @@ -96,9 +95,10 @@ protected void configureErrorText(List> textList, PanelSyncManager man } /** - * Called serverside to obtain text displayed in GUI - * each element of list is displayed on new line - * to use translation, use TextComponentTranslation + * Called on both sides to obtain text displayed in GUI
+ * Each element of list is displayed on new line
+ * To use translation, use {@link KeyUtil#coloredLang(TextFormatting, String, Object...)} + * or {@link KeyUtil#unformattedLang(String, Object...)} */ protected void configureDisplayText(List> textList, PanelSyncManager manager) { MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), manager); @@ -119,31 +119,37 @@ protected void configureDisplayText(List> textList, PanelSyncManager m } protected @NotNull ModularPanel createRootPanel() { - return GTGuis.createPanel(mte, 198, 208); + return GTGuis.createPanel(mte, DEFAULT_WIDTH, DEFAULT_HEIGHT); } - protected void createBars() { - if (!(mte instanceof ProgressBarMultiblock progressMulti)) { - return; - } + /** + * @param mainPanel the main panel, needed for creating popup panels + * @param panelSyncManager the sync manager for synchronizing widgets + */ + @Nullable + protected Column createBars(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { + if (!(mte instanceof ProgressBarMultiblock progressMulti)) return null; final int count = progressMulti.getProgressBarCount(); - if (count < 1) { - return; - } + if (count < 1) return null; + mainPanel.height(DEFAULT_HEIGHT + (Bars.HEIGHT * 2) - 2); final int rows = progressMulti.getProgressBarRows(); final int cols = progressMulti.getProgressBarCols(); - Column column = new Column(); - rootColumn.child(column); + Column column = new Column() + .padding(4, 0) + .pos(0, 114) + .widthRel(1f) + .height(Bars.HEIGHT * 2); + int rowWidth = (Bars.FULL_WIDTH / cols) - (cols - 1); for (int r = 0; r < rows; r++) { - screenHeight -= (r + 1) * 8; Row row = new Row() - .size(Bars.FULL_WIDTH, Bars.HEIGHT) - .left(4); + .widthRel(1f) + .height(Bars.HEIGHT); int from = r * cols; int to = Math.min(from + cols, cols); @@ -155,15 +161,15 @@ protected void createBars() { } for (int i = from; i < to; i++) { - // row.top(screenHeight + 6) - // .child(progressMulti.createProgressBar(panelSyncManager, i) - // .height(Bars.HEIGHT) - // .width(cols == 3 ? Bars.THIRD_WIDTH : cols == 2 ? Bars.HALF_WIDTH : Bars.FULL_WIDTH) - // .direction(ProgressWidget.Direction.RIGHT)); + row.child(progressMulti.createProgressBar(panelSyncManager, i) + .height(Bars.HEIGHT) + .width(rowWidth) + .direction(ProgressWidget.Direction.RIGHT)); } column.child(row); } + return column; } protected ParentWidget createScreen() { @@ -173,35 +179,18 @@ protected ParentWidget createScreen() { .pos(4, 4); } - protected void createInventory() { - inventoryRow.size(Screen.WIDTH, 81) - .left(4) - .bottom(3); - - Column inventory = new Column() - .child(SlotGroupWidget.playerInventory() - .left(3) - .bottom(4)); - - inventoryRow.child(inventory); - rootColumn.child(inventoryRow); - } - @NotNull protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = createFlexButton(mainPanel, panelSyncManager); if (flexButton == null) { - // 173, 125, 18, 18 flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() .size(18) - // .pos(173, 125) .marginBottom(5); } var powerButton = createPowerButton(mainPanel, panelSyncManager); return new Column() .right(4) - .bottom(7) .size(18, 77) .child(createDistinctButton(mainPanel, panelSyncManager)) .child(createVoidingButton(mainPanel, panelSyncManager)) @@ -258,22 +247,18 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); return new CycleButtonWidget() - // .top(18) .size(18, 18) .value(distinctValue) - .textureGetter( - i -> i == 0 ? GTGuiTextures.BUTTON_NO_DISTINCT_BUSES : GTGuiTextures.BUTTON_DISTINCT_BUSES) + .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) .background(GTGuiTextures.BUTTON) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? IKey.lang("gregtech.multiblock.universal.distinct_enabled") : IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); } else { - return new Widget<>() - // .top(18) + return GTGuiTextures.BUTTON_NO_DISTINCT_BUSES.asWidget() .size(18, 18) - .background(GTGuiTextures.BUTTON, GTGuiTextures.BUTTON_NO_DISTINCT_BUSES) - .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported"))); + .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 1c7a842dd8d..4c6a3ff80c0 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -382,8 +382,13 @@ public static class IDs { 18, 72, 18, 18, true); public static final UITexture BUTTON_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); - public static final UITexture BUTTON_DISTINCT_BUSES = fullImage("textures/gui/widget/button_distinct_buses.png", - true); + + /** + * 0 = DISABLED
+ * 1 = ENABLED
+ */ + public static final UITexture[] BUTTON_DISTINCT_BUSES = slice("textures/gui/widget/button_distinct_buses.png", + 18, 36, 18, 18, true); public static final UITexture BUTTON_NO_DISTINCT_BUSES = fullImage( "textures/gui/widget/button_no_distinct_buses.png", true); public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 2c32c66ff9f..d53605cb2e7 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -18,7 +18,7 @@ public static IKey withColor(TextFormatting formatting, IKey... keys) { return IKey.comp(toColor(formatting), IKey.comp(keys), RESET); } - public static IKey coloredTranslation(TextFormatting formatting, String lang, Object... args) { + public static IKey coloredLang(TextFormatting formatting, String lang, Object... args) { if (args == null || args.length == 0) return withColor(formatting, IKey.lang(lang)); Object[] fixedArgs = new Object[args.length]; for (int i = 0; i < args.length; i++) { @@ -44,6 +44,6 @@ public static IKey unformattedString(String s) { } public static IKey unformattedLang(String lang, Object... args) { - return coloredTranslation(TextFormatting.RESET, lang, args); + return coloredLang(TextFormatting.RESET, lang, args); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 2351b3d1126..05a37a6f8ea 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -171,7 +171,7 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - IntSyncValue syncValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); + IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); return new MultiblockUIFactory<>(this) { @Override @@ -191,6 +191,7 @@ protected MultiblockUIFactory createUIFactory() { .heightRel(1.0f))) .child(new Row() // TODO add inc/dec buttons + // TODO create slider widget .child(new TextFieldWidget() .size(40, 20) .left(38) @@ -199,7 +200,7 @@ protected MultiblockUIFactory createUIFactory() { .setTextColor(Color.WHITE.darker(1)) .setNumbers(0, 100) // TODO show % sign - .value(syncValue) + .value(throttleValue) .background(GTGuiTextures.DISPLAY)))); return new ButtonWidget<>() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index decee7f6c25..5927584fb87 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -147,7 +147,7 @@ private void addHeatCapacity(Consumer adder, PanelSyncManager manager) { var heatString = KeyUtil.coloredNumber(TextFormatting.RED, temp.getIntValue(), "K"); - adder.accept(KeyUtil.coloredTranslation(TextFormatting.GRAY, + adder.accept(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } } From b31ec7a7362e2a905a12927c2c04f039eea23669 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 19 Nov 2024 15:30:30 -0700 Subject: [PATCH 005/264] remove generic for MultiblockUIFactory --- .../multiblock/MultiMapMultiblockController.java | 4 ++-- .../multiblock/MultiblockWithDisplayBase.java | 6 +++--- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 6 +++--- .../metatileentities/multi/MetaTileEntityLargeBoiler.java | 4 ++-- .../multi/electric/MetaTileEntityElectricBlastFurnace.java | 5 ++--- 5 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 0b1d5a606e9..9f07b067b59 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -137,9 +137,9 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM } @Override - protected MultiblockUIFactory createUIFactory() { + protected MultiblockUIFactory createUIFactory() { IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); - return new MultiblockUIFactory<>(this) { + return new MultiblockUIFactory(this) { @Override public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index a49d8b0818a..b095d82aa91 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -48,7 +48,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; - private final MultiblockUIFactory uiFactory; + private final MultiblockUIFactory uiFactory; private boolean voidingItems = false; private boolean voidingFluids = false; @@ -549,8 +549,8 @@ public boolean usesMui2() { return true; } - protected MultiblockUIFactory createUIFactory() { - return new MultiblockUIFactory<>(this); + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory(this); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 5d97d34974c..6b67301d682 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -35,13 +35,13 @@ import java.util.ArrayList; import java.util.List; -public class MultiblockUIFactory { +public class MultiblockUIFactory { - private final T mte; + private final MultiblockWithDisplayBase mte; protected static final int DEFAULT_HEIGHT = 202; protected static final int DEFAULT_WIDTH = 198; - public MultiblockUIFactory(@NotNull T mte) { + public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 05a37a6f8ea..74001955450 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -170,9 +170,9 @@ protected void addWarningText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { + protected MultiblockUIFactory createUIFactory() { IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); - return new MultiblockUIFactory<>(this) { + return new MultiblockUIFactory(this) { @Override public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 5927584fb87..dbaa0062c45 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -12,7 +12,6 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockDisplayTextPort; -import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -124,9 +123,9 @@ protected void addDisplayText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { + protected MultiblockUIFactory createUIFactory() { IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, i -> {}); - return new MultiblockUIFactory<>(this) { + return new MultiblockUIFactory(this) { @Override protected void configureDisplayText(List> textList, PanelSyncManager manager) { From 03e328d2394ec7ad5724c25afb140734bc23835e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 19 Nov 2024 16:04:59 -0700 Subject: [PATCH 006/264] initial work on indicator widget --- .../multiblock/ui/MultiblockUIFactory.java | 47 ++++++++++++++----- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 6b67301d682..2858233696a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -27,6 +27,7 @@ import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.TextWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.cleanroommc.modularui.widgets.layout.Row; import org.jetbrains.annotations.NotNull; @@ -46,12 +47,8 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { } public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - var list = new ArrayList>(); - configureDisplayText(list, panelSyncManager); - var displayText = new Column() - .padding(4, 4); - - list.forEach(displayText::child); + var displayText = new ArrayList>(); + configureDisplayText(displayText, panelSyncManager); var panel = createRootPanel(); @@ -60,14 +57,10 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { // .setWarningStatus(getWarningLogo(), this::addWarningText) // .setErrorStatus(getErrorLogo(), this::addErrorText)) - // todo voiding mode button - // ImageCycleButtonWidget(173, 161, 18, 18) - // TODO createExtras() hook for overrides? var bars = createBars(panel, panelSyncManager); - return panel.child(createScreen() - .child(displayText)) + return panel.child(createScreen(displayText, panelSyncManager)) .childIf(bars != null, bars) .child(new Row() .bottom(7) @@ -76,6 +69,25 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { .child(createButtons(panel, panelSyncManager))); } + private Widget createIndicator(PanelSyncManager syncManager) { + List> textList = new ArrayList<>(); + configureErrorText(textList, syncManager); + if (!textList.isEmpty()) + configureWarningText(textList, syncManager); + + return GTGuiTextures.GREGTECH_LOGO.asWidget() + // .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(tooltip -> { + if (textList.isEmpty()) return; + for (var w : textList) { + if (w instanceof TextWidget textWidget) + tooltip.addLine(textWidget.getKey()); + } + }) + .right(4) + .bottom(4); + } + /** * Returns a list of text indicating any current warnings in this Multiblock. * Recommended to only display warnings if the structure is already formed. @@ -172,8 +184,17 @@ protected Column createBars(@NotNull ModularPanel mainPanel, return column; } - protected ParentWidget createScreen() { - return new ScrollWidget<>(new VerticalScrollData()) + protected ParentWidget createScreen(List> lines, PanelSyncManager syncManager) { + var displayText = new Column() + .expanded() + .padding(4, 4); + + lines.forEach(displayText::child); + return new ParentWidget<>() + .child(createIndicator(syncManager)) + .child(new ScrollWidget<>(new VerticalScrollData()) + .sizeRel(1f) + .child(displayText)) .background(GTGuiTextures.DISPLAY) .size(190, 109) .pos(4, 4); From 2f2eac946c672a6a2585ba83f3500e455750c309 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 19 Nov 2024 23:43:18 -0700 Subject: [PATCH 007/264] help i am in syncing hell --- .../multiblock/MultiblockDisplayTextPort.java | 48 ++++--------------- .../multiblock/MultiblockWithDisplayBase.java | 7 ++- .../multiblock/ui/MultiblockUIFactory.java | 48 +++++++++++-------- .../MetaTileEntityElectricBlastFurnace.java | 15 ++---- .../MetaTileEntityMufflerHatch.java | 27 +++++++++++ 5 files changed, 75 insertions(+), 70 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index dbc134056f2..a7b094f32f6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -11,7 +11,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.LongSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import java.util.List; @@ -26,13 +25,13 @@ public class MultiblockDisplayTextPort { *
* Automatically adds the "Invalid Structure" line if the structure is not formed. */ - public static Builder builder(List> textList, boolean isStructureFormed, PanelSyncManager manager) { - return builder(textList, isStructureFormed, true, manager); + public static Builder builder(List> textList, boolean isStructureFormed) { + return builder(textList, isStructureFormed, true); } public static Builder builder(List> textList, boolean isStructureFormed, - boolean showIncompleteStructureWarning, PanelSyncManager manager) { - return new Builder(textList, isStructureFormed, showIncompleteStructureWarning, manager); + boolean showIncompleteStructureWarning) { + return new Builder(textList, isStructureFormed, showIncompleteStructureWarning); } public static class Builder { @@ -41,7 +40,6 @@ public static class Builder { private Function> widgetFunction = key -> key.asWidget() .widthRel(1f).height(12); private final boolean isStructureFormed; - private final PanelSyncManager manager; private boolean isWorkingEnabled, isActive; @@ -50,16 +48,10 @@ public static class Builder { private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); private IKey runningKey = IKey.lang("gregtech.multiblock.running"); - private static final IKey RED = IKey.str(TextFormatting.RED.toString()); - private static final IKey GRAY = IKey.str(TextFormatting.GRAY.toString()); - private static final IKey AQUA = IKey.str(TextFormatting.AQUA.toString()); - private static final IKey RESET = IKey.str(TextFormatting.RESET.toString()); - private Builder(List> textList, boolean isStructureFormed, - boolean showIncompleteStructureWarning, PanelSyncManager manager) { + boolean showIncompleteStructureWarning) { this.textList = textList; this.isStructureFormed = isStructureFormed; - this.manager = manager; if (!isStructureFormed && showIncompleteStructureWarning) { var base = KeyUtil.coloredLang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); @@ -101,17 +93,8 @@ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String r public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { if (!isStructureFormed || energyContainer == null) return this; - var capacity = syncedGetter(energyContainer::getEnergyCapacity); - manager.syncValue("energy_capacity", capacity); - capacity.updateCacheFromSource(true); - - var voltage = syncedGetter( - () -> Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage())); - manager.syncValue("energy_voltage", voltage); - voltage.updateCacheFromSource(true); - - if (capacity.getLongValue() > 0) { - long maxVoltage = voltage.getLongValue(); + if (energyContainer.getEnergyCapacity() > 0) { + long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -376,46 +359,41 @@ public Builder addLowDynamoTierLine(boolean isTooLow) { public Builder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; if (maintenanceProblems < 63) { - boolean hasAddedHeader = false; + addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.has_problems")); // Wrench if ((maintenanceProblems & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wrench")); } // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.screwdriver")); } // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.soft_mallet")); } // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.hard_hammer")); } // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wire_cutter")); } // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { - addMaintenanceProblemHeader(hasAddedHeader); addKey(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.crowbar")); } @@ -423,14 +401,6 @@ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { return this; } - private boolean addMaintenanceProblemHeader(boolean hasAddedHeader) { - if (!hasAddedHeader) { - addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.has_problems")); - } - return true; - } - /** * Adds two error lines when the machine's muffler hatch is obstructed. *
diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index b095d82aa91..070a4a9d228 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -48,6 +48,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; + private static final int UPDATE_MAINTANENCE = GregtechDataCodes.assignId(); private final MultiblockUIFactory uiFactory; private boolean voidingItems = false; @@ -194,6 +195,7 @@ protected void formStructure(PatternMatchContext context) { maintenanceHatch = getAbilities(MultiblockAbility.MAINTENANCE_HATCH).get(0); if (maintenanceHatch.startWithoutProblems() && !initialMaintenanceDone) { this.maintenance_problems = (byte) 0b111111; + writeCustomData(UPDATE_MAINTANENCE, buffer -> buffer.writeByte(this.maintenance_problems)); this.timeActive = 0; this.initialMaintenanceDone = true; } @@ -475,7 +477,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { *
* Parameters should be passed directly to the created widget. Size will be 18x18. * - * @deprecated {@link #createFlexButton(ModularPanel, PanelSyncManager)} + * @deprecated override {@link MultiblockUIFactory#createFlexButton(ModularPanel, PanelSyncManager)} */ @Deprecated @SuppressWarnings("SameParameterValue") @@ -652,6 +654,9 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { if (dataId == IS_WORKING) { lastActive = buf.readBoolean(); } + if (dataId == UPDATE_MAINTANENCE) { + this.maintenance_problems = buf.readByte(); + } } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 2858233696a..039d39bee0c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -12,6 +12,7 @@ import net.minecraft.util.text.TextFormatting; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; @@ -48,7 +49,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { var displayText = new ArrayList>(); - configureDisplayText(displayText, panelSyncManager); + configureDisplayText(displayText); var panel = createRootPanel(); @@ -69,40 +70,47 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { .child(createButtons(panel, panelSyncManager))); } - private Widget createIndicator(PanelSyncManager syncManager) { + private Widget createIndicator() { List> textList = new ArrayList<>(); - configureErrorText(textList, syncManager); - if (!textList.isEmpty()) - configureWarningText(textList, syncManager); - - return GTGuiTextures.GREGTECH_LOGO.asWidget() + return new Widget<>() // .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .onUpdateListener(w -> { + IDrawable icon; + textList.clear(); + configureErrorText(textList); + if (textList.isEmpty()) { + configureWarningText(textList); + icon = textList.isEmpty() ? GTGuiTextures.GREGTECH_LOGO : GTGuiTextures.OREDICT_WARN; + } else { + // error + icon = GTGuiTextures.FILTER_SETTINGS_OVERLAY; + } + w.overlay(icon); + }, true) .tooltipBuilder(tooltip -> { - if (textList.isEmpty()) return; - for (var w : textList) { - if (w instanceof TextWidget textWidget) + for (var text : textList) { + if (text instanceof TextWidget textWidget) tooltip.addLine(textWidget.getKey()); } }) - .right(4) - .bottom(4); + .pos(174, 93); } /** * Returns a list of text indicating any current warnings in this Multiblock. * Recommended to only display warnings if the structure is already formed. */ - protected void configureWarningText(List> textList, PanelSyncManager manager) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false, manager) + protected void configureWarningText(List> textList) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false) .addMaintenanceProblemLines(mte.getMaintenanceProblems()); } /** * Returns a list of translation keys indicating any current errors in this Multiblock. - * Prioritized over any warnings provided by {@link #configureWarningText(List, PanelSyncManager)}. + * Prioritized over any warnings provided by {@link #configureWarningText(List)}. */ - protected void configureErrorText(List> textList, PanelSyncManager manager) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), manager) + protected void configureErrorText(List> textList) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()) .addMufflerObstructedLine(mte.hasMufflerMechanics() && !mte.isMufflerFaceFree()); } @@ -112,8 +120,8 @@ protected void configureErrorText(List> textList, PanelSyncManager man * To use translation, use {@link KeyUtil#coloredLang(TextFormatting, String, Object...)} * or {@link KeyUtil#unformattedLang(String, Object...)} */ - protected void configureDisplayText(List> textList, PanelSyncManager manager) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), manager); + protected void configureDisplayText(List> textList) { + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()); } /** @@ -191,7 +199,7 @@ protected ParentWidget createScreen(List> lines, PanelSyncManager s lines.forEach(displayText::child); return new ParentWidget<>() - .child(createIndicator(syncManager)) + .child(createIndicator()) .child(new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) .child(displayText)) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index dbaa0062c45..9070c30e4cb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -51,8 +51,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,27 +122,24 @@ protected void addDisplayText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, i -> {}); return new MultiblockUIFactory(this) { @Override - protected void configureDisplayText(List> textList, PanelSyncManager manager) { - MultiblockDisplayTextPort.builder(textList, isStructureFormed(), manager) + protected void configureDisplayText(List> textList) { + MultiblockDisplayTextPort.builder(textList, isStructureFormed()) .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(adder -> addHeatCapacity(adder, manager)) + .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(Consumer adder, PanelSyncManager manager) { + private void addHeatCapacity(Consumer adder) { if (isStructureFormed()) { - manager.syncValue("temperature", temp); - temp.updateCacheFromSource(true); var heatString = KeyUtil.coloredNumber(TextFormatting.RED, - temp.getIntValue(), "K"); + getCurrentTemperature(), "K"); adder.accept(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java index c9342d0c3a0..b374156aaef 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java @@ -1,5 +1,7 @@ package gregtech.common.metatileentities.multi.multiblockpart; +import gregtech.api.GTValues; +import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IMufflerHatch; import gregtech.api.metatileentity.ITieredMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; @@ -13,6 +15,8 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; @@ -28,6 +32,8 @@ public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart, ITieredMetaTileEntity, IMufflerHatch { + private static final int MUFFLER_OBSTRUCTED = GregtechDataCodes.assignId(); + private boolean frontFaceFree; public MetaTileEntityMufflerHatch(ResourceLocation metaTileEntityId, int tier) { @@ -48,6 +54,7 @@ public void update() { } } else if (getOffsetTimer() % 10 == 0) { this.frontFaceFree = checkFrontFaceFree(); + writeCustomData(MUFFLER_OBSTRUCTED, buffer -> buffer.writeBoolean(this.frontFaceFree)); } } @@ -73,6 +80,26 @@ private boolean checkFrontFaceFree() { return blockState.getBlock().isAir(blockState, getWorld(), frontPos) || GTUtility.isBlockSnow(blockState); } + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeBoolean(this.frontFaceFree); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.frontFaceFree = buf.readBoolean(); + } + + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == MUFFLER_OBSTRUCTED) { + this.frontFaceFree = buf.readBoolean(); + } + } + @Override public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); From 566d2f45e02f27b9a9171d8bd145ad56c0a6111d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:15:15 -0700 Subject: [PATCH 008/264] remove todo --- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 039d39bee0c..7e8eee3c6a7 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -53,11 +53,6 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { var panel = createRootPanel(); - // todo indicator widget - // IndicatorImageWidget(174, 101, 17, 17, getLogo()) - // .setWarningStatus(getWarningLogo(), this::addWarningText) - // .setErrorStatus(getErrorLogo(), this::addErrorText)) - // TODO createExtras() hook for overrides? var bars = createBars(panel, panelSyncManager); From 4b3f434123651c5daf302341cb7a2031efd6a188 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 17:07:17 -0700 Subject: [PATCH 009/264] sync certain values add ByteSyncValue implement blinking logos --- .../multiblock/ui/MultiblockUIFactory.java | 38 +++++--- .../java/gregtech/api/mui/GTGuiTextures.java | 27 +++++- .../gregtech/api/mui/sync/ByteSyncValue.java | 88 +++++++++++++++++++ 3 files changed, 141 insertions(+), 12 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/sync/ByteSyncValue.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7e8eee3c6a7..52b82093982 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -8,6 +8,7 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.ByteSyncValue; import gregtech.api.util.KeyUtil; import net.minecraft.util.text.TextFormatting; @@ -40,14 +41,28 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; + protected final BooleanSyncValue mufflerObstructed; + protected final BooleanSyncValue structureFormed; + protected final ByteSyncValue maintanence; + protected static final int DEFAULT_HEIGHT = 202; protected static final int DEFAULT_WIDTH = 198; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; + this.mufflerObstructed = new BooleanSyncValue(mte::isStructureObstructed, null); + this.structureFormed = new BooleanSyncValue(mte::isStructureFormed, null); + this.maintanence = new ByteSyncValue(mte::getMaintenanceProblems); + } + + protected void syncValues(PanelSyncManager manager) { + manager.syncValue("muffler", mufflerObstructed); + manager.syncValue("maintenance", maintanence); + manager.syncValue("structure_formed", structureFormed); } public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + syncValues(panelSyncManager); var displayText = new ArrayList>(); configureDisplayText(displayText); @@ -68,27 +83,28 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { private Widget createIndicator() { List> textList = new ArrayList<>(); return new Widget<>() - // .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .pos(174 - 5, 93 - 5) .onUpdateListener(w -> { IDrawable icon; textList.clear(); configureErrorText(textList); if (textList.isEmpty()) { configureWarningText(textList); - icon = textList.isEmpty() ? GTGuiTextures.GREGTECH_LOGO : GTGuiTextures.OREDICT_WARN; + icon = textList.isEmpty() ? + GTGuiTextures.GREGTECH_LOGO : // no error + GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; // warn } else { // error - icon = GTGuiTextures.FILTER_SETTINGS_OVERLAY; + icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; } w.overlay(icon); - }, true) + }) .tooltipBuilder(tooltip -> { for (var text : textList) { if (text instanceof TextWidget textWidget) tooltip.addLine(textWidget.getKey()); } - }) - .pos(174, 93); + }); } /** @@ -96,8 +112,8 @@ private Widget createIndicator() { * Recommended to only display warnings if the structure is already formed. */ protected void configureWarningText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false) - .addMaintenanceProblemLines(mte.getMaintenanceProblems()); + MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue(), false) + .addMaintenanceProblemLines(maintanence.getByteValue()); } /** @@ -105,8 +121,8 @@ protected void configureWarningText(List> textList) { * Prioritized over any warnings provided by {@link #configureWarningText(List)}. */ protected void configureErrorText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()) - .addMufflerObstructedLine(mte.hasMufflerMechanics() && !mte.isMufflerFaceFree()); + MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue()) + .addMufflerObstructedLine(mufflerObstructed.getBoolValue()); } /** @@ -116,7 +132,7 @@ protected void configureErrorText(List> textList) { * or {@link KeyUtil#unformattedLang(String, Object...)} */ protected void configureDisplayText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()); + MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue()); } /** diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 4c6a3ff80c0..5333a475712 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -8,6 +8,8 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.concurrent.atomic.AtomicInteger; + /** * GT MUI textures.
* Marked experimental as some of these textures may disappear or be renamed at some point @@ -43,7 +45,12 @@ public static class IDs { /** @apiNote You may want {@link GTGuiTextures#getLogo} instead. */ public static final UITexture GREGTECH_LOGO_XMAS = fullImage("textures/gui/icon/gregtech_logo_xmas.png"); public static final UITexture GREGTECH_LOGO_DARK = fullImage("textures/gui/icon/gregtech_logo_dark.png"); - // todo blinking GT logos + public static final IDrawable GREGTECH_LOGO_BLINKING_YELLOW = animated( + "textures/gui/icon/gregtech_logo_blinking_yellow.png", + 17, 34, true, 10); + public static final IDrawable GREGTECH_LOGO_BLINKING_RED = animated( + "textures/gui/icon/gregtech_logo_blinking_red.png", + 17, 34, true, 6); public static final UITexture INDICATOR_NO_ENERGY = fullImage("textures/gui/base/indicator_no_energy.png"); public static final UITexture INDICATOR_NO_STEAM_BRONZE = fullImage( @@ -579,6 +586,15 @@ private static UITexture[] slice(String path, int imageWidth, int imageHeight, i return slices; } + private static UITexture[] slice(String path, int imageWidth, int imageHeight, boolean canApplyTheme) { + int sliceSize = Math.min(imageWidth, imageHeight); + return slice(path, imageWidth, imageHeight, sliceSize, sliceSize, canApplyTheme); + } + + private static IDrawable animated(String path, int imageWidth, int imageHeight, boolean canApplyTheme, int rate) { + return dynamic(slice(path, imageWidth, imageHeight, canApplyTheme), rate); + } + private static UITexture progressBar(String path) { return progressBar(path, 20, 40, false); } @@ -607,4 +623,13 @@ private static UITexture progressBar(String path, int width, int height, boolean } return GTValues.XMAS.get() ? GREGTECH_LOGO_XMAS : GREGTECH_LOGO; } + + public static IDrawable dynamic(UITexture[] textures, int rate) { + AtomicInteger index = new AtomicInteger(); + return (context, x, y, width, height, widgetTheme) -> { + int a = (int) (context.getTick() % rate); + int i = (a == 0 ? index.getAndIncrement() : index.get()) % textures.length; + textures[i].draw(context, x, y, width, height, widgetTheme); + }; + } } diff --git a/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java b/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java new file mode 100644 index 00000000000..7156319def7 --- /dev/null +++ b/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java @@ -0,0 +1,88 @@ +package gregtech.api.mui.sync; + +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.api.value.sync.IStringSyncValue; +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public class ByteSyncValue extends ValueSyncHandler implements IStringSyncValue { + + private byte cache; + private final ByteSupplier getter; + private final ByteSetter setter; + + public ByteSyncValue(@NotNull ByteSupplier getter, @Nullable ByteSetter setter) { + this.getter = getter; + this.setter = setter; + } + + public ByteSyncValue(@NotNull ByteSupplier getter) { + this(getter, null); + } + + @Override + public void setStringValue(String value, boolean setSource, boolean sync) { + setByteValue(Byte.parseByte(value), setSource, sync); + } + + @Override + public String getStringValue() { + return String.valueOf(cache); + } + + @Override + public void setValue(Byte value, boolean setSource, boolean sync) { + setByteValue(value, setSource, sync); + } + + @Override + public boolean updateCacheFromSource(boolean isFirstSync) { + if (isFirstSync || this.getter.getByte() != this.cache) { + setByteValue(this.getter.getByte(), false, false); + return true; + } + return false; + } + + @Override + public void write(PacketBuffer buffer) throws IOException { + buffer.writeByte(this.cache); + } + + @Override + public void read(PacketBuffer buffer) throws IOException { + setByteValue(buffer.readByte(), true, false); + } + + public Byte getValue() { + return cache; + } + + public byte getByteValue() { + return cache; + } + + public void setByteValue(byte value, boolean setSource, boolean sync) { + this.cache = value; + if (setSource && this.setter != null) { + this.setter.set(value); + } + if (sync) { + sync(0, this::write); + } + } + + public interface ByteSupplier { + + byte getByte(); + } + + public interface ByteSetter { + + void set(byte b); + } +} From b78874720acd69a9a6ff9480d1809b26ec829bad Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 17:20:07 -0700 Subject: [PATCH 010/264] simplify slightly --- .../multiblock/ui/MultiblockUIFactory.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 52b82093982..79aeb1cfd2a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -85,14 +85,15 @@ private Widget createIndicator() { return new Widget<>() .pos(174 - 5, 93 - 5) .onUpdateListener(w -> { - IDrawable icon; + IDrawable icon = GTGuiTextures.GREGTECH_LOGO; textList.clear(); configureErrorText(textList); if (textList.isEmpty()) { configureWarningText(textList); - icon = textList.isEmpty() ? - GTGuiTextures.GREGTECH_LOGO : // no error - GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; // warn + if (!textList.isEmpty()) { + // warn + icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; + } } else { // error icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; From 0dadfa35119150e8d19abf129c12e623b0367432 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 22:13:23 -0700 Subject: [PATCH 011/264] sike i don't need ByteSyncValue --- .../multiblock/ui/MultiblockUIFactory.java | 7 +- .../gregtech/api/mui/sync/ByteSyncValue.java | 88 ------------------- 2 files changed, 3 insertions(+), 92 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/sync/ByteSyncValue.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 79aeb1cfd2a..7da04057345 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -8,7 +8,6 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.ByteSyncValue; import gregtech.api.util.KeyUtil; import net.minecraft.util.text.TextFormatting; @@ -43,7 +42,7 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected final BooleanSyncValue mufflerObstructed; protected final BooleanSyncValue structureFormed; - protected final ByteSyncValue maintanence; + protected final IntSyncValue maintanence; protected static final int DEFAULT_HEIGHT = 202; protected static final int DEFAULT_WIDTH = 198; @@ -52,7 +51,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; this.mufflerObstructed = new BooleanSyncValue(mte::isStructureObstructed, null); this.structureFormed = new BooleanSyncValue(mte::isStructureFormed, null); - this.maintanence = new ByteSyncValue(mte::getMaintenanceProblems); + this.maintanence = new IntSyncValue(mte::getMaintenanceProblems, null); } protected void syncValues(PanelSyncManager manager) { @@ -114,7 +113,7 @@ private Widget createIndicator() { */ protected void configureWarningText(List> textList) { MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue(), false) - .addMaintenanceProblemLines(maintanence.getByteValue()); + .addMaintenanceProblemLines((byte) maintanence.getIntValue()); } /** diff --git a/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java b/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java deleted file mode 100644 index 7156319def7..00000000000 --- a/src/main/java/gregtech/api/mui/sync/ByteSyncValue.java +++ /dev/null @@ -1,88 +0,0 @@ -package gregtech.api.mui.sync; - -import net.minecraft.network.PacketBuffer; - -import com.cleanroommc.modularui.api.value.sync.IStringSyncValue; -import com.cleanroommc.modularui.value.sync.ValueSyncHandler; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.IOException; - -public class ByteSyncValue extends ValueSyncHandler implements IStringSyncValue { - - private byte cache; - private final ByteSupplier getter; - private final ByteSetter setter; - - public ByteSyncValue(@NotNull ByteSupplier getter, @Nullable ByteSetter setter) { - this.getter = getter; - this.setter = setter; - } - - public ByteSyncValue(@NotNull ByteSupplier getter) { - this(getter, null); - } - - @Override - public void setStringValue(String value, boolean setSource, boolean sync) { - setByteValue(Byte.parseByte(value), setSource, sync); - } - - @Override - public String getStringValue() { - return String.valueOf(cache); - } - - @Override - public void setValue(Byte value, boolean setSource, boolean sync) { - setByteValue(value, setSource, sync); - } - - @Override - public boolean updateCacheFromSource(boolean isFirstSync) { - if (isFirstSync || this.getter.getByte() != this.cache) { - setByteValue(this.getter.getByte(), false, false); - return true; - } - return false; - } - - @Override - public void write(PacketBuffer buffer) throws IOException { - buffer.writeByte(this.cache); - } - - @Override - public void read(PacketBuffer buffer) throws IOException { - setByteValue(buffer.readByte(), true, false); - } - - public Byte getValue() { - return cache; - } - - public byte getByteValue() { - return cache; - } - - public void setByteValue(byte value, boolean setSource, boolean sync) { - this.cache = value; - if (setSource && this.setter != null) { - this.setter.set(value); - } - if (sync) { - sync(0, this::write); - } - } - - public interface ByteSupplier { - - byte getByte(); - } - - public interface ByteSetter { - - void set(byte b); - } -} From d544f1d658f1515571ef0ef33713eb695aee3fd0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 22:37:23 -0700 Subject: [PATCH 012/264] structure formed is already synced --- .../multiblock/ui/MultiblockUIFactory.java | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7da04057345..cae85bcacd4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -41,7 +41,6 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected final BooleanSyncValue mufflerObstructed; - protected final BooleanSyncValue structureFormed; protected final IntSyncValue maintanence; protected static final int DEFAULT_HEIGHT = 202; @@ -50,14 +49,12 @@ public class MultiblockUIFactory { public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; this.mufflerObstructed = new BooleanSyncValue(mte::isStructureObstructed, null); - this.structureFormed = new BooleanSyncValue(mte::isStructureFormed, null); this.maintanence = new IntSyncValue(mte::getMaintenanceProblems, null); } protected void syncValues(PanelSyncManager manager) { manager.syncValue("muffler", mufflerObstructed); manager.syncValue("maintenance", maintanence); - manager.syncValue("structure_formed", structureFormed); } public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { @@ -112,7 +109,7 @@ private Widget createIndicator() { * Recommended to only display warnings if the structure is already formed. */ protected void configureWarningText(List> textList) { - MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue(), false) + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false) .addMaintenanceProblemLines((byte) maintanence.getIntValue()); } @@ -121,7 +118,7 @@ protected void configureWarningText(List> textList) { * Prioritized over any warnings provided by {@link #configureWarningText(List)}. */ protected void configureErrorText(List> textList) { - MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue()) + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()) .addMufflerObstructedLine(mufflerObstructed.getBoolValue()); } @@ -132,7 +129,7 @@ protected void configureErrorText(List> textList) { * or {@link KeyUtil#unformattedLang(String, Object...)} */ protected void configureDisplayText(List> textList) { - MultiblockDisplayTextPort.builder(textList, structureFormed.getBoolValue()); + MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()); } /** From fdf139bacd73a5384b00203a0762d817a2791e7c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 20 Nov 2024 23:10:23 -0700 Subject: [PATCH 013/264] try sync progress --- .../multiblock/ui/MultiblockUIFactory.java | 8 ++++++++ .../MetaTileEntityElectricBlastFurnace.java | 13 ++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index cae85bcacd4..535f4ccb23f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -60,6 +60,7 @@ protected void syncValues(PanelSyncManager manager) { public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { syncValues(panelSyncManager); var displayText = new ArrayList>(); + // try to make this more dynamic somehow configureDisplayText(displayText); var panel = createRootPanel(); @@ -203,6 +204,13 @@ protected Column createBars(@NotNull ModularPanel mainPanel, protected ParentWidget createScreen(List> lines, PanelSyncManager syncManager) { var displayText = new Column() .expanded() + // .onUpdateListener(column -> { + // column.getChildren().clear(); + // lines.clear(); + // configureDisplayText(lines); + // lines.forEach(column::child); + // WidgetTree.resize(column); + // }) .padding(4, 4); lines.forEach(displayText::child); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 9070c30e4cb..526b4bd7fcf 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -51,6 +51,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,6 +126,15 @@ protected void addDisplayText(List textList) { protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) { + DoubleSyncValue progress; + + @Override + protected void syncValues(PanelSyncManager manager) { + super.syncValues(manager); + progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + manager.syncValue("progress", progress); + } + @Override protected void configureDisplayText(List> textList) { MultiblockDisplayTextPort.builder(textList, isStructureFormed()) @@ -133,7 +144,7 @@ protected void configureDisplayText(List> textList) { .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(progress.getDoubleValue()); } private void addHeatCapacity(Consumer adder) { From 98db7d9973cf802c8f2ce4daad66315490913d6d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:34:13 -0700 Subject: [PATCH 014/264] progress works add dynamic keys add helper methods --- .../multiblock/MultiblockDisplayTextPort.java | 13 ++-- src/main/java/gregtech/api/util/KeyUtil.java | 59 +++++++++++++++++-- .../MetaTileEntityElectricBlastFurnace.java | 2 +- 3 files changed, 58 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index a7b094f32f6..b4587f102b1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -10,13 +10,12 @@ import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.LongSyncValue; import com.cleanroommc.modularui.widget.Widget; import java.util.List; import java.util.function.Consumer; +import java.util.function.DoubleSupplier; import java.util.function.Function; -import java.util.function.LongSupplier; public class MultiblockDisplayTextPort { @@ -284,10 +283,10 @@ public Builder addIdlingLine(boolean checkState) { * * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ - public Builder addProgressLine(double progressPercent) { // todo + public Builder addProgressLine(DoubleSupplier progressPercent) { // todo if (!isStructureFormed || !isActive) return this; - int currentProgress = (int) (progressPercent * 100); - addKey(KeyUtil.unformattedLang("gregtech.multiblock.progress", currentProgress)); + addKey(KeyUtil.dynamicLang(TextFormatting.GRAY, "gregtech.multiblock.progress", + () -> ((int) (progressPercent.getAsDouble() * 100)))); return this; } @@ -451,10 +450,6 @@ private Widget addKey(IKey key) { return w; } - private static LongSyncValue syncedGetter(LongSupplier getter) { - return new LongSyncValue(getter, l -> {}); - } - public Builder widgetFunction(Function> widgetFunction) { this.widgetFunction = widgetFunction; return this; diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index d53605cb2e7..0de7aa28870 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -3,10 +3,15 @@ import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IKey; +import org.apache.commons.lang3.ArrayUtils; + +import java.util.function.LongSupplier; +import java.util.function.Supplier; public class KeyUtil { public static final IKey RESET = toColor(TextFormatting.RESET); + public static final String SECTION = "§"; public static IKey toColor(TextFormatting formatting) { return IKey.str(formatting.toString()); @@ -19,12 +24,8 @@ public static IKey withColor(TextFormatting formatting, IKey... keys) { } public static IKey coloredLang(TextFormatting formatting, String lang, Object... args) { - if (args == null || args.length == 0) return withColor(formatting, IKey.lang(lang)); - Object[] fixedArgs = new Object[args.length]; - for (int i = 0; i < args.length; i++) { - fixedArgs[i] = IKey.str(args[i].toString() + formatting); - } - return withColor(formatting, IKey.lang(lang, fixedArgs)); + if (ArrayUtils.isEmpty(args)) return withColor(formatting, IKey.lang(lang)); + return withColor(formatting, IKey.lang(lang, checkFormatting(formatting, args))); } public static IKey coloredString(TextFormatting formatting, String string) { @@ -46,4 +47,50 @@ public static IKey unformattedString(String s) { public static IKey unformattedLang(String lang, Object... args) { return coloredLang(TextFormatting.RESET, lang, args); } + + public static IKey dynamicString(TextFormatting formatting, Supplier stringSupplier) { + return IKey.dynamic(() -> coloredString(formatting, stringSupplier.get()).get()); + } + + @SafeVarargs + public static IKey dynamicLang(TextFormatting formatting, String lang, Supplier... argSuppliers) { + if (ArrayUtils.isEmpty(argSuppliers)) return coloredLang(formatting, lang); + if (argSuppliers.length == 1) return IKey.dynamic(() -> coloredLang(formatting, lang, + fixString(formatting, argSuppliers[0].get().toString())).get()); + return IKey.dynamic(() -> { + Object[] args = new Object[argSuppliers.length]; + for (int i = 0; i < args.length; i++) { + args[i] = fixString(formatting, argSuppliers[i].get().toString()); + } + return coloredLang(formatting, lang, args).get(); + }); + } + + public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier) { + return IKey.dynamic(() -> coloredNumber(formatting, supplier.getAsLong()).get()); + } + + public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier, String suffix) { + return IKey.dynamic(() -> coloredNumber(formatting, supplier.getAsLong(), suffix).get()); + } + + public static Object[] checkFormatting(TextFormatting formatting, Object[] args) { + Object[] fixedArgs = new Object[args.length]; + for (int i = 0; i < args.length; i++) { + fixedArgs[i] = fixString(formatting, args[i].toString()); + } + return fixedArgs; + } + + public static String fixString(TextFormatting formatting, String s) { + if (hasFormatting(s)) { + return s + formatting; + } else { + return s; + } + } + + public static boolean hasFormatting(String s) { + return s.contains(SECTION); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 526b4bd7fcf..88ed27b76b6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -144,7 +144,7 @@ protected void configureDisplayText(List> textList) { .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(progress.getDoubleValue()); + .addProgressLine(progress::getDoubleValue); } private void addHeatCapacity(Consumer adder) { From 83f55eb1eae949763770f74211a3e05c0f31e9e7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:40:23 -0700 Subject: [PATCH 015/264] fix args properly --- src/main/java/gregtech/api/util/KeyUtil.java | 23 +++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 0de7aa28870..97be7aa056d 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -52,15 +52,19 @@ public static IKey dynamicString(TextFormatting formatting, Supplier str return IKey.dynamic(() -> coloredString(formatting, stringSupplier.get()).get()); } + public static IKey dynamicString(Supplier formatting, Supplier stringSupplier) { + return IKey.dynamic(() -> coloredString(formatting.get(), stringSupplier.get()).get()); + } + @SafeVarargs public static IKey dynamicLang(TextFormatting formatting, String lang, Supplier... argSuppliers) { if (ArrayUtils.isEmpty(argSuppliers)) return coloredLang(formatting, lang); if (argSuppliers.length == 1) return IKey.dynamic(() -> coloredLang(formatting, lang, - fixString(formatting, argSuppliers[0].get().toString())).get()); + fixArg(formatting, argSuppliers[0].get().toString())).get()); return IKey.dynamic(() -> { Object[] args = new Object[argSuppliers.length]; for (int i = 0; i < args.length; i++) { - args[i] = fixString(formatting, argSuppliers[i].get().toString()); + args[i] = fixArg(formatting, argSuppliers[i].get()); } return coloredLang(formatting, lang, args).get(); }); @@ -77,17 +81,20 @@ public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier, public static Object[] checkFormatting(TextFormatting formatting, Object[] args) { Object[] fixedArgs = new Object[args.length]; for (int i = 0; i < args.length; i++) { - fixedArgs[i] = fixString(formatting, args[i].toString()); + fixedArgs[i] = fixArg(formatting, args[i]); } return fixedArgs; } - public static String fixString(TextFormatting formatting, String s) { - if (hasFormatting(s)) { - return s + formatting; - } else { - return s; + public static Object fixArg(TextFormatting formatting, Object arg) { + if (arg instanceof IKey key) { + if (hasFormatting(key.get())) + return IKey.comp(key, toColor(formatting)); + } else if (arg instanceof String s) { + if (hasFormatting(s)) + return s + formatting; } + return arg; } public static boolean hasFormatting(String s) { From 42c4f333ed05a9e42e880d98db7ccecff407ab37 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 21 Nov 2024 17:42:11 -0700 Subject: [PATCH 016/264] update large boiler use list instead of consumer move margin to power button instead of flex --- .../multiblock/MultiblockDisplayTextPort.java | 7 +- .../multiblock/ui/MultiblockUIFactory.java | 6 +- .../multi/MetaTileEntityLargeBoiler.java | 88 +++++++++++++++++-- .../MetaTileEntityElectricBlastFurnace.java | 5 +- 4 files changed, 92 insertions(+), 14 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index b4587f102b1..8f8145ae52c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -12,6 +12,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.widget.Widget; +import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.DoubleSupplier; @@ -439,8 +440,10 @@ public Builder addEmptyLine() { } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - customConsumer.accept(this::addKey); + public Builder addCustom(Consumer> customConsumer) { + List customKeys = new ArrayList<>(); + customConsumer.accept(customKeys); + customKeys.forEach(this::addKey); return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 535f4ccb23f..eed67a16c0f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -229,8 +229,7 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy var flexButton = createFlexButton(mainPanel, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() - .size(18) - .marginBottom(5); + .size(18); } var powerButton = createPowerButton(mainPanel, panelSyncManager); @@ -340,7 +339,8 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) .disableHoverBackground() .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) - .value(workingStateValue); + .value(workingStateValue) + .marginTop(5); } public static final class Screen { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 74001955450..b94e58c6d35 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -14,6 +14,7 @@ import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -37,17 +38,21 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; +import com.cleanroommc.modularui.drawable.Rectangle; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.SliderWidget; import com.cleanroommc.modularui.widgets.layout.Row; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; @@ -172,6 +177,10 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); + DoubleSyncValue sliderValue = new DoubleSyncValue( + () -> (double) getThrottlePercentage() / 100, + d -> setThrottlePercentage((int) (d * 100))); + IntSyncValue waterFilled = new IntSyncValue(this::getWaterFilled, null); return new MultiblockUIFactory(this) { @Override @@ -181,7 +190,8 @@ protected MultiblockUIFactory createUIFactory() { (syncManager, syncHandler) -> GTGuis.createPopupPanel("boiler_throttle", 116, 53) .child(new Row() .pos(4, 4) - .height(16).coverChildrenWidth() + .height(16) + .coverChildrenWidth() .child(new ItemDrawable(getStackForm()) .asWidget() .size(16) @@ -190,12 +200,21 @@ protected MultiblockUIFactory createUIFactory() { .asWidget() .heightRel(1.0f))) .child(new Row() + .top(20) + .margin(4, 0) + .coverChildrenHeight() + .child(new SliderWidget() + .background(new Rectangle().setColor(Color.BLACK.brighter(2)).asIcon() + .height(8)) + .bounds(0, 1) + .setAxis(GuiAxis.X) + .value(sliderValue) + .widthRel(0.7f) + .height(20)) // TODO add inc/dec buttons - // TODO create slider widget .child(new TextFieldWidget() - .size(40, 20) - .left(38) - .top(20) + .widthRel(0.3f) + .height(20) // TODO proper color .setTextColor(Color.WHITE.darker(1)) .setNumbers(0, 100) @@ -205,7 +224,9 @@ protected MultiblockUIFactory createUIFactory() { return new ButtonWidget<>() .width(18) - .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) + // todo lang + .addTooltipLine("Configure Boiler Throttle") // TODO make this work .background(GTGuiTextures.BUTTON) .onMousePressed(i -> { @@ -218,6 +239,61 @@ protected MultiblockUIFactory createUIFactory() { return true; }); } + + @Override + protected void syncValues(PanelSyncManager manager) { + super.syncValues(manager); + manager.syncValue("water_filled", waterFilled); + } + + @Override + protected void configureWarningText(List> textList) { + super.configureWarningText(textList); + MultiblockDisplayTextPort.builder(textList, isStructureFormed()) + .addCustom(keyList -> { + if (isStructureFormed()) { + if (waterFilled.getIntValue() == 0) { + keyList.add(KeyUtil.coloredLang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); + } + } + }); + } + + @Override + protected void configureDisplayText(List> textList) { + MultiblockDisplayTextPort.builder(textList, isStructureFormed()) + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addCustom(this::addCustomData) + .addWorkingStatusLine(); + } + + private void addCustomData(List keyList) { + if (isStructureFormed()) { + // Steam Output line + IKey steamOutput = KeyUtil.coloredNumber(TextFormatting.AQUA, recipeLogic.getLastTickSteam(), + " L/t"); + + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.steam_output", steamOutput)); + + // Efficiency line + IKey efficiency = KeyUtil.dynamicString( + () -> getNumberColor(recipeLogic.getHeatScaled()), + () -> recipeLogic.getHeatScaled() + "%"); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.efficiency", efficiency)); + + // Throttle line + IKey throttle = KeyUtil.dynamicString( + () -> getNumberColor(getThrottle()), + () -> getThrottle() + "%"); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.throttle", throttle)); + } + } }; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 88ed27b76b6..9b698ee0c97 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -60,7 +60,6 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.function.Consumer; import static gregtech.api.util.RelativeDirection.*; @@ -147,12 +146,12 @@ protected void configureDisplayText(List> textList) { .addProgressLine(progress::getDoubleValue); } - private void addHeatCapacity(Consumer adder) { + private void addHeatCapacity(List keyList) { if (isStructureFormed()) { var heatString = KeyUtil.coloredNumber(TextFormatting.RED, getCurrentTemperature(), "K"); - adder.accept(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } } From 8193f8cde8a98979626043be98614a540f4acdd9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:52:11 -0700 Subject: [PATCH 017/264] create ui factory at build instead of constructor --- .../metatileentity/multiblock/MultiblockWithDisplayBase.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 070a4a9d228..2752bb7e0d0 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -49,7 +49,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; private static final int UPDATE_MAINTANENCE = GregtechDataCodes.assignId(); - private final MultiblockUIFactory uiFactory; + private MultiblockUIFactory uiFactory = null; private boolean voidingItems = false; private boolean voidingFluids = false; @@ -89,7 +89,6 @@ public MultiblockWithDisplayBase(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.maintenance_problems = 0b000000; this.voidingMode = VoidingMode.VOID_NONE; - this.uiFactory = createUIFactory(); } /** @@ -557,6 +556,7 @@ protected MultiblockUIFactory createUIFactory() { @Override public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + if (this.uiFactory == null) this.uiFactory = createUIFactory(); return this.uiFactory.buildUI(guiData, panelSyncManager); } From c41fe44d39df5efe08e1e3b2e4e6b684d90f8676 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 21 Nov 2024 18:52:42 -0700 Subject: [PATCH 018/264] update large combustion add note for dynamic texture --- .../java/gregtech/api/mui/GTGuiTextures.java | 2 + .../MetaTileEntityLargeCombustionEngine.java | 74 +++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 5333a475712..5fc34e7ff27 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -626,6 +626,8 @@ private static UITexture progressBar(String path, int width, int height, boolean public static IDrawable dynamic(UITexture[] textures, int rate) { AtomicInteger index = new AtomicInteger(); + // todo something is wrong with this + // also this method is client only so that could cause problems too return (context, x, y, width, height, widgetTheme) -> { int a = (int) (context.getTick() % rate); int i = (a == 0 ? index.getAndIncrement() : index.get()) % textures.length; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 978271998ac..62423a55db2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -22,6 +22,7 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.recipes.RecipeMaps; import gregtech.api.unification.material.Materials; +import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; @@ -45,9 +46,13 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.GenericSyncValue; +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.Widget; import com.cleanroommc.modularui.widgets.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -117,6 +122,75 @@ protected void addErrorText(List textList) { } } + @Override + protected MultiblockUIFactory createUIFactory() { + var lubricant = new GenericSyncValue<>( + () -> getInputFluidInventory().drain(Materials.Lubricant.getFluid(Integer.MAX_VALUE), false), + null, NetworkUtils::readFluidStack, NetworkUtils::writeFluidStack); + + var fuelName = new StringSyncValue( + () -> ((LargeCombustionEngineWorkableHandler) recipeMapWorkable).getRecipeFluidInputInfo(), null); + var fuelAmount = new IntSyncValue(recipeMapWorkable::getPreviousRecipeDuration, null); + + return new MultiblockUIFactory(this) { + + @Override + protected void syncValues(PanelSyncManager manager) { + super.syncValues(manager); + manager.syncValue("lubricant", lubricant); + manager.syncValue("fuel_name", fuelName); + manager.syncValue("fuel_amount", fuelAmount); + } + + @Override + protected void configureDisplayText(List> textList) { + var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); + var builder = MultiblockDisplayTextPort.builder(textList, isStructureFormed()) + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + + if (isExtreme) { + builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); + } else { + builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); + } + + // todo fuel needed line not working? + builder.addFuelNeededLine(fuelName.getStringValue(), fuelAmount.getIntValue()) + .addCustom(tl -> { + if (isStructureFormed() && recipeLogic.isOxygenBoosted) { + String key = isExtreme ? + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : + "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; + tl.add(KeyUtil.coloredLang(TextFormatting.AQUA, key)); + } + }) + .addWorkingStatusLine(); + } + + @Override + protected void configureErrorText(List> textList) { + super.configureErrorText(textList); + MultiblockDisplayTextPort.builder(textList, isStructureFormed()) + .addCustom(keyList -> { + if (isStructureFormed()) { + if (checkIntakesObstructed()) { + keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.obstructed")); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_combustion_engine.obstructed.desc")); + } + + FluidStack lubricantStack = lubricant.getValue(); + if (lubricantStack == null || lubricantStack.amount == 0) { + keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.no_lubricant")); + } + } + }); + } + }; + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); From 996acc2d0f8f3d7262f6083c6cdb00dde7e0ec32 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 22 Nov 2024 12:06:40 -0700 Subject: [PATCH 019/264] pass in builder instead of list add multiblock name make steam output dynamic --- .../multiblock/MultiblockDisplayTextPort.java | 5 +++++ .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 8 ++++---- .../metatileentities/multi/MetaTileEntityLargeBoiler.java | 8 ++++---- .../electric/MetaTileEntityElectricBlastFurnace.java | 6 ++---- .../generator/MetaTileEntityLargeCombustionEngine.java | 5 ++--- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index 8f8145ae52c..fe455b59c65 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -61,6 +61,11 @@ private Builder(List> textList, boolean isStructureFormed, } } + public Builder addTitle(String metaFullName) { + addKey(KeyUtil.coloredLang(TextFormatting.WHITE, metaFullName)); + return this; + } + /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { this.isWorkingEnabled = isWorkingEnabled; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index eed67a16c0f..4a7a1fcec74 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -61,7 +61,9 @@ protected void syncValues(PanelSyncManager manager) { syncValues(panelSyncManager); var displayText = new ArrayList>(); // try to make this more dynamic somehow - configureDisplayText(displayText); + var builder = MultiblockDisplayTextPort.builder(displayText, mte.isStructureFormed()) + .addTitle(mte.getMetaFullName()); + configureDisplayText(builder); var panel = createRootPanel(); @@ -129,9 +131,7 @@ protected void configureErrorText(List> textList) { * To use translation, use {@link KeyUtil#coloredLang(TextFormatting, String, Object...)} * or {@link KeyUtil#unformattedLang(String, Object...)} */ - protected void configureDisplayText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()); - } + protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) {} /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index b94e58c6d35..e346c5880ad 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -252,6 +252,7 @@ protected void configureWarningText(List> textList) { MultiblockDisplayTextPort.builder(textList, isStructureFormed()) .addCustom(keyList -> { if (isStructureFormed()) { + // todo this is returning 0 on client for some reason if (waterFilled.getIntValue() == 0) { keyList.add(KeyUtil.coloredLang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); @@ -263,9 +264,8 @@ protected void configureWarningText(List> textList) { } @Override - protected void configureDisplayText(List> textList) { - MultiblockDisplayTextPort.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addCustom(this::addCustomData) .addWorkingStatusLine(); } @@ -273,7 +273,7 @@ protected void configureDisplayText(List> textList) { private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line - IKey steamOutput = KeyUtil.coloredNumber(TextFormatting.AQUA, recipeLogic.getLastTickSteam(), + IKey steamOutput = KeyUtil.dynamicLong(TextFormatting.AQUA, recipeLogic::getLastTickSteam, " L/t"); keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 9b698ee0c97..2bde15997ce 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -53,7 +53,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -135,9 +134,8 @@ protected void syncValues(PanelSyncManager manager) { } @Override - protected void configureDisplayText(List> textList) { - MultiblockDisplayTextPort.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addCustom(this::addHeatCapacity) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 62423a55db2..dba8f636c0b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -143,10 +143,9 @@ protected void syncValues(PanelSyncManager manager) { } @Override - protected void configureDisplayText(List> textList) { + protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); - var builder = MultiblockDisplayTextPort.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); if (isExtreme) { builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); From 14fe2441908ffa3058af1c9d2e4a2b42696126fc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 22 Nov 2024 14:11:29 -0700 Subject: [PATCH 020/264] improve blinking logo a bit --- src/main/java/gregtech/api/mui/GTGuiTextures.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 5fc34e7ff27..cc31d6eda5b 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -47,10 +47,10 @@ public static class IDs { public static final UITexture GREGTECH_LOGO_DARK = fullImage("textures/gui/icon/gregtech_logo_dark.png"); public static final IDrawable GREGTECH_LOGO_BLINKING_YELLOW = animated( "textures/gui/icon/gregtech_logo_blinking_yellow.png", - 17, 34, true, 10); + 17, 34, true, 60); public static final IDrawable GREGTECH_LOGO_BLINKING_RED = animated( "textures/gui/icon/gregtech_logo_blinking_red.png", - 17, 34, true, 6); + 17, 34, true, 36); public static final UITexture INDICATOR_NO_ENERGY = fullImage("textures/gui/base/indicator_no_energy.png"); public static final UITexture INDICATOR_NO_STEAM_BRONZE = fullImage( @@ -626,12 +626,14 @@ private static UITexture progressBar(String path, int width, int height, boolean public static IDrawable dynamic(UITexture[] textures, int rate) { AtomicInteger index = new AtomicInteger(); + AtomicInteger tick = new AtomicInteger(); // todo something is wrong with this // also this method is client only so that could cause problems too return (context, x, y, width, height, widgetTheme) -> { - int a = (int) (context.getTick() % rate); - int i = (a == 0 ? index.getAndIncrement() : index.get()) % textures.length; - textures[i].draw(context, x, y, width, height, widgetTheme); + int a = tick.getAndIncrement() % rate; // this makes rate per frame ? + int i = a == 0 ? index.incrementAndGet() : index.get(); + index.set(i % textures.length); + textures[index.get()].draw(context, x, y, width, height, widgetTheme); }; } } From de9c22b6084f70f47b16d750b086d33a2d4be521 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 22 Nov 2024 14:13:39 -0700 Subject: [PATCH 021/264] switch to builder instead of list for warning/error fix title --- .../multiblock/MultiblockDisplayTextPort.java | 44 ++++++++----- .../multiblock/ui/MultiblockUIFactory.java | 66 ++++--------------- .../multi/MetaTileEntityLargeBoiler.java | 27 ++++---- .../MetaTileEntityLargeCombustionEngine.java | 40 ++++++----- 4 files changed, 70 insertions(+), 107 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index fe455b59c65..b5039136aaa 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -17,6 +17,8 @@ import java.util.function.Consumer; import java.util.function.DoubleSupplier; import java.util.function.Function; +import java.util.function.IntSupplier; +import java.util.function.Supplier; public class MultiblockDisplayTextPort { @@ -25,20 +27,24 @@ public class MultiblockDisplayTextPort { *
* Automatically adds the "Invalid Structure" line if the structure is not formed. */ - public static Builder builder(List> textList, boolean isStructureFormed) { - return builder(textList, isStructureFormed, true); + public static Builder builder(List> textList, MultiblockWithDisplayBase mte) { + return builder(textList, mte, true); } - public static Builder builder(List> textList, boolean isStructureFormed, + public static Builder builder(List> textList, MultiblockWithDisplayBase mte, boolean showIncompleteStructureWarning) { - return new Builder(textList, isStructureFormed, showIncompleteStructureWarning); + return new Builder(textList, mte, showIncompleteStructureWarning, true); + } + + public static Builder builder(List> textList, MultiblockWithDisplayBase mte, + boolean showIncompleteStructureWarning, boolean showTitle) { + return new Builder(textList, mte, showIncompleteStructureWarning, showTitle); } public static class Builder { private final List> textList; - private Function> widgetFunction = key -> key.asWidget() - .widthRel(1f).height(12); + private Function> widgetFunction = Builder::keyMapper; private final boolean isStructureFormed; private boolean isWorkingEnabled, isActive; @@ -48,10 +54,13 @@ public static class Builder { private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); private IKey runningKey = IKey.lang("gregtech.multiblock.running"); - private Builder(List> textList, boolean isStructureFormed, - boolean showIncompleteStructureWarning) { + private Builder(List> textList, MultiblockWithDisplayBase mte, + boolean showIncompleteStructureWarning, boolean showTitle) { this.textList = textList; - this.isStructureFormed = isStructureFormed; + this.isStructureFormed = mte.isStructureFormed(); + + if (showTitle) + addKey(KeyUtil.coloredLang(TextFormatting.WHITE, mte.getMetaFullName())); if (!isStructureFormed && showIncompleteStructureWarning) { var base = KeyUtil.coloredLang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); @@ -61,9 +70,10 @@ private Builder(List> textList, boolean isStructureFormed, } } - public Builder addTitle(String metaFullName) { - addKey(KeyUtil.coloredLang(TextFormatting.WHITE, metaFullName)); - return this; + public static Widget keyMapper(IKey key) { + return key.asWidget() + .widthRel(1f) + .height(12); } /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ @@ -427,13 +437,13 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { *
* Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ - public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; + public Builder addFuelNeededLine(Supplier fuelName, IntSupplier previousRecipeDuration) { + if (!isStructureFormed || !isActive || fuelName.get() == null) return this; - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.dynamicLang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", - KeyUtil.coloredString(TextFormatting.RED, fuelName), - KeyUtil.coloredNumber(TextFormatting.AQUA, previousRecipeDuration))); + () -> KeyUtil.coloredString(TextFormatting.RED, fuelName.get()), + () -> KeyUtil.coloredNumber(TextFormatting.AQUA, previousRecipeDuration.getAsInt()))); return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 4a7a1fcec74..8da85b77949 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -60,9 +60,9 @@ protected void syncValues(PanelSyncManager manager) { public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { syncValues(panelSyncManager); var displayText = new ArrayList>(); - // try to make this more dynamic somehow - var builder = MultiblockDisplayTextPort.builder(displayText, mte.isStructureFormed()) - .addTitle(mte.getMetaFullName()); + + var builder = MultiblockDisplayTextPort.builder(displayText, mte); + configureDisplayText(builder); var panel = createRootPanel(); @@ -86,9 +86,10 @@ private Widget createIndicator() { .onUpdateListener(w -> { IDrawable icon = GTGuiTextures.GREGTECH_LOGO; textList.clear(); - configureErrorText(textList); + var builder = MultiblockDisplayTextPort.builder(textList, mte, true, false); + configureErrorText(builder); if (textList.isEmpty()) { - configureWarningText(textList); + configureWarningText(builder); if (!textList.isEmpty()) { // warn icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; @@ -111,18 +112,16 @@ private Widget createIndicator() { * Returns a list of text indicating any current warnings in this Multiblock. * Recommended to only display warnings if the structure is already formed. */ - protected void configureWarningText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed(), false) - .addMaintenanceProblemLines((byte) maintanence.getIntValue()); + protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { + builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); } /** * Returns a list of translation keys indicating any current errors in this Multiblock. - * Prioritized over any warnings provided by {@link #configureWarningText(List)}. + * Prioritized over any warnings provided by {@link #configureWarningText(MultiblockDisplayTextPort.Builder)}. */ - protected void configureErrorText(List> textList) { - MultiblockDisplayTextPort.builder(textList, mte.isStructureFormed()) - .addMufflerObstructedLine(mufflerObstructed.getBoolValue()); + protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { + builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); } /** @@ -242,49 +241,6 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy .childIf(powerButton != null, powerButton); } - // protected void createExtraButton() { - // List> list = new ArrayList<>(); - // mte.createExtraButtons(rootPanel, panelSyncManager, list); - // if (list.isEmpty()) { - // list.add(new Widget<>() - // .background(GTGuiTextures.BUTTON) - // .overlay(GTGuiTextures.BUTTON_NO_FLEX) - // .tooltip(t -> t.addLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")))); - // } - // - // if (list.size() == 1) { - // buttonColumn.child(list.get(0).size(18, 18)); - // return; - // } - // - // PanelSyncHandler popupPanel = panelSyncManager.panel("throttle_panel", rootPanel, - // (syncManager, syncHandler) -> { - // ModularPanel panel = GTGuis.createPopupPanel("extra_buttons", Screen.WIDTH, screenHeight); - // Row row = new Row().height(18) - // .margin(4) - // .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); - // panel.child(row); - // for (var widget : list) { - // row.child(widget.size(18, 18)); - // } - // return panel; - // }); - // - // buttonColumn.child(new ButtonWidget<>() - // .size(18, 18) - // .overlay(GTGuiTextures.BUTTON_THROTTLE_MINUS) // TODO texture - // .background(GTGuiTextures.BUTTON) // TODO make this work - // .onMousePressed(i -> { - // if (popupPanel.isPanelOpen()) { - // popupPanel.closePanel(); - // } else { - // popupPanel.openPanel(); - // } - // Interactable.playButtonClickSound(); - // return true; - // })); - // } - protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (mte instanceof IDistinctBusController distinct && distinct.canBeDistinct()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index e346c5880ad..626a29816cb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -247,20 +247,19 @@ protected void syncValues(PanelSyncManager manager) { } @Override - protected void configureWarningText(List> textList) { - super.configureWarningText(textList); - MultiblockDisplayTextPort.builder(textList, isStructureFormed()) - .addCustom(keyList -> { - if (isStructureFormed()) { - // todo this is returning 0 on client for some reason - if (waterFilled.getIntValue() == 0) { - keyList.add(KeyUtil.coloredLang(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); - } - } - }); + protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { + super.configureWarningText(builder); + builder.addCustom(keyList -> { + if (isStructureFormed()) { + // todo this is returning 0 on client for some reason + if (waterFilled.getIntValue() == 0) { + keyList.add(KeyUtil.coloredLang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); + } + } + }); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index dba8f636c0b..b24504f51ef 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -52,7 +52,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.Widget; import com.cleanroommc.modularui.widgets.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -154,7 +153,7 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { } // todo fuel needed line not working? - builder.addFuelNeededLine(fuelName.getStringValue(), fuelAmount.getIntValue()) + builder.addFuelNeededLine(fuelName::getStringValue, fuelAmount::getIntValue) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? @@ -167,25 +166,24 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { } @Override - protected void configureErrorText(List> textList) { - super.configureErrorText(textList); - MultiblockDisplayTextPort.builder(textList, isStructureFormed()) - .addCustom(keyList -> { - if (isStructureFormed()) { - if (checkIntakesObstructed()) { - keyList.add(KeyUtil.coloredLang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.obstructed")); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, - "gregtech.multiblock.large_combustion_engine.obstructed.desc")); - } - - FluidStack lubricantStack = lubricant.getValue(); - if (lubricantStack == null || lubricantStack.amount == 0) { - keyList.add(KeyUtil.coloredLang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.no_lubricant")); - } - } - }); + protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { + super.configureErrorText(builder); + builder.addCustom(keyList -> { + if (isStructureFormed()) { + if (checkIntakesObstructed()) { + keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.obstructed")); + keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.large_combustion_engine.obstructed.desc")); + } + + FluidStack lubricantStack = lubricant.getValue(); + if (lubricantStack == null || lubricantStack.amount == 0) { + keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.no_lubricant")); + } + } + }); } }; } From c87f253b38b87816558025e7502949a5b3804d4c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 23 Nov 2024 14:37:34 -0700 Subject: [PATCH 022/264] add/improve javadocs this is the most i can do for waterFilled for now --- .../multiblock/ui/MultiblockUIFactory.java | 21 ++++++++++++++----- .../multi/MetaTileEntityLargeBoiler.java | 4 +++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 8da85b77949..500665400fc 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -52,11 +52,19 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.maintanence = new IntSyncValue(mte::getMaintenanceProblems, null); } + /** + * Called once during ui construction. + * @param manager for syncing values + */ protected void syncValues(PanelSyncManager manager) { manager.syncValue("muffler", mufflerObstructed); manager.syncValue("maintenance", maintanence); } + /** + * Constructs the multiblock ui panel
+ * It is not recommended to override this method + */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { syncValues(panelSyncManager); var displayText = new ArrayList>(); @@ -100,6 +108,7 @@ private Widget createIndicator() { } w.overlay(icon); }) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(tooltip -> { for (var text : textList) { if (text instanceof TextWidget textWidget) @@ -109,23 +118,25 @@ private Widget createIndicator() { } /** - * Returns a list of text indicating any current warnings in this Multiblock. - * Recommended to only display warnings if the structure is already formed. + * Returns a list of text indicating any current warnings in this Multiblock.
+ * Recommended to only display warnings if the structure is already formed.
+ * This is called every tick on the client-side */ protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); } /** - * Returns a list of translation keys indicating any current errors in this Multiblock. - * Prioritized over any warnings provided by {@link #configureWarningText(MultiblockDisplayTextPort.Builder)}. + * Returns a list of translation keys indicating any current errors in this Multiblock.
+ * Prioritized over any warnings provided by {@link #configureWarningText(MultiblockDisplayTextPort.Builder)}.
+ * This is called every tick on the client-side */ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); } /** - * Called on both sides to obtain text displayed in GUI
+ * Called once on both sides to obtain text displayed in GUI
* Each element of list is displayed on new line
* To use translation, use {@link KeyUtil#coloredLang(TextFormatting, String, Object...)} * or {@link KeyUtil#unformattedLang(String, Object...)} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 626a29816cb..e685f8e2bd3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -180,9 +180,10 @@ protected MultiblockUIFactory createUIFactory() { DoubleSyncValue sliderValue = new DoubleSyncValue( () -> (double) getThrottlePercentage() / 100, d -> setThrottlePercentage((int) (d * 100))); - IntSyncValue waterFilled = new IntSyncValue(this::getWaterFilled, null); return new MultiblockUIFactory(this) { + IntSyncValue waterFilled; + @Override public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { @@ -243,6 +244,7 @@ protected MultiblockUIFactory createUIFactory() { @Override protected void syncValues(PanelSyncManager manager) { super.syncValues(manager); + waterFilled = new IntSyncValue(() -> getWaterFilled(), null); manager.syncValue("water_filled", waterFilled); } From 0d78a12a278189b6000bb110e808ba5a9c919ae1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:03:02 -0700 Subject: [PATCH 023/264] remove reset and make internal methods private --- src/main/java/gregtech/api/util/KeyUtil.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 97be7aa056d..6b33e010b68 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -10,7 +10,6 @@ public class KeyUtil { - public static final IKey RESET = toColor(TextFormatting.RESET); public static final String SECTION = "§"; public static IKey toColor(TextFormatting formatting) { @@ -19,8 +18,8 @@ public static IKey toColor(TextFormatting formatting) { public static IKey withColor(TextFormatting formatting, IKey... keys) { if (keys == null) return toColor(formatting); - if (keys.length == 1) return IKey.comp(toColor(formatting), keys[0], RESET); - return IKey.comp(toColor(formatting), IKey.comp(keys), RESET); + if (keys.length == 1) return IKey.comp(toColor(formatting), keys[0]); + return IKey.comp(toColor(formatting), IKey.comp(keys)); } public static IKey coloredLang(TextFormatting formatting, String lang, Object... args) { @@ -29,7 +28,8 @@ public static IKey coloredLang(TextFormatting formatting, String lang, Object... } public static IKey coloredString(TextFormatting formatting, String string) { - return IKey.comp(toColor(formatting), IKey.str(string), RESET); + if (string == null) return IKey.EMPTY; + return IKey.comp(toColor(formatting), IKey.str(string)); } public static IKey coloredNumber(TextFormatting formatting, long number) { @@ -60,7 +60,7 @@ public static IKey dynamicString(Supplier formatting, Supplier... argSuppliers) { if (ArrayUtils.isEmpty(argSuppliers)) return coloredLang(formatting, lang); if (argSuppliers.length == 1) return IKey.dynamic(() -> coloredLang(formatting, lang, - fixArg(formatting, argSuppliers[0].get().toString())).get()); + fixArg(formatting, argSuppliers[0].get())).get()); return IKey.dynamic(() -> { Object[] args = new Object[argSuppliers.length]; for (int i = 0; i < args.length; i++) { @@ -78,7 +78,7 @@ public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier, return IKey.dynamic(() -> coloredNumber(formatting, supplier.getAsLong(), suffix).get()); } - public static Object[] checkFormatting(TextFormatting formatting, Object[] args) { + private static Object[] checkFormatting(TextFormatting formatting, Object[] args) { Object[] fixedArgs = new Object[args.length]; for (int i = 0; i < args.length; i++) { fixedArgs[i] = fixArg(formatting, args[i]); @@ -86,7 +86,7 @@ public static Object[] checkFormatting(TextFormatting formatting, Object[] args) return fixedArgs; } - public static Object fixArg(TextFormatting formatting, Object arg) { + private static Object fixArg(TextFormatting formatting, Object arg) { if (arg instanceof IKey key) { if (hasFormatting(key.get())) return IKey.comp(key, toColor(formatting)); @@ -97,7 +97,7 @@ public static Object fixArg(TextFormatting formatting, Object arg) { return arg; } - public static boolean hasFormatting(String s) { + private static boolean hasFormatting(String s) { return s.contains(SECTION); } } From fcc0e74e05a67e086a73a688518c521bed4999e8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 23 Nov 2024 19:06:18 -0700 Subject: [PATCH 024/264] sync fuel needed and rotor stats always add fuel line --- .../capability/impl/AbstractRecipeLogic.java | 4 +- .../impl/MultiblockFuelRecipeLogic.java | 31 +++++++- .../multiblock/MultiblockDisplayTextPort.java | 2 +- .../multiblock/ui/MultiblockUIFactory.java | 8 +- .../MetaTileEntityLargeCombustionEngine.java | 9 +-- .../generator/MetaTileEntityLargeTurbine.java | 78 +++++++++++++++++++ 6 files changed, 112 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index d86d2827139..96d79ca562a 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -59,6 +59,7 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, private double speedBonus = -1; protected Recipe previousRecipe; + protected int cachedDuration; private boolean allowOverclocking = true; protected int parallelRecipesPerformed; private long overclockVoltage; @@ -1025,7 +1026,8 @@ public long getInfoProviderEUt() { * @return the previous recipe's duration */ public int getPreviousRecipeDuration() { - return getPreviousRecipe() == null ? 0 : getPreviousRecipe().getDuration(); + this.cachedDuration = getPreviousRecipe() == null ? this.cachedDuration : getPreviousRecipe().getDuration(); + return this.cachedDuration; } /** diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java index 4c374985014..34871f60803 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java @@ -1,5 +1,6 @@ package gregtech.api.capability.impl; +import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IRotorHolder; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; @@ -12,10 +13,12 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.TextFormattingUtil; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.Tuple; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; +import com.cleanroommc.modularui.network.NetworkUtils; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -23,11 +26,23 @@ public class MultiblockFuelRecipeLogic extends MultiblockRecipeLogic { protected long totalContinuousRunningTime; + protected String cachedFuelAmount; + + private static final int SYNC_FUEL_NEEDED = GregtechDataCodes.assignId(); public MultiblockFuelRecipeLogic(RecipeMapMultiblockController tileEntity) { super(tileEntity); } + @Override + protected void trySearchNewRecipe() { + super.trySearchNewRecipe(); + writeCustomData(SYNC_FUEL_NEEDED, buffer -> { + NetworkUtils.writeStringSafe(buffer, getRecipeFluidInputInfo()); + buffer.writeInt(getPreviousRecipeDuration()); + }); + } + @Override protected void modifyOverclockPre(@NotNull OCParams ocParams, @NotNull RecipePropertyStorage storage) { // apply maintenance bonuses @@ -123,7 +138,7 @@ public String getRecipeFluidInputInfo() { Recipe recipe; if (previousRecipe == null) { recipe = findRecipe(Integer.MAX_VALUE, getInputInventory(), getInputTank()); - if (recipe == null) return null; + if (recipe == null) return this.cachedFuelAmount; } else { recipe = previousRecipe; } @@ -134,9 +149,10 @@ public String getRecipeFluidInputInfo() { if (rotorHolder != null && rotorHolder.hasRotor()) { neededAmount /= (rotorHolder.getTotalEfficiency() / 100.0); } else if (rotorHolder != null && !rotorHolder.hasRotor()) { - return null; + return this.cachedFuelAmount; } - return TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; + this.cachedFuelAmount = TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; + return this.cachedFuelAmount; } public FluidStack getInputFluidStack() { @@ -156,4 +172,13 @@ public FluidStack getInputFluidStack() { public boolean isAllowOverclocking() { return false; } + + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == SYNC_FUEL_NEEDED) { + this.cachedFuelAmount = NetworkUtils.readStringSafe(buf); + this.cachedDuration = buf.readInt(); + } + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index b5039136aaa..b59299de969 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -438,7 +438,7 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ public Builder addFuelNeededLine(Supplier fuelName, IntSupplier previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName.get() == null) return this; + if (!isStructureFormed || !isActive) return this; addKey(KeyUtil.dynamicLang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 500665400fc..fb7e8f46d50 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -54,6 +54,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { /** * Called once during ui construction. + * * @param manager for syncing values */ protected void syncValues(PanelSyncManager manager) { @@ -214,13 +215,6 @@ protected Column createBars(@NotNull ModularPanel mainPanel, protected ParentWidget createScreen(List> lines, PanelSyncManager syncManager) { var displayText = new Column() .expanded() - // .onUpdateListener(column -> { - // column.getChildren().clear(); - // lines.clear(); - // configureDisplayText(lines); - // lines.forEach(column::child); - // WidgetTree.resize(column); - // }) .padding(4, 4); lines.forEach(displayText::child); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index b24504f51ef..41a8521d348 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -49,7 +49,6 @@ import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.GenericSyncValue; -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.ProgressWidget; @@ -127,18 +126,12 @@ protected MultiblockUIFactory createUIFactory() { () -> getInputFluidInventory().drain(Materials.Lubricant.getFluid(Integer.MAX_VALUE), false), null, NetworkUtils::readFluidStack, NetworkUtils::writeFluidStack); - var fuelName = new StringSyncValue( - () -> ((LargeCombustionEngineWorkableHandler) recipeMapWorkable).getRecipeFluidInputInfo(), null); - var fuelAmount = new IntSyncValue(recipeMapWorkable::getPreviousRecipeDuration, null); - return new MultiblockUIFactory(this) { @Override protected void syncValues(PanelSyncManager manager) { super.syncValues(manager); manager.syncValue("lubricant", lubricant); - manager.syncValue("fuel_name", fuelName); - manager.syncValue("fuel_amount", fuelAmount); } @Override @@ -153,7 +146,7 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { } // todo fuel needed line not working? - builder.addFuelNeededLine(fuelName::getStringValue, fuelAmount::getIntValue) + builder.addFuelNeededLine(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index f0f6e2138c5..6d76e1229c1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -1,6 +1,7 @@ package gregtech.common.metatileentities.multi.electric.generator; import gregtech.api.GTValues; +import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IRotorHolder; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; @@ -15,6 +16,7 @@ import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.recipes.RecipeMap; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -22,6 +24,8 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; @@ -45,6 +49,7 @@ public class MetaTileEntityLargeTurbine extends FuelMultiblockController implements ITieredMetaTileEntity, ProgressBarMultiblock { + private static final int SYNC_ROTOR = GregtechDataCodes.assignId(); public final int tier; public final IBlockState casingState; @@ -56,6 +61,8 @@ public class MetaTileEntityLargeTurbine extends FuelMultiblockController private static final int MIN_DURABILITY_TO_WARN = 10; public IFluidHandler exportFluidHandler; + private int cachedRotorEfficiency; + private int cachedTotalEfficiency; public MetaTileEntityLargeTurbine(ResourceLocation metaTileEntityId, RecipeMap recipeMap, int tier, IBlockState casingState, IBlockState gearboxState, ICubeRenderer casingRenderer, @@ -107,6 +114,12 @@ protected void formStructure(PatternMatchContext context) { super.formStructure(context); this.exportFluidHandler = new FluidTankList(true, getAbilities(MultiblockAbility.EXPORT_FLUIDS)); ((LargeTurbineWorkableHandler) this.recipeMapWorkable).updateTanks(); + this.cachedRotorEfficiency = getRotorHolder().getRotorEfficiency(); + this.cachedTotalEfficiency = getRotorHolder().getTotalEfficiency(); + writeCustomData(SYNC_ROTOR, buffer -> { + buffer.writeInt(this.cachedRotorEfficiency); + buffer.writeInt(this.cachedTotalEfficiency); + }); } @Override @@ -183,6 +196,56 @@ protected void addErrorText(List textList) { } } + @Override + public void receiveCustomData(int dataId, PacketBuffer buf) { + super.receiveCustomData(dataId, buf); + if (dataId == SYNC_ROTOR) { + this.cachedRotorEfficiency = buf.readInt(); + this.cachedTotalEfficiency = buf.readInt(); + } + } + + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeInt(this.cachedRotorEfficiency); + buf.writeInt(this.cachedTotalEfficiency); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.cachedRotorEfficiency = buf.readInt(); + this.cachedTotalEfficiency = buf.readInt(); + } + + @Override + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory(this) { + + @Override + protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { + MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) + .addCustom(tl -> { + if (isStructureFormed()) { + if (cachedRotorEfficiency > 0) { + IKey efficiencyInfo = KeyUtil.coloredNumber(TextFormatting.AQUA, + cachedTotalEfficiency, "%"); + tl.add(KeyUtil.coloredLang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.efficiency", + efficiencyInfo)); + } + } + }) + .addFuelNeededLine(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) + .addWorkingStatusLine(); + } + }; + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); @@ -409,4 +472,19 @@ private int[] getFuelAmount() { } return new int[2]; } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound data) { + // really do not like how i have to save this to NBT + data.setInteger("cached_eff", this.cachedRotorEfficiency); + data.setInteger("cached_total", this.cachedTotalEfficiency); + return super.writeToNBT(data); + } + + @Override + public void readFromNBT(NBTTagCompound data) { + super.readFromNBT(data); + this.cachedRotorEfficiency = data.getInteger("cached_eff"); + this.cachedTotalEfficiency = data.getInteger("cached_total"); + } } From f1617a734c0e5366e3da1ecb424e6a081f5b3b76 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 24 Nov 2024 19:39:25 -0700 Subject: [PATCH 025/264] rename and reorganize KeyUtil methods --- .../multiblock/MultiblockDisplayTextPort.java | 74 +++++++------- .../multiblock/ui/MultiblockUIFactory.java | 4 +- src/main/java/gregtech/api/util/KeyUtil.java | 97 +++++++++++-------- .../multi/MetaTileEntityLargeBoiler.java | 16 +-- .../MetaTileEntityElectricBlastFurnace.java | 4 +- .../MetaTileEntityLargeCombustionEngine.java | 8 +- .../generator/MetaTileEntityLargeTurbine.java | 4 +- 7 files changed, 113 insertions(+), 94 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index b59299de969..9a40f7fede8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -60,11 +60,11 @@ private Builder(List> textList, MultiblockWithDisplayBase mte, this.isStructureFormed = mte.isStructureFormed(); if (showTitle) - addKey(KeyUtil.coloredLang(TextFormatting.WHITE, mte.getMetaFullName())); + addKey(KeyUtil.lang(TextFormatting.WHITE, mte.getMetaFullName())); if (!isStructureFormed && showIncompleteStructureWarning) { - var base = KeyUtil.coloredLang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); - var hover = KeyUtil.coloredLang(TextFormatting.GRAY, + var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); addKey(base).addTooltipLine(hover); } @@ -115,9 +115,9 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { // wrap in text component to keep it from being formatted IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - var bodyText = KeyUtil.coloredLang(TextFormatting.GRAY, + var bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); - var hoverText = KeyUtil.coloredLang(TextFormatting.GRAY, + var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); addKey(bodyText).addTooltipLine(hoverText); } @@ -134,9 +134,9 @@ public Builder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; if (tier < GTValues.ULV || tier > GTValues.MAX) return this; - var bodyText = KeyUtil.coloredLang(TextFormatting.GRAY, + var bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); - var hoverText = KeyUtil.coloredLang(TextFormatting.GRAY, + var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier_hover"); addKey(bodyText).addTooltipLine(hoverText); return this; @@ -152,10 +152,10 @@ public Builder addEnergyUsageExactLine(long energyUsage) { if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.unformattedString( + var voltageName = KeyUtil.string( GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); } return this; @@ -171,10 +171,10 @@ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.unformattedString( + var voltageName = KeyUtil.string( GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); } return this; @@ -192,10 +192,10 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.unformattedString( + var voltageName = KeyUtil.string( GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_amps", energyFormatted, amperage, voltageName)); } @@ -210,8 +210,8 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { public Builder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; if (maxCWUt > 0) { - var computation = KeyUtil.coloredString(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.computation.max", computation)); } return this; @@ -225,9 +225,9 @@ public Builder addComputationUsageLine(int maxCWUt) { public Builder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; if (isActive && currentCWUt > 0) { - var computation = KeyUtil.coloredString(TextFormatting.AQUA, + var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.computation.usage", computation)); } return this; @@ -259,7 +259,7 @@ public Builder addWorkingStatusLine() { public Builder addWorkPausedLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || !isWorkingEnabled) { - addKey(KeyUtil.withColor(TextFormatting.GOLD, pausedKey)); + addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); } return this; } @@ -273,7 +273,7 @@ public Builder addWorkPausedLine(boolean checkState) { public Builder addRunningPerfectlyLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || isActive) { - addKey(KeyUtil.withColor(TextFormatting.GREEN, runningKey)); + addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); } return this; } @@ -287,7 +287,7 @@ public Builder addRunningPerfectlyLine(boolean checkState) { public Builder addIdlingLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || (isWorkingEnabled && !isActive)) { - addKey(KeyUtil.withColor(TextFormatting.GRAY, idlingKey)); + addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); } return this; } @@ -301,7 +301,7 @@ public Builder addIdlingLine(boolean checkState) { */ public Builder addProgressLine(DoubleSupplier progressPercent) { // todo if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.dynamicLang(TextFormatting.GRAY, "gregtech.multiblock.progress", + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", () -> ((int) (progressPercent.getAsDouble() * 100)))); return this; } @@ -314,10 +314,10 @@ public Builder addProgressLine(DoubleSupplier progressPercent) { // todo public Builder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; if (numParallels > 1) { - var parallels = KeyUtil.coloredString(TextFormatting.DARK_PURPLE, + var parallels = KeyUtil.string(TextFormatting.DARK_PURPLE, TextFormattingUtil.formatNumbers(numParallels)); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.parallel", parallels)); } return this; @@ -331,7 +331,7 @@ public Builder addParallelsLine(int numParallels) { public Builder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; if (isLowPower) { - addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); } return this; @@ -359,7 +359,7 @@ public Builder addLowComputationLine(boolean isLowComputation) { public Builder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; if (isTooLow) { - addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); } return this; @@ -374,42 +374,42 @@ public Builder addLowDynamoTierLine(boolean isTooLow) { public Builder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; if (maintenanceProblems < 63) { - addKey(KeyUtil.coloredLang(TextFormatting.YELLOW, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); // Wrench if ((maintenanceProblems & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wrench")); } // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.screwdriver")); } // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.soft_mallet")); } // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.hard_hammer")); } // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.wire_cutter")); } // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.problem.crowbar")); } } @@ -424,9 +424,9 @@ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { public Builder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; if (isObstructed) { - addKey(KeyUtil.coloredLang(TextFormatting.RED, + addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); - addKey(KeyUtil.coloredLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.universal.muffler_obstructed_desc")); } return this; @@ -440,10 +440,10 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { public Builder addFuelNeededLine(Supplier fuelName, IntSupplier previousRecipeDuration) { if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.dynamicLang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", - () -> KeyUtil.coloredString(TextFormatting.RED, fuelName.get()), - () -> KeyUtil.coloredNumber(TextFormatting.AQUA, previousRecipeDuration.getAsInt()))); + () -> KeyUtil.string(TextFormatting.RED, fuelName.get()), + () -> KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration.getAsInt()))); return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index fb7e8f46d50..18e55448b2f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -139,8 +139,8 @@ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { /** * Called once on both sides to obtain text displayed in GUI
* Each element of list is displayed on new line
- * To use translation, use {@link KeyUtil#coloredLang(TextFormatting, String, Object...)} - * or {@link KeyUtil#unformattedLang(String, Object...)} + * To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} + * or {@link KeyUtil#lang(String, Object...)} */ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) {} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 6b33e010b68..6afbc3d34dc 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -12,70 +12,89 @@ public class KeyUtil { public static final String SECTION = "§"; - public static IKey toColor(TextFormatting formatting) { - return IKey.str(formatting.toString()); + public static IKey colored(TextFormatting formatting, IKey... keys) { + if (ArrayUtils.isEmpty(keys)) return wrap(formatting); + if (keys.length == 1) return IKey.comp(wrap(formatting), keys[0]); + return IKey.comp(wrap(formatting), IKey.comp(keys)); } - public static IKey withColor(TextFormatting formatting, IKey... keys) { - if (keys == null) return toColor(formatting); - if (keys.length == 1) return IKey.comp(toColor(formatting), keys[0]); - return IKey.comp(toColor(formatting), IKey.comp(keys)); + public static IKey string(String s) { + return string(TextFormatting.RESET, s); } - public static IKey coloredLang(TextFormatting formatting, String lang, Object... args) { - if (ArrayUtils.isEmpty(args)) return withColor(formatting, IKey.lang(lang)); - return withColor(formatting, IKey.lang(lang, checkFormatting(formatting, args))); + public static IKey string(Supplier s) { + return string(TextFormatting.RESET, s); } - public static IKey coloredString(TextFormatting formatting, String string) { + public static IKey string(TextFormatting formatting, String string) { if (string == null) return IKey.EMPTY; - return IKey.comp(toColor(formatting), IKey.str(string)); - } - - public static IKey coloredNumber(TextFormatting formatting, long number) { - return coloredString(formatting, TextFormattingUtil.formatNumbers(number)); + return IKey.comp(wrap(formatting), IKey.str(string)); } - public static IKey coloredNumber(TextFormatting formatting, long number, String suffix) { - return coloredString(formatting, TextFormattingUtil.formatNumbers(number) + suffix); + public static IKey string(TextFormatting formatting, Supplier stringSupplier) { + return IKey.dynamic(() -> formatting + stringSupplier.get()); } - public static IKey unformattedString(String s) { - return coloredString(TextFormatting.RESET, s); + public static IKey string(Supplier formatting, String s) { + return IKey.dynamic(() -> formatting.get() + s); } - public static IKey unformattedLang(String lang, Object... args) { - return coloredLang(TextFormatting.RESET, lang, args); + public static IKey string(Supplier formatting, Supplier stringSupplier) { + return IKey.dynamic(() -> formatting.get() + stringSupplier.get()); } - public static IKey dynamicString(TextFormatting formatting, Supplier stringSupplier) { - return IKey.dynamic(() -> coloredString(formatting, stringSupplier.get()).get()); + public static IKey lang(String lang, Object... args) { + return lang(TextFormatting.RESET, lang, args); } - public static IKey dynamicString(Supplier formatting, Supplier stringSupplier) { - return IKey.dynamic(() -> coloredString(formatting.get(), stringSupplier.get()).get()); + public static IKey lang(TextFormatting formatting, String lang, Object... args) { + if (ArrayUtils.isEmpty(args)) return colored(formatting, IKey.lang(lang)); + return colored(formatting, IKey.lang(lang, checkFormatting(formatting, args))); } - @SafeVarargs - public static IKey dynamicLang(TextFormatting formatting, String lang, Supplier... argSuppliers) { - if (ArrayUtils.isEmpty(argSuppliers)) return coloredLang(formatting, lang); - if (argSuppliers.length == 1) return IKey.dynamic(() -> coloredLang(formatting, lang, - fixArg(formatting, argSuppliers[0].get())).get()); + public static IKey lang(TextFormatting formatting, String lang, Supplier... argSuppliers) { + if (ArrayUtils.isEmpty(argSuppliers)) return colored(formatting, IKey.lang(lang)); + if (argSuppliers.length == 1) + return string(formatting, () -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).get()); + final Object[] fixedArgs = new Object[argSuppliers.length]; return IKey.dynamic(() -> { - Object[] args = new Object[argSuppliers.length]; - for (int i = 0; i < args.length; i++) { - args[i] = fixArg(formatting, argSuppliers[i].get()); + for (int i = 0; i < fixedArgs.length; i++) { + fixedArgs[i] = fixArg(formatting, argSuppliers[i].get()); } - return coloredLang(formatting, lang, args).get(); + return formatting + IKey.lang(lang, fixedArgs).get(); }); } - public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier) { - return IKey.dynamic(() -> coloredNumber(formatting, supplier.getAsLong()).get()); + public static IKey lang(Supplier formatting, String lang, Supplier... argSuppliers) { + return IKey.dynamic(() -> lang(formatting.get(), lang, argSuppliers).get()); + } + + public static IKey number(TextFormatting formatting, long number) { + return string(formatting, TextFormattingUtil.formatNumbers(number)); + } + + public static IKey number(TextFormatting formatting, long number, String suffix) { + return string(formatting, TextFormattingUtil.formatNumbers(number) + suffix); + } + + public static IKey number(TextFormatting formatting, LongSupplier supplier) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong())); + } + + public static IKey number(TextFormatting formatting, LongSupplier supplier, String suffix) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); + } + + public static IKey number(Supplier formatting, LongSupplier supplier) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong())); + } + + public static IKey number(Supplier formatting, LongSupplier supplier, String suffix) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } - public static IKey dynamicLong(TextFormatting formatting, LongSupplier supplier, String suffix) { - return IKey.dynamic(() -> coloredNumber(formatting, supplier.getAsLong(), suffix).get()); + private static IKey wrap(TextFormatting formatting) { + return IKey.str(formatting.toString()); } private static Object[] checkFormatting(TextFormatting formatting, Object[] args) { @@ -89,7 +108,7 @@ private static Object[] checkFormatting(TextFormatting formatting, Object[] args private static Object fixArg(TextFormatting formatting, Object arg) { if (arg instanceof IKey key) { if (hasFormatting(key.get())) - return IKey.comp(key, toColor(formatting)); + return IKey.comp(key, wrap(formatting)); } else if (arg instanceof String s) { if (hasFormatting(s)) return s + formatting; diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index e685f8e2bd3..8176a1fb4d7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -255,9 +255,9 @@ protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { if (isStructureFormed()) { // todo this is returning 0 on client for some reason if (waterFilled.getIntValue() == 0) { - keyList.add(KeyUtil.coloredLang(TextFormatting.YELLOW, + keyList.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.explosion_tooltip")); } } @@ -274,24 +274,24 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line - IKey steamOutput = KeyUtil.dynamicLong(TextFormatting.AQUA, recipeLogic::getLastTickSteam, + IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, recipeLogic::getLastTickSteam, " L/t"); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line - IKey efficiency = KeyUtil.dynamicString( + IKey efficiency = KeyUtil.string( () -> getNumberColor(recipeLogic.getHeatScaled()), () -> recipeLogic.getHeatScaled() + "%"); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line - IKey throttle = KeyUtil.dynamicString( + IKey throttle = KeyUtil.string( () -> getNumberColor(getThrottle()), () -> getThrottle() + "%"); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 2bde15997ce..b6f4766d65e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -146,10 +146,10 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { private void addHeatCapacity(List keyList) { if (isStructureFormed()) { - var heatString = KeyUtil.coloredNumber(TextFormatting.RED, + var heatString = KeyUtil.number(TextFormatting.RED, getCurrentTemperature(), "K"); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 41a8521d348..0e9b35acedd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -152,7 +152,7 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - tl.add(KeyUtil.coloredLang(TextFormatting.AQUA, key)); + tl.add(KeyUtil.lang(TextFormatting.AQUA, key)); } }) .addWorkingStatusLine(); @@ -164,15 +164,15 @@ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { builder.addCustom(keyList -> { if (isStructureFormed()) { if (checkIntakesObstructed()) { - keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.obstructed")); - keyList.add(KeyUtil.coloredLang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_combustion_engine.obstructed.desc")); } FluidStack lubricantStack = lubricant.getValue(); if (lubricantStack == null || lubricantStack.amount == 0) { - keyList.add(KeyUtil.coloredLang(TextFormatting.RED, + keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.no_lubricant")); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 6d76e1229c1..2546b86053f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -232,9 +232,9 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { .addCustom(tl -> { if (isStructureFormed()) { if (cachedRotorEfficiency > 0) { - IKey efficiencyInfo = KeyUtil.coloredNumber(TextFormatting.AQUA, + IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, cachedTotalEfficiency, "%"); - tl.add(KeyUtil.coloredLang(TextFormatting.GRAY, + tl.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.efficiency", efficiencyInfo)); } From 23dba3684c5770ed5cca0e2c9e7cdc1b4a1f78aa Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 25 Nov 2024 17:09:26 -0700 Subject: [PATCH 026/264] always return cache for client and default for server --- .../api/capability/impl/MultiblockFuelRecipeLogic.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java index 34871f60803..d483175d153 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java @@ -127,6 +127,9 @@ public void invalidate() { } public String getRecipeFluidInputInfo() { + if (getMetaTileEntity().getWorld().isRemote) + return this.cachedFuelAmount; + IRotorHolder rotorHolder = null; if (metaTileEntity instanceof MultiblockWithDisplayBase multiblockWithDisplayBase) { @@ -138,7 +141,7 @@ public String getRecipeFluidInputInfo() { Recipe recipe; if (previousRecipe == null) { recipe = findRecipe(Integer.MAX_VALUE, getInputInventory(), getInputTank()); - if (recipe == null) return this.cachedFuelAmount; + if (recipe == null) return null; } else { recipe = previousRecipe; } @@ -149,7 +152,7 @@ public String getRecipeFluidInputInfo() { if (rotorHolder != null && rotorHolder.hasRotor()) { neededAmount /= (rotorHolder.getTotalEfficiency() / 100.0); } else if (rotorHolder != null && !rotorHolder.hasRotor()) { - return this.cachedFuelAmount; + return null; } this.cachedFuelAmount = TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; return this.cachedFuelAmount; From 65e5ee498d3883ede4b19eb1d2d4f89207d4ae62 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 26 Nov 2024 15:43:19 -0700 Subject: [PATCH 027/264] make display text dynamically updated no need to use dynamic ikeys --- .../multiblock/MultiblockDisplayTextPort.java | 10 +++---- .../multiblock/ui/MultiblockUIFactory.java | 27 ++++++++++++++++--- .../multi/MetaTileEntityLargeBoiler.java | 12 ++++----- .../MetaTileEntityLargeCombustionEngine.java | 3 ++- .../generator/MetaTileEntityLargeTurbine.java | 3 ++- 5 files changed, 37 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java index 9a40f7fede8..9d02c6426bf 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java @@ -17,8 +17,6 @@ import java.util.function.Consumer; import java.util.function.DoubleSupplier; import java.util.function.Function; -import java.util.function.IntSupplier; -import java.util.function.Supplier; public class MultiblockDisplayTextPort { @@ -437,13 +435,13 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { *
* Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ - public Builder addFuelNeededLine(Supplier fuelName, IntSupplier previousRecipeDuration) { - if (!isStructureFormed || !isActive) return this; + public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + if (!isStructureFormed || !isActive || fuelName == null) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", - () -> KeyUtil.string(TextFormatting.RED, fuelName.get()), - () -> KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration.getAsInt()))); + KeyUtil.string(TextFormatting.RED, fuelName), + KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 18e55448b2f..e3d1e1b8430 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -70,9 +70,9 @@ protected void syncValues(PanelSyncManager manager) { syncValues(panelSyncManager); var displayText = new ArrayList>(); - var builder = MultiblockDisplayTextPort.builder(displayText, mte); + // var builder = MultiblockDisplayTextPort.builder(displayText, mte); - configureDisplayText(builder); + // configureDisplayText(builder); var panel = createRootPanel(); @@ -212,12 +212,19 @@ protected Column createBars(@NotNull ModularPanel mainPanel, return column; } - protected ParentWidget createScreen(List> lines, PanelSyncManager syncManager) { + protected Widget createScreen(List> lines, PanelSyncManager syncManager) { var displayText = new Column() .expanded() + .onUpdateListener(column -> { + column.getChildren().clear(); + lines.clear(); + configureDisplayText(MultiblockDisplayTextPort.builder(lines, mte)); + lines.forEach(column::child); + resize(column); + }) .padding(4, 4); - lines.forEach(displayText::child); + // lines.forEach(displayText::child); return new ParentWidget<>() .child(createIndicator()) .child(new ScrollWidget<>(new VerticalScrollData()) @@ -228,6 +235,18 @@ protected ParentWidget createScreen(List> lines, PanelSyncManager s .pos(4, 4); } + private void resize(IWidget parent) { + int top = parent.getArea().getPadding().top; + for (IWidget widget : parent.getChildren()) { + widget.resizer().resize(widget); + var area = widget.getArea(); + area.rx = parent.getArea().getPadding().left; + area.ry = top; + area.applyPos(parent); + top += area.requestedHeight(); + } + } + @NotNull protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = createFlexButton(mainPanel, panelSyncManager); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 8176a1fb4d7..1e21ea315c1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -274,23 +274,23 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line - IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, recipeLogic::getLastTickSteam, - " L/t"); + IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, + recipeLogic.getLastTickSteam(), " L/t"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.string( - () -> getNumberColor(recipeLogic.getHeatScaled()), - () -> recipeLogic.getHeatScaled() + "%"); + getNumberColor(recipeLogic.getHeatScaled()), + recipeLogic.getHeatScaled() + "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.string( - () -> getNumberColor(getThrottle()), - () -> getThrottle() + "%"); + getNumberColor(getThrottle()), + getThrottle() + "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 0e9b35acedd..df0994ac102 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -146,7 +146,8 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { } // todo fuel needed line not working? - builder.addFuelNeededLine(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) + builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), + recipeLogic.getPreviousRecipeDuration()) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 2546b86053f..13183d44a39 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -240,7 +240,8 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { } } }) - .addFuelNeededLine(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) + .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), + recipeLogic.getPreviousRecipeDuration()) .addWorkingStatusLine(); } }; From b1b0b26e114f50072c014bd3ca511c8da1562b99 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 26 Nov 2024 16:18:05 -0700 Subject: [PATCH 028/264] comments, use margin instead of padding, align --- .../multiblock/ui/MultiblockUIFactory.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index e3d1e1b8430..c7f9ca7d8b5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -84,7 +84,9 @@ protected void syncValues(PanelSyncManager manager) { .child(new Row() .bottom(7) .height(77) - .child(SlotGroupWidget.playerInventory(0).left(4)) + .margin(4, 0) + .child(SlotGroupWidget.playerInventory(0) + .alignX(0f)) .child(createButtons(panel, panelSyncManager))); } @@ -137,7 +139,7 @@ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { } /** - * Called once on both sides to obtain text displayed in GUI
+ * Called per tick on client side
* Each element of list is displayed on new line
* To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} * or {@link KeyUtil#lang(String, Object...)} @@ -179,8 +181,8 @@ protected Column createBars(@NotNull ModularPanel mainPanel, final int cols = progressMulti.getProgressBarCols(); Column column = new Column() - .padding(4, 0) - .pos(0, 114) + .margin(4, 0) + .top(114) .widthRel(1f) .height(Bars.HEIGHT * 2); int rowWidth = (Bars.FULL_WIDTH / cols) - (cols - 1); @@ -218,11 +220,12 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan .onUpdateListener(column -> { column.getChildren().clear(); lines.clear(); + // really debating on if the display screen should be its own widget configureDisplayText(MultiblockDisplayTextPort.builder(lines, mte)); lines.forEach(column::child); resize(column); }) - .padding(4, 4); + .margin(4, 4); // lines.forEach(displayText::child); return new ParentWidget<>() @@ -257,7 +260,8 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy var powerButton = createPowerButton(mainPanel, panelSyncManager); return new Column() - .right(4) + .alignX(1f) + .right(0) .size(18, 77) .child(createDistinctButton(mainPanel, panelSyncManager)) .child(createVoidingButton(mainPanel, panelSyncManager)) From c1c11bcf674bb900e34863280f053c68c81a2316 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:41:19 -0700 Subject: [PATCH 029/264] make and use builder methods instead of anonynous classes --- .../MultiMapMultiblockController.java | 40 ++-- .../multiblock/ui/MultiblockUIFactory.java | 103 +++++---- .../multi/MetaTileEntityLargeBoiler.java | 206 +++++++++--------- .../MetaTileEntityElectricBlastFurnace.java | 39 ++-- .../MetaTileEntityLargeCombustionEngine.java | 65 +++--- .../generator/MetaTileEntityLargeTurbine.java | 15 +- 6 files changed, 220 insertions(+), 248 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 9f07b067b59..a31eedf0e20 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -139,28 +139,24 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM @Override protected MultiblockUIFactory createUIFactory() { IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); - return new MultiblockUIFactory(this) { - - @Override - public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, - @NotNull PanelSyncManager panelSyncManager) { - if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) - return null; - - return new CycleButtonWidget() - .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) - .background(GTGuiTextures.BUTTON) - // TODO find out why this needs to be called - .disableHoverBackground() - .value(recipeMapValue) - .length(getAvailableRecipeMaps().length) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(t -> t.addLine(IKey.comp( - IKey.lang("gregtech.multiblock.multiple_recipemaps.value", - IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] - .getTranslationKey()))))); - } - }; + return new MultiblockUIFactory(this) + .createFlexButton((panel, syncManager) -> { + if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) + return null; + + return new CycleButtonWidget() + .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) + .background(GTGuiTextures.BUTTON) + // TODO find out why this needs to be called + .disableHoverBackground() + .value(recipeMapValue) + .length(getAvailableRecipeMaps().length) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(IKey.comp( + IKey.lang("gregtech.multiblock.multiple_recipemaps.value", + IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] + .getTranslationKey()))))); + }); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c7f9ca7d8b5..f0be2563110 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -36,12 +36,20 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Supplier; public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected final BooleanSyncValue mufflerObstructed; protected final IntSyncValue maintanence; + protected Consumer valueSyncer = syncManager -> {}; + protected Consumer displayText = builder -> {}; + protected Consumer warningText = builder -> {}; + protected Consumer errorText = builder -> {}; + protected BiFunction> flexButton = (panel, syncManager) -> null; protected static final int DEFAULT_HEIGHT = 202; protected static final int DEFAULT_WIDTH = 198; @@ -54,12 +62,14 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { /** * Called once during ui construction. - * - * @param manager for syncing values */ - protected void syncValues(PanelSyncManager manager) { - manager.syncValue("muffler", mufflerObstructed); - manager.syncValue("maintenance", maintanence); + public MultiblockUIFactory syncValues(Consumer valueSyncer) { + this.valueSyncer = syncManager -> { + syncManager.syncValue("muffler", mufflerObstructed); + syncManager.syncValue("maintenance", maintanence); + valueSyncer.accept(syncManager); + }; + return this; } /** @@ -67,15 +77,11 @@ protected void syncValues(PanelSyncManager manager) { * It is not recommended to override this method */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - syncValues(panelSyncManager); - var displayText = new ArrayList>(); - - // var builder = MultiblockDisplayTextPort.builder(displayText, mte); - - // configureDisplayText(builder); - + this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); + var displayText = new ArrayList>(); + // TODO createExtras() hook for overrides? var bars = createBars(panel, panelSyncManager); @@ -94,23 +100,7 @@ private Widget createIndicator() { List> textList = new ArrayList<>(); return new Widget<>() .pos(174 - 5, 93 - 5) - .onUpdateListener(w -> { - IDrawable icon = GTGuiTextures.GREGTECH_LOGO; - textList.clear(); - var builder = MultiblockDisplayTextPort.builder(textList, mte, true, false); - configureErrorText(builder); - if (textList.isEmpty()) { - configureWarningText(builder); - if (!textList.isEmpty()) { - // warn - icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; - } - } else { - // error - icon = GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; - } - w.overlay(icon); - }) + .onUpdateListener(w -> w.overlay(getIndicatorOverlay(textList))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(tooltip -> { for (var text : textList) { @@ -120,22 +110,49 @@ private Widget createIndicator() { }); } + private IDrawable getIndicatorOverlay(List> textList) { + if (!textList.isEmpty()) textList.clear(); + + var builder = MultiblockDisplayTextPort.builder(textList, mte, true, false); + this.errorText.accept(builder); + if (!textList.isEmpty()) { + // error + return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; + } + this.warningText.accept(builder); + if (!textList.isEmpty()) { + // warn + return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; + } + + // todo getLogo()? + return GTGuiTextures.GREGTECH_LOGO_DARK; + } + /** * Returns a list of text indicating any current warnings in this Multiblock.
* Recommended to only display warnings if the structure is already formed.
* This is called every tick on the client-side */ - protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { - builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); + public MultiblockUIFactory configureWarningText(Consumer warningText) { + this.warningText = builder -> { + builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); + warningText.accept(builder); + }; + return this; } /** * Returns a list of translation keys indicating any current errors in this Multiblock.
- * Prioritized over any warnings provided by {@link #configureWarningText(MultiblockDisplayTextPort.Builder)}.
+ * Prioritized over any warnings provided by {@link #configureWarningText(Consumer)}.
* This is called every tick on the client-side */ - protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { - builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); + public MultiblockUIFactory configureErrorText(Consumer errorText) { + this.errorText = builder -> { + builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); + errorText.accept(builder); + }; + return this; } /** @@ -144,20 +161,20 @@ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { * To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} * or {@link KeyUtil#lang(String, Object...)} */ - protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) {} + public MultiblockUIFactory configureDisplayText(Consumer displayText) { + this.displayText = displayText; + return this; + } /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no * additional functionality for this Multiblock. *
* Size will be 18x18. - * - * @param mainPanel the main panel, needed for creating popup panels - * @param panelSyncManager the sync manager for synchronizing widgets */ - public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, - @NotNull PanelSyncManager panelSyncManager) { - return null; + public MultiblockUIFactory createFlexButton(BiFunction> flexButton) { + this.flexButton = flexButton; + return this; } protected @NotNull ModularPanel createRootPanel() { @@ -221,7 +238,7 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan column.getChildren().clear(); lines.clear(); // really debating on if the display screen should be its own widget - configureDisplayText(MultiblockDisplayTextPort.builder(lines, mte)); + this.displayText.accept(MultiblockDisplayTextPort.builder(lines, mte)); lines.forEach(column::child); resize(column); }) @@ -252,7 +269,7 @@ private void resize(IWidget parent) { @NotNull protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - var flexButton = createFlexButton(mainPanel, panelSyncManager); + var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() .size(18); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 1e21ea315c1..145a570c9c3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -49,7 +49,6 @@ import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SliderWidget; @@ -176,82 +175,17 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); - DoubleSyncValue sliderValue = new DoubleSyncValue( - () -> (double) getThrottlePercentage() / 100, - d -> setThrottlePercentage((int) (d * 100))); - return new MultiblockUIFactory(this) { - - IntSyncValue waterFilled; - - @Override - public @Nullable Widget createFlexButton(@NotNull ModularPanel mainPanel, - @NotNull PanelSyncManager panelSyncManager) { - PanelSyncHandler panel = panelSyncManager.panel("throttle_panel", mainPanel, - (syncManager, syncHandler) -> GTGuis.createPopupPanel("boiler_throttle", 116, 53) - .child(new Row() - .pos(4, 4) - .height(16) - .coverChildrenWidth() - .child(new ItemDrawable(getStackForm()) - .asWidget() - .size(16) - .marginRight(4)) - .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") - .asWidget() - .heightRel(1.0f))) - .child(new Row() - .top(20) - .margin(4, 0) - .coverChildrenHeight() - .child(new SliderWidget() - .background(new Rectangle().setColor(Color.BLACK.brighter(2)).asIcon() - .height(8)) - .bounds(0, 1) - .setAxis(GuiAxis.X) - .value(sliderValue) - .widthRel(0.7f) - .height(20)) - // TODO add inc/dec buttons - .child(new TextFieldWidget() - .widthRel(0.3f) - .height(20) - // TODO proper color - .setTextColor(Color.WHITE.darker(1)) - .setNumbers(0, 100) - // TODO show % sign - .value(throttleValue) - .background(GTGuiTextures.DISPLAY)))); - - return new ButtonWidget<>() - .width(18) - .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) - // todo lang - .addTooltipLine("Configure Boiler Throttle") - // TODO make this work - .background(GTGuiTextures.BUTTON) - .onMousePressed(i -> { - if (panel.isPanelOpen()) { - panel.closePanel(); - } else { - panel.openPanel(); - } - Interactable.playButtonClickSound(); - return true; - }); - } - - @Override - protected void syncValues(PanelSyncManager manager) { - super.syncValues(manager); - waterFilled = new IntSyncValue(() -> getWaterFilled(), null); - manager.syncValue("water_filled", waterFilled); - } - - @Override - protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { - super.configureWarningText(builder); - builder.addCustom(keyList -> { + final IntSyncValue waterFilled = new IntSyncValue(this::getWaterFilled, null); + // update cache manually, as it's not done in constructor + waterFilled.updateCacheFromSource(true); + + return new MultiblockUIFactory(this) + .syncValues(syncManager -> syncManager.syncValue("water_filled", waterFilled)) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addCustom(this::addCustomData) + .addWorkingStatusLine()) + .configureWarningText(builder -> builder.addCustom(keyList -> { if (isStructureFormed()) { // todo this is returning 0 on client for some reason if (waterFilled.getIntValue() == 0) { @@ -261,41 +195,95 @@ protected void configureWarningText(MultiblockDisplayTextPort.Builder builder) { "gregtech.multiblock.large_boiler.explosion_tooltip")); } } + })) + .createFlexButton((panel, syncManager) -> { + PanelSyncHandler throttle = syncManager.panel("throttle_panel", panel, this::makeThrottlePanel); + + return new ButtonWidget<>() + .width(18) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) + // todo lang + .addTooltipLine("Configure Boiler Throttle") + // TODO make this work + .background(GTGuiTextures.BUTTON) + .onMousePressed(i -> { + if (throttle.isPanelOpen()) { + throttle.closePanel(); + } else { + throttle.openPanel(); + } + Interactable.playButtonClickSound(); + return true; + }); }); - } + } - @Override - protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { - builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addCustom(this::addCustomData) - .addWorkingStatusLine(); - } + private void addCustomData(List keyList) { + if (isStructureFormed()) { + // Steam Output line + IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, + recipeLogic.getLastTickSteam(), " L/t"); + + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.steam_output", steamOutput)); + + // Efficiency line + IKey efficiency = KeyUtil.string( + getNumberColor(recipeLogic.getHeatScaled()), + recipeLogic.getHeatScaled() + "%"); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.efficiency", efficiency)); + + // Throttle line + IKey throttle = KeyUtil.string( + getNumberColor(getThrottle()), + getThrottle() + "%"); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.throttle", throttle)); + } + } - private void addCustomData(List keyList) { - if (isStructureFormed()) { - // Steam Output line - IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, - recipeLogic.getLastTickSteam(), " L/t"); - - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.steam_output", steamOutput)); - - // Efficiency line - IKey efficiency = KeyUtil.string( - getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic.getHeatScaled() + "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.efficiency", efficiency)); - - // Throttle line - IKey throttle = KeyUtil.string( - getNumberColor(getThrottle()), - getThrottle() + "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.throttle", throttle)); - } - } - }; + private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, PanelSyncHandler syncHandler) { + IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); + DoubleSyncValue sliderValue = new DoubleSyncValue( + () -> (double) getThrottlePercentage() / 100, + d -> setThrottlePercentage((int) (d * 100)) + ); + + return GTGuis.createPopupPanel("boiler_throttle", 116, 53) + .child(new Row() + .pos(4, 4) + .height(16) + .coverChildrenWidth() + .child(new ItemDrawable(getStackForm()) + .asWidget() + .size(16) + .marginRight(4)) + .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") + .asWidget() + .heightRel(1.0f))) + .child(new Row() + .top(20) + .margin(4, 0) + .coverChildrenHeight() + .child(new SliderWidget() + .background(new Rectangle().setColor(Color.BLACK.brighter(2)).asIcon() + .height(8)) + .bounds(0, 1) + .setAxis(GuiAxis.X) + .value(sliderValue) + .widthRel(0.7f) + .height(20)) + // TODO add inc/dec buttons + .child(new TextFieldWidget() + .widthRel(0.3f) + .height(20) + // TODO proper color + .setTextColor(Color.WHITE.darker(1)) + .setNumbers(0, 100) + // TODO show % sign + .value(throttleValue) + .background(GTGuiTextures.DISPLAY))); } private void setThrottlePercentage(int amount) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index b6f4766d65e..43d49b97109 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -122,38 +122,27 @@ protected void addDisplayText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - return new MultiblockUIFactory(this) { - - DoubleSyncValue progress; - - @Override - protected void syncValues(PanelSyncManager manager) { - super.syncValues(manager); - progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - manager.syncValue("progress", progress); - } - - @Override - protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { - builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + return new MultiblockUIFactory(this) + .syncValues(syncManager -> syncManager.syncValue("progress", progress)) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue); - } + .addProgressLine(progress::getDoubleValue)); + } - private void addHeatCapacity(List keyList) { - if (isStructureFormed()) { - var heatString = KeyUtil.number(TextFormatting.RED, - getCurrentTemperature(), "K"); + private void addHeatCapacity(List keyList) { + if (isStructureFormed()) { + var heatString = KeyUtil.number(TextFormatting.RED, + getCurrentTemperature(), "K"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.blast_furnace.max_temperature", heatString)); - } - } - }; + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.blast_furnace.max_temperature", heatString)); + } } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index df0994ac102..d63589c3003 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -126,43 +126,32 @@ protected MultiblockUIFactory createUIFactory() { () -> getInputFluidInventory().drain(Materials.Lubricant.getFluid(Integer.MAX_VALUE), false), null, NetworkUtils::readFluidStack, NetworkUtils::writeFluidStack); - return new MultiblockUIFactory(this) { - - @Override - protected void syncValues(PanelSyncManager manager) { - super.syncValues(manager); - manager.syncValue("lubricant", lubricant); - } - - @Override - protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { - var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); - builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); - - if (isExtreme) { - builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); - } else { - builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); - } - - // todo fuel needed line not working? - builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), - recipeLogic.getPreviousRecipeDuration()) - .addCustom(tl -> { - if (isStructureFormed() && recipeLogic.isOxygenBoosted) { - String key = isExtreme ? - "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : - "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - tl.add(KeyUtil.lang(TextFormatting.AQUA, key)); - } - }) - .addWorkingStatusLine(); - } + return new MultiblockUIFactory(this) + .syncValues(syncManager -> syncManager.syncValue("lubricant", lubricant)) + .configureDisplayText(builder -> { + var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + + if (isExtreme) { + builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); + } else { + builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); + } - @Override - protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { - super.configureErrorText(builder); - builder.addCustom(keyList -> { + // todo fuel needed line not working? + builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), + recipeLogic.getPreviousRecipeDuration()) + .addCustom(tl -> { + if (isStructureFormed() && recipeLogic.isOxygenBoosted) { + String key = isExtreme ? + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : + "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; + tl.add(KeyUtil.lang(TextFormatting.AQUA, key)); + } + }) + .addWorkingStatusLine(); + }) + .configureErrorText(builder -> builder.addCustom(keyList -> { if (isStructureFormed()) { if (checkIntakesObstructed()) { keyList.add(KeyUtil.lang(TextFormatting.RED, @@ -177,9 +166,7 @@ protected void configureErrorText(MultiblockDisplayTextPort.Builder builder) { "gregtech.multiblock.large_combustion_engine.no_lubricant")); } } - }); - } - }; + })); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 13183d44a39..132d736222c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -221,13 +221,10 @@ public void receiveInitialSyncData(PacketBuffer buf) { @Override protected MultiblockUIFactory createUIFactory() { - return new MultiblockUIFactory(this) { - - @Override - protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { - MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - - builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + final MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + return new MultiblockUIFactory(this) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) .addCustom(tl -> { if (isStructureFormed()) { @@ -242,9 +239,7 @@ protected void configureDisplayText(MultiblockDisplayTextPort.Builder builder) { }) .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addWorkingStatusLine(); - } - }; + .addWorkingStatusLine()); } @Override From 7c8691099cd015240a2a0b9924b682f98eacb97b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:02:13 -0700 Subject: [PATCH 030/264] move builder from MultiblockDisplayTextPort into MultiblockUIFactory delete MultiblockDisplayTextPort.java spotless --- .../MultiMapMultiblockController.java | 4 - .../multiblock/MultiblockDisplayTextPort.java | 474 ---------------- .../multiblock/ui/MultiblockUIFactory.java | 511 +++++++++++++++++- .../multi/MetaTileEntityLargeBoiler.java | 3 +- .../MetaTileEntityElectricBlastFurnace.java | 2 - .../MetaTileEntityLargeCombustionEngine.java | 2 +- 6 files changed, 484 insertions(+), 512 deletions(-) delete mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index a31eedf0e20..f587caac056 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -24,12 +24,8 @@ import codechicken.lib.raytracer.CuboidRayTraceResult; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widgets.CycleButtonWidget; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java deleted file mode 100644 index 9d02c6426bf..00000000000 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayTextPort.java +++ /dev/null @@ -1,474 +0,0 @@ -package gregtech.api.metatileentity.multiblock; - -import gregtech.api.GTValues; -import gregtech.api.capability.IEnergyContainer; -import gregtech.api.util.GTUtility; -import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; -import gregtech.common.ConfigHolder; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.widget.Widget; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.DoubleSupplier; -import java.util.function.Function; - -public class MultiblockDisplayTextPort { - - /** - * Construct a new Multiblock Display Text builder. - *
- * Automatically adds the "Invalid Structure" line if the structure is not formed. - */ - public static Builder builder(List> textList, MultiblockWithDisplayBase mte) { - return builder(textList, mte, true); - } - - public static Builder builder(List> textList, MultiblockWithDisplayBase mte, - boolean showIncompleteStructureWarning) { - return new Builder(textList, mte, showIncompleteStructureWarning, true); - } - - public static Builder builder(List> textList, MultiblockWithDisplayBase mte, - boolean showIncompleteStructureWarning, boolean showTitle) { - return new Builder(textList, mte, showIncompleteStructureWarning, showTitle); - } - - public static class Builder { - - private final List> textList; - private Function> widgetFunction = Builder::keyMapper; - private final boolean isStructureFormed; - - private boolean isWorkingEnabled, isActive; - - // Keys for the three-state working system, can be set custom by multiblocks. - private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); - private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); - private IKey runningKey = IKey.lang("gregtech.multiblock.running"); - - private Builder(List> textList, MultiblockWithDisplayBase mte, - boolean showIncompleteStructureWarning, boolean showTitle) { - this.textList = textList; - this.isStructureFormed = mte.isStructureFormed(); - - if (showTitle) - addKey(KeyUtil.lang(TextFormatting.WHITE, mte.getMetaFullName())); - - if (!isStructureFormed && showIncompleteStructureWarning) { - var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); - var hover = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.invalid_structure.tooltip"); - addKey(base).addTooltipLine(hover); - } - } - - public static Widget keyMapper(IKey key) { - return key.asWidget() - .widthRel(1f) - .height(12); - } - - /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ - public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { - this.isWorkingEnabled = isWorkingEnabled; - this.isActive = isActive; - return this; - } - - /** - * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. - * You still must call {@link Builder#addWorkingStatusLine()} for these to appear! - *
- * Pass any key as null for it to continue to use the default key. - * - * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". - * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". - * @param runningKey The translation key for the Running state, or "isActive". - */ - public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { - if (idlingKey != null) this.idlingKey = IKey.str(idlingKey); - if (pausedKey != null) this.pausedKey = IKey.str(pausedKey); - if (runningKey != null) this.runningKey = IKey.str(runningKey); - return this; - } - - /** - * Adds the max EU/t that this multiblock can use. - *
- * Added if the structure is formed and if the passed energy container has greater than zero capacity. - */ - public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!isStructureFormed || energyContainer == null) return this; - - if (energyContainer.getEnergyCapacity() > 0) { - long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - var bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); - var hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_hover"); - addKey(bodyText).addTooltipLine(hoverText); - } - return this; - } - - /** - * Adds the max Recipe Tier that this multiblock can use for recipe lookup. - *
- * Added if the structure is formed and if the passed tier is a valid energy tier index for - * {@link GTValues#VNF}. - */ - public Builder addEnergyTierLine(int tier) { - if (!isStructureFormed) return this; - if (tier < GTValues.ULV || tier > GTValues.MAX) return this; - - var bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); - var hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier_hover"); - addKey(bodyText).addTooltipLine(hoverText); - return this; - } - - /** - * Adds the exact EU/t that this multiblock needs to run. - *
- * Added if the structure is formed and if the passed value is greater than zero. - */ - public Builder addEnergyUsageExactLine(long energyUsage) { - if (!isStructureFormed) return this; - if (energyUsage > 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce. - *
- * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. - */ - public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp - * outputting multis. - *
- * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than - * zero. - */ - public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && amperage != 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_amps", - energyFormatted, amperage, voltageName)); - } - return this; - } - - /** - * Adds the max CWU/t that this multiblock can use. - *
- * Added if the structure is formed and if the max CWU/t is greater than zero. - */ - public Builder addComputationUsageLine(int maxCWUt) { - if (!isStructureFormed) return this; - if (maxCWUt > 0) { - var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.computation.max", computation)); - } - return this; - } - - /** - * Adds a currently used CWU/t line. - *
- * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. - */ - public Builder addComputationUsageExactLine(int currentCWUt) { - if (!isStructureFormed) return this; - if (isActive && currentCWUt > 0) { - var computation = KeyUtil.string(TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.computation.usage", computation)); - } - return this; - } - - /** - * Adds a three-state indicator line, showing if the machine is running, paused, or idling. - *
- * Added if the structure is formed. - */ - public Builder addWorkingStatusLine() { - if (!isStructureFormed) return this; - - if (!isWorkingEnabled) { - return addWorkPausedLine(false); - } else if (isActive) { - return addRunningPerfectlyLine(false); - } else { - return addIdlingLine(false); - } - } - - /** - * Adds the "Work Paused." line. - *
- * Added if working is not enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addWorkPausedLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || !isWorkingEnabled) { - addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); - } - return this; - } - - /** - * Adds the "Running Perfectly." line. - *
- * Added if machine is active, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addRunningPerfectlyLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || isActive) { - addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); - } - return this; - } - - /** - * Adds the "Idling." line. - *
- * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addIdlingLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || (isWorkingEnabled && !isActive)) { - addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); - } - return this; - } - - /** - * Adds a simple progress line that displays progress as a percentage. - *
- * Added if structure is formed and the machine is active. - * - * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. - */ - public Builder addProgressLine(DoubleSupplier progressPercent) { // todo - if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", - () -> ((int) (progressPercent.getAsDouble() * 100)))); - return this; - } - - /** - * Adds a line indicating how many parallels this multi can potentially perform. - *
- * Added if structure is formed and the number of parallels is greater than one. - */ - public Builder addParallelsLine(int numParallels) { - if (!isStructureFormed) return this; - if (numParallels > 1) { - var parallels = KeyUtil.string(TextFormatting.DARK_PURPLE, - TextFormattingUtil.formatNumbers(numParallels)); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.parallel", parallels)); - } - return this; - } - - /** - * Adds a warning line when the machine is low on power. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowPowerLine(boolean isLowPower) { - if (!isStructureFormed) return this; - if (isLowPower) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy")); - } - return this; - } - - /** - * Adds a warning line when the machine is low on computation. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowComputationLine(boolean isLowComputation) { - if (!isStructureFormed) return this; - if (isLowComputation) { - addKey(IKey.comp(IKey.str(TextFormatting.YELLOW.toString()), - IKey.lang("gregtech.multiblock.computation.not_enough_computation"))); - } - return this; - } - - /** - * Adds a warning line when the machine's dynamo tier is too low for current conditions. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowDynamoTierLine(boolean isTooLow) { - if (!isStructureFormed) return this; - if (isTooLow) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy_output")); - } - return this; - } - - /** - * Adds warning line(s) when the machine has maintenance problems. - *
- * Added if there are any maintenance problems, one line per problem as well as a header.
- * Will check the config setting for if maintenance is enabled automatically. - */ - public Builder addMaintenanceProblemLines(byte maintenanceProblems) { - if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - if (maintenanceProblems < 63) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.has_problems")); - - // Wrench - if ((maintenanceProblems & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wrench")); - } - - // Screwdriver - if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.screwdriver")); - } - - // Soft Mallet - if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.soft_mallet")); - } - - // Hammer - if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.hard_hammer")); - } - - // Wire Cutters - if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wire_cutter")); - } - - // Crowbar - if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.crowbar")); - } - } - return this; - } - - /** - * Adds two error lines when the machine's muffler hatch is obstructed. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addMufflerObstructedLine(boolean isObstructed) { - if (!isStructureFormed) return this; - if (isObstructed) { - addKey(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.universal.muffler_obstructed")); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.muffler_obstructed_desc")); - } - return this; - } - - /** - * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. - *
- * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. - */ - public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.fuel_needed", - KeyUtil.string(TextFormatting.RED, fuelName), - KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); - - return this; - } - - /** Insert an empty line into the text list. */ - public Builder addEmptyLine() { - addKey(IKey.EMPTY); // this is going to cause problems maybe - return this; - } - - /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - List customKeys = new ArrayList<>(); - customConsumer.accept(customKeys); - customKeys.forEach(this::addKey); - return this; - } - - private Widget addKey(IKey key) { - var w = this.widgetFunction.apply(key); - this.textList.add(w); - return w; - } - - public Builder widgetFunction(Function> widgetFunction) { - this.widgetFunction = widgetFunction; - return this; - } - } -} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index f0be2563110..a7773339798 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -1,14 +1,18 @@ package gregtech.api.metatileentity.multiblock.ui; +import gregtech.api.GTValues; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.IDistinctBusController; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayTextPort; +import gregtech.api.capability.IEnergyContainer; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.ConfigHolder; import net.minecraft.util.text.TextFormatting; @@ -38,7 +42,8 @@ import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; -import java.util.function.Supplier; +import java.util.function.DoubleSupplier; +import java.util.function.Function; public class MultiblockUIFactory { @@ -46,9 +51,9 @@ public class MultiblockUIFactory { protected final BooleanSyncValue mufflerObstructed; protected final IntSyncValue maintanence; protected Consumer valueSyncer = syncManager -> {}; - protected Consumer displayText = builder -> {}; - protected Consumer warningText = builder -> {}; - protected Consumer errorText = builder -> {}; + protected Consumer displayText = builder -> {}; + protected Consumer warningText = builder -> {}; + protected Consumer errorText = builder -> {}; protected BiFunction> flexButton = (panel, syncManager) -> null; protected static final int DEFAULT_HEIGHT = 202; @@ -98,9 +103,10 @@ public MultiblockUIFactory syncValues(Consumer valueSyncer) { private Widget createIndicator() { List> textList = new ArrayList<>(); + var builder = builder(textList); return new Widget<>() .pos(174 - 5, 93 - 5) - .onUpdateListener(w -> w.overlay(getIndicatorOverlay(textList))) + .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(tooltip -> { for (var text : textList) { @@ -110,17 +116,16 @@ private Widget createIndicator() { }); } - private IDrawable getIndicatorOverlay(List> textList) { - if (!textList.isEmpty()) textList.clear(); + private IDrawable getIndicatorOverlay(Builder builder) { + if (!builder.isEmpty()) builder.clear(); - var builder = MultiblockDisplayTextPort.builder(textList, mte, true, false); this.errorText.accept(builder); - if (!textList.isEmpty()) { + if (!builder.isEmpty()) { // error return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; } this.warningText.accept(builder); - if (!textList.isEmpty()) { + if (!builder.isEmpty()) { // warn return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } @@ -134,7 +139,7 @@ private IDrawable getIndicatorOverlay(List> textList) { * Recommended to only display warnings if the structure is already formed.
* This is called every tick on the client-side */ - public MultiblockUIFactory configureWarningText(Consumer warningText) { + public MultiblockUIFactory configureWarningText(Consumer warningText) { this.warningText = builder -> { builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); warningText.accept(builder); @@ -147,7 +152,7 @@ public MultiblockUIFactory configureWarningText(Consumer * This is called every tick on the client-side */ - public MultiblockUIFactory configureErrorText(Consumer errorText) { + public MultiblockUIFactory configureErrorText(Consumer errorText) { this.errorText = builder -> { builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); errorText.accept(builder); @@ -161,8 +166,8 @@ public MultiblockUIFactory configureErrorText(Consumer displayText) { - this.displayText = displayText; + public MultiblockUIFactory configureDisplayText(Consumer displayText) { + this.displayText = builder -> displayText.accept(builder.title().structureFormed()); return this; } @@ -232,24 +237,21 @@ protected Column createBars(@NotNull ModularPanel mainPanel, } protected Widget createScreen(List> lines, PanelSyncManager syncManager) { - var displayText = new Column() - .expanded() - .onUpdateListener(column -> { - column.getChildren().clear(); - lines.clear(); - // really debating on if the display screen should be its own widget - this.displayText.accept(MultiblockDisplayTextPort.builder(lines, mte)); - lines.forEach(column::child); - resize(column); - }) - .margin(4, 4); - - // lines.forEach(displayText::child); return new ParentWidget<>() .child(createIndicator()) .child(new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) - .child(displayText)) + .child(new Column() + .expanded() + .onUpdateListener(column -> { + column.getChildren().clear(); + lines.clear(); + // really debating on if the display screen should be its own widget + this.displayText.accept(builder(lines)); + lines.forEach(column::child); + resize(column); + }) + .margin(4, 4))) .background(GTGuiTextures.DISPLAY) .size(190, 109) .pos(4, 4); @@ -360,4 +362,455 @@ public static final class Bars { private Bars() {} } + + protected Builder builder(List> list) { + return new Builder(list).title().structureFormed(); + } + + @SuppressWarnings({ "UnusedReturnValue", "unused" }) + public class Builder { + + private final List> textList; + private Function> widgetFunction = Builder::keyMapper; + + private boolean isWorkingEnabled, isActive; + + // Keys for the three-state working system, can be set custom by multiblocks. + private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); + private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); + private IKey runningKey = IKey.lang("gregtech.multiblock.running"); + + protected static Widget keyMapper(IKey key) { + return key.asWidget() + .widthRel(1f) + .height(12); + } + + private Builder(List> textList) { + this.textList = textList; + } + + public Builder structureFormed() { + if (!mte.isStructureFormed()) { + var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + var hover = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.invalid_structure.tooltip"); + addKey(base).addTooltipLine(hover); + } + return this; + } + + public Builder title() { + addKey(KeyUtil.lang(TextFormatting.WHITE, mte.getMetaFullName())); + return this; + } + + /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ + public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { + this.isWorkingEnabled = isWorkingEnabled; + this.isActive = isActive; + return this; + } + + /** + * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. + * You still must call {@link Builder#addWorkingStatusLine()} for these to appear! + *
+ * Pass any key as null for it to continue to use the default key. + * + * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". + * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". + * @param runningKey The translation key for the Running state, or "isActive". + */ + public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { + if (idlingKey != null) this.idlingKey = IKey.str(idlingKey); + if (pausedKey != null) this.pausedKey = IKey.str(pausedKey); + if (runningKey != null) this.runningKey = IKey.str(runningKey); + return this; + } + + /** + * Adds the max EU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the passed energy container has greater than zero capacity. + */ + public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { + if (!mte.isStructureFormed() || energyContainer == null) return this; + + if (energyContainer.getEnergyCapacity() > 0) { + long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + var bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); + var hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_hover"); + addKey(bodyText).addTooltipLine(hoverText); + } + return this; + } + + /** + * Adds the max Recipe Tier that this multiblock can use for recipe lookup. + *
+ * Added if the structure is formed and if the passed tier is a valid energy tier index for + * {@link GTValues#VNF}. + */ + public Builder addEnergyTierLine(int tier) { + if (!mte.isStructureFormed()) return this; + if (tier < GTValues.ULV || tier > GTValues.MAX) return this; + + var bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); + var hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier_hover"); + addKey(bodyText).addTooltipLine(hoverText); + return this; + } + + /** + * Adds the exact EU/t that this multiblock needs to run. + *
+ * Added if the structure is formed and if the passed value is greater than zero. + */ + public Builder addEnergyUsageExactLine(long energyUsage) { + if (!mte.isStructureFormed()) return this; + if (energyUsage > 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.string( + GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce. + *
+ * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. + */ + public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { + if (!mte.isStructureFormed()) return this; + if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.string( + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp + * outputting multis. + *
+ * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than + * zero. + */ + public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { + if (!mte.isStructureFormed()) return this; + if (maxVoltage != 0 && amperage != 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.string( + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_amps", + energyFormatted, amperage, voltageName)); + } + return this; + } + + /** + * Adds the max CWU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the max CWU/t is greater than zero. + */ + public Builder addComputationUsageLine(int maxCWUt) { + if (!mte.isStructureFormed()) return this; + if (maxCWUt > 0) { + var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.computation.max", computation)); + } + return this; + } + + /** + * Adds a currently used CWU/t line. + *
+ * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. + */ + public Builder addComputationUsageExactLine(int currentCWUt) { + if (!mte.isStructureFormed()) return this; + if (isActive && currentCWUt > 0) { + var computation = KeyUtil.string(TextFormatting.AQUA, + TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.computation.usage", computation)); + } + return this; + } + + /** + * Adds a three-state indicator line, showing if the machine is running, paused, or idling. + *
+ * Added if the structure is formed. + */ + public Builder addWorkingStatusLine() { + if (!mte.isStructureFormed()) return this; + + if (!isWorkingEnabled) { + return addWorkPausedLine(false); + } else if (isActive) { + return addRunningPerfectlyLine(false); + } else { + return addIdlingLine(false); + } + } + + /** + * Adds the "Work Paused." line. + *
+ * Added if working is not enabled, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addWorkPausedLine(boolean checkState) { + if (!mte.isStructureFormed()) return this; + if (!checkState || !isWorkingEnabled) { + addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); + } + return this; + } + + /** + * Adds the "Running Perfectly." line. + *
+ * Added if machine is active, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addRunningPerfectlyLine(boolean checkState) { + if (!mte.isStructureFormed()) return this; + if (!checkState || isActive) { + addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); + } + return this; + } + + /** + * Adds the "Idling." line. + *
+ * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. + * Also added only if formed. + */ + public Builder addIdlingLine(boolean checkState) { + if (!mte.isStructureFormed()) return this; + if (!checkState || (isWorkingEnabled && !isActive)) { + addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); + } + return this; + } + + /** + * Adds a simple progress line that displays progress as a percentage. + *
+ * Added if structure is formed and the machine is active. + * + * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. + */ + public Builder addProgressLine(DoubleSupplier progressPercent) { // todo + if (!mte.isStructureFormed() || !isActive) return this; + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", + () -> ((int) (progressPercent.getAsDouble() * 100)))); + return this; + } + + /** + * Adds a line indicating how many parallels this multi can potentially perform. + *
+ * Added if structure is formed and the number of parallels is greater than one. + */ + public Builder addParallelsLine(int numParallels) { + if (!mte.isStructureFormed()) return this; + if (numParallels > 1) { + var parallels = KeyUtil.string(TextFormatting.DARK_PURPLE, + TextFormattingUtil.formatNumbers(numParallels)); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.parallel", parallels)); + } + return this; + } + + /** + * Adds a warning line when the machine is low on power. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowPowerLine(boolean isLowPower) { + if (!mte.isStructureFormed()) return this; + if (isLowPower) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy")); + } + return this; + } + + /** + * Adds a warning line when the machine is low on computation. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowComputationLine(boolean isLowComputation) { + if (!mte.isStructureFormed()) return this; + if (isLowComputation) { + addKey(IKey.comp(IKey.str(TextFormatting.YELLOW.toString()), + IKey.lang("gregtech.multiblock.computation.not_enough_computation"))); + } + return this; + } + + /** + * Adds a warning line when the machine's dynamo tier is too low for current conditions. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addLowDynamoTierLine(boolean isTooLow) { + if (!mte.isStructureFormed()) return this; + if (isTooLow) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy_output")); + } + return this; + } + + /** + * Adds warning line(s) when the machine has maintenance problems. + *
+ * Added if there are any maintenance problems, one line per problem as well as a header.
+ * Will check the config setting for if maintenance is enabled automatically. + */ + public Builder addMaintenanceProblemLines(byte maintenanceProblems) { + if (!mte.isStructureFormed() || !ConfigHolder.machines.enableMaintenance) return this; + if (maintenanceProblems < 63) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.has_problems")); + + // Wrench + if ((maintenanceProblems & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wrench")); + } + + // Screwdriver + if (((maintenanceProblems >> 1) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.screwdriver")); + } + + // Soft Mallet + if (((maintenanceProblems >> 2) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.soft_mallet")); + } + + // Hammer + if (((maintenanceProblems >> 3) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.hard_hammer")); + } + + // Wire Cutters + if (((maintenanceProblems >> 4) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wire_cutter")); + } + + // Crowbar + if (((maintenanceProblems >> 5) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.crowbar")); + } + } + return this; + } + + /** + * Adds two error lines when the machine's muffler hatch is obstructed. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public Builder addMufflerObstructedLine(boolean isObstructed) { + if (!mte.isStructureFormed()) return this; + if (isObstructed) { + addKey(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.universal.muffler_obstructed")); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.muffler_obstructed_desc")); + } + return this; + } + + /** + * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. + *
+ * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. + */ + public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + if (!mte.isStructureFormed() || !isActive || fuelName == null) return this; + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.fuel_needed", + KeyUtil.string(TextFormatting.RED, fuelName), + KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); + + return this; + } + + /** Insert an empty line into the text list. */ + public Builder addEmptyLine() { + addKey(IKey.EMPTY); // this is going to cause problems maybe + return this; + } + + /** Add custom text dynamically, allowing for custom application logic. */ + public Builder addCustom(Consumer> customConsumer) { + List customKeys = new ArrayList<>(); + customConsumer.accept(customKeys); + customKeys.forEach(this::addKey); + return this; + } + + /** + * @param widgetFunction function to build widgets from keys + */ + public Builder widgetFunction(Function> widgetFunction) { + this.widgetFunction = widgetFunction; + return this; + } + + protected boolean isEmpty() { + return textList.isEmpty(); + } + + protected void clear() { + textList.clear(); + } + + private Widget addKey(IKey key) { + var w = this.widgetFunction.apply(key); + this.textList.add(w); + return w; + } + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 145a570c9c3..bdccb67d4dd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -247,8 +247,7 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, PanelSyncHa IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); DoubleSyncValue sliderValue = new DoubleSyncValue( () -> (double) getThrottlePercentage() / 100, - d -> setThrottlePercentage((int) (d * 100)) - ); + d -> setThrottlePercentage((int) (d * 100))); return GTGuis.createPopupPanel("boiler_throttle", 116, 53) .child(new Row() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 43d49b97109..f5f104dfe10 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -11,7 +11,6 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayTextPort; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -52,7 +51,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index d63589c3003..177b7335590 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -140,7 +140,7 @@ protected MultiblockUIFactory createUIFactory() { // todo fuel needed line not working? builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), - recipeLogic.getPreviousRecipeDuration()) + recipeLogic.getPreviousRecipeDuration()) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? From c22b0dc82a038523e48d9f8235c445c243dcf2f3 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:12:01 -0700 Subject: [PATCH 031/264] make builder static again --- .../multiblock/ui/MultiblockUIFactory.java | 69 ++++++++++--------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index a7773339798..33599fe3307 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -50,7 +50,7 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected final BooleanSyncValue mufflerObstructed; protected final IntSyncValue maintanence; - protected Consumer valueSyncer = syncManager -> {}; + protected Consumer valueSyncer; protected Consumer displayText = builder -> {}; protected Consumer warningText = builder -> {}; protected Consumer errorText = builder -> {}; @@ -63,6 +63,10 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; this.mufflerObstructed = new BooleanSyncValue(mte::isStructureObstructed, null); this.maintanence = new IntSyncValue(mte::getMaintenanceProblems, null); + this.valueSyncer = syncManager -> { + syncManager.syncValue("muffler", mufflerObstructed); + syncManager.syncValue("maintenance", maintanence); + }; } /** @@ -103,7 +107,7 @@ public MultiblockUIFactory syncValues(Consumer valueSyncer) { private Widget createIndicator() { List> textList = new ArrayList<>(); - var builder = builder(textList); + var builder = builder(textList, mte); return new Widget<>() .pos(174 - 5, 93 - 5) .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) @@ -167,7 +171,7 @@ public MultiblockUIFactory configureErrorText(Consumer errorText) { * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(Consumer displayText) { - this.displayText = builder -> displayText.accept(builder.title().structureFormed()); + this.displayText = displayText; return this; } @@ -247,7 +251,7 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan column.getChildren().clear(); lines.clear(); // really debating on if the display screen should be its own widget - this.displayText.accept(builder(lines)); + this.displayText.accept(builder(lines, mte)); lines.forEach(column::child); resize(column); }) @@ -363,17 +367,19 @@ public static final class Bars { private Bars() {} } - protected Builder builder(List> list) { - return new Builder(list).title().structureFormed(); + protected static Builder builder(List> list, MultiblockWithDisplayBase mte) { + return new Builder(list) + .title(mte.getMetaFullName()) + .structureFormed(mte.isStructureFormed()); } @SuppressWarnings({ "UnusedReturnValue", "unused" }) - public class Builder { + public static class Builder { private final List> textList; private Function> widgetFunction = Builder::keyMapper; - private boolean isWorkingEnabled, isActive; + private boolean isWorkingEnabled, isActive, isStructureFormed; // Keys for the three-state working system, can be set custom by multiblocks. private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); @@ -390,8 +396,9 @@ private Builder(List> textList) { this.textList = textList; } - public Builder structureFormed() { - if (!mte.isStructureFormed()) { + public Builder structureFormed(boolean structureFormed) { + this.isStructureFormed = structureFormed; + if (!structureFormed) { var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); @@ -400,8 +407,8 @@ public Builder structureFormed() { return this; } - public Builder title() { - addKey(KeyUtil.lang(TextFormatting.WHITE, mte.getMetaFullName())); + public Builder title(String lang) { + addKey(KeyUtil.lang(TextFormatting.WHITE, lang)); return this; } @@ -435,7 +442,7 @@ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String r * Added if the structure is formed and if the passed energy container has greater than zero capacity. */ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!mte.isStructureFormed() || energyContainer == null) return this; + if (!isStructureFormed || energyContainer == null) return this; if (energyContainer.getEnergyCapacity() > 0) { long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); @@ -460,7 +467,7 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { * {@link GTValues#VNF}. */ public Builder addEnergyTierLine(int tier) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -477,7 +484,7 @@ public Builder addEnergyTierLine(int tier) { * Added if the structure is formed and if the passed value is greater than zero. */ public Builder addEnergyUsageExactLine(long energyUsage) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -496,7 +503,7 @@ public Builder addEnergyUsageExactLine(long energyUsage) { * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. */ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -517,7 +524,7 @@ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { * zero. */ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -537,7 +544,7 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { * Added if the structure is formed and if the max CWU/t is greater than zero. */ public Builder addComputationUsageLine(int maxCWUt) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (maxCWUt > 0) { var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -552,7 +559,7 @@ public Builder addComputationUsageLine(int maxCWUt) { * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. */ public Builder addComputationUsageExactLine(int currentCWUt) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (isActive && currentCWUt > 0) { var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); @@ -568,7 +575,7 @@ public Builder addComputationUsageExactLine(int currentCWUt) { * Added if the structure is formed. */ public Builder addWorkingStatusLine() { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (!isWorkingEnabled) { return addWorkPausedLine(false); @@ -586,7 +593,7 @@ public Builder addWorkingStatusLine() { * Also added only if formed. */ public Builder addWorkPausedLine(boolean checkState) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (!checkState || !isWorkingEnabled) { addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); } @@ -600,7 +607,7 @@ public Builder addWorkPausedLine(boolean checkState) { * Also added only if formed. */ public Builder addRunningPerfectlyLine(boolean checkState) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (!checkState || isActive) { addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); } @@ -614,7 +621,7 @@ public Builder addRunningPerfectlyLine(boolean checkState) { * Also added only if formed. */ public Builder addIdlingLine(boolean checkState) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (!checkState || (isWorkingEnabled && !isActive)) { addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); } @@ -629,7 +636,7 @@ public Builder addIdlingLine(boolean checkState) { * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ public Builder addProgressLine(DoubleSupplier progressPercent) { // todo - if (!mte.isStructureFormed() || !isActive) return this; + if (!isStructureFormed || !isActive) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", () -> ((int) (progressPercent.getAsDouble() * 100)))); return this; @@ -641,7 +648,7 @@ public Builder addProgressLine(DoubleSupplier progressPercent) { // todo * Added if structure is formed and the number of parallels is greater than one. */ public Builder addParallelsLine(int numParallels) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (numParallels > 1) { var parallels = KeyUtil.string(TextFormatting.DARK_PURPLE, TextFormattingUtil.formatNumbers(numParallels)); @@ -658,7 +665,7 @@ public Builder addParallelsLine(int numParallels) { * Added if the structure is formed and if the passed parameter is true. */ public Builder addLowPowerLine(boolean isLowPower) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -672,7 +679,7 @@ public Builder addLowPowerLine(boolean isLowPower) { * Added if the structure is formed and if the passed parameter is true. */ public Builder addLowComputationLine(boolean isLowComputation) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (isLowComputation) { addKey(IKey.comp(IKey.str(TextFormatting.YELLOW.toString()), IKey.lang("gregtech.multiblock.computation.not_enough_computation"))); @@ -686,7 +693,7 @@ public Builder addLowComputationLine(boolean isLowComputation) { * Added if the structure is formed and if the passed parameter is true. */ public Builder addLowDynamoTierLine(boolean isTooLow) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -701,7 +708,7 @@ public Builder addLowDynamoTierLine(boolean isTooLow) { * Will check the config setting for if maintenance is enabled automatically. */ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { - if (!mte.isStructureFormed() || !ConfigHolder.machines.enableMaintenance) return this; + if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -751,7 +758,7 @@ public Builder addMaintenanceProblemLines(byte maintenanceProblems) { * Added if the structure is formed and if the passed parameter is true. */ public Builder addMufflerObstructedLine(boolean isObstructed) { - if (!mte.isStructureFormed()) return this; + if (!isStructureFormed) return this; if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -767,7 +774,7 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!mte.isStructureFormed() || !isActive || fuelName == null) return this; + if (!isStructureFormed || !isActive || fuelName == null) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", From 88033365fc0d698a0a631db015e01402157bd3a2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 20:56:04 -0700 Subject: [PATCH 032/264] simplify compound consumer fix javadoc --- .../multiblock/MultiblockWithDisplayBase.java | 2 +- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 2752bb7e0d0..dbb1aa04206 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -476,7 +476,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { *
* Parameters should be passed directly to the created widget. Size will be 18x18. * - * @deprecated override {@link MultiblockUIFactory#createFlexButton(ModularPanel, PanelSyncManager)} + * @deprecated override {@link MultiblockUIFactory#createFlexButton(BiFunction)} */ @Deprecated @SuppressWarnings("SameParameterValue") diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 33599fe3307..26f372db5ab 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -73,11 +73,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { * Called once during ui construction. */ public MultiblockUIFactory syncValues(Consumer valueSyncer) { - this.valueSyncer = syncManager -> { - syncManager.syncValue("muffler", mufflerObstructed); - syncManager.syncValue("maintenance", maintanence); - valueSyncer.accept(syncManager); - }; + this.valueSyncer = this.valueSyncer.andThen(valueSyncer); return this; } From 94d0951b0f4d66ba68115af935d0ead0011e4575 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:01:37 -0700 Subject: [PATCH 033/264] fix water for boiler --- .../multi/MetaTileEntityLargeBoiler.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index bdccb67d4dd..bb12fbb5238 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -45,6 +45,7 @@ import com.cleanroommc.modularui.drawable.Rectangle; 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.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; @@ -69,6 +70,7 @@ public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase impleme private FluidTankList steamOutputTank; private int throttlePercentage = 100; + private boolean hasWaterCache; public MetaTileEntityLargeBoiler(ResourceLocation metaTileEntityId, BoilerType boilerType) { super(metaTileEntityId); @@ -175,9 +177,9 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - final IntSyncValue waterFilled = new IntSyncValue(this::getWaterFilled, null); - // update cache manually, as it's not done in constructor - waterFilled.updateCacheFromSource(true); + final var waterFilled = new BooleanSyncValue( + () -> hasWaterCache, b -> hasWaterCache = b, + () -> getWaterFilled() > 0, null); return new MultiblockUIFactory(this) .syncValues(syncManager -> syncManager.syncValue("water_filled", waterFilled)) @@ -188,7 +190,7 @@ protected MultiblockUIFactory createUIFactory() { .configureWarningText(builder -> builder.addCustom(keyList -> { if (isStructureFormed()) { // todo this is returning 0 on client for some reason - if (waterFilled.getIntValue() == 0) { + if (!waterFilled.getBoolValue()) { keyList.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); keyList.add(KeyUtil.lang(TextFormatting.GRAY, @@ -390,12 +392,14 @@ public void readFromNBT(NBTTagCompound data) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeVarInt(throttlePercentage); + buf.writeBoolean(hasWaterCache = getWaterFilled() > 0); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); throttlePercentage = buf.readVarInt(); + this.hasWaterCache = buf.readBoolean(); } public int getThrottle() { From 53fd162c1bfc4e13a6aac2644725add6bf6da7f5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:10:13 -0700 Subject: [PATCH 034/264] fix lubricant for LCE --- .../MetaTileEntityLargeCombustionEngine.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 177b7335590..d1c0eb6f210 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -35,6 +35,7 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -46,9 +47,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; import com.cleanroommc.modularui.widgets.ProgressWidget; @@ -62,6 +61,7 @@ public class MetaTileEntityLargeCombustionEngine extends FuelMultiblockControlle private final int tier; private final boolean isExtreme; private boolean boostAllowed; + private boolean hasLubricant; public MetaTileEntityLargeCombustionEngine(ResourceLocation metaTileEntityId, int tier) { super(metaTileEntityId, RecipeMaps.COMBUSTION_GENERATOR_FUELS, tier); @@ -122,12 +122,12 @@ protected void addErrorText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - var lubricant = new GenericSyncValue<>( - () -> getInputFluidInventory().drain(Materials.Lubricant.getFluid(Integer.MAX_VALUE), false), - null, NetworkUtils::readFluidStack, NetworkUtils::writeFluidStack); + final BooleanSyncValue hasLubricant = new BooleanSyncValue( + () -> this.hasLubricant, value -> this.hasLubricant = value, + () -> getLubricantAmount()[0] > 0, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> syncManager.syncValue("lubricant", lubricant)) + .syncValues(syncManager -> syncManager.syncValue("lubricant", hasLubricant)) .configureDisplayText(builder -> { var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); @@ -160,8 +160,7 @@ protected MultiblockUIFactory createUIFactory() { "gregtech.multiblock.large_combustion_engine.obstructed.desc")); } - FluidStack lubricantStack = lubricant.getValue(); - if (lubricantStack == null || lubricantStack.amount == 0) { + if (!hasLubricant.getBoolValue()) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.no_lubricant")); } @@ -287,6 +286,18 @@ public int getProgressBarCount() { return 3; } + @Override + public void writeInitialSyncData(PacketBuffer buf) { + super.writeInitialSyncData(buf); + buf.writeBoolean(this.hasLubricant = getLubricantAmount()[0] > 0); + } + + @Override + public void receiveInitialSyncData(PacketBuffer buf) { + super.receiveInitialSyncData(buf); + this.hasLubricant = buf.readBoolean(); + } + @Override public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { return switch (index) { From daa1fc0b1ac3ff91899b6e094a0b458a0a33a56c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:33:51 -0700 Subject: [PATCH 035/264] fix large turbine --- .../generator/MetaTileEntityLargeTurbine.java | 50 ++++++------------- 1 file changed, 15 insertions(+), 35 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 132d736222c..7db6ef2190c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -24,7 +24,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; @@ -114,12 +113,6 @@ protected void formStructure(PatternMatchContext context) { super.formStructure(context); this.exportFluidHandler = new FluidTankList(true, getAbilities(MultiblockAbility.EXPORT_FLUIDS)); ((LargeTurbineWorkableHandler) this.recipeMapWorkable).updateTanks(); - this.cachedRotorEfficiency = getRotorHolder().getRotorEfficiency(); - this.cachedTotalEfficiency = getRotorHolder().getTotalEfficiency(); - writeCustomData(SYNC_ROTOR, buffer -> { - buffer.writeInt(this.cachedRotorEfficiency); - buffer.writeInt(this.cachedTotalEfficiency); - }); } @Override @@ -196,20 +189,11 @@ protected void addErrorText(List textList) { } } - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == SYNC_ROTOR) { - this.cachedRotorEfficiency = buf.readInt(); - this.cachedTotalEfficiency = buf.readInt(); - } - } - @Override public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); - buf.writeInt(this.cachedRotorEfficiency); - buf.writeInt(this.cachedTotalEfficiency); + buf.writeInt(this.cachedRotorEfficiency = getRotorHolder().getRotorEfficiency()); + buf.writeInt(this.cachedTotalEfficiency = getRotorHolder().getTotalEfficiency()); } @Override @@ -222,15 +206,26 @@ public void receiveInitialSyncData(PacketBuffer buf) { @Override protected MultiblockUIFactory createUIFactory() { final MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + final IntSyncValue efficiency = new IntSyncValue( + () -> cachedRotorEfficiency, value -> cachedRotorEfficiency = value, + () -> getRotorHolder().getRotorEfficiency(), null); + final IntSyncValue total = new IntSyncValue( + () -> cachedTotalEfficiency, value -> cachedTotalEfficiency = value, + () -> getRotorHolder().getRotorEfficiency(), null); + return new MultiblockUIFactory(this) + .syncValues(syncManager -> { + syncManager.syncValue("eff", efficiency); + syncManager.syncValue("total", total); + }) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) .addCustom(tl -> { if (isStructureFormed()) { - if (cachedRotorEfficiency > 0) { + if (efficiency.getIntValue() > 0) { IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, - cachedTotalEfficiency, "%"); + total.getIntValue(), "%"); tl.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.efficiency", efficiencyInfo)); @@ -468,19 +463,4 @@ private int[] getFuelAmount() { } return new int[2]; } - - @Override - public NBTTagCompound writeToNBT(NBTTagCompound data) { - // really do not like how i have to save this to NBT - data.setInteger("cached_eff", this.cachedRotorEfficiency); - data.setInteger("cached_total", this.cachedTotalEfficiency); - return super.writeToNBT(data); - } - - @Override - public void readFromNBT(NBTTagCompound data) { - super.readFromNBT(data); - this.cachedRotorEfficiency = data.getInteger("cached_eff"); - this.cachedTotalEfficiency = data.getInteger("cached_total"); - } } From d54cc48b19f66fc579c227e5cab67f6197f39650 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 21:34:08 -0700 Subject: [PATCH 036/264] fix maint and obstruction --- .../multiblock/MultiblockWithDisplayBase.java | 5 +---- .../multiblock/ui/MultiblockUIFactory.java | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index dbb1aa04206..4f1215f3c5a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -39,6 +39,7 @@ import org.jetbrains.annotations.NotNull; import java.util.*; +import java.util.function.BiFunction; import static gregtech.api.capability.GregtechDataCodes.IS_WORKING; import static gregtech.api.capability.GregtechDataCodes.STORE_TAPED; @@ -194,7 +195,6 @@ protected void formStructure(PatternMatchContext context) { maintenanceHatch = getAbilities(MultiblockAbility.MAINTENANCE_HATCH).get(0); if (maintenanceHatch.startWithoutProblems() && !initialMaintenanceDone) { this.maintenance_problems = (byte) 0b111111; - writeCustomData(UPDATE_MAINTANENCE, buffer -> buffer.writeByte(this.maintenance_problems)); this.timeActive = 0; this.initialMaintenanceDone = true; } @@ -654,9 +654,6 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { if (dataId == IS_WORKING) { lastActive = buf.readBoolean(); } - if (dataId == UPDATE_MAINTANENCE) { - this.maintenance_problems = buf.readByte(); - } } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 26f372db5ab..0e15698ec56 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -48,8 +48,8 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; - protected final BooleanSyncValue mufflerObstructed; - protected final IntSyncValue maintanence; + protected boolean mufflerObstructed; + protected byte maintanence; protected Consumer valueSyncer; protected Consumer displayText = builder -> {}; protected Consumer warningText = builder -> {}; @@ -61,11 +61,17 @@ public class MultiblockUIFactory { public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; - this.mufflerObstructed = new BooleanSyncValue(mte::isStructureObstructed, null); - this.maintanence = new IntSyncValue(mte::getMaintenanceProblems, null); + var mufflerObstructed = new BooleanSyncValue( + () -> this.mufflerObstructed, value -> this.mufflerObstructed = value, + mte::isStructureObstructed, null); + var maintenance = new IntSyncValue( + () -> this.maintanence, value -> this.maintanence = (byte) value, + mte::getMaintenanceProblems, null); + maintenance.updateCacheFromSource(true); + this.valueSyncer = syncManager -> { syncManager.syncValue("muffler", mufflerObstructed); - syncManager.syncValue("maintenance", maintanence); + syncManager.syncValue("maintenance", maintenance); }; } @@ -141,7 +147,7 @@ private IDrawable getIndicatorOverlay(Builder builder) { */ public MultiblockUIFactory configureWarningText(Consumer warningText) { this.warningText = builder -> { - builder.addMaintenanceProblemLines((byte) maintanence.getIntValue()); + builder.addMaintenanceProblemLines(maintanence); warningText.accept(builder); }; return this; @@ -154,7 +160,7 @@ public MultiblockUIFactory configureWarningText(Consumer warningText) { */ public MultiblockUIFactory configureErrorText(Consumer errorText) { this.errorText = builder -> { - builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); + builder.addMufflerObstructedLine(mufflerObstructed); errorText.accept(builder); }; return this; From 86619855cc52c67b33319e78a452961b9e3a6908 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 22:37:42 -0700 Subject: [PATCH 037/264] improve int array sync value --- .../gregtech/api/mui/sync/FixedIntArraySyncValue.java | 9 +++++---- .../generator/MetaTileEntityLargeCombustionEngine.java | 6 +++--- .../electric/generator/MetaTileEntityLargeTurbine.java | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java index 381dcbc6c6c..461864ac8a7 100644 --- a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java +++ b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java @@ -10,6 +10,7 @@ import java.io.IOException; import java.util.Arrays; +import java.util.Objects; import java.util.function.Consumer; import java.util.function.Supplier; @@ -24,10 +25,10 @@ public class FixedIntArraySyncValue extends ValueSyncHandler { private final Supplier getter; private final @Nullable Consumer setter; - public FixedIntArraySyncValue(@NotNull Supplier getter, @Nullable Consumer setter, int size) { - this.getter = getter; + public FixedIntArraySyncValue(@NotNull Supplier getter, @Nullable Consumer setter) { + this.getter = Objects.requireNonNull(getter); this.setter = setter; - this.cache = new int[size]; + this.cache = getter.get(); } @Contract("null, _, null, _ -> fail") @@ -62,7 +63,7 @@ public void setValue(int @NotNull [] value, boolean setSource, boolean sync) { @Override public boolean updateCacheFromSource(boolean isFirstSync) { - if (this.getter != null && (isFirstSync || !Arrays.equals(this.getter.get(), this.cache))) { + if (isFirstSync || !Arrays.equals(this.getter.get(), this.cache)) { setValue(this.getter.get(), false, false); return true; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index d1c0eb6f210..8ea51088007 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -302,7 +302,7 @@ public void receiveInitialSyncData(PacketBuffer buf) { public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { return switch (index) { case 0 -> { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null, 2); + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); StringSyncValue fuelNameValue = new StringSyncValue(() -> { FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); if (stack == null) { @@ -324,7 +324,7 @@ yield new ProgressWidget() .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } case 1 -> { - FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null, 2); + FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null); panelSyncManager.syncValue("lubricant_amount", lubricantValue); yield new ProgressWidget() @@ -346,7 +346,7 @@ yield new ProgressWidget() }); } case 2 -> { - FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null, 2); + FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null); BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed, null); panelSyncManager.syncValue("oxygen_amount", oxygenValue); panelSyncManager.syncValue("boost_allowed", boostValue); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 7db6ef2190c..de65bf73522 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -330,7 +330,7 @@ public int getProgressBarCount() { public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { return switch (index) { case 0 -> { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null, 2); + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); StringSyncValue fuelNameValue = new StringSyncValue(() -> { FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); if (stack == null) { From 4a03e9d3028312cef1c97262e9e9595070fcec74 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 23:49:02 -0700 Subject: [PATCH 038/264] improve compound consumers use double instead of supplier --- .../RecipeMapMultiblockController.java | 50 +++++++++---------- .../multiblock/ui/MultiblockUIFactory.java | 34 ++++++------- .../MetaTileEntityElectricBlastFurnace.java | 2 +- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 6244272518c..3c35afd6730 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -12,6 +12,7 @@ import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.IDataInfoProvider; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; @@ -34,6 +35,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -105,13 +107,6 @@ public boolean checkRecipe(@NotNull Recipe recipe, boolean consumeIfSuccess) { protected void formStructure(PatternMatchContext context) { super.formStructure(context); initializeAbilities(); - writeCustomData(UPDATE_ENERGY, buf -> { - buf.writeLong(energyContainer.getEnergyCapacity()); - buf.writeLong(energyContainer.getInputVoltage()); - buf.writeLong(energyContainer.getInputAmperage()); - buf.writeLong(energyContainer.getOutputVoltage()); - buf.writeLong(energyContainer.getOutputAmperage()); - }); } @Override @@ -197,6 +192,22 @@ protected void addWarningText(List textList) { .addMaintenanceProblemLines(getMaintenanceProblems()); } + @Override + protected MultiblockUIFactory createUIFactory() { + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + return new MultiblockUIFactory(this) + .syncValues(syncManager -> syncManager.syncValue("progress", progress)) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(progress.getDoubleValue())) + .configureWarningText(builder -> builder + .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + } + @Override public TraceabilityPredicate autoAbilities() { return autoAbilities(true, true, true, true, true, true, true); @@ -276,31 +287,16 @@ public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); isDistinct = buf.readBoolean(); - long capacity = buf.readLong(), - inVoltage = buf.readLong(), - inAmps = buf.readLong(), - outVoltage = buf.readLong(), - outAmps = buf.readLong(); + long capacity = buf.readLong(); + long inVoltage = buf.readLong(); + long inAmps = buf.readLong(); + long outVoltage = buf.readLong(); + long outAmps = buf.readLong(); this.energyContainer = new EnergyContainerHandler(this, capacity, inVoltage, inAmps, outVoltage, outAmps); } - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == UPDATE_ENERGY) { - long capacity = buf.readLong(), - inVoltage = buf.readLong(), - inAmps = buf.readLong(), - outVoltage = buf.readLong(), - outAmps = buf.readLong(); - - this.energyContainer = new EnergyContainerHandler(this, capacity, - inVoltage, inAmps, outVoltage, outAmps); - } - } - @Override public boolean canBeDistinct() { return false; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 0e15698ec56..8acf97c1719 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -42,18 +42,18 @@ import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; -import java.util.function.DoubleSupplier; import java.util.function.Function; public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; + private boolean dirty; protected boolean mufflerObstructed; - protected byte maintanence; + protected byte maintenance; protected Consumer valueSyncer; + protected Consumer warningText; + protected Consumer errorText; protected Consumer displayText = builder -> {}; - protected Consumer warningText = builder -> {}; - protected Consumer errorText = builder -> {}; protected BiFunction> flexButton = (panel, syncManager) -> null; protected static final int DEFAULT_HEIGHT = 202; @@ -63,16 +63,17 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; var mufflerObstructed = new BooleanSyncValue( () -> this.mufflerObstructed, value -> this.mufflerObstructed = value, - mte::isStructureObstructed, null); - var maintenance = new IntSyncValue( - () -> this.maintanence, value -> this.maintanence = (byte) value, + () -> !mte.isMufflerFaceFree(), null); + var maintenanceValue = new IntSyncValue( + () -> this.maintenance, value -> this.maintenance = (byte) value, mte::getMaintenanceProblems, null); - maintenance.updateCacheFromSource(true); this.valueSyncer = syncManager -> { syncManager.syncValue("muffler", mufflerObstructed); - syncManager.syncValue("maintenance", maintenance); + syncManager.syncValue("maintenance", maintenanceValue); }; + this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); + this.warningText = builder -> builder.addMaintenanceProblemLines((byte) maintenanceValue.getIntValue()); } /** @@ -146,10 +147,7 @@ private IDrawable getIndicatorOverlay(Builder builder) { * This is called every tick on the client-side */ public MultiblockUIFactory configureWarningText(Consumer warningText) { - this.warningText = builder -> { - builder.addMaintenanceProblemLines(maintanence); - warningText.accept(builder); - }; + this.warningText = this.warningText.andThen(warningText); return this; } @@ -159,10 +157,7 @@ public MultiblockUIFactory configureWarningText(Consumer warningText) { * This is called every tick on the client-side */ public MultiblockUIFactory configureErrorText(Consumer errorText) { - this.errorText = builder -> { - builder.addMufflerObstructedLine(mufflerObstructed); - errorText.accept(builder); - }; + this.errorText = this.errorText.andThen(errorText); return this; } @@ -637,10 +632,9 @@ public Builder addIdlingLine(boolean checkState) { * * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ - public Builder addProgressLine(DoubleSupplier progressPercent) { // todo + public Builder addProgressLine(double progressPercent) { // todo if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", - () -> ((int) (progressPercent.getAsDouble() * 100)))); + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); return this; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index f5f104dfe10..ca60576d1fb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -130,7 +130,7 @@ protected MultiblockUIFactory createUIFactory() { .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)); + .addProgressLine(progress.getDoubleValue())); } private void addHeatCapacity(List keyList) { From 0a494b8d290efc6531e1d0756f754c3663013a90 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 27 Nov 2024 23:49:34 -0700 Subject: [PATCH 039/264] start work on fixing display --- .../multiblock/ui/MultiblockUIFactory.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 8acf97c1719..8f673601ef6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -74,6 +74,8 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { }; this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); this.warningText = builder -> builder.addMaintenanceProblemLines((byte) maintenanceValue.getIntValue()); + mufflerObstructed.setChangeListener(this::markDirty); + maintenanceValue.setChangeListener(this::markDirty); } /** @@ -84,6 +86,10 @@ public MultiblockUIFactory syncValues(Consumer valueSyncer) { return this; } + protected void markDirty() { + this.dirty = true; + } + /** * Constructs the multiblock ui panel
* It is not recommended to override this method @@ -245,12 +251,15 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan .child(new Column() .expanded() .onUpdateListener(column -> { + if (!dirty) return; + // todo this causes tooltips to flash, very problematic column.getChildren().clear(); lines.clear(); // really debating on if the display screen should be its own widget this.displayText.accept(builder(lines, mte)); lines.forEach(column::child); resize(column); + dirty = false; }) .margin(4, 4))) .background(GTGuiTextures.DISPLAY) From b24f55909fb82f1bda95715c53e44af3f5ab927a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 28 Nov 2024 00:57:35 -0700 Subject: [PATCH 040/264] fix display tooltips --- .../multiblock/ui/MultiblockUIFactory.java | 53 +++++++++++-------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 8f673601ef6..5f655ad984e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; @@ -47,7 +48,6 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; - private boolean dirty; protected boolean mufflerObstructed; protected byte maintenance; protected Consumer valueSyncer; @@ -63,31 +63,26 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; var mufflerObstructed = new BooleanSyncValue( () -> this.mufflerObstructed, value -> this.mufflerObstructed = value, - () -> !mte.isMufflerFaceFree(), null); - var maintenanceValue = new IntSyncValue( - () -> this.maintenance, value -> this.maintenance = (byte) value, - mte::getMaintenanceProblems, null); - - this.valueSyncer = syncManager -> { - syncManager.syncValue("muffler", mufflerObstructed); - syncManager.syncValue("maintenance", maintenanceValue); - }; + () -> mte.hasMufflerMechanics() && !mte.isMufflerFaceFree(), null); + + this.valueSyncer = syncManager -> syncManager.syncValue("muffler", mufflerObstructed); this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); - this.warningText = builder -> builder.addMaintenanceProblemLines((byte) maintenanceValue.getIntValue()); - mufflerObstructed.setChangeListener(this::markDirty); - maintenanceValue.setChangeListener(this::markDirty); + this.warningText = builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); } /** * Called once during ui construction. */ public MultiblockUIFactory syncValues(Consumer valueSyncer) { - this.valueSyncer = this.valueSyncer.andThen(valueSyncer); - return this; + return syncValues(valueSyncer, true); } - protected void markDirty() { - this.dirty = true; + /** + * Called once during ui construction. + */ + public MultiblockUIFactory syncValues(Consumer valueSyncer, boolean merge) { + this.valueSyncer = merge ? this.valueSyncer.andThen(valueSyncer) : valueSyncer; + return this; } /** @@ -251,15 +246,14 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan .child(new Column() .expanded() .onUpdateListener(column -> { - if (!dirty) return; - // todo this causes tooltips to flash, very problematic - column.getChildren().clear(); + List> copy = new ArrayList<>(lines); lines.clear(); - // really debating on if the display screen should be its own widget this.displayText.accept(builder(lines, mte)); + if (!listChanged(copy, lines)) return; + column.getChildren().clear(); + // really debating on if the display screen should be its own widget lines.forEach(column::child); resize(column); - dirty = false; }) .margin(4, 4))) .background(GTGuiTextures.DISPLAY) @@ -279,6 +273,18 @@ private void resize(IWidget parent) { } } + protected static boolean listChanged(List a, List b) { + if (a.size() != b.size()) return true; + for (int i = 0; i < a.size(); i++) { + if (a.get(i).getClass() != b.get(i).getClass()) return true; + if (a.get(i) instanceof TextWidget left && b.get(i) instanceof TextWidget right && + !Objects.equals(left.getKey(), right.getKey())) + return true; + // todo handle other things? or should text widgets be forced + } + return false; + } + @NotNull protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); @@ -643,7 +649,8 @@ public Builder addIdlingLine(boolean checkState) { */ public Builder addProgressLine(double progressPercent) { // todo if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", + () -> ((int) (progressPercent * 100)))); return this; } From b68b68a00db542862fb75f4503e9157231838c7f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 28 Nov 2024 00:57:47 -0700 Subject: [PATCH 041/264] use dynamic keys again --- .../multi/MetaTileEntityLargeBoiler.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index bb12fbb5238..ac6923eede4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -224,22 +224,22 @@ private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, - recipeLogic.getLastTickSteam(), " L/t"); + recipeLogic::getLastTickSteam, " L/t"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line - IKey efficiency = KeyUtil.string( - getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic.getHeatScaled() + "%"); + IKey efficiency = KeyUtil.number( + () -> getNumberColor(recipeLogic.getHeatScaled()), + recipeLogic::getHeatScaled, "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line - IKey throttle = KeyUtil.string( - getNumberColor(getThrottle()), - getThrottle() + "%"); + IKey throttle = KeyUtil.number( + () -> getNumberColor(getThrottle()), + this::getThrottle, "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } From 1c5bdc4acf985cbb74acef625e8c170fdc759ea6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:44:24 -0700 Subject: [PATCH 042/264] simplify display checking make status key dynamic use supplier for progress remove some todos --- .../RecipeMapMultiblockController.java | 4 +- .../multiblock/ui/MultiblockUIFactory.java | 78 +++++++++---------- .../multi/MetaTileEntityLargeBoiler.java | 3 +- .../MetaTileEntityElectricBlastFurnace.java | 4 +- .../MetaTileEntityLargeCombustionEngine.java | 2 +- .../generator/MetaTileEntityLargeTurbine.java | 2 +- 6 files changed, 42 insertions(+), 51 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 3c35afd6730..d6b92656872 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -198,12 +198,12 @@ protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) .syncValues(syncManager -> syncManager.syncValue("progress", progress)) .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(progress.getDoubleValue())) + .addProgressLine(progress::getDoubleValue)) .configureWarningText(builder -> builder .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 5f655ad984e..10b158523b2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -40,9 +40,10 @@ import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.function.BiFunction; +import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import java.util.function.DoubleSupplier; import java.util.function.Function; public class MultiblockUIFactory { @@ -51,9 +52,7 @@ public class MultiblockUIFactory { protected boolean mufflerObstructed; protected byte maintenance; protected Consumer valueSyncer; - protected Consumer warningText; - protected Consumer errorText; - protected Consumer displayText = builder -> {}; + protected Consumer displayText, warningText, errorText; protected BiFunction> flexButton = (panel, syncManager) -> null; protected static final int DEFAULT_HEIGHT = 202; @@ -68,6 +67,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.valueSyncer = syncManager -> syncManager.syncValue("muffler", mufflerObstructed); this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); this.warningText = builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); + this.displayText = builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed()); } /** @@ -111,7 +111,7 @@ public MultiblockUIFactory syncValues(Consumer valueSyncer, bo private Widget createIndicator() { List> textList = new ArrayList<>(); - var builder = builder(textList, mte); + var builder = builder(textList); return new Widget<>() .pos(174 - 5, 93 - 5) .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) @@ -169,7 +169,7 @@ public MultiblockUIFactory configureErrorText(Consumer errorText) { * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(Consumer displayText) { - this.displayText = displayText; + this.displayText = this.displayText.andThen(displayText); return this; } @@ -239,6 +239,7 @@ protected Column createBars(@NotNull ModularPanel mainPanel, } protected Widget createScreen(List> lines, PanelSyncManager syncManager) { + final var builder = builder(lines); return new ParentWidget<>() .child(createIndicator()) .child(new ScrollWidget<>(new VerticalScrollData()) @@ -246,10 +247,10 @@ protected Widget createScreen(List> lines, PanelSyncManager syncMan .child(new Column() .expanded() .onUpdateListener(column -> { - List> copy = new ArrayList<>(lines); - lines.clear(); - this.displayText.accept(builder(lines, mte)); - if (!listChanged(copy, lines)) return; + int prev = lines.size(); + builder.clear(); + this.displayText.accept(builder); + if (prev == lines.size()) return; column.getChildren().clear(); // really debating on if the display screen should be its own widget lines.forEach(column::child); @@ -273,18 +274,6 @@ private void resize(IWidget parent) { } } - protected static boolean listChanged(List a, List b) { - if (a.size() != b.size()) return true; - for (int i = 0; i < a.size(); i++) { - if (a.get(i).getClass() != b.get(i).getClass()) return true; - if (a.get(i) instanceof TextWidget left && b.get(i) instanceof TextWidget right && - !Objects.equals(left.getKey(), right.getKey())) - return true; - // todo handle other things? or should text widgets be forced - } - return false; - } - @NotNull protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); @@ -379,10 +368,8 @@ public static final class Bars { private Bars() {} } - protected static Builder builder(List> list, MultiblockWithDisplayBase mte) { - return new Builder(list) - .title(mte.getMetaFullName()) - .structureFormed(mte.isStructureFormed()); + protected static Builder builder(List> list) { + return new Builder(list); } @SuppressWarnings({ "UnusedReturnValue", "unused" }) @@ -391,7 +378,9 @@ public static class Builder { private final List> textList; private Function> widgetFunction = Builder::keyMapper; - private boolean isWorkingEnabled, isActive, isStructureFormed; + private BooleanSupplier isWorkingEnabled = () -> false; + private BooleanSupplier isActive = () -> false; + private boolean isStructureFormed; // Keys for the three-state working system, can be set custom by multiblocks. private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); @@ -425,7 +414,7 @@ public Builder title(String lang) { } /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ - public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { + public Builder setWorkingStatus(BooleanSupplier isWorkingEnabled, BooleanSupplier isActive) { this.isWorkingEnabled = isWorkingEnabled; this.isActive = isActive; return this; @@ -572,7 +561,7 @@ public Builder addComputationUsageLine(int maxCWUt) { */ public Builder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; - if (isActive && currentCWUt > 0) { + if (isActive.getAsBoolean() && currentCWUt > 0) { var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -589,13 +578,16 @@ public Builder addComputationUsageExactLine(int currentCWUt) { public Builder addWorkingStatusLine() { if (!isStructureFormed) return this; - if (!isWorkingEnabled) { - return addWorkPausedLine(false); - } else if (isActive) { - return addRunningPerfectlyLine(false); - } else { - return addIdlingLine(false); - } + addKey(KeyUtil.string(() -> { + if (!isWorkingEnabled.getAsBoolean()) { + return TextFormatting.GOLD + pausedKey.get(); + } else if (isActive.getAsBoolean()) { + return TextFormatting.GREEN + runningKey.get(); + } else { + return TextFormatting.GRAY + idlingKey.get(); + } + })); + return this; } /** @@ -606,7 +598,7 @@ public Builder addWorkingStatusLine() { */ public Builder addWorkPausedLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || !isWorkingEnabled) { + if (!checkState || !isWorkingEnabled.getAsBoolean()) { addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); } return this; @@ -620,7 +612,7 @@ public Builder addWorkPausedLine(boolean checkState) { */ public Builder addRunningPerfectlyLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || isActive) { + if (!checkState || isActive.getAsBoolean()) { addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); } return this; @@ -634,7 +626,7 @@ public Builder addRunningPerfectlyLine(boolean checkState) { */ public Builder addIdlingLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || (isWorkingEnabled && !isActive)) { + if (!checkState || (isWorkingEnabled.getAsBoolean() && !isActive.getAsBoolean())) { addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); } return this; @@ -647,10 +639,10 @@ public Builder addIdlingLine(boolean checkState) { * * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ - public Builder addProgressLine(double progressPercent) { // todo - if (!isStructureFormed || !isActive) return this; + public Builder addProgressLine(DoubleSupplier progressPercent) { + if (!isStructureFormed || !isActive.getAsBoolean()) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", - () -> ((int) (progressPercent * 100)))); + () -> ((int) (progressPercent.getAsDouble() * 100)))); return this; } @@ -786,7 +778,7 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; + if (!isStructureFormed || !isActive.getAsBoolean() || fuelName == null) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index ac6923eede4..6eb3fdab78e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -184,12 +184,11 @@ protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) .syncValues(syncManager -> syncManager.syncValue("water_filled", waterFilled)) .configureDisplayText(builder -> builder - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addCustom(this::addCustomData) .addWorkingStatusLine()) .configureWarningText(builder -> builder.addCustom(keyList -> { if (isStructureFormed()) { - // todo this is returning 0 on client for some reason if (!waterFilled.getBoolValue()) { keyList.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index ca60576d1fb..97a39e90c9e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -124,13 +124,13 @@ protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) .syncValues(syncManager -> syncManager.syncValue("progress", progress)) .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(progress.getDoubleValue())); + .addProgressLine(progress::getDoubleValue)); } private void addHeatCapacity(List keyList) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 8ea51088007..26a6991706d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -130,7 +130,7 @@ protected MultiblockUIFactory createUIFactory() { .syncValues(syncManager -> syncManager.syncValue("lubricant", hasLubricant)) .configureDisplayText(builder -> { var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); - builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + builder.setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive); if (isExtreme) { builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index de65bf73522..26808d48577 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -219,7 +219,7 @@ protected MultiblockUIFactory createUIFactory() { syncManager.syncValue("total", total); }) .configureDisplayText(builder -> builder - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) .addCustom(tl -> { if (isStructureFormed()) { From 2742b45b6b6994ab7c9a350547d934a3565fe31b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 28 Nov 2024 20:56:33 -0700 Subject: [PATCH 043/264] add tooltip for no flex --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 10b158523b2..eb86028667f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -279,7 +279,8 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() - .size(18); + .size(18) + .addTooltipLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")); } var powerButton = createPowerButton(mainPanel, panelSyncManager); From 1848e1cf2abf33ecc5a29dd56d6d11c1c40df207 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 01:48:21 -0700 Subject: [PATCH 044/264] improve value syncing greatly --- .../capability/impl/AbstractRecipeLogic.java | 4 +- .../impl/MultiblockFuelRecipeLogic.java | 32 +---- .../multiblock/MultiblockWithDisplayBase.java | 9 +- .../RecipeMapMultiblockController.java | 4 +- .../multiblock/ui/MultiblockUIFactory.java | 114 +++++++++++++----- .../multi/MetaTileEntityLargeBoiler.java | 6 +- .../MetaTileEntityElectricBlastFurnace.java | 2 +- .../MetaTileEntityLargeCombustionEngine.java | 25 +--- .../generator/MetaTileEntityLargeTurbine.java | 87 ++++++++----- 9 files changed, 157 insertions(+), 126 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index 96d79ca562a..d86d2827139 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -59,7 +59,6 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, private double speedBonus = -1; protected Recipe previousRecipe; - protected int cachedDuration; private boolean allowOverclocking = true; protected int parallelRecipesPerformed; private long overclockVoltage; @@ -1026,8 +1025,7 @@ public long getInfoProviderEUt() { * @return the previous recipe's duration */ public int getPreviousRecipeDuration() { - this.cachedDuration = getPreviousRecipe() == null ? this.cachedDuration : getPreviousRecipe().getDuration(); - return this.cachedDuration; + return getPreviousRecipe() == null ? 0 : getPreviousRecipe().getDuration(); } /** diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java index d483175d153..e48dbcb530d 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java @@ -1,6 +1,5 @@ package gregtech.api.capability.impl; -import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IRotorHolder; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; @@ -13,12 +12,10 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.TextFormattingUtil; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.Tuple; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; -import com.cleanroommc.modularui.network.NetworkUtils; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -26,23 +23,11 @@ public class MultiblockFuelRecipeLogic extends MultiblockRecipeLogic { protected long totalContinuousRunningTime; - protected String cachedFuelAmount; - - private static final int SYNC_FUEL_NEEDED = GregtechDataCodes.assignId(); public MultiblockFuelRecipeLogic(RecipeMapMultiblockController tileEntity) { super(tileEntity); } - @Override - protected void trySearchNewRecipe() { - super.trySearchNewRecipe(); - writeCustomData(SYNC_FUEL_NEEDED, buffer -> { - NetworkUtils.writeStringSafe(buffer, getRecipeFluidInputInfo()); - buffer.writeInt(getPreviousRecipeDuration()); - }); - } - @Override protected void modifyOverclockPre(@NotNull OCParams ocParams, @NotNull RecipePropertyStorage storage) { // apply maintenance bonuses @@ -127,9 +112,6 @@ public void invalidate() { } public String getRecipeFluidInputInfo() { - if (getMetaTileEntity().getWorld().isRemote) - return this.cachedFuelAmount; - IRotorHolder rotorHolder = null; if (metaTileEntity instanceof MultiblockWithDisplayBase multiblockWithDisplayBase) { @@ -150,12 +132,11 @@ public String getRecipeFluidInputInfo() { int ocAmount = GTUtility.safeCastLongToInt(getMaxVoltage() / recipe.getEUt()); int neededAmount = ocAmount * requiredFluidInput.amount; if (rotorHolder != null && rotorHolder.hasRotor()) { - neededAmount /= (rotorHolder.getTotalEfficiency() / 100.0); + neededAmount /= (int) (rotorHolder.getTotalEfficiency() / 100.0); } else if (rotorHolder != null && !rotorHolder.hasRotor()) { return null; } - this.cachedFuelAmount = TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; - return this.cachedFuelAmount; + return TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; } public FluidStack getInputFluidStack() { @@ -175,13 +156,4 @@ public FluidStack getInputFluidStack() { public boolean isAllowOverclocking() { return false; } - - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == SYNC_FUEL_NEEDED) { - this.cachedFuelAmount = NetworkUtils.readStringSafe(buf); - this.cachedDuration = buf.readInt(); - } - } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 4f1215f3c5a..35da1d8a98f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -49,8 +49,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; - private static final int UPDATE_MAINTANENCE = GregtechDataCodes.assignId(); - private MultiblockUIFactory uiFactory = null; + private MultiblockUIFactory uiFactory; private boolean voidingItems = false; private boolean voidingFluids = false; @@ -556,7 +555,7 @@ protected MultiblockUIFactory createUIFactory() { @Override public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - if (this.uiFactory == null) this.uiFactory = createUIFactory(); + if (uiFactory == null) return null; return this.uiFactory.buildUI(guiData, panelSyncManager); } @@ -604,6 +603,8 @@ public void writeInitialSyncData(PacketBuffer buf) { buf.writeBoolean(voidingFluids); buf.writeBoolean(voidingItems); buf.writeInt(voidingMode.ordinal()); + if (uiFactory == null) uiFactory = createUIFactory(); + this.uiFactory.writeInitialSync(buf); } @Override @@ -614,6 +615,8 @@ public void receiveInitialSyncData(PacketBuffer buf) { voidingFluids = buf.readBoolean(); voidingItems = buf.readBoolean(); voidingMode = VoidingMode.values()[buf.readInt()]; + if (uiFactory == null) uiFactory = createUIFactory(); + this.uiFactory.readInitialSync(buf); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index d6b92656872..623c39daf8e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -196,10 +196,10 @@ protected void addWarningText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> syncManager.syncValue("progress", progress)) + .syncValue("progress", progress) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) + .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index eb86028667f..7b6cd1d3287 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -9,11 +9,13 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTLog; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; +import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IDrawable; @@ -25,6 +27,7 @@ import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; @@ -38,6 +41,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; @@ -45,44 +49,61 @@ import java.util.function.Consumer; import java.util.function.DoubleSupplier; import java.util.function.Function; +import java.util.function.IntSupplier; public class MultiblockUIFactory { + protected static final int DEFAULT_HEIGHT = 202; + protected static final int DEFAULT_WIDTH = 198; + private final MultiblockWithDisplayBase mte; - protected boolean mufflerObstructed; - protected byte maintenance; protected Consumer valueSyncer; protected Consumer displayText, warningText, errorText; protected BiFunction> flexButton = (panel, syncManager) -> null; - - protected static final int DEFAULT_HEIGHT = 202; - protected static final int DEFAULT_WIDTH = 198; + private Consumer writer, reader; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; var mufflerObstructed = new BooleanSyncValue( - () -> this.mufflerObstructed, value -> this.mufflerObstructed = value, () -> mte.hasMufflerMechanics() && !mte.isMufflerFaceFree(), null); this.valueSyncer = syncManager -> syncManager.syncValue("muffler", mufflerObstructed); this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); this.warningText = builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); this.displayText = builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed()); + this.writer = mufflerObstructed::write; + this.reader = mufflerObstructed::read; } /** - * Called once during ui construction. + * Use this to sync a value to the PanelSyncManager
+ * Also initially syncs the value before ui is constructed */ - public MultiblockUIFactory syncValues(Consumer valueSyncer) { - return syncValues(valueSyncer, true); + public MultiblockUIFactory syncValue(String name, ValueSyncHandler syncHandler) { + this.writer = this.writer.andThen(buffer -> { + try { + syncHandler.write(buffer); + } catch (IOException ignored) { + GTLog.logger.warn("Sync handler \"{}\" failed to write!", name); + } + }); + this.reader = this.reader.andThen(buffer -> { + try { + syncHandler.read(buffer); + } catch (IOException ignored) { + GTLog.logger.warn("Sync handler \"{}\" failed to read!", name); + } + }); + this.valueSyncer = this.valueSyncer.andThen(syncManager -> syncManager.syncValue(name, syncHandler)); + return this; } - /** - * Called once during ui construction. - */ - public MultiblockUIFactory syncValues(Consumer valueSyncer, boolean merge) { - this.valueSyncer = merge ? this.valueSyncer.andThen(valueSyncer) : valueSyncer; - return this; + public void writeInitialSync(PacketBuffer buffer) { + this.writer.accept(buffer); + } + + public void readInitialSync(PacketBuffer buffer) { + this.reader.accept(buffer); } /** @@ -142,13 +163,32 @@ private IDrawable getIndicatorOverlay(Builder builder) { return GTGuiTextures.GREGTECH_LOGO_DARK; } + /** + * Returns a list of text indicating any current warnings in this Multiblock.
+ * Recommended to only display warnings if the structure is already formed.
+ * This is called every tick on the client-side + */ + public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { + this.warningText = merge ? this.warningText.andThen(warningText) : warningText; + return this; + } + /** * Returns a list of text indicating any current warnings in this Multiblock.
* Recommended to only display warnings if the structure is already formed.
* This is called every tick on the client-side */ public MultiblockUIFactory configureWarningText(Consumer warningText) { - this.warningText = this.warningText.andThen(warningText); + return configureWarningText(true, warningText); + } + + /** + * Returns a list of translation keys indicating any current errors in this Multiblock.
+ * Prioritized over any warnings provided by {@link #configureWarningText(Consumer)}.
+ * This is called every tick on the client-side + */ + public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { + this.errorText = merge ? this.errorText.andThen(errorText) : errorText; return this; } @@ -158,7 +198,17 @@ public MultiblockUIFactory configureWarningText(Consumer warningText) { * This is called every tick on the client-side */ public MultiblockUIFactory configureErrorText(Consumer errorText) { - this.errorText = this.errorText.andThen(errorText); + return configureErrorText(true, errorText); + } + + /** + * Called per tick on client side
+ * Each element of list is displayed on new line
+ * To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} + * or {@link KeyUtil#lang(String, Object...)} + */ + public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { + this.displayText = merge ? this.displayText.andThen(displayText) : displayText; return this; } @@ -169,8 +219,7 @@ public MultiblockUIFactory configureErrorText(Consumer errorText) { * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(Consumer displayText) { - this.displayText = this.displayText.andThen(displayText); - return this; + return configureDisplayText(true, displayText); } /** @@ -325,8 +374,8 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull .background(GTGuiTextures.BUTTON) .value(voidingValue) .length(4) - .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); } else { return GTGuiTextures.BUTTON_VOID_NONE.asWidget() .size(18, 18) @@ -336,19 +385,23 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull @Nullable protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - // todo in the future, refactor so that this multis are instanceof IControllable. - IControllable controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); - if (controllable == null) return null; - - BooleanSyncValue workingStateValue = new BooleanSyncValue(controllable::isWorkingEnabled, - controllable::setWorkingEnabled); + IControllable controllable; + if (!(mte instanceof IControllable)) { + // is this actually relevant? + // todo in the future, refactor so that this multis are instanceof IControllable. + controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); + if (controllable == null) return null; + GTLog.logger.warn("MTE [{}] does not extend IControllable when it should!", mte.getClass().getSimpleName()); + } else { + controllable = (IControllable) mte; + } return new CycleButtonWidget() .size(18) .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) .disableHoverBackground() .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) - .value(workingStateValue) + .value(new BooleanSyncValue(controllable::isWorkingEnabled, controllable::setWorkingEnabled)) .marginTop(5); } @@ -778,14 +831,15 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { *
* Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ - public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDuration) { if (!isStructureFormed || !isActive.getAsBoolean() || fuelName == null) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), - KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); + KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration::getAsInt))); + // addKey(KeyUtil.lang(TextFormatting.getValueByName(keys[0].get()), keys[1].get(), keys[2], keys[3])); return this; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 6eb3fdab78e..0fe284f500c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -70,7 +70,6 @@ public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase impleme private FluidTankList steamOutputTank; private int throttlePercentage = 100; - private boolean hasWaterCache; public MetaTileEntityLargeBoiler(ResourceLocation metaTileEntityId, BoilerType boilerType) { super(metaTileEntityId); @@ -178,11 +177,10 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { final var waterFilled = new BooleanSyncValue( - () -> hasWaterCache, b -> hasWaterCache = b, () -> getWaterFilled() > 0, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> syncManager.syncValue("water_filled", waterFilled)) + .syncValue("water_filled", waterFilled) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addCustom(this::addCustomData) @@ -391,14 +389,12 @@ public void readFromNBT(NBTTagCompound data) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeVarInt(throttlePercentage); - buf.writeBoolean(hasWaterCache = getWaterFilled() > 0); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); throttlePercentage = buf.readVarInt(); - this.hasWaterCache = buf.readBoolean(); } public int getThrottle() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 97a39e90c9e..c3b7859c951 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -122,7 +122,7 @@ protected void addDisplayText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> syncManager.syncValue("progress", progress)) + .syncValue("progress", progress) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(getEnergyContainer()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 26a6991706d..acd62291eba 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -35,7 +35,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -122,14 +121,12 @@ protected void addErrorText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { - final BooleanSyncValue hasLubricant = new BooleanSyncValue( - () -> this.hasLubricant, value -> this.hasLubricant = value, - () -> getLubricantAmount()[0] > 0, null); + var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; + final BooleanSyncValue hasLubricant = new BooleanSyncValue(() -> getLubricantAmount()[0] > 0, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> syncManager.syncValue("lubricant", hasLubricant)) + .syncValue("lubricant", hasLubricant) .configureDisplayText(builder -> { - var recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); builder.setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive); if (isExtreme) { @@ -140,7 +137,7 @@ protected MultiblockUIFactory createUIFactory() { // todo fuel needed line not working? builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), - recipeLogic.getPreviousRecipeDuration()) + recipeLogic::getPreviousRecipeDuration) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? @@ -286,18 +283,6 @@ public int getProgressBarCount() { return 3; } - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeBoolean(this.hasLubricant = getLubricantAmount()[0] > 0); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.hasLubricant = buf.readBoolean(); - } - @Override public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { return switch (index) { @@ -331,8 +316,8 @@ yield new ProgressWidget() .progress(() -> lubricantValue.getValue()[1] == 0 ? 0 : 1.0 * lubricantValue.getValue()[0] / lubricantValue.getValue()[1]) .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { if (lubricantValue.getValue()[0] == 0) { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 26808d48577..fc8bca212d1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -24,7 +24,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; @@ -36,6 +35,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; @@ -60,8 +62,6 @@ public class MetaTileEntityLargeTurbine extends FuelMultiblockController private static final int MIN_DURABILITY_TO_WARN = 10; public IFluidHandler exportFluidHandler; - private int cachedRotorEfficiency; - private int cachedTotalEfficiency; public MetaTileEntityLargeTurbine(ResourceLocation metaTileEntityId, RecipeMap recipeMap, int tier, IBlockState casingState, IBlockState gearboxState, ICubeRenderer casingRenderer, @@ -189,35 +189,30 @@ protected void addErrorText(List textList) { } } - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeInt(this.cachedRotorEfficiency = getRotorHolder().getRotorEfficiency()); - buf.writeInt(this.cachedTotalEfficiency = getRotorHolder().getTotalEfficiency()); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.cachedRotorEfficiency = buf.readInt(); - this.cachedTotalEfficiency = buf.readInt(); - } - @Override protected MultiblockUIFactory createUIFactory() { - final MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - final IntSyncValue efficiency = new IntSyncValue( - () -> cachedRotorEfficiency, value -> cachedRotorEfficiency = value, - () -> getRotorHolder().getRotorEfficiency(), null); - final IntSyncValue total = new IntSyncValue( - () -> cachedTotalEfficiency, value -> cachedTotalEfficiency = value, + MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + IntSyncValue efficiency = new IntSyncValue( + () -> 0, null, () -> getRotorHolder().getRotorEfficiency(), null); + IntSyncValue total = new IntSyncValue( + () -> 0, null, + () -> getRotorHolder().getTotalEfficiency(), null); + IntSyncValue durability = new IntSyncValue( + () -> 0, null, + () -> getRotorHolder().getRotorDurabilityPercent(), null); + BooleanSyncValue rotorFree = new BooleanSyncValue( + this::isRotorFaceFree, null); + StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); + IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); return new MultiblockUIFactory(this) - .syncValues(syncManager -> { - syncManager.syncValue("eff", efficiency); - syncManager.syncValue("total", total); - }) + .syncValue("eff", efficiency) + .syncValue("total", total) + .syncValue("free", durability) + .syncValue("dura", rotorFree) + .syncValue("fuel_amount", fuelAmount) + .syncValue("prev_duration", prevDuration) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) @@ -232,9 +227,37 @@ protected MultiblockUIFactory createUIFactory() { } } }) - .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), - recipeLogic.getPreviousRecipeDuration()) - .addWorkingStatusLine()); + .addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) + .addWorkingStatusLine()) + .configureWarningText(false, builder -> builder + .addCustom(tl -> { + if (isStructureFormed()) { + if (efficiency.getIntValue() > 0) { + if (durability.getIntValue() <= MIN_DURABILITY_TO_WARN) { + tl.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.turbine.rotor_durability_low")); + } + } + } + }) + .addLowDynamoTierLine(isDynamoTierTooLow()) + .addMaintenanceProblemLines(getMaintenanceProblems())) + .configureErrorText(builder -> builder + .addCustom(keyList -> { + if (isStructureFormed()) { + if (!rotorFree.getBoolValue()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.obstructed")); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.obstructed.desc")); + } + + if (efficiency.getIntValue() <= 0) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.no_rotor")); + } + } + })); } @Override @@ -375,8 +398,8 @@ yield new ProgressWidget() .progress(() -> rotorMaxSpeedValue.getIntValue() == 0 ? 0 : 1.0 * rotorSpeedValue.getIntValue() / rotorMaxSpeedValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { int speed = rotorSpeedValue.getIntValue(); int maxSpeed = rotorMaxSpeedValue.getIntValue(); @@ -421,8 +444,8 @@ yield new ProgressWidget() .progress(() -> durabilityValue.getIntValue() / 100.0) .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { if (efficiencyValue.getIntValue() <= 0) { t.addLine(IKey.lang("gregtech.multiblock.turbine.no_rotor")); From aa560fe1c3282bd379339e9fbd43e3a2e06be741 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 01:53:25 -0700 Subject: [PATCH 045/264] fix LCE fuel name + spotless --- .../multiblock/ui/MultiblockUIFactory.java | 2 -- .../generator/MetaTileEntityLargeCombustionEngine.java | 9 ++++++--- .../electric/generator/MetaTileEntityLargeTurbine.java | 6 ++---- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7b6cd1d3287..d45ebfe9b50 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -838,8 +838,6 @@ public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDura "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration::getAsInt))); - - // addKey(KeyUtil.lang(TextFormatting.getValueByName(keys[0].get()), keys[1].get(), keys[2], keys[3])); return this; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index acd62291eba..711ee3e6484 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -47,6 +47,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; +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.ProgressWidget; @@ -123,9 +124,13 @@ protected void addErrorText(List textList) { protected MultiblockUIFactory createUIFactory() { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; final BooleanSyncValue hasLubricant = new BooleanSyncValue(() -> getLubricantAmount()[0] > 0, null); + StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); + IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); return new MultiblockUIFactory(this) .syncValue("lubricant", hasLubricant) + .syncValue("fuel_amount", fuelAmount) + .syncValue("prev_duration", prevDuration) .configureDisplayText(builder -> { builder.setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive); @@ -135,9 +140,7 @@ protected MultiblockUIFactory createUIFactory() { builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); } - // todo fuel needed line not working? - builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), - recipeLogic::getPreviousRecipeDuration) + builder.addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) .addCustom(tl -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index fc8bca212d1..d48a613f66e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -35,9 +35,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -import com.cleanroommc.modularui.value.sync.GenericSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; @@ -203,8 +201,8 @@ protected MultiblockUIFactory createUIFactory() { () -> getRotorHolder().getRotorDurabilityPercent(), null); BooleanSyncValue rotorFree = new BooleanSyncValue( this::isRotorFaceFree, null); - StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); - IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); + StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); + IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); return new MultiblockUIFactory(this) .syncValue("eff", efficiency) From e7aa34f81fca9d68a97d37ed089ab41662bb815a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 02:05:37 -0700 Subject: [PATCH 046/264] remove unused datacode --- .../multiblock/RecipeMapMultiblockController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 623c39daf8e..d81cd93965d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -1,7 +1,6 @@ package gregtech.api.metatileentity.multiblock; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IDistinctBusController; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultipleTankHandler; @@ -46,7 +45,6 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDisplayBase implements IDataInfoProvider, ICleanroomReceiver, IDistinctBusController { - public static final int UPDATE_ENERGY = GregtechDataCodes.assignId(); public final RecipeMap recipeMap; protected MultiblockRecipeLogic recipeMapWorkable; protected IItemHandlerModifiable inputInventory; From 340aac07396969d9fcf3b62de748ca5161f63876 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 13:06:44 -0700 Subject: [PATCH 047/264] no need to sync temp --- .../MetaTileEntityElectricBlastFurnace.java | 45 ++++++------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index c3b7859c951..2d4dc36c580 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -3,7 +3,6 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.IHeatingCoilBlockStats; -import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IHeatingCoil; import gregtech.api.capability.impl.HeatingCoilRecipeLogic; import gregtech.api.metatileentity.MetaTileEntity; @@ -37,7 +36,6 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; @@ -51,18 +49,19 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.function.Consumer; import static gregtech.api.util.RelativeDirection.*; public class MetaTileEntityElectricBlastFurnace extends RecipeMapMultiblockController implements IHeatingCoil { - private static final int UPDATE_TEMP = GregtechDataCodes.assignId(); private int blastFurnaceTemperature; public MetaTileEntityElectricBlastFurnace(ResourceLocation metaTileEntityId) { @@ -75,25 +74,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { return new MetaTileEntityElectricBlastFurnace(metaTileEntityId); } - @Override - public void writeInitialSyncData(PacketBuffer buf) { - super.writeInitialSyncData(buf); - buf.writeInt(blastFurnaceTemperature); - } - - @Override - public void receiveInitialSyncData(PacketBuffer buf) { - super.receiveInitialSyncData(buf); - this.blastFurnaceTemperature = buf.readInt(); - } - - @Override - public void receiveCustomData(int dataId, PacketBuffer buf) { - super.receiveCustomData(dataId, buf); - if (dataId == UPDATE_TEMP) - this.blastFurnaceTemperature = buf.readInt(); - } - @Override protected void addDisplayText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed()) @@ -121,26 +101,30 @@ protected void addDisplayText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, null); return new MultiblockUIFactory(this) .syncValue("progress", progress) + .syncValue("temp", temp) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(this::addHeatCapacity) + .addCustom(addHeatCapacity(temp)) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() .addProgressLine(progress::getDoubleValue)); } - private void addHeatCapacity(List keyList) { - if (isStructureFormed()) { - var heatString = KeyUtil.number(TextFormatting.RED, - getCurrentTemperature(), "K"); + private Consumer> addHeatCapacity(IntSyncValue temp) { + return keyList -> { + if (isStructureFormed()) { + var heatString = KeyUtil.number(TextFormatting.RED, + temp::getIntValue, "K"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.blast_furnace.max_temperature", heatString)); - } + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.blast_furnace.max_temperature", heatString)); + } + }; } @Override @@ -155,7 +139,6 @@ protected void formStructure(PatternMatchContext context) { // the subtracted tier gives the starting level (exclusive) of the +100K heat bonus this.blastFurnaceTemperature += 100 * Math.max(0, GTUtility.getFloorTierByVoltage(getEnergyContainer().getInputVoltage()) - GTValues.MV); - writeCustomData(UPDATE_TEMP, buffer -> buffer.writeInt(this.blastFurnaceTemperature)); } @Override From 79e0da3e5bb24f2e1bf9e5951f62f23b1e947e0f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:03:28 -0700 Subject: [PATCH 048/264] rework builder to use IDrawables improve list checking --- .../multiblock/ui/MultiblockUIFactory.java | 109 +++++++++++------- .../multi/MetaTileEntityLargeBoiler.java | 3 +- .../MetaTileEntityElectricBlastFurnace.java | 4 +- 3 files changed, 73 insertions(+), 43 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index d45ebfe9b50..e1011f10623 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -21,6 +21,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; +import com.cleanroommc.modularui.drawable.keys.DynamicKey; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -35,14 +36,16 @@ import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.TextWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.cleanroommc.modularui.widgets.layout.Row; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; @@ -114,12 +117,10 @@ public void readInitialSync(PacketBuffer buffer) { this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); - var displayText = new ArrayList>(); - // TODO createExtras() hook for overrides? var bars = createBars(panel, panelSyncManager); - return panel.child(createScreen(displayText, panelSyncManager)) + return panel.child(createScreen(panelSyncManager)) .childIf(bars != null, bars) .child(new Row() .bottom(7) @@ -131,18 +132,12 @@ public void readInitialSync(PacketBuffer buffer) { } private Widget createIndicator() { - List> textList = new ArrayList<>(); - var builder = builder(textList); + var builder = builder(); return new Widget<>() .pos(174 - 5, 93 - 5) .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(tooltip -> { - for (var text : textList) { - if (text instanceof TextWidget textWidget) - tooltip.addLine(textWidget.getKey()); - } - }); + .tooltipBuilder(tooltip -> tooltip.addDrawableLines(builder.getTextList())); } private IDrawable getIndicatorOverlay(Builder builder) { @@ -287,25 +282,27 @@ protected Column createBars(@NotNull ModularPanel mainPanel, return column; } - protected Widget createScreen(List> lines, PanelSyncManager syncManager) { - final var builder = builder(lines); + protected Widget createScreen(PanelSyncManager syncManager) { + final var builder = builder(); + this.displayText.accept(builder); + var col = new Column(); + builder.build(col); + return new ParentWidget<>() .child(createIndicator()) .child(new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) - .child(new Column() - .expanded() + .child(col.expanded() + .margin(4, 4) .onUpdateListener(column -> { - int prev = lines.size(); - builder.clear(); - this.displayText.accept(builder); - if (prev == lines.size()) return; + var b = builder(); + this.displayText.accept(b); + if (!builder.hasChanged(b)) return; column.getChildren().clear(); // really debating on if the display screen should be its own widget - lines.forEach(column::child); + b.build(column); resize(column); - }) - .margin(4, 4))) + }))) .background(GTGuiTextures.DISPLAY) .size(190, 109) .pos(4, 4); @@ -422,15 +419,16 @@ public static final class Bars { private Bars() {} } - protected static Builder builder(List> list) { - return new Builder(list); + protected static Builder builder() { + return new Builder(); } @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { - private final List> textList; - private Function> widgetFunction = Builder::keyMapper; + private final List textList; + private Function> widgetFunction = Builder::keyMapper; + private final Int2ObjectMap tooltips = new Int2ObjectArrayMap<>(); private BooleanSupplier isWorkingEnabled = () -> false; private BooleanSupplier isActive = () -> false; @@ -441,14 +439,14 @@ public static class Builder { private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); private IKey runningKey = IKey.lang("gregtech.multiblock.running"); - protected static Widget keyMapper(IKey key) { + protected static Widget keyMapper(IDrawable key) { return key.asWidget() .widthRel(1f) .height(12); } - private Builder(List> textList) { - this.textList = textList; + private Builder() { + this.textList = new ArrayList<>(); } public Builder structureFormed(boolean structureFormed) { @@ -457,7 +455,7 @@ public Builder structureFormed(boolean structureFormed) { var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); - addKey(base).addTooltipLine(hover); + addKey(base, hover); } return this; } @@ -510,7 +508,7 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); - addKey(bodyText).addTooltipLine(hoverText); + addKey(bodyText, hoverText); } return this; } @@ -529,7 +527,7 @@ public Builder addEnergyTierLine(int tier) { "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier_hover"); - addKey(bodyText).addTooltipLine(hoverText); + addKey(bodyText, hoverText); return this; } @@ -848,8 +846,8 @@ public Builder addEmptyLine() { } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - List customKeys = new ArrayList<>(); + public Builder addCustom(Consumer> customConsumer) { + List customKeys = new ArrayList<>(); customConsumer.accept(customKeys); customKeys.forEach(this::addKey); return this; @@ -858,7 +856,7 @@ public Builder addCustom(Consumer> customConsumer) { /** * @param widgetFunction function to build widgets from keys */ - public Builder widgetFunction(Function> widgetFunction) { + public Builder widgetFunction(Function> widgetFunction) { this.widgetFunction = widgetFunction; return this; } @@ -871,10 +869,41 @@ protected void clear() { textList.clear(); } - private Widget addKey(IKey key) { - var w = this.widgetFunction.apply(key); - this.textList.add(w); - return w; + protected void build(ParentWidget parent) { + for (int i = 0; i < textList.size(); i++) { + var line = this.widgetFunction.apply(textList.get(i)); + if (tooltips.containsKey(i)) + line.addTooltipLine(tooltips.get(i)); + parent.child(line); + } + } + + protected List getTextList() { + return Collections.unmodifiableList(textList); + } + + protected boolean hasChanged(Builder other) { + if (textList.size() != other.textList.size()) return true; + for (int i = 0; i < textList.size(); i++) { + IDrawable left = textList.get(i), right = other.textList.get(i); + + // dynamic keys are impossible to check, skip + if (left instanceof DynamicKey && right instanceof DynamicKey) + continue; + + if (!left.equals(right)) + return true; + } + return false; + } + + private void addKey(IDrawable key) { + this.textList.add(key); + } + + private void addKey(IDrawable key, IDrawable hover) { + this.tooltips.put(textList.size(), hover); + addKey(key); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 0fe284f500c..9792aa2c7de 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -39,6 +39,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; +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.ItemDrawable; @@ -217,7 +218,7 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(List keyList) { + private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 2d4dc36c580..10ad73f58eb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -47,7 +47,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; @@ -115,7 +115,7 @@ protected MultiblockUIFactory createUIFactory() { .addProgressLine(progress::getDoubleValue)); } - private Consumer> addHeatCapacity(IntSyncValue temp) { + private Consumer> addHeatCapacity(IntSyncValue temp) { return keyList -> { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, From fbc08cf7e09500ddae85478f2ff6203125818915 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:08:34 -0700 Subject: [PATCH 049/264] simplify ifs --- .../multiblock/ui/MultiblockUIFactory.java | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index e1011f10623..125c815a289 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -342,42 +342,42 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - if (mte instanceof IDistinctBusController distinct && distinct.canBeDistinct()) { - BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); - - return new CycleButtonWidget() - .size(18, 18) - .value(distinctValue) - .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) - .background(GTGuiTextures.BUTTON) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? - IKey.lang("gregtech.multiblock.universal.distinct_enabled") : - IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); - } else { + if (!(mte instanceof IDistinctBusController distinct) || !distinct.canBeDistinct()) { return GTGuiTextures.BUTTON_NO_DISTINCT_BUSES.asWidget() .size(18, 18) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } + + BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); + + return new CycleButtonWidget() + .size(18, 18) + .value(distinctValue) + .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) + .background(GTGuiTextures.BUTTON) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? + IKey.lang("gregtech.multiblock.universal.distinct_enabled") : + IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); } protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - if (mte.shouldShowVoidingModeButton()) { - IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); - - return new CycleButtonWidget() - .size(18, 18) - .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) - .background(GTGuiTextures.BUTTON) - .value(voidingValue) - .length(4) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(t -> t.addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); - } else { + if (!mte.shouldShowVoidingModeButton()) { return GTGuiTextures.BUTTON_VOID_NONE.asWidget() .size(18, 18) .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported"))); } + + IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); + + return new CycleButtonWidget() + .size(18, 18) + .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) + .background(GTGuiTextures.BUTTON) + .value(voidingValue) + .length(4) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipBuilder(t -> t.addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); } @Nullable From ba0001a74cc5b45baf38337c809e01f4a40f5db9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:17:53 -0700 Subject: [PATCH 050/264] move tooltip setting to right method --- .../metatileentities/multi/MetaTileEntityLargeBoiler.java | 2 +- .../multi/electric/MetaTileEntityFluidDrill.java | 2 +- .../metatileentities/multi/electric/MetaTileEntityHPCA.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 9792aa2c7de..a3e2d18bb24 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -443,8 +443,8 @@ public int getProgressBarCount() { .progress(() -> waterCapacityValue.getIntValue() == 0 ? 0 : waterFilledValue.getIntValue() * 1.0 / waterCapacityValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { if (waterFilledValue.getIntValue() == 0) { t.addLine(IKey.lang("gregtech.multiblock.large_boiler.no_water")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 87f4a7ea701..a6faf4924b7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -394,8 +394,8 @@ public int getProgressBarCount() { return new ProgressWidget() .progress(() -> operationsValue.getIntValue() * 1.0 / BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS) .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { if (operationsValue.getIntValue() == 0) { t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depleted")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 24ebc9a6ca7..876da1a56dd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -543,8 +543,8 @@ public int getProgressBarCount() { yield new com.cleanroommc.modularui.widgets.ProgressWidget() .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { t.addLine(IKey.lang("gregtech.multiblock.hpca.computation", currentCWUtValue.getIntValue(), maxCWUtValue.getIntValue())); @@ -560,8 +560,8 @@ public int getProgressBarCount() { yield new com.cleanroommc.modularui.widgets.ProgressWidget() .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { double temp = temperatureValue.getDoubleValue(); int degrees = (int) Math.round(temp / 10.0); From 061e71677aa880a00f33b3caec5e25351c1a36db Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:20:50 -0700 Subject: [PATCH 051/264] fix packages --- .../multi/electric/MetaTileEntityHPCA.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 876da1a56dd..e86908a23db 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -8,7 +8,6 @@ import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.IGuiTexture; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.gui.widgets.SuppliedImageWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -59,6 +58,7 @@ import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.ProgressWidget; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; @@ -88,12 +88,12 @@ public class MetaTileEntityHPCA extends MultiblockWithDisplayBase private double temperature = IDLE_TEMPERATURE; // start at idle temperature - private final ProgressWidget.TimedProgressSupplier progressSupplier; + private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier progressSupplier; public MetaTileEntityHPCA(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.energyContainer = new EnergyContainerList(new ArrayList<>()); - this.progressSupplier = new ProgressWidget.TimedProgressSupplier(200, 47, false); + this.progressSupplier = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 47, false); this.hpcaHandler = new HPCAGridHandler(this); } @@ -363,9 +363,10 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { ModularUI.Builder builder = super.createUITemplate(entityPlayer); // Create the hover grid - builder.widget(new ProgressWidget( + builder.widget(new gregtech.api.gui.widgets.ProgressWidget( () -> hpcaHandler.getAllocatedCWUt() > 0 ? progressSupplier.getAsDouble() : 0, - 74, 57, 47, 47, GuiTextures.HPCA_COMPONENT_OUTLINE, ProgressWidget.MoveType.HORIZONTAL) + 74, 57, 47, 47, GuiTextures.HPCA_COMPONENT_OUTLINE, + gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) .setIgnoreColor(true) .setHoverTextConsumer(hpcaHandler::addInfo)); int startX = 76; @@ -531,8 +532,8 @@ public int getProgressBarCount() { } @Override - public com.cleanroommc.modularui.widgets.@NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, - int index) { + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, + int index) { return switch (index) { case 0 -> { IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt, null); @@ -540,7 +541,7 @@ public int getProgressBarCount() { panelSyncManager.syncValue("current_cwut", currentCWUtValue); panelSyncManager.syncValue("max_cwut", maxCWUtValue); - yield new com.cleanroommc.modularui.widgets.ProgressWidget() + yield new ProgressWidget() .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION, MultiblockUIFactory.Bars.HALF_WIDTH) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) @@ -557,7 +558,7 @@ public int getProgressBarCount() { DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature, null); panelSyncManager.syncValue("temperature", temperatureValue); - yield new com.cleanroommc.modularui.widgets.ProgressWidget() + yield new ProgressWidget() .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) From 262d37d1e7c1352521eb0aea684a1f29f04c5d2f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 29 Nov 2024 15:34:51 -0700 Subject: [PATCH 052/264] make fluid drill lang colored --- .../electric/MetaTileEntityFluidDrill.java | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index a6faf4924b7..426d93dab5c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -21,6 +21,7 @@ import gregtech.api.unification.material.Materials; import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.api.worldgen.bedrockFluids.BedrockFluidVeinHandler; @@ -400,16 +401,20 @@ public int getProgressBarCount() { if (operationsValue.getIntValue() == 0) { t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depleted")); } else { - // TODO working dynamic color substitutions into IKey.lang - int percent = (int) Math.round(100.0 * operationsValue.getIntValue() / - BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS); - if (percent > 40) { - t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.high", percent)); - } else if (percent > 10) { - t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.medium", percent)); - } else { - t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depletion.low", percent)); - } + t.addLine(KeyUtil.string(() -> { + int percent = (int) Math.round(100.0 * operationsValue.getIntValue() / + BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS); + if (percent > 40) { + return TextFormatting.GREEN + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.high", percent).get(); + } else if (percent > 10) { + return TextFormatting.YELLOW + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.medium", percent).get(); + } else { + return TextFormatting.RED + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.low", percent).get(); + } + })); } } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); From 187575f0ed9b9d79b8885cb539e484e0a39c540c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 1 Dec 2024 18:47:48 -0700 Subject: [PATCH 053/264] port Fusion Reactor + textures allow custom screen and panel size --- .../multiblock/ui/MultiblockUIFactory.java | 47 +++++++--- .../java/gregtech/api/mui/GTGuiTextures.java | 11 +++ .../electric/MetaTileEntityFusionReactor.java | 80 ++++++++++++++---- .../progress_bar/fusion_diagram/stitched.png | Bin 0 -> 269 bytes 4 files changed, 111 insertions(+), 27 deletions(-) create mode 100644 src/main/resources/assets/gregtech/textures/gui/progress_bar/fusion_diagram/stitched.png diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 125c815a289..3ad32cf9076 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -53,17 +53,18 @@ import java.util.function.DoubleSupplier; import java.util.function.Function; import java.util.function.IntSupplier; +import java.util.function.Supplier; public class MultiblockUIFactory { - protected static final int DEFAULT_HEIGHT = 202; - protected static final int DEFAULT_WIDTH = 198; - private final MultiblockWithDisplayBase mte; protected Consumer valueSyncer; protected Consumer displayText, warningText, errorText; protected BiFunction> flexButton = (panel, syncManager) -> null; private Consumer writer, reader; + private int width = 198, height = 202; + private int screenHeight = 109; + private Supplier> customScreen; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; @@ -83,21 +84,27 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { * Also initially syncs the value before ui is constructed */ public MultiblockUIFactory syncValue(String name, ValueSyncHandler syncHandler) { + this.valueSyncer = this.valueSyncer.andThen(syncManager -> syncManager.syncValue(name, syncHandler)); + return syncValue(syncHandler); + } + + /** + * Initially syncs the value before ui is constructed
+ * Use this if the value will be passed into a widget. + */ + public MultiblockUIFactory syncValue(ValueSyncHandler syncHandler) { this.writer = this.writer.andThen(buffer -> { try { syncHandler.write(buffer); } catch (IOException ignored) { - GTLog.logger.warn("Sync handler \"{}\" failed to write!", name); } }); this.reader = this.reader.andThen(buffer -> { try { syncHandler.read(buffer); } catch (IOException ignored) { - GTLog.logger.warn("Sync handler \"{}\" failed to read!", name); } }); - this.valueSyncer = this.valueSyncer.andThen(syncManager -> syncManager.syncValue(name, syncHandler)); return this; } @@ -134,7 +141,7 @@ public void readInitialSync(PacketBuffer buffer) { private Widget createIndicator() { var builder = builder(); return new Widget<>() - .pos(174 - 5, 93 - 5) + .pos(174 - 5, screenHeight - 18 - 3) .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(tooltip -> tooltip.addDrawableLines(builder.getTextList())); @@ -228,8 +235,19 @@ public MultiblockUIFactory createFlexButton(BiFunction> customScreen) { + this.customScreen = customScreen; + return this; + } + protected Widget createScreen(PanelSyncManager syncManager) { final var builder = builder(); this.displayText.accept(builder); @@ -290,7 +313,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { return new ParentWidget<>() .child(createIndicator()) - .child(new ScrollWidget<>(new VerticalScrollData()) + .child(customScreen != null ? customScreen.get() : new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) .child(col.expanded() .margin(4, 4) @@ -304,7 +327,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { resize(column); }))) .background(GTGuiTextures.DISPLAY) - .size(190, 109) + .size(190, screenHeight) .pos(4, 4); } @@ -332,7 +355,7 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy return new Column() .alignX(1f) - .right(0) + .right(4) .size(18, 77) .child(createDistinctButton(mainPanel, panelSyncManager)) .child(createVoidingButton(mainPanel, panelSyncManager)) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index cc31d6eda5b..3d0adff0eb2 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -124,6 +124,17 @@ public static class IDs { // todo primitive display? + // FUSION + public static final UITexture FUSION_REACTOR_MK1_TITLE = fullImage( + "textures/gui/widget/fusion_reactor_mk1_title.png"); + public static final UITexture FUSION_REACTOR_MK2_TITLE = fullImage( + "textures/gui/widget/fusion_reactor_mk2_title.png"); + public static final UITexture FUSION_REACTOR_MK3_TITLE = fullImage( + "textures/gui/widget/fusion_reactor_mk3_title.png"); + public static final UITexture FUSION_DIAGRAM = fullImage("textures/gui/widget/fusion_reactor_diagram.png"); + public static final UITexture FUSION_LEGEND = fullImage("textures/gui/widget/fusion_reactor_legend.png"); + public static final UITexture FUSION_PROGRESS = fullImage("textures/gui/progress_bar/fusion_diagram/stitched.png"); + // SLOTS public static final UITexture SLOT = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/base/slot.png") diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 8a5e1d068a9..a22bf3dadcb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -12,7 +12,6 @@ import gregtech.api.gui.widgets.ImageCycleButtonWidget; import gregtech.api.gui.widgets.ImageWidget; import gregtech.api.gui.widgets.IndicatorImageWidget; -import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.metatileentity.IFastRenderMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -20,6 +19,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -70,6 +71,10 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.layout.Column; import com.google.common.collect.Lists; import com.google.common.util.concurrent.AtomicDouble; import org.jetbrains.annotations.NotNull; @@ -362,18 +367,18 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { builder.image(4, 4, 190, 138, GuiTextures.DISPLAY); // Energy Bar - builder.widget(new ProgressWidget( + builder.widget(new gregtech.api.gui.widgets.ProgressWidget( () -> energyContainer.getEnergyCapacity() > 0 ? 1.0 * energyContainer.getEnergyStored() / energyContainer.getEnergyCapacity() : 0, 4, 144, 94, 7, - GuiTextures.PROGRESS_BAR_FUSION_ENERGY, ProgressWidget.MoveType.HORIZONTAL) + GuiTextures.PROGRESS_BAR_FUSION_ENERGY, gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) .setHoverTextConsumer(this::addEnergyBarHoverText)); // Heat Bar - builder.widget(new ProgressWidget( + builder.widget(new gregtech.api.gui.widgets.ProgressWidget( () -> energyContainer.getEnergyCapacity() > 0 ? 1.0 * heat / energyContainer.getEnergyCapacity() : 0, 100, 144, 94, 7, - GuiTextures.PROGRESS_BAR_FUSION_HEAT, ProgressWidget.MoveType.HORIZONTAL) + GuiTextures.PROGRESS_BAR_FUSION_HEAT, gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) .setHoverTextConsumer(this::addHeatBarHoverText)); // Indicator Widget @@ -425,6 +430,46 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { return builder; } + @Override + protected MultiblockUIFactory createUIFactory() { + IDrawable title; + if (tier == GTValues.LuV) { + // MK1 + title = GTGuiTextures.FUSION_REACTOR_MK1_TITLE; + } else if (tier == GTValues.ZPM) { + // MK2 + title = GTGuiTextures.FUSION_REACTOR_MK2_TITLE; + } else { + // MK3 + title = GTGuiTextures.FUSION_REACTOR_MK3_TITLE; + } + + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + return new MultiblockUIFactory(this) + .syncValue(progress) + .setSize(198, 236) + .setScreenHeight(138) + .configureDisplayText(false, builder -> {}) + .customScreen(() -> new Column() + .padding(4) + .expanded() + .child(title.asWidget() + .marginBottom(8) + .size(69, 12)) + .child(new ProgressWidget() + .size(77, 77) + .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() + .size(89, 101) + .marginTop(11)) + .direction(ProgressWidget.Direction.CIRCULAR_CW) + .value(progress) + .texture(null, GTGuiTextures.FUSION_PROGRESS, 77)) + .child(GTGuiTextures.FUSION_LEGEND.asWidget() + .left(4) + .bottom(4) + .size(108, 41))); + } + private void addEnergyBarHoverText(List hoverList) { ITextComponent energyInfo = TextComponentUtil.stringWithColor( TextFormatting.AQUA, @@ -450,14 +495,14 @@ private void addHeatBarHoverText(List hoverList) { private static class FusionProgressSupplier { private final AtomicDouble tracker = new AtomicDouble(0.0); - private final ProgressWidget.TimedProgressSupplier bottomLeft; + private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier bottomLeft; private final DoubleSupplier topLeft; private final DoubleSupplier topRight; private final DoubleSupplier bottomRight; public FusionProgressSupplier() { // Bottom Left, fill on [0, 0.25) - bottomLeft = new ProgressWidget.TimedProgressSupplier(200, 164, false) { + bottomLeft = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 164, false) { @Override public double getAsDouble() { @@ -527,25 +572,30 @@ private enum Type { BOTTOM_LEFT( 61, 66, 35, 41, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BL, ProgressWidget.MoveType.VERTICAL), + GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BL, + gregtech.api.gui.widgets.ProgressWidget.MoveType.VERTICAL), TOP_LEFT( 61, 30, 41, 35, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TL, ProgressWidget.MoveType.HORIZONTAL), + GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TL, + gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL), TOP_RIGHT( 103, 30, 35, 41, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TR, ProgressWidget.MoveType.VERTICAL_DOWNWARDS), + GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TR, + gregtech.api.gui.widgets.ProgressWidget.MoveType.VERTICAL_DOWNWARDS), BOTTOM_RIGHT( 97, 72, 41, 35, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BR, ProgressWidget.MoveType.HORIZONTAL_BACKWARDS); + GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BR, + gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL_BACKWARDS); private final int x; private final int y; private final int width; private final int height; private final TextureArea texture; - private final ProgressWidget.MoveType moveType; + private final gregtech.api.gui.widgets.ProgressWidget.MoveType moveType; - Type(int x, int y, int width, int height, TextureArea texture, ProgressWidget.MoveType moveType) { + Type(int x, int y, int width, int height, TextureArea texture, + gregtech.api.gui.widgets.ProgressWidget.MoveType moveType) { this.x = x; this.y = y; this.width = width; @@ -554,8 +604,8 @@ private enum Type { this.moveType = moveType; } - public ProgressWidget getWidget(MetaTileEntityFusionReactor instance) { - return new ProgressWidget( + public gregtech.api.gui.widgets.ProgressWidget getWidget(MetaTileEntityFusionReactor instance) { + return new gregtech.api.gui.widgets.ProgressWidget( () -> instance.recipeMapWorkable.isActive() ? instance.progressBarSupplier.getSupplier(this).getAsDouble() : 0, x, y, width, height, texture, moveType) diff --git a/src/main/resources/assets/gregtech/textures/gui/progress_bar/fusion_diagram/stitched.png b/src/main/resources/assets/gregtech/textures/gui/progress_bar/fusion_diagram/stitched.png new file mode 100644 index 0000000000000000000000000000000000000000..8ba66f3caca364fe24e525fd88eaf50bd3bed41c GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^z97uO3?#2ymuv!3jKx9jP7LeL$-D$|L<4+6Tp9lV zXJ7!Lh64u%jd%&6#~Xw~lm5b-(|- zlF_96$zy$Om(@$3U2^c;aLGza+dUN!|4^u);GPjL}lsmPGQkr zySQ=Evuk1Q#p*X-d&!=iD8Kf7$|IAY&6(=mZ58H$hm0J6&SUU&^>bP0l+XkKpR{RK literal 0 HcmV?d00001 From 5aafea09d37183389198bc7811f1c3fd142f2f3a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 1 Dec 2024 20:06:17 -0700 Subject: [PATCH 054/264] sync harder fix small issue with rebuilding display --- .../multiblock/MultiblockWithDisplayBase.java | 8 ++++++ .../multiblock/ui/MultiblockUIFactory.java | 26 ++++++++++++------- .../MetaTileEntityElectricBlastFurnace.java | 6 ++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 35da1d8a98f..ed86374343f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -49,6 +49,7 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; + private static final int UI_SYNC = GregtechDataCodes.assignId(); private MultiblockUIFactory uiFactory; private boolean voidingItems = false; @@ -205,6 +206,8 @@ protected void formStructure(PatternMatchContext context) { } this.variantActiveBlocks = context.getOrDefault("VABlock", new LinkedList<>()); replaceVariantBlocksActive(false); + if (uiFactory != null) + writeCustomData(UI_SYNC, uiFactory::writeInitialSync);; } @Override @@ -556,6 +559,7 @@ protected MultiblockUIFactory createUIFactory() { @Override public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { if (uiFactory == null) return null; + writeCustomData(UI_SYNC, uiFactory::writeInitialSync); // is this too early to sync? return this.uiFactory.buildUI(guiData, panelSyncManager); } @@ -657,6 +661,10 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { if (dataId == IS_WORKING) { lastActive = buf.readBoolean(); } + if (dataId == UI_SYNC) { + uiFactory.readInitialSync(buf); + uiFactory.markDirty(); + } } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 3ad32cf9076..c87e08619a8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -65,6 +65,7 @@ public class MultiblockUIFactory { private int width = 198, height = 202; private int screenHeight = 109; private Supplier> customScreen; + private boolean dirty; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; @@ -96,14 +97,12 @@ public MultiblockUIFactory syncValue(ValueSyncHandler syncHandler) { this.writer = this.writer.andThen(buffer -> { try { syncHandler.write(buffer); - } catch (IOException ignored) { - } + } catch (IOException ignored) {} }); this.reader = this.reader.andThen(buffer -> { try { syncHandler.read(buffer); - } catch (IOException ignored) { - } + } catch (IOException ignored) {} }); return this; } @@ -310,6 +309,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { this.displayText.accept(builder); var col = new Column(); builder.build(col); + final var compare = builder(); return new ParentWidget<>() .child(createIndicator()) @@ -318,13 +318,16 @@ protected Widget createScreen(PanelSyncManager syncManager) { .child(col.expanded() .margin(4, 4) .onUpdateListener(column -> { - var b = builder(); - this.displayText.accept(b); - if (!builder.hasChanged(b)) return; - column.getChildren().clear(); // really debating on if the display screen should be its own widget - b.build(column); + compare.clear(); + this.displayText.accept(compare); + if (!builder.hasChanged(compare) && !dirty) return; + builder.clear(); + column.getChildren().clear(); + this.displayText.accept(builder); + builder.build(column); resize(column); + dirty = false; }))) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) @@ -425,6 +428,10 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull .marginTop(5); } + public void markDirty() { + dirty = true; + } + public static final class Screen { public static int WIDTH = 190; @@ -461,6 +468,7 @@ public static class Builder { private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); private IKey runningKey = IKey.lang("gregtech.multiblock.running"); + private boolean dirty; protected static Widget keyMapper(IDrawable key) { return key.asWidget() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 10ad73f58eb..490f384acdc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -102,13 +102,17 @@ protected void addDisplayText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, null); + temp.updateCacheFromSource(true); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + tier.updateCacheFromSource(true); return new MultiblockUIFactory(this) .syncValue("progress", progress) .syncValue("temp", temp) + .syncValue("tier", tier) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addEnergyTierLine(tier.getIntValue()) .addCustom(addHeatCapacity(temp)) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() From 80447a031c377148030674c9ec6da6353eeb70e6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 1 Dec 2024 22:56:49 -0700 Subject: [PATCH 055/264] improve EBF `formStructure()` a bit --- .../electric/MetaTileEntityElectricBlastFurnace.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 490f384acdc..34fd1aecd32 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -134,12 +134,8 @@ private Consumer> addHeatCapacity(IntSyncValue temp) { @Override protected void formStructure(PatternMatchContext context) { super.formStructure(context); - Object type = context.get("CoilType"); - if (type instanceof IHeatingCoilBlockStats) { - this.blastFurnaceTemperature = ((IHeatingCoilBlockStats) type).getCoilTemperature(); - } else { - this.blastFurnaceTemperature = CoilType.CUPRONICKEL.getCoilTemperature(); - } + IHeatingCoilBlockStats type = context.getOrDefault("CoilType", CoilType.CUPRONICKEL); + this.blastFurnaceTemperature = type.getCoilTemperature(); // the subtracted tier gives the starting level (exclusive) of the +100K heat bonus this.blastFurnaceTemperature += 100 * Math.max(0, GTUtility.getFloorTierByVoltage(getEnergyContainer().getInputVoltage()) - GTValues.MV); From cd1b3fe3607fcc333fef037c758e355e1f303dee Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 3 Dec 2024 16:12:14 -0700 Subject: [PATCH 056/264] remove unused datacode --- .../multi/electric/generator/MetaTileEntityLargeTurbine.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index d48a613f66e..05e09dff696 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -48,7 +48,6 @@ public class MetaTileEntityLargeTurbine extends FuelMultiblockController implements ITieredMetaTileEntity, ProgressBarMultiblock { - private static final int SYNC_ROTOR = GregtechDataCodes.assignId(); public final int tier; public final IBlockState casingState; From 9bd0ebd73833eda622c36f17ef2613ad79a13f78 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 4 Dec 2024 20:15:44 -0700 Subject: [PATCH 057/264] create new class for display that behaves similar to AdvancedTextWidget --- .../api/mui/widget/GregtechDisplayScreen.java | 293 ++++++++++++++++++ .../generator/MetaTileEntityLargeTurbine.java | 28 +- 2 files changed, 314 insertions(+), 7 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java new file mode 100644 index 00000000000..079aa56fbb1 --- /dev/null +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -0,0 +1,293 @@ +package gregtech.api.mui.widget; + +import gregtech.api.GTValues; +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.layout.IViewport; +import com.cleanroommc.modularui.api.layout.IViewportStack; +import com.cleanroommc.modularui.api.widget.IGuiAction; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.Stencil; +import com.cleanroommc.modularui.drawable.TextRenderer; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.HoveredWidgetList; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import com.cleanroommc.modularui.widget.ParentWidget; +import com.cleanroommc.modularui.widget.scroll.ScrollArea; +import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; +import com.cleanroommc.modularui.widget.sizer.Area; +import io.netty.buffer.Unpooled; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.IntSupplier; +import java.util.function.LongSupplier; +import java.util.function.Supplier; + +public class GregtechDisplayScreen extends ParentWidget implements IViewport, Interactable { + + private final DisplaySyncHandler syncHandler; + private final TextRenderer textRenderer = new TextRenderer(); + private final ScrollArea scroll = new ScrollArea(); + private final MultiblockWithDisplayBase mte; + + public GregtechDisplayScreen(MultiblockWithDisplayBase mte) { + this.mte = mte; + this.syncHandler = new DisplaySyncHandler(); + setSyncHandler(this.syncHandler); + scroll.setScrollDataY(new VerticalScrollData()); + sizeRel(1f); + listenGuiAction((IGuiAction.MouseReleased) mouseButton -> { + this.scroll.mouseReleased(getContext()); + return false; + }); + addLine(buffer -> NetworkUtils.writeStringSafe(buffer, mte.getMetaFullName()), + buffer -> KeyUtil.lang(TextFormatting.WHITE, NetworkUtils.readStringSafe(buffer))); + addLine(buffer -> buffer.writeBoolean(mte.isStructureFormed()), buffer -> { + if (buffer.readBoolean()) return null; + return KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + }); + } + + @Override + public Area getArea() { + return this.scroll; + } + + @Override + public void getSelfAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) { + if (isInside(stack, x, y)) { + widgets.add(this, stack.peek()); + } + } + + @Override + public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) {} + + @Override + public void draw(GuiContext context, WidgetTheme widgetTheme) { + drawKeys(); + } + + private void drawKeys() { + // draw the keys + int x = getArea().getPadding().left; + int y = getArea().getPadding().top; + for (var key : syncHandler.builtKeys) { + if (key == null) continue; + + textRenderer.setPos(x, y - scroll.getScrollY().getScroll()); + textRenderer.draw(key.get()); + y += 12; + } + } + + @Override + public void onResized() { + if (this.scroll.getScrollY() != null) { + this.scroll.getScrollY().clamp(this.scroll); + } + } + + @Override + public boolean canHover() { + return super.canHover() || + this.scroll.isInsideScrollbarArea(getContext().getMouseX(), getContext().getMouseY()); + } + + @Override + public @NotNull Interactable.Result onMousePressed(int mouseButton) { + GuiContext context = getContext(); + if (this.scroll.mouseClicked(context)) { + return Interactable.Result.STOP; + } + return Interactable.Result.IGNORE; + } + + @Override + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) { + return this.scroll.mouseScroll(getContext()); + } + + @Override + public boolean onMouseRelease(int mouseButton) { + this.scroll.mouseReleased(getContext()); + return false; + } + + @Override + public void onUpdate() { + super.onUpdate(); + this.scroll.drag(getContext().getAbsMouseX(), getContext().getAbsMouseY()); + this.scroll.getScrollY().setScrollSize(this.syncHandler.getActiveHeight()); + } + + public GregtechDisplayScreen addLine(Consumer serializer, Function deserializer) { + this.syncHandler.addLine(serializer, deserializer); + return getThis(); + } + + public GregtechDisplayScreen energy(LongSupplier maxVoltage, LongSupplier recipeEUt) { + addLine(buffer -> { + long maxV = maxVoltage.getAsLong(); + boolean b = maxV != 0 && maxV >= -recipeEUt.getAsLong(); + buffer.writeBoolean(mte.isStructureFormed() && b); + if (b) buffer.writeLong(maxV); + }, buffer -> { + if (!buffer.readBoolean()) return null; + long maxV = buffer.readLong(); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.string( + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxV)]); + + return KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", + TextFormattingUtil.formatNumbers(maxV), voltageName); + }); + return getThis(); + } + + public GregtechDisplayScreen fuelNeeded(Supplier amount, IntSupplier duration) { + addLine(buffer -> { + String s = amount.get(); + buffer.writeBoolean(s != null && mte.isStructureFormed()); + if (s != null) { + NetworkUtils.writeStringSafe(buffer, s); + buffer.writeInt(duration.getAsInt()); + } + }, buffer -> { + if (!buffer.readBoolean()) return null; + return KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.fuel_needed", + KeyUtil.string(TextFormatting.RED, NetworkUtils.readStringSafe(buffer)), + KeyUtil.number(TextFormatting.AQUA, buffer.readInt())); + }); + return getThis(); + } + + public GregtechDisplayScreen status() { + addLine(buffer -> { + int i = 0; + var arl = mte.getRecipeLogic(); + if (arl != null && !arl.isWorkingEnabled()) { + i = 1; + } else if (arl != null && arl.isActive()) { + i = 2; + } + buffer.writeVarInt(i); + }, buffer -> switch (buffer.readVarInt()) { + case 1 -> KeyUtil.lang(TextFormatting.GOLD, "gregtech.multiblock.work_paused"); + case 2 -> KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.running"); + default -> KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.idling"); + }); + return getThis(); + } + + @Override + public boolean isValidSyncHandler(SyncHandler syncHandler) { + return syncHandler instanceof DisplaySyncHandler; + } + + @Override + public void preDraw(GuiContext context, boolean transformed) { + if (!transformed) { + Stencil.applyAtZero(this.scroll, context); + } + } + + @Override + public void postDraw(GuiContext context, boolean transformed) { + if (!transformed) { + Stencil.remove(); + this.scroll.drawScrollbar(); + } + } + + private static class DisplaySyncHandler extends SyncHandler { + + private final List> serializers = new ArrayList<>(); + private final List> deserializers = new ArrayList<>(); + private IKey[] builtKeys = new IKey[0]; + private final PacketBuffer internalBuffer = new PacketBuffer(Unpooled.buffer()); + private boolean dirty = true; + private int activeHeight = 0; + + public void addLine(Consumer serializer, Function deserializer) { + serializers.add(serializer); + deserializers.add(deserializer); + } + + private void markDirty() { + this.dirty = true; + } + + @Override + public void detectAndSendChanges(boolean init) { + if (init || dirty) { + if (init) buildKeys(null); + if (dirty) dirty = false; + syncToClient(0, this::serializeKeys); + return; + } + + IKey[] copy = builtKeys.clone(); + internalBuffer.clear(); + serializeKeys(internalBuffer); + buildKeys(internalBuffer); + + for (int i = 0; i < builtKeys.length; i++) { + if (builtKeys[i] == null && copy[i] == null) continue; + if (builtKeys[i] == null || copy[i] == null || !builtKeys[i].get().equals(copy[i].get())) { + markDirty(); + return; + } + } + } + + private void buildKeys(PacketBuffer buffer) { + builtKeys = new IKey[deserializers.size()]; + activeHeight = 0; + if (buffer == null) return; + Arrays.setAll(builtKeys, i -> { + var key = deserializers.get(i).apply(buffer); + if (key != null) activeHeight += 12; + return key; + }); + } + + public int getActiveHeight() { + return activeHeight; + } + + private void serializeKeys(PacketBuffer buffer) { + serializers.forEach(s -> s.accept(buffer)); + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + if (id == 0) { + builtKeys = new IKey[deserializers.size()]; + for (int i = 0; i < builtKeys.length; i++) { + builtKeys[i] = deserializers.get(i).apply(buf); + } + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException {} + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 05e09dff696..c16d82020d8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -1,7 +1,6 @@ package gregtech.common.metatileentities.multi.electric.generator; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IRotorHolder; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; @@ -12,6 +11,7 @@ import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; +import gregtech.api.mui.widget.GregtechDisplayScreen; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -189,15 +189,13 @@ protected void addErrorText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + boolean noRotor = getRotorHolder() == null; IntSyncValue efficiency = new IntSyncValue( - () -> 0, null, - () -> getRotorHolder().getRotorEfficiency(), null); + () -> noRotor ? 0 : getRotorHolder().getRotorEfficiency(), null); IntSyncValue total = new IntSyncValue( - () -> 0, null, - () -> getRotorHolder().getTotalEfficiency(), null); + () -> noRotor ? 0 : getRotorHolder().getTotalEfficiency(), null); IntSyncValue durability = new IntSyncValue( - () -> 0, null, - () -> getRotorHolder().getRotorDurabilityPercent(), null); + () -> noRotor ? 0 : getRotorHolder().getRotorDurabilityPercent(), null); BooleanSyncValue rotorFree = new BooleanSyncValue( this::isRotorFaceFree, null); StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); @@ -210,6 +208,22 @@ protected MultiblockUIFactory createUIFactory() { .syncValue("dura", rotorFree) .syncValue("fuel_amount", fuelAmount) .syncValue("prev_duration", prevDuration) + .customScreen(() -> new GregtechDisplayScreen(this) + .padding(4) + .energy(this::getMaxVoltage, recipeLogic::getRecipeEUt) + .addLine(buffer -> { + buffer.writeBoolean(isStructureFormed()); + if (isStructureFormed()) + buffer.writeInt(noRotor ? -1 : getRotorHolder().getTotalEfficiency()); + }, buffer -> { + if (!buffer.readBoolean()) return null; + int i = buffer.readInt(); + if (i < 0) return null; + return KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.efficiency", i); + }) + .fuelNeeded(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) + .status()) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) From a6e74a7cbc61f70504b5b7651d88bff2673a904c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 00:08:00 -0700 Subject: [PATCH 058/264] add new case for status --- .../api/mui/widget/GregtechDisplayScreen.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index 079aa56fbb1..abed972b12e 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -181,18 +181,23 @@ public GregtechDisplayScreen fuelNeeded(Supplier amount, IntSupplier dur public GregtechDisplayScreen status() { addLine(buffer -> { - int i = 0; var arl = mte.getRecipeLogic(); - if (arl != null && !arl.isWorkingEnabled()) { + int i; + if (arl == null) { + i = 0; + } else if (!arl.isWorkingEnabled()) { i = 1; - } else if (arl != null && arl.isActive()) { + } else if (arl.isActive()) { i = 2; + } else { + i = 3; } buffer.writeVarInt(i); }, buffer -> switch (buffer.readVarInt()) { case 1 -> KeyUtil.lang(TextFormatting.GOLD, "gregtech.multiblock.work_paused"); case 2 -> KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.running"); - default -> KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.idling"); + case 3 -> KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.idling"); + default -> null; }); return getThis(); } From 806f859eeea5dd729a4e0771b8d440d6cb7a36ae Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 14:01:26 -0700 Subject: [PATCH 059/264] improve drawing a bit --- .../api/mui/widget/GregtechDisplayScreen.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index abed972b12e..240ee454d26 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -20,6 +20,7 @@ import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.viewport.GuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.HoveredWidgetList; import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.ParentWidget; @@ -81,17 +82,17 @@ public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, @Override public void draw(GuiContext context, WidgetTheme widgetTheme) { - drawKeys(); - } - - private void drawKeys() { // draw the keys int x = getArea().getPadding().left; - int y = getArea().getPadding().top; + int y = getArea().getPadding().top - scroll.getScrollY().getScroll(); + + textRenderer.setShadow(widgetTheme.getTextShadow()); + textRenderer.setAlignment(Alignment.CenterLeft, getArea().width, 12); + textRenderer.setScale(1f); + for (var key : syncHandler.builtKeys) { if (key == null) continue; - - textRenderer.setPos(x, y - scroll.getScrollY().getScroll()); + textRenderer.setPos(x, y); textRenderer.draw(key.get()); y += 12; } From 3e74e8a42f4a90d7365cf345ed1f60bb6f309a99 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 5 Dec 2024 15:32:35 -0700 Subject: [PATCH 060/264] add change listener --- .../gregtech/api/mui/widget/GregtechDisplayScreen.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index 240ee454d26..09d39a2cf3e 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -51,6 +51,7 @@ public GregtechDisplayScreen(MultiblockWithDisplayBase mte) { this.mte = mte; this.syncHandler = new DisplaySyncHandler(); setSyncHandler(this.syncHandler); + this.syncHandler.setChangeListener(() -> scroll.getScrollY().setScrollSize(syncHandler.getActiveHeight())); scroll.setScrollDataY(new VerticalScrollData()); sizeRel(1f); listenGuiAction((IGuiAction.MouseReleased) mouseButton -> { @@ -135,7 +136,6 @@ public boolean onMouseRelease(int mouseButton) { public void onUpdate() { super.onUpdate(); this.scroll.drag(getContext().getAbsMouseX(), getContext().getAbsMouseY()); - this.scroll.getScrollY().setScrollSize(this.syncHandler.getActiveHeight()); } public GregtechDisplayScreen addLine(Consumer serializer, Function deserializer) { @@ -230,6 +230,7 @@ private static class DisplaySyncHandler extends SyncHandler { private IKey[] builtKeys = new IKey[0]; private final PacketBuffer internalBuffer = new PacketBuffer(Unpooled.buffer()); private boolean dirty = true; + private Runnable changeListener = null; private int activeHeight = 0; public void addLine(Consumer serializer, Function deserializer) { @@ -247,6 +248,7 @@ public void detectAndSendChanges(boolean init) { if (init) buildKeys(null); if (dirty) dirty = false; syncToClient(0, this::serializeKeys); + if (changeListener != null) changeListener.run(); return; } @@ -264,6 +266,10 @@ public void detectAndSendChanges(boolean init) { } } + public void setChangeListener(Runnable changeListener) { + this.changeListener = changeListener; + } + private void buildKeys(PacketBuffer buffer) { builtKeys = new IKey[deserializers.size()]; activeHeight = 0; From 8eb88aa34790bddfd6d8e88eec79a199798ade70 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 7 Jan 2025 20:28:34 -0700 Subject: [PATCH 061/264] fix rebase --- .../multiblock/FuelMultiblockController.java | 4 +-- .../MultiMapMultiblockController.java | 3 +- .../multiblock/ui/MultiblockUIFactory.java | 29 ++++++++++++------- .../api/mui/widget/GregtechDisplayScreen.java | 9 +++--- .../multi/MetaTileEntityLargeBoiler.java | 3 +- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index 33cb838f455..dba93b5a3c3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -22,7 +22,7 @@ import net.minecraftforge.fluids.FluidStack; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.screen.Tooltip; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.value.sync.StringSyncValue; import org.jetbrains.annotations.NotNull; @@ -183,7 +183,7 @@ protected void addFuelText(List textList) { * @param amounts the sync value containing an array of [fuel stored, fuel capacity] * @param fuelNameValue the name of the fuel */ - protected void createFuelTooltip(@NotNull Tooltip tooltip, @NotNull FixedIntArraySyncValue amounts, + protected void createFuelTooltip(@NotNull RichTooltip tooltip, @NotNull FixedIntArraySyncValue amounts, @NotNull StringSyncValue fuelNameValue) { tooltip.setAutoUpdate(true); if (isStructureFormed()) { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index f587caac056..fe116630290 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -141,7 +141,8 @@ protected MultiblockUIFactory createUIFactory() { return null; return new CycleButtonWidget() - .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) + // .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) + .overlay(GTGuiTextures.BUTTON_MULTI_MAP) .background(GTGuiTextures.BUTTON) // TODO find out why this needs to be called .disableHoverBackground() diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c87e08619a8..9aff07b25ea 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -21,7 +21,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.drawable.keys.DynamicKey; +import com.cleanroommc.modularui.drawable.text.DynamicKey; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -37,6 +37,7 @@ import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Column; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Row; import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -254,8 +255,8 @@ public MultiblockUIFactory setScreenHeight(int height) { * @param panelSyncManager the sync manager for synchronizing widgets */ @Nullable - protected Column createBars(@NotNull ModularPanel mainPanel, - @NotNull PanelSyncManager panelSyncManager) { + protected Flow createBars(@NotNull ModularPanel mainPanel, + @NotNull PanelSyncManager panelSyncManager) { if (!(mte instanceof ProgressBarMultiblock progressMulti)) return null; final int count = progressMulti.getProgressBarCount(); @@ -265,7 +266,7 @@ protected Column createBars(@NotNull ModularPanel mainPanel, final int rows = progressMulti.getProgressBarRows(); final int cols = progressMulti.getProgressBarCols(); - Column column = new Column() + Flow column = Flow.column() .margin(4, 0) .top(114) .widthRel(1f) @@ -274,7 +275,7 @@ protected Column createBars(@NotNull ModularPanel mainPanel, for (int r = 0; r < rows; r++) { - Row row = new Row() + Flow row = Flow.row() .widthRel(1f) .height(Bars.HEIGHT); @@ -347,7 +348,7 @@ private void resize(IWidget parent) { } @NotNull - protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { + protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() @@ -356,7 +357,7 @@ protected Column createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSy } var powerButton = createPowerButton(mainPanel, panelSyncManager); - return new Column() + return Flow.column() .alignX(1f) .right(4) .size(18, 77) @@ -379,7 +380,9 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, return new CycleButtonWidget() .size(18, 18) .value(distinctValue) - .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) + // .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) + .stateBackground(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) + .stateBackground(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) .background(GTGuiTextures.BUTTON) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? @@ -398,7 +401,11 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull return new CycleButtonWidget() .size(18, 18) - .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) + // .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) + .stateOverlay(0, GTGuiTextures.MULTIBLOCK_VOID[0]) + .stateOverlay(1, GTGuiTextures.MULTIBLOCK_VOID[1]) + .stateOverlay(2, GTGuiTextures.MULTIBLOCK_VOID[2]) + .stateOverlay(3, GTGuiTextures.MULTIBLOCK_VOID[3]) .background(GTGuiTextures.BUTTON) .value(voidingValue) .length(4) @@ -421,7 +428,9 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull return new CycleButtonWidget() .size(18) - .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) + // .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) + .stateOverlay(true, GTGuiTextures.BUTTON_POWER[1]) + .stateOverlay(false, GTGuiTextures.BUTTON_POWER[0]) .disableHoverBackground() .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) .value(new BooleanSyncValue(controllable::isWorkingEnabled, controllable::setWorkingEnabled)) diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index 09d39a2cf3e..3e9d35f96c8 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -15,10 +15,11 @@ import com.cleanroommc.modularui.api.widget.IGuiAction; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.Stencil; -import com.cleanroommc.modularui.drawable.TextRenderer; +import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.HoveredWidgetList; @@ -82,7 +83,7 @@ public void getSelfAt(IViewportStack stack, HoveredWidgetList widgets, int x, in public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) {} @Override - public void draw(GuiContext context, WidgetTheme widgetTheme) { + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { // draw the keys int x = getArea().getPadding().left; int y = getArea().getPadding().top - scroll.getScrollY().getScroll(); @@ -209,14 +210,14 @@ public boolean isValidSyncHandler(SyncHandler syncHandler) { } @Override - public void preDraw(GuiContext context, boolean transformed) { + public void preDraw(ModularGuiContext context, boolean transformed) { if (!transformed) { Stencil.applyAtZero(this.scroll, context); } } @Override - public void postDraw(GuiContext context, boolean transformed) { + public void postDraw(ModularGuiContext context, boolean transformed) { if (!transformed) { Stencil.remove(); this.scroll.drawScrollbar(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index a3e2d18bb24..935c04ef6ee 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -197,7 +197,8 @@ protected MultiblockUIFactory createUIFactory() { } })) .createFlexButton((panel, syncManager) -> { - PanelSyncHandler throttle = syncManager.panel("throttle_panel", panel, this::makeThrottlePanel); + PanelSyncHandler throttle = (PanelSyncHandler) syncManager.panel("throttle_panel", + this::makeThrottlePanel, true); return new ButtonWidget<>() .width(18) From 6a9cd2ed4a747acea6bd0c655cbfc90e2849127d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:02:16 -0700 Subject: [PATCH 062/264] only construct key array if lengths are different --- .../java/gregtech/api/mui/widget/GregtechDisplayScreen.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index 3e9d35f96c8..3b79567188e 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -272,7 +272,9 @@ public void setChangeListener(Runnable changeListener) { } private void buildKeys(PacketBuffer buffer) { - builtKeys = new IKey[deserializers.size()]; + if (builtKeys.length != deserializers.size()) + builtKeys = new IKey[deserializers.size()]; + activeHeight = 0; if (buffer == null) return; Arrays.setAll(builtKeys, i -> { From b00e034cde22c854750fa5c5294486e235f8b9a8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 7 Jan 2025 21:11:35 -0700 Subject: [PATCH 063/264] try to utilize new key methods --- src/main/java/gregtech/api/util/KeyUtil.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 6afbc3d34dc..c858abf9b06 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -15,11 +15,11 @@ public class KeyUtil { public static IKey colored(TextFormatting formatting, IKey... keys) { if (ArrayUtils.isEmpty(keys)) return wrap(formatting); if (keys.length == 1) return IKey.comp(wrap(formatting), keys[0]); - return IKey.comp(wrap(formatting), IKey.comp(keys)); + return IKey.comp(keys).format(formatting); } public static IKey string(String s) { - return string(TextFormatting.RESET, s); + return IKey.str(s); } public static IKey string(Supplier s) { @@ -28,11 +28,11 @@ public static IKey string(Supplier s) { public static IKey string(TextFormatting formatting, String string) { if (string == null) return IKey.EMPTY; - return IKey.comp(wrap(formatting), IKey.str(string)); + return IKey.str(string).format(formatting); } public static IKey string(TextFormatting formatting, Supplier stringSupplier) { - return IKey.dynamic(() -> formatting + stringSupplier.get()); + return IKey.dynamic(stringSupplier).format(formatting); } public static IKey string(Supplier formatting, String s) { @@ -48,8 +48,7 @@ public static IKey lang(String lang, Object... args) { } public static IKey lang(TextFormatting formatting, String lang, Object... args) { - if (ArrayUtils.isEmpty(args)) return colored(formatting, IKey.lang(lang)); - return colored(formatting, IKey.lang(lang, checkFormatting(formatting, args))); + return IKey.lang(lang, args).format(formatting); } public static IKey lang(TextFormatting formatting, String lang, Supplier... argSuppliers) { From f66276abdcffded4e95da46cd636e4110df21708 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:01:13 -0700 Subject: [PATCH 064/264] improve key util methods some more fix comp keys losing formatting actually draw the formatted keys --- .../api/mui/widget/GregtechDisplayScreen.java | 2 +- src/main/java/gregtech/api/util/KeyUtil.java | 32 ++++++++----------- .../gregtech/mixins/mui2/KeyCompMixin.java | 19 +++++++++++ src/main/resources/mixins.gregtech.mui2.json | 1 + 4 files changed, 35 insertions(+), 19 deletions(-) create mode 100644 src/main/java/gregtech/mixins/mui2/KeyCompMixin.java diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java index 3b79567188e..b83ab43b5a0 100644 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java @@ -95,7 +95,7 @@ public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { for (var key : syncHandler.builtKeys) { if (key == null) continue; textRenderer.setPos(x, y); - textRenderer.draw(key.get()); + textRenderer.draw(key.getFormatted()); y += 12; } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index c858abf9b06..52d248d5911 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -5,6 +5,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import org.apache.commons.lang3.ArrayUtils; +import java.util.Arrays; import java.util.function.LongSupplier; import java.util.function.Supplier; @@ -23,7 +24,7 @@ public static IKey string(String s) { } public static IKey string(Supplier s) { - return string(TextFormatting.RESET, s); + return IKey.dynamic(s); } public static IKey string(TextFormatting formatting, String string) { @@ -36,31 +37,29 @@ public static IKey string(TextFormatting formatting, Supplier stringSupp } public static IKey string(Supplier formatting, String s) { - return IKey.dynamic(() -> formatting.get() + s); + return IKey.dynamic(() -> IKey.str(s).format(formatting.get()).getFormatted()); } public static IKey string(Supplier formatting, Supplier stringSupplier) { - return IKey.dynamic(() -> formatting.get() + stringSupplier.get()); + return IKey.dynamic(() -> IKey.str(stringSupplier.get()).format(formatting.get()).getFormatted()); } public static IKey lang(String lang, Object... args) { - return lang(TextFormatting.RESET, lang, args); + return IKey.lang(lang, args); } public static IKey lang(TextFormatting formatting, String lang, Object... args) { - return IKey.lang(lang, args).format(formatting); + return IKey.lang(lang, checkFormatting(formatting, args)).format(formatting); } public static IKey lang(TextFormatting formatting, String lang, Supplier... argSuppliers) { - if (ArrayUtils.isEmpty(argSuppliers)) return colored(formatting, IKey.lang(lang)); + if (ArrayUtils.isEmpty(argSuppliers)) return IKey.lang(lang).format(formatting); if (argSuppliers.length == 1) - return string(formatting, () -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).get()); - final Object[] fixedArgs = new Object[argSuppliers.length]; + return IKey.dynamic(() -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).format(formatting).getFormatted()); + final Object[] args = new Object[argSuppliers.length]; return IKey.dynamic(() -> { - for (int i = 0; i < fixedArgs.length; i++) { - fixedArgs[i] = fixArg(formatting, argSuppliers[i].get()); - } - return formatting + IKey.lang(lang, fixedArgs).get(); + Arrays.setAll(args, value -> fixArg(formatting, argSuppliers[value].get())); + return IKey.lang(lang, args).format(formatting).getFormatted(); }); } @@ -97,16 +96,13 @@ private static IKey wrap(TextFormatting formatting) { } private static Object[] checkFormatting(TextFormatting formatting, Object[] args) { - Object[] fixedArgs = new Object[args.length]; - for (int i = 0; i < args.length; i++) { - fixedArgs[i] = fixArg(formatting, args[i]); - } - return fixedArgs; + Arrays.setAll(args, value -> fixArg(formatting, args[value])); + return args; } private static Object fixArg(TextFormatting formatting, Object arg) { if (arg instanceof IKey key) { - if (hasFormatting(key.get())) + if (hasFormatting(key.getFormatted())) return IKey.comp(key, wrap(formatting)); } else if (arg instanceof String s) { if (hasFormatting(s)) diff --git a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java new file mode 100644 index 00000000000..d85d942bcae --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java @@ -0,0 +1,19 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.BaseKey; + +import com.cleanroommc.modularui.drawable.text.CompoundKey; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = CompoundKey.class, remap = false) +public abstract class KeyCompMixin extends BaseKey { + + @Redirect(method = "get", at = @At(value = "INVOKE", target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) + public String formatTheKeys(IKey key) { + return key.getFormatted(); + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index f313fa2b32d..0e523b028aa 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,6 +8,7 @@ "maxShiftBy": 10 }, "mixins": [ + "KeyCompMixin", "ModularPanelMixin" ], "client": [ From 7f480da67337eb8171d722e8fc2b063a813354fc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 7 Jan 2025 22:13:01 -0700 Subject: [PATCH 065/264] simplify status keys remove unneeded method spotless --- .../multiblock/ui/MultiblockUIFactory.java | 12 ++++++------ src/main/java/gregtech/api/util/KeyUtil.java | 9 ++------- src/main/java/gregtech/mixins/mui2/KeyCompMixin.java | 6 +++--- 3 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 9aff07b25ea..c1e1d114d5e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -474,9 +474,9 @@ public static class Builder { private boolean isStructureFormed; // Keys for the three-state working system, can be set custom by multiblocks. - private IKey idlingKey = IKey.lang("gregtech.multiblock.idling"); - private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused"); - private IKey runningKey = IKey.lang("gregtech.multiblock.running"); + private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").format(TextFormatting.GRAY); + private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").format(TextFormatting.GOLD); + private IKey runningKey = IKey.lang("gregtech.multiblock.running").format(TextFormatting.GREEN); private boolean dirty; protected static Widget keyMapper(IDrawable key) { @@ -691,7 +691,7 @@ public Builder addWorkingStatusLine() { public Builder addWorkPausedLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || !isWorkingEnabled.getAsBoolean()) { - addKey(KeyUtil.colored(TextFormatting.GOLD, pausedKey)); + addKey(pausedKey); } return this; } @@ -705,7 +705,7 @@ public Builder addWorkPausedLine(boolean checkState) { public Builder addRunningPerfectlyLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || isActive.getAsBoolean()) { - addKey(KeyUtil.colored(TextFormatting.GREEN, runningKey)); + addKey(runningKey); } return this; } @@ -719,7 +719,7 @@ public Builder addRunningPerfectlyLine(boolean checkState) { public Builder addIdlingLine(boolean checkState) { if (!isStructureFormed) return this; if (!checkState || (isWorkingEnabled.getAsBoolean() && !isActive.getAsBoolean())) { - addKey(KeyUtil.colored(TextFormatting.GRAY, idlingKey)); + addKey(idlingKey); } return this; } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 52d248d5911..6187426dff4 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -13,12 +13,6 @@ public class KeyUtil { public static final String SECTION = "§"; - public static IKey colored(TextFormatting formatting, IKey... keys) { - if (ArrayUtils.isEmpty(keys)) return wrap(formatting); - if (keys.length == 1) return IKey.comp(wrap(formatting), keys[0]); - return IKey.comp(keys).format(formatting); - } - public static IKey string(String s) { return IKey.str(s); } @@ -55,7 +49,8 @@ public static IKey lang(TextFormatting formatting, String lang, Object... args) public static IKey lang(TextFormatting formatting, String lang, Supplier... argSuppliers) { if (ArrayUtils.isEmpty(argSuppliers)) return IKey.lang(lang).format(formatting); if (argSuppliers.length == 1) - return IKey.dynamic(() -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).format(formatting).getFormatted()); + return IKey.dynamic( + () -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).format(formatting).getFormatted()); final Object[] args = new Object[argSuppliers.length]; return IKey.dynamic(() -> { Arrays.setAll(args, value -> fixArg(formatting, argSuppliers[value].get())); diff --git a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java index d85d942bcae..92d9011ed1c 100644 --- a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java +++ b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java @@ -2,9 +2,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.BaseKey; - import com.cleanroommc.modularui.drawable.text.CompoundKey; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; @@ -12,7 +10,9 @@ @Mixin(value = CompoundKey.class, remap = false) public abstract class KeyCompMixin extends BaseKey { - @Redirect(method = "get", at = @At(value = "INVOKE", target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) + @Redirect(method = "get", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) public String formatTheKeys(IKey key) { return key.getFormatted(); } From be3c08cb65d424bc44156fd5ce6e21ff0aaf8f07 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 8 Jan 2025 15:56:34 -0700 Subject: [PATCH 066/264] forgor flow --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c1e1d114d5e..b71226309da 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -129,7 +129,7 @@ public void readInitialSync(PacketBuffer buffer) { return panel.child(createScreen(panelSyncManager)) .childIf(bars != null, bars) - .child(new Row() + .child(Flow.row() .bottom(7) .height(77) .margin(4, 0) From 85ca3e9f8705881a7cb1ffd495b2ff554de67b5a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 8 Jan 2025 17:42:29 -0700 Subject: [PATCH 067/264] port to rich text --- .../multiblock/ui/MultiblockUIFactory.java | 122 ++++++++---------- .../multi/MetaTileEntityLargeBoiler.java | 10 +- .../MetaTileEntityElectricBlastFurnace.java | 6 +- .../generator/MetaTileEntityLargeTurbine.java | 51 +++++--- 4 files changed, 96 insertions(+), 93 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index b71226309da..b7c725ddce1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -20,10 +20,12 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.drawable.text.DynamicKey; +import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -35,24 +37,20 @@ import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.RichTextWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; -import com.cleanroommc.modularui.widgets.layout.Column; import com.cleanroommc.modularui.widgets.layout.Flow; -import com.cleanroommc.modularui.widgets.layout.Row; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.ArrayList; -import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.DoubleSupplier; -import java.util.function.Function; import java.util.function.IntSupplier; import java.util.function.Supplier; @@ -144,7 +142,7 @@ private Widget createIndicator() { .pos(174 - 5, screenHeight - 18 - 3) .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(tooltip -> tooltip.addDrawableLines(builder.getTextList())); + .tooltipBuilder(builder::buildTooltip); } private IDrawable getIndicatorOverlay(Builder builder) { @@ -308,27 +306,29 @@ public MultiblockUIFactory customScreen(Supplier> customScreen) protected Widget createScreen(PanelSyncManager syncManager) { final var builder = builder(); this.displayText.accept(builder); - var col = new Column(); - builder.build(col); + var richTextWidget = new RichTextWidget(); + builder.buildDisplay(richTextWidget); final var compare = builder(); return new ParentWidget<>() .child(createIndicator()) .child(customScreen != null ? customScreen.get() : new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) - .child(col.expanded() + .child(richTextWidget.sizeRel(1f) + .alignment(Alignment.TopLeft) .margin(4, 4) .onUpdateListener(column -> { // really debating on if the display screen should be its own widget - compare.clear(); + // compare.clear(); this.displayText.accept(compare); - if (!builder.hasChanged(compare) && !dirty) return; - builder.clear(); - column.getChildren().clear(); - this.displayText.accept(builder); - builder.build(column); - resize(column); - dirty = false; + // if (!builder.hasChanged(compare) && !dirty) return; + // builder.clear(); + if (builder.hasChanged(compare)) + column.markDirty(); + // this.displayText.accept(builder); + // builder.build(column); + // resize(column); + // dirty = false; }))) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) @@ -465,9 +465,11 @@ protected static Builder builder() { @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { - private final List textList; - private Function> widgetFunction = Builder::keyMapper; - private final Int2ObjectMap tooltips = new Int2ObjectArrayMap<>(); + private final RichText text = new RichText(); + private final List>>> textList = new ArrayList<>(); + // private final List textList; + // private Function> widgetFunction = Builder::keyMapper; + // private final Int2ObjectMap tooltips = new Int2ObjectArrayMap<>(); private BooleanSupplier isWorkingEnabled = () -> false; private BooleanSupplier isActive = () -> false; @@ -479,15 +481,15 @@ public static class Builder { private IKey runningKey = IKey.lang("gregtech.multiblock.running").format(TextFormatting.GREEN); private boolean dirty; - protected static Widget keyMapper(IDrawable key) { - return key.asWidget() - .widthRel(1f) - .height(12); - } + // protected static Widget keyMapper(IDrawable key) { + // return key.asWidget() + // .widthRel(1f) + // .height(12); + // } - private Builder() { - this.textList = new ArrayList<>(); - } + // private Builder() { + // this.textList = new ArrayList<>(); + // } public Builder structureFormed(boolean structureFormed) { this.isStructureFormed = structureFormed; @@ -672,11 +674,11 @@ public Builder addWorkingStatusLine() { addKey(KeyUtil.string(() -> { if (!isWorkingEnabled.getAsBoolean()) { - return TextFormatting.GOLD + pausedKey.get(); + return pausedKey.getFormatted(); } else if (isActive.getAsBoolean()) { - return TextFormatting.GREEN + runningKey.get(); + return runningKey.getFormatted(); } else { - return TextFormatting.GRAY + idlingKey.get(); + return idlingKey.getFormatted(); } })); return this; @@ -881,23 +883,13 @@ public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDura /** Insert an empty line into the text list. */ public Builder addEmptyLine() { - addKey(IKey.EMPTY); // this is going to cause problems maybe + this.text.newLine(); return this; } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - List customKeys = new ArrayList<>(); - customConsumer.accept(customKeys); - customKeys.forEach(this::addKey); - return this; - } - - /** - * @param widgetFunction function to build widgets from keys - */ - public Builder widgetFunction(Function> widgetFunction) { - this.widgetFunction = widgetFunction; + public Builder addCustom(Consumer customConsumer) { + customConsumer.accept(this.text); return this; } @@ -909,41 +901,35 @@ protected void clear() { textList.clear(); } - protected void build(ParentWidget parent) { - for (int i = 0; i < textList.size(); i++) { - var line = this.widgetFunction.apply(textList.get(i)); - if (tooltips.containsKey(i)) - line.addTooltipLine(tooltips.get(i)); - parent.child(line); - } + protected void buildDisplay(RichTextWidget parent) { + parent.textBuilder(richText -> this.textList.forEach(t -> t.accept(richText))); } - protected List getTextList() { - return Collections.unmodifiableList(textList); + protected void buildTooltip(RichTooltip tooltip) { + this.textList.forEach(t -> t.accept(tooltip)); } - protected boolean hasChanged(Builder other) { - if (textList.size() != other.textList.size()) return true; - for (int i = 0; i < textList.size(); i++) { - IDrawable left = textList.get(i), right = other.textList.get(i); - - // dynamic keys are impossible to check, skip - if (left instanceof DynamicKey && right instanceof DynamicKey) - continue; + protected RichText getTextList() { + return this.text; + } - if (!left.equals(right)) + protected boolean hasChanged(Builder other) { + List cur = text.getStringRepresentation(); + List oth = other.text.getStringRepresentation(); + if (cur.size() != oth.size()) return true; + for (int i = 0; i < cur.size(); i++) { + if (!Objects.equals(cur.get(i), oth.get(i))) return true; } return false; } private void addKey(IDrawable key) { - this.textList.add(key); + textList.add(richText -> richText.addLine(key)); } - private void addKey(IDrawable key, IDrawable hover) { - this.tooltips.put(textList.size(), hover); - addKey(key); + private void addKey(IKey key, IDrawable hover) { + addKey(key.asTextIcon().asHoverable().addTooltipLine(hover)); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 935c04ef6ee..6cab3547ebc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -39,11 +39,11 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; -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.ItemDrawable; import com.cleanroommc.modularui.drawable.Rectangle; +import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -219,27 +219,27 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(List keyList) { + private void addCustomData(RichText keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, recipeLogic::getLastTickSteam, " L/t"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.number( () -> getNumberColor(recipeLogic.getHeatScaled()), recipeLogic::getHeatScaled, "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( () -> getNumberColor(getThrottle()), this::getThrottle, "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 34fd1aecd32..bb8239d8723 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -47,7 +47,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; @@ -119,13 +119,13 @@ protected MultiblockUIFactory createUIFactory() { .addProgressLine(progress::getDoubleValue)); } - private Consumer> addHeatCapacity(IntSyncValue temp) { + private Consumer addHeatCapacity(IntSyncValue temp) { return keyList -> { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, temp::getIntValue, "K"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } }; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index c16d82020d8..a49c787c388 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -11,7 +11,6 @@ import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; -import gregtech.api.mui.widget.GregtechDisplayScreen; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -208,22 +207,40 @@ protected MultiblockUIFactory createUIFactory() { .syncValue("dura", rotorFree) .syncValue("fuel_amount", fuelAmount) .syncValue("prev_duration", prevDuration) - .customScreen(() -> new GregtechDisplayScreen(this) - .padding(4) - .energy(this::getMaxVoltage, recipeLogic::getRecipeEUt) - .addLine(buffer -> { - buffer.writeBoolean(isStructureFormed()); - if (isStructureFormed()) - buffer.writeInt(noRotor ? -1 : getRotorHolder().getTotalEfficiency()); - }, buffer -> { - if (!buffer.readBoolean()) return null; - int i = buffer.readInt(); - if (i < 0) return null; - return KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.efficiency", i); - }) - .fuelNeeded(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) - .status()) + // .customScreen(() -> new ScrollWidget<>(new VerticalScrollData()) + // .padding(4).sizeRel(1f) + // .child(new RichTextWidget() + // .sizeRel(1f) + // .autoUpdate(true) + // .alignment(Alignment.TopLeft) + // .textBuilder(richText -> { + // richText.add(KeyUtil.lang(TextFormatting.WHITE, getMetaFullName())).newLine(); + // + // if (!isStructureFormed()) + // richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure")).newLine(); + // + // long v = getMaxVoltage(); + // String voltageName = GTValues.VOCNF[GTUtility.getFloorTierByVoltage(v)]; + // richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", + // TextFormattingUtil.formatNumbers(v), IKey.str(voltageName).format(TextFormatting.RESET))).newLine(); + // })) + // new GregtechDisplayScreen(this) + // .padding(4) + // .energy(this::getMaxVoltage, recipeLogic::getRecipeEUt) + // .addLine(buffer -> { + // buffer.writeBoolean(isStructureFormed()); + // if (isStructureFormed()) + // buffer.writeInt(noRotor ? -1 : getRotorHolder().getTotalEfficiency()); + // }, buffer -> { + // if (!buffer.readBoolean()) return null; + // int i = buffer.readInt(); + // if (i < 0) return null; + // return KeyUtil.lang(TextFormatting.GRAY, + // "gregtech.multiblock.turbine.efficiency", i); + // }) + // .fuelNeeded(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) + // .status() + // ) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) From d80871d37573d203930095e62d62c700a700a3c1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 15:59:06 -0700 Subject: [PATCH 068/264] fix npe --- .../electric/generator/MetaTileEntityLargeTurbine.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index a49c787c388..482502a7bb5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -188,13 +188,12 @@ protected void addErrorText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - boolean noRotor = getRotorHolder() == null; IntSyncValue efficiency = new IntSyncValue( - () -> noRotor ? 0 : getRotorHolder().getRotorEfficiency(), null); + () -> getRotorHolder() == null ? 0 : getRotorHolder().getRotorEfficiency(), null); IntSyncValue total = new IntSyncValue( - () -> noRotor ? 0 : getRotorHolder().getTotalEfficiency(), null); + () -> getRotorHolder() == null ? 0 : getRotorHolder().getTotalEfficiency(), null); IntSyncValue durability = new IntSyncValue( - () -> noRotor ? 0 : getRotorHolder().getRotorDurabilityPercent(), null); + () -> getRotorHolder() == null ? 0 : getRotorHolder().getRotorDurabilityPercent(), null); BooleanSyncValue rotorFree = new BooleanSyncValue( this::isRotorFaceFree, null); StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); From ca60a763408f845da6f4ca6434f77ddfdea1795e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:19:08 -0700 Subject: [PATCH 069/264] fix indicator tooltips improve display text big cleanup --- .../multiblock/ui/MultiblockUIFactory.java | 102 +++++------------- .../multi/MetaTileEntityLargeBoiler.java | 18 ++-- .../MetaTileEntityElectricBlastFurnace.java | 8 +- .../MetaTileEntityLargeCombustionEngine.java | 29 ++--- .../generator/MetaTileEntityLargeTurbine.java | 98 ++++++----------- 5 files changed, 84 insertions(+), 171 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index b7c725ddce1..20b92a86b32 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -22,7 +22,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.widget.IWidget; -import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.screen.RichTooltip; @@ -35,6 +35,7 @@ import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; +import com.cleanroommc.modularui.widget.sizer.Area; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.RichTextWidget; @@ -46,7 +47,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Objects; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; import java.util.function.Consumer; @@ -139,22 +139,27 @@ public void readInitialSync(PacketBuffer buffer) { private Widget createIndicator() { var builder = builder(); return new Widget<>() + .size(18) .pos(174 - 5, screenHeight - 18 - 3) - .onUpdateListener(w -> w.overlay(getIndicatorOverlay(builder))) + .overlay(new DynamicDrawable(() -> getIndicatorOverlay(builder))) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(builder::buildTooltip); + .tooltipBuilder(builder::build); } private IDrawable getIndicatorOverlay(Builder builder) { - if (!builder.isEmpty()) builder.clear(); + builder.clear(); + RichTooltip test = new RichTooltip(new Area()); this.errorText.accept(builder); - if (!builder.isEmpty()) { + builder.build(test); + if (!test.isEmpty()) { // error return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; } + this.warningText.accept(builder); - if (!builder.isEmpty()) { + builder.build(test); + if (!test.isEmpty()) { // warn return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } @@ -306,47 +311,22 @@ public MultiblockUIFactory customScreen(Supplier> customScreen) protected Widget createScreen(PanelSyncManager syncManager) { final var builder = builder(); this.displayText.accept(builder); - var richTextWidget = new RichTextWidget(); - builder.buildDisplay(richTextWidget); - final var compare = builder(); return new ParentWidget<>() - .child(createIndicator()) .child(customScreen != null ? customScreen.get() : new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) - .child(richTextWidget.sizeRel(1f) + .child(new RichTextWidget() + .sizeRel(1f) .alignment(Alignment.TopLeft) .margin(4, 4) - .onUpdateListener(column -> { - // really debating on if the display screen should be its own widget - // compare.clear(); - this.displayText.accept(compare); - // if (!builder.hasChanged(compare) && !dirty) return; - // builder.clear(); - if (builder.hasChanged(compare)) - column.markDirty(); - // this.displayText.accept(builder); - // builder.build(column); - // resize(column); - // dirty = false; - }))) + .autoUpdate(true) + .textBuilder(builder::build))) + .child(createIndicator()) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) .pos(4, 4); } - private void resize(IWidget parent) { - int top = parent.getArea().getPadding().top; - for (IWidget widget : parent.getChildren()) { - widget.resizer().resize(widget); - var area = widget.getArea(); - area.rx = parent.getArea().getPadding().left; - area.ry = top; - area.applyPos(parent); - top += area.requestedHeight(); - } - } - @NotNull protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); @@ -380,7 +360,6 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, return new CycleButtonWidget() .size(18, 18) .value(distinctValue) - // .textureGetter(i -> GTGuiTextures.BUTTON_DISTINCT_BUSES[i]) .stateBackground(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) .stateBackground(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) .background(GTGuiTextures.BUTTON) @@ -394,14 +373,13 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull if (!mte.shouldShowVoidingModeButton()) { return GTGuiTextures.BUTTON_VOID_NONE.asWidget() .size(18, 18) - .tooltip(t -> t.addLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported"))); + .addTooltipLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported")); } IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); return new CycleButtonWidget() .size(18, 18) - // .textureGetter(i -> GTGuiTextures.MULTIBLOCK_VOID[i]) .stateOverlay(0, GTGuiTextures.MULTIBLOCK_VOID[0]) .stateOverlay(1, GTGuiTextures.MULTIBLOCK_VOID[1]) .stateOverlay(2, GTGuiTextures.MULTIBLOCK_VOID[2]) @@ -428,7 +406,6 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull return new CycleButtonWidget() .size(18) - // .textureGetter(i -> GTGuiTextures.BUTTON_POWER[i]) .stateOverlay(true, GTGuiTextures.BUTTON_POWER[1]) .stateOverlay(false, GTGuiTextures.BUTTON_POWER[0]) .disableHoverBackground() @@ -465,8 +442,8 @@ protected static Builder builder() { @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { - private final RichText text = new RichText(); - private final List>>> textList = new ArrayList<>(); + // private final RichText text = new RichText(); + private final List>> textList = new ArrayList<>(); // private final List textList; // private Function> widgetFunction = Builder::keyMapper; // private final Int2ObjectMap tooltips = new Int2ObjectArrayMap<>(); @@ -481,16 +458,6 @@ public static class Builder { private IKey runningKey = IKey.lang("gregtech.multiblock.running").format(TextFormatting.GREEN); private boolean dirty; - // protected static Widget keyMapper(IDrawable key) { - // return key.asWidget() - // .widthRel(1f) - // .height(12); - // } - - // private Builder() { - // this.textList = new ArrayList<>(); - // } - public Builder structureFormed(boolean structureFormed) { this.isStructureFormed = structureFormed; if (!structureFormed) { @@ -883,13 +850,13 @@ public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDura /** Insert an empty line into the text list. */ public Builder addEmptyLine() { - this.text.newLine(); + this.textList.add(IRichTextBuilder::newLine); return this; } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer customConsumer) { - customConsumer.accept(this.text); + public Builder addCustom(Consumer> customConsumer) { + textList.add(customConsumer); return this; } @@ -901,27 +868,8 @@ protected void clear() { textList.clear(); } - protected void buildDisplay(RichTextWidget parent) { - parent.textBuilder(richText -> this.textList.forEach(t -> t.accept(richText))); - } - - protected void buildTooltip(RichTooltip tooltip) { - this.textList.forEach(t -> t.accept(tooltip)); - } - - protected RichText getTextList() { - return this.text; - } - - protected boolean hasChanged(Builder other) { - List cur = text.getStringRepresentation(); - List oth = other.text.getStringRepresentation(); - if (cur.size() != oth.size()) return true; - for (int i = 0; i < cur.size(); i++) { - if (!Objects.equals(cur.get(i), oth.get(i))) - return true; - } - return false; + protected void build(IRichTextBuilder richText) { + this.textList.forEach(t -> t.accept(richText)); } private void addKey(IDrawable key) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 6cab3547ebc..ebbbe3b5f99 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -40,10 +40,10 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.drawable.Rectangle; -import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; @@ -186,14 +186,12 @@ protected MultiblockUIFactory createUIFactory() { .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addCustom(this::addCustomData) .addWorkingStatusLine()) - .configureWarningText(builder -> builder.addCustom(keyList -> { - if (isStructureFormed()) { - if (!waterFilled.getBoolValue()) { - keyList.add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); - } + .configureWarningText(builder -> builder.addCustom(richText -> { + if (isStructureFormed() && !waterFilled.getBoolValue()) { + richText.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + richText.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); } })) .createFlexButton((panel, syncManager) -> { @@ -219,7 +217,7 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(RichText keyList) { + private void addCustomData(IRichTextBuilder keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index bb8239d8723..6c91210d514 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -47,7 +47,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; @@ -119,13 +119,13 @@ protected MultiblockUIFactory createUIFactory() { .addProgressLine(progress::getDoubleValue)); } - private Consumer addHeatCapacity(IntSyncValue temp) { - return keyList -> { + private Consumer> addHeatCapacity(IntSyncValue temp) { + return richText -> { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, temp::getIntValue, "K"); - keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.addLine(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } }; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 711ee3e6484..8322cf1a5e0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -140,30 +140,31 @@ protected MultiblockUIFactory createUIFactory() { builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); } + // todo fix prev duration being 0 on first ui open builder.addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) - .addCustom(tl -> { + .addCustom(richText -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - tl.add(KeyUtil.lang(TextFormatting.AQUA, key)); + richText.addLine(KeyUtil.lang(TextFormatting.AQUA, key)); } }) .addWorkingStatusLine(); }) .configureErrorText(builder -> builder.addCustom(keyList -> { - if (isStructureFormed()) { - if (checkIntakesObstructed()) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.obstructed")); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_combustion_engine.obstructed.desc")); - } - - if (!hasLubricant.getBoolValue()) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.no_lubricant")); - } + if (!isStructureFormed()) return; + + if (checkIntakesObstructed()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.obstructed")); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_combustion_engine.obstructed.desc")); + } + + if (!hasLubricant.getBoolValue()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.no_lubricant")); } })); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 482502a7bb5..cb0568b302a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -200,89 +200,55 @@ protected MultiblockUIFactory createUIFactory() { IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); return new MultiblockUIFactory(this) - .syncValue("eff", efficiency) + .syncValue("efficiency", efficiency) .syncValue("total", total) - .syncValue("free", durability) - .syncValue("dura", rotorFree) + .syncValue("durability", durability) + .syncValue("rotor_free", rotorFree) .syncValue("fuel_amount", fuelAmount) .syncValue("prev_duration", prevDuration) - // .customScreen(() -> new ScrollWidget<>(new VerticalScrollData()) - // .padding(4).sizeRel(1f) - // .child(new RichTextWidget() - // .sizeRel(1f) - // .autoUpdate(true) - // .alignment(Alignment.TopLeft) - // .textBuilder(richText -> { - // richText.add(KeyUtil.lang(TextFormatting.WHITE, getMetaFullName())).newLine(); - // - // if (!isStructureFormed()) - // richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure")).newLine(); - // - // long v = getMaxVoltage(); - // String voltageName = GTValues.VOCNF[GTUtility.getFloorTierByVoltage(v)]; - // richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", - // TextFormattingUtil.formatNumbers(v), IKey.str(voltageName).format(TextFormatting.RESET))).newLine(); - // })) - // new GregtechDisplayScreen(this) - // .padding(4) - // .energy(this::getMaxVoltage, recipeLogic::getRecipeEUt) - // .addLine(buffer -> { - // buffer.writeBoolean(isStructureFormed()); - // if (isStructureFormed()) - // buffer.writeInt(noRotor ? -1 : getRotorHolder().getTotalEfficiency()); - // }, buffer -> { - // if (!buffer.readBoolean()) return null; - // int i = buffer.readInt(); - // if (i < 0) return null; - // return KeyUtil.lang(TextFormatting.GRAY, - // "gregtech.multiblock.turbine.efficiency", i); - // }) - // .fuelNeeded(recipeLogic::getRecipeFluidInputInfo, recipeLogic::getPreviousRecipeDuration) - // .status() - // ) .configureDisplayText(builder -> builder .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(tl -> { - if (isStructureFormed()) { - if (efficiency.getIntValue() > 0) { - IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, - total.getIntValue(), "%"); - tl.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.efficiency", - efficiencyInfo)); - } + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (efficiency.getIntValue() > 0) { + IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, + total.getIntValue(), "%"); + richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.efficiency", + efficiencyInfo)); } }) + // todo fix prev duration being 0 on first ui open .addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) .addWorkingStatusLine()) .configureWarningText(false, builder -> builder - .addCustom(tl -> { - if (isStructureFormed()) { - if (efficiency.getIntValue() > 0) { - if (durability.getIntValue() <= MIN_DURABILITY_TO_WARN) { - tl.add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.turbine.rotor_durability_low")); - } - } + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (efficiency.getIntValue() > 0 && durability.getIntValue() <= MIN_DURABILITY_TO_WARN) { + richText.addLine(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.turbine.rotor_durability_low")); } }) .addLowDynamoTierLine(isDynamoTierTooLow()) .addMaintenanceProblemLines(getMaintenanceProblems())) .configureErrorText(builder -> builder - .addCustom(keyList -> { - if (isStructureFormed()) { - if (!rotorFree.getBoolValue()) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.turbine.obstructed")); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.obstructed.desc")); - } + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (!rotorFree.getBoolValue()) { + richText.addLine(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.obstructed")); + richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.obstructed.desc")); + } - if (efficiency.getIntValue() <= 0) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.turbine.no_rotor")); - } + // todo fix "no rotor" tooltip always being shown on first ui open + if (efficiency.getIntValue() <= 0) { + richText.addLine(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.no_rotor")); } })); } From 9ff112c7cdc323acb367cd9b8ef133549a3af3af Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 17:57:14 -0700 Subject: [PATCH 070/264] fix energy container line --- .../RecipeMapMultiblockController.java | 8 +++-- .../multiblock/ui/MultiblockUIFactory.java | 32 +++++++++---------- .../MetaTileEntityElectricBlastFurnace.java | 2 +- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index d81cd93965d..8dc02b8b4db 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -35,6 +35,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -193,12 +194,15 @@ protected void addWarningText(List textList) { @Override protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + tier.updateCacheFromSource(true); return new MultiblockUIFactory(this) .syncValue("progress", progress) + .syncValue("tier", tier) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addEnergyUsageLine(this::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() .addProgressLine(progress::getDoubleValue)) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 20b92a86b32..7860f3d59fe 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -503,22 +503,22 @@ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String r *
* Added if the structure is formed and if the passed energy container has greater than zero capacity. */ - public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!isStructureFormed || energyContainer == null) return this; - - if (energyContainer.getEnergyCapacity() > 0) { - long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - IKey voltageName = IKey.str(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - var bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName); - var hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_hover"); - addKey(bodyText, hoverText); - } + public Builder addEnergyUsageLine(Supplier energyContainer) { + if (!isStructureFormed || energyContainer.get() == null) return this; + if (energyContainer.get().getEnergyCapacity() <= 0) return this; + + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", () -> { + var e = energyContainer.get(); + long maxVoltage = Math.max(e.getInputVoltage(), e.getOutputVoltage()); + return TextFormattingUtil.formatNumbers(maxVoltage); + }, () -> { + var e = energyContainer.get(); + long maxVoltage = Math.max(e.getInputVoltage(), e.getOutputVoltage()); + return GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]; + }); + var hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_hover"); + addKey(bodyText, hoverText); return this; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 6c91210d514..03a64c49a9d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -111,7 +111,7 @@ protected MultiblockUIFactory createUIFactory() { .syncValue("tier", tier) .configureDisplayText(builder -> builder .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(getEnergyContainer()) + .addEnergyUsageLine(this::getEnergyContainer) .addEnergyTierLine(tier.getIntValue()) .addCustom(addHeatCapacity(temp)) .addParallelsLine(recipeMapWorkable.getParallelLimit()) From 69b6f106836a114c7549579070638e03a0ce427a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:25:20 -0700 Subject: [PATCH 071/264] port pyrolyse and multismelter add hover method to KeyUtil --- .../multiblock/ui/MultiblockUIFactory.java | 2 +- src/main/java/gregtech/api/util/KeyUtil.java | 5 ++ .../electric/MetaTileEntityMultiSmelter.java | 67 ++++++++++++++++--- .../electric/MetaTileEntityPyrolyseOven.java | 35 ++++++++++ 4 files changed, 100 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7860f3d59fe..c945a6a7404 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -877,7 +877,7 @@ private void addKey(IDrawable key) { } private void addKey(IKey key, IDrawable hover) { - addKey(key.asTextIcon().asHoverable().addTooltipLine(hover)); + addKey(KeyUtil.setHover(key, hover)); } } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 6187426dff4..f2d533de182 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -2,6 +2,7 @@ import net.minecraft.util.text.TextFormatting; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import org.apache.commons.lang3.ArrayUtils; @@ -86,6 +87,10 @@ public static IKey number(Supplier formatting, LongSupplier supp return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } + public static IDrawable setHover(IKey body, IDrawable hover) { + return body.asTextIcon().asHoverable().addTooltipLine(hover); + } + private static IKey wrap(TextFormatting formatting) { return IKey.str(formatting.toString()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 71fca7ba8d4..226972e3813 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -9,6 +9,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ParallelLogicType; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -19,6 +20,7 @@ import gregtech.api.recipes.machines.RecipeMapFurnace; import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -36,6 +38,9 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -104,17 +109,63 @@ protected void addDisplayText(List textList) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } + @Override + protected MultiblockUIFactory createUIFactory() { + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + tier.updateCacheFromSource(true); + IntSyncValue discount = new IntSyncValue(() -> heatingCoilDiscount, null); + IntSyncValue parallel = new IntSyncValue(() -> getRecipeMapWorkable().getParallelLimit(), null); + return new MultiblockUIFactory(this) + .syncValue("progress", progress) + .syncValue("tier", tier) + .syncValue("discount", discount) + .syncValue("para", parallel) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) + .addEnergyUsageLine(this::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (discount.getIntValue() > 1) { + IKey coilDiscount = KeyUtil.number(TextFormatting.AQUA, + (long) (100.0 / discount.getIntValue()), "%"); + + IKey base = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.heating_coil_discount", + coilDiscount); + + IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.heating_coil_discount_hover"); + + richText.addLine(KeyUtil.setHover(base, hoverText)); + } + + if (parallel.getIntValue() > 0) { + IKey parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, + parallel.getIntValue()); + + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.parallel", + parallels); + + IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.parallel_hover"); + + richText.addLine(KeyUtil.setHover(bodyText, hoverText)); + } + }) + .addWorkingStatusLine() + .addProgressLine(progress::getDoubleValue)); + } + @Override protected void formStructure(PatternMatchContext context) { super.formStructure(context); - Object coilType = context.get("CoilType"); - if (coilType instanceof IHeatingCoilBlockStats) { - this.heatingCoilLevel = ((IHeatingCoilBlockStats) coilType).getLevel(); - this.heatingCoilDiscount = ((IHeatingCoilBlockStats) coilType).getEnergyDiscount(); - } else { - this.heatingCoilLevel = CoilType.CUPRONICKEL.getLevel(); - this.heatingCoilDiscount = CoilType.CUPRONICKEL.getEnergyDiscount(); - } + IHeatingCoilBlockStats coilType = context.getOrDefault("CoilType", CoilType.CUPRONICKEL); + this.heatingCoilLevel = coilType.getLevel(); + this.heatingCoilDiscount = coilType.getEnergyDiscount(); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index b4715563582..437461a4e6e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -14,6 +15,7 @@ import gregtech.api.recipes.logic.OCResult; import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -32,6 +34,9 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -139,6 +144,36 @@ private TextFormatting getSpeedColor(int speed) { } } + @Override + protected MultiblockUIFactory createUIFactory() { + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + tier.updateCacheFromSource(true); + IntSyncValue coil = new IntSyncValue(() -> coilTier, null); + return new MultiblockUIFactory(this) + .syncValue("progress", progress) + .syncValue("tier", tier) + .syncValue("coil", coil) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) + .addEnergyUsageLine(this::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) + .addCustom(richText -> { + if (!isStructureFormed()) return; + int processingSpeed = coil.getIntValue() == 0 ? 75 : 50 * (coil.getIntValue() + 1); + IKey speed = KeyUtil.number(() -> getSpeedColor(processingSpeed), () -> processingSpeed, + "%"); + IKey body = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.pyrolyse_oven.speed", + speed); + IKey hover = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.pyrolyse_oven.speed_hover"); + richText.addLine(body.asTextIcon().asHoverable().addTooltipLine(hover)); + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(progress::getDoubleValue)); + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); From 58e97fb9dff2ceb0d294b2b3781ea6d0242d3e23 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:28:10 -0700 Subject: [PATCH 072/264] fix potential npe when fixing args --- src/main/java/gregtech/api/util/KeyUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index f2d533de182..c143318d14d 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -96,6 +96,7 @@ private static IKey wrap(TextFormatting formatting) { } private static Object[] checkFormatting(TextFormatting formatting, Object[] args) { + if (ArrayUtils.isEmpty(args)) return args; Arrays.setAll(args, value -> fixArg(formatting, args[value])); return args; } From b397c4c738a9bcf9f7f36edafe103f438e0eeb32 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:35:50 -0700 Subject: [PATCH 073/264] add mixin to set cache in constructor add todo notes to all mui2 mixins --- .../mixins/mui2/IntSyncValueMixin.java | 24 +++++++++++++++++++ .../gregtech/mixins/mui2/KeyCompMixin.java | 1 + src/main/resources/mixins.gregtech.mui2.json | 1 + 3 files changed, 26 insertions(+) create mode 100644 src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java diff --git a/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java b/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java new file mode 100644 index 00000000000..c571e2de1b8 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java @@ -0,0 +1,24 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.function.IntConsumer; +import java.util.function.IntSupplier; + +// todo remove once mui2 rc3 is released +@Mixin(value = IntSyncValue.class, remap = false) +public abstract class IntSyncValueMixin { + + @Shadow + private int cache; + + @Inject(method = "(Ljava/util/function/IntSupplier;Ljava/util/function/IntConsumer;)V", at = @At("TAIL")) + public void setCache(IntSupplier getter, IntConsumer setter, CallbackInfo ci) { + this.cache = getter.getAsInt(); + } +} diff --git a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java index 92d9011ed1c..863d58ef120 100644 --- a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java +++ b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java @@ -7,6 +7,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +// todo check if can remove once rc3 is released @Mixin(value = CompoundKey.class, remap = false) public abstract class KeyCompMixin extends BaseKey { diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 0e523b028aa..946632bf1c0 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,6 +8,7 @@ "maxShiftBy": 10 }, "mixins": [ + "IntSyncValueMixin", "KeyCompMixin", "ModularPanelMixin" ], From a1af7cc89299299db468d016dc78473e646a8b78 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 9 Jan 2025 18:39:37 -0700 Subject: [PATCH 074/264] no longer need to call this --- .../multiblock/RecipeMapMultiblockController.java | 1 - .../multi/electric/MetaTileEntityElectricBlastFurnace.java | 3 +-- .../multi/electric/MetaTileEntityMultiSmelter.java | 1 - .../multi/electric/MetaTileEntityPyrolyseOven.java | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 8dc02b8b4db..d65d583ffc3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -195,7 +195,6 @@ protected void addWarningText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - tier.updateCacheFromSource(true); return new MultiblockUIFactory(this) .syncValue("progress", progress) .syncValue("tier", tier) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 03a64c49a9d..e5693ed236d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -102,9 +102,8 @@ protected void addDisplayText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, null); - temp.updateCacheFromSource(true); IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - tier.updateCacheFromSource(true); + return new MultiblockUIFactory(this) .syncValue("progress", progress) .syncValue("temp", temp) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 226972e3813..053758cb4c1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -113,7 +113,6 @@ protected void addDisplayText(List textList) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - tier.updateCacheFromSource(true); IntSyncValue discount = new IntSyncValue(() -> heatingCoilDiscount, null); IntSyncValue parallel = new IntSyncValue(() -> getRecipeMapWorkable().getParallelLimit(), null); return new MultiblockUIFactory(this) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 437461a4e6e..9024b1861cd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -148,7 +148,6 @@ private TextFormatting getSpeedColor(int speed) { protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - tier.updateCacheFromSource(true); IntSyncValue coil = new IntSyncValue(() -> coilTier, null); return new MultiblockUIFactory(this) .syncValue("progress", progress) From 31f4468449ae149b933c975a856801ec6665fffd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 10 Jan 2025 13:43:36 -0700 Subject: [PATCH 075/264] cleanup --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c945a6a7404..1d4f6d58a37 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -442,11 +442,7 @@ protected static Builder builder() { @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { - // private final RichText text = new RichText(); private final List>> textList = new ArrayList<>(); - // private final List textList; - // private Function> widgetFunction = Builder::keyMapper; - // private final Int2ObjectMap tooltips = new Int2ObjectArrayMap<>(); private BooleanSupplier isWorkingEnabled = () -> false; private BooleanSupplier isActive = () -> false; From d9cf1dd4a9208dcdbe531acab6c63684092c6b3f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:40:41 -0700 Subject: [PATCH 076/264] make adding status keys actually translate add note --- .../multiblock/ui/MultiblockUIFactory.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 1d4f6d58a37..d59dfbe7e9b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -442,6 +442,12 @@ protected static Builder builder() { @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { + /* + * NOTE: + * instead of this, hold an IRichTextBuilder and set with a method + * display needs RichText, and warning/error need RichTooltip + * then compare the builder (requires mixin) to see if update is needed + **/ private final List>> textList = new ArrayList<>(); private BooleanSupplier isWorkingEnabled = () -> false; @@ -488,9 +494,9 @@ public Builder setWorkingStatus(BooleanSupplier isWorkingEnabled, BooleanSupplie * @param runningKey The translation key for the Running state, or "isActive". */ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { - if (idlingKey != null) this.idlingKey = IKey.str(idlingKey); - if (pausedKey != null) this.pausedKey = IKey.str(pausedKey); - if (runningKey != null) this.runningKey = IKey.str(runningKey); + if (idlingKey != null) this.idlingKey = IKey.lang(idlingKey).format(TextFormatting.GRAY); + if (pausedKey != null) this.pausedKey = IKey.lang(pausedKey).format(TextFormatting.GOLD); + if (runningKey != null) this.runningKey = IKey.lang(runningKey).format(TextFormatting.GREEN); return this; } From 223a29daeeac72966c5c997b18d674ce2a790011 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:41:09 -0700 Subject: [PATCH 077/264] port HPCA, research station, cracking unit --- .../electric/MetaTileEntityCrackingUnit.java | 40 +++++++ .../multi/electric/MetaTileEntityHPCA.java | 107 ++++++++++++++++++ .../MetaTileEntityResearchStation.java | 28 +++++ 3 files changed, 175 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index b1bd30b8574..14cbb45e76e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -14,6 +15,7 @@ import gregtech.api.recipes.logic.OCResult; import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -32,6 +34,9 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,6 +113,41 @@ protected void addDisplayText(List textList) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } + @Override + protected MultiblockUIFactory createUIFactory() { + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + return new MultiblockUIFactory(this) + .syncValue("progress", progress) + .syncValue("tier", tier) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) + .addEnergyUsageLine(this::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + // Coil energy discount line + IKey energyDiscount = KeyUtil.number(TextFormatting.AQUA, + 100 - 10L * coilTier, "%"); + + IKey base = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.cracking_unit.energy", + energyDiscount); + + IKey hover = KeyUtil.lang( + TextFormatting.GRAY, + "gregtech.multiblock.cracking_unit.energy_hover"); + + richText.addLine(KeyUtil.setHover(base, hover)); + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(progress::getDoubleValue)) + .configureWarningText(builder -> builder + .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index e86908a23db..6631ab70037 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -20,6 +20,7 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; @@ -55,6 +56,8 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -453,6 +456,79 @@ protected void addErrorText(List textList) { } } + @Override + protected MultiblockUIFactory createUIFactory() { + IntSyncValue curCWUt = new IntSyncValue(() -> hpcaHandler.cachedCWUt, null); + IntSyncValue maxCWUt = new IntSyncValue(hpcaHandler::getMaxCWUt, null); + BooleanSyncValue hasNoEnergy = new BooleanSyncValue(() -> hasNotEnoughEnergy, null); + DoubleSyncValue temp = new DoubleSyncValue(() -> temperature, null); + + return new MultiblockUIFactory(this) + .syncValue("cur_cwut", curCWUt) + .syncValue("max_cwut", maxCWUt) + .syncValue("no_energy", hasNoEnergy) + .syncValue("temp", temp) + .configureDisplayText(builder -> builder + .setWorkingStatus(() -> true, () -> hpcaHandler.getAllocatedCWUt() > 0) + .setWorkingStatusKeys( + "gregtech.multiblock.idling", + "gregtech.multiblock.idling", + "gregtech.multiblock.data_bank.providing") + .addCustom(richText -> { + if (!isStructureFormed()) return; + + // Energy Usage + String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; + richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.energy", + TextFormattingUtil.formatNumbers(curCWUt.getIntValue()), + TextFormattingUtil.formatNumbers(maxCWUt.getIntValue()), + voltageName)); + + // Provided Computation + IKey cwutInfo = KeyUtil.string(TextFormatting.AQUA, + curCWUt.getIntValue() + " / " + maxCWUt.getIntValue() + " CWU/t"); + + richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.computation", + cwutInfo)); + }) + .addWorkingStatusLine()) + .configureWarningText(builder -> builder + .addLowPowerLine(hasNoEnergy.getBoolValue()) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (temp.getDoubleValue() > 500) { + // Temperature warning + richText.add(KeyUtil.lang( + TextFormatting.YELLOW, + "gregtech.multiblock.hpca.warning_temperature")); + + // Active cooler overdrive warning + richText.add(KeyUtil.lang( + TextFormatting.GRAY, + "gregtech.multiblock.hpca.warning_temperature_active_cool")); + } + + // Structure warnings + // hpcaHandler.addWarnings(richText); + hpcaHandler.addWarnings2(richText); + }) + .addMaintenanceProblemLines(getMaintenanceProblems())) + .configureErrorText(builder -> builder + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (temp.getDoubleValue() > 1000) { + richText.addLine(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.hpca.error_temperature")); + } + // hpcaHandler.addErrors(textList); + hpcaHandler.addErrors2(richText); + })); + } + @Override public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip, boolean advanced) { @@ -923,6 +999,37 @@ public void addErrors(List textList) { } } + public void addWarnings2(IRichTextBuilder richText) { + List warnings = new ArrayList<>(); + if (numBridges > 1) { + warnings.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.warning_multiple_bridges")); + } + if (computationProviders.isEmpty()) { + warnings.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.warning_no_computation")); + } + if (getMaxCoolingDemand() > getMaxCoolingAmount()) { + warnings.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.warning_low_cooling")); + } + if (!warnings.isEmpty()) { + richText.addLine(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.hpca.warning_structure_header")); + warnings.forEach(richText::addLine); + } + } + + public void addErrors2(IRichTextBuilder richText) { + for (IHPCAComponentHatch component : components) { + if (component.isDamaged()) { + richText.addLine(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.hpca.error_damaged")); + return; + } + } + } + public TextureArea getComponentTexture(int index) { if (components.size() <= index) { return GuiTextures.BLANK_TRANSPARENT; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index cef0e7958e7..6e3a853c2dd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -13,6 +13,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -39,6 +40,8 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -246,6 +249,31 @@ protected void addWarningText(List textList) { .addMaintenanceProblemLines(getMaintenanceProblems()); } + @Override + protected MultiblockUIFactory createUIFactory() { + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); + return new MultiblockUIFactory(this) + .syncValue("progress", progress) + .syncValue("tier", tier) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) + .setWorkingStatusKeys( + "gregtech.multiblock.idling", + "gregtech.multiblock.work_paused", + "gregtech.machine.research_station.researching") + .addEnergyUsageLine(recipeMapWorkable::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) + .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(progress::getDoubleValue)) + .configureWarningText(builder -> builder + .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) + .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) + .addMaintenanceProblemLines(getMaintenanceProblems())); + } + private static class ResearchStationRecipeLogic extends ComputationRecipeLogic { public ResearchStationRecipeLogic(MetaTileEntityResearchStation metaTileEntity) { From c03d5a9fa88dd506d9eb5efa310288b314079d36 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 10 Jan 2025 14:49:17 -0700 Subject: [PATCH 078/264] port processing array add varargs to setHover() --- src/main/java/gregtech/api/util/KeyUtil.java | 5 +- .../MetaTileEntityProcessingArray.java | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index c143318d14d..72a24e46ea3 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -87,8 +87,9 @@ public static IKey number(Supplier formatting, LongSupplier supp return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } - public static IDrawable setHover(IKey body, IDrawable hover) { - return body.asTextIcon().asHoverable().addTooltipLine(hover); + public static IDrawable setHover(IKey body, IDrawable... hover) { + if (ArrayUtils.isEmpty(hover)) return body; + return body.asTextIcon().asHoverable().addTooltipDrawableLines(Arrays.asList(hover)); } private static IKey wrap(TextFormatting formatting) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 0a06b0fb546..a041084dabc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -16,6 +16,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -26,6 +27,7 @@ import gregtech.api.recipes.logic.OCResult; import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -49,6 +51,9 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -174,6 +179,73 @@ protected void addDisplayText(List textList) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } + @Override + protected MultiblockUIFactory createUIFactory() { + ProcessingArrayWorkable logic = (ProcessingArrayWorkable) recipeMapWorkable; + + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + IntSyncValue tier = new IntSyncValue(() -> logic.currentMachineStack.isEmpty() ? -1 : logic.machineTier, null); + return new MultiblockUIFactory(this) + .syncValue("progress", progress) + .syncValue("tier", tier) + .configureDisplayText(builder -> builder + .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) + .addEnergyUsageLine(this::getEnergyContainer) + .addEnergyTierLine(tier.getIntValue()) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + // Machine mode text + // Shared text components for both states + IKey maxMachinesText = KeyUtil.string(TextFormatting.DARK_PURPLE, + Integer.toString(getMachineLimit())); + maxMachinesText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_max", maxMachinesText); + + if (logic.activeRecipeMap == null) { + // No machines in hatch + IKey noneText = KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.machine.machine_hatch.machines_none"); + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines", noneText); + IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_none_hover"); + richText.addLine(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); + } else { + // Some amount of machines in hatch + String key = logic.getMachineStack().getTranslationKey(); + IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, + key + ".name"); + mapText = KeyUtil.lang( + TextFormatting.DARK_PURPLE, + "%sx %s", + logic.getParallelLimit(), mapText); + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines", mapText); + String voltageName = GTValues.VNF[logic.machineTier]; + int amps = logic.getMachineStack().getCount(); + String energyFormatted = TextFormattingUtil + .formatNumbers(GTValues.V[logic.machineTier] * amps); + IKey hoverText = KeyUtil.lang( + TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_max_eut", + energyFormatted, amps, voltageName); + richText.addLine(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); + } + + // Hatch locked status + if (isActive()) { + richText.addLine(KeyUtil.lang(TextFormatting.DARK_RED, + "gregtech.machine.machine_hatch.locked")); + } + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(progress::getDoubleValue)) + .configureWarningText(builder -> builder + .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + } + @SideOnly(Side.CLIENT) @NotNull @Override From 65544c9fbdf8d60c1e55bfb0f411de6e1668a4a8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 13 Jan 2025 22:39:00 -0700 Subject: [PATCH 079/264] go back to drawable list --- .../multiblock/ui/MultiblockUIFactory.java | 12 ++++++------ .../multi/MetaTileEntityLargeBoiler.java | 10 +++++----- .../electric/MetaTileEntityCrackingUnit.java | 4 ++-- .../MetaTileEntityElectricBlastFurnace.java | 6 +++--- .../multi/electric/MetaTileEntityHPCA.java | 18 +++++++++--------- .../electric/MetaTileEntityMultiSmelter.java | 4 ++-- .../MetaTileEntityProcessingArray.java | 6 +++--- .../electric/MetaTileEntityPyrolyseOven.java | 4 ++-- .../MetaTileEntityLargeCombustionEngine.java | 2 +- .../generator/MetaTileEntityLargeTurbine.java | 10 +++++----- 10 files changed, 38 insertions(+), 38 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index d59dfbe7e9b..3e9c9020318 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -448,7 +448,7 @@ public static class Builder { * display needs RichText, and warning/error need RichTooltip * then compare the builder (requires mixin) to see if update is needed **/ - private final List>> textList = new ArrayList<>(); + private final List textList = new ArrayList<>(); private BooleanSupplier isWorkingEnabled = () -> false; private BooleanSupplier isActive = () -> false; @@ -852,13 +852,13 @@ public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDura /** Insert an empty line into the text list. */ public Builder addEmptyLine() { - this.textList.add(IRichTextBuilder::newLine); + this.textList.add(IKey.LINE_FEED); return this; } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - textList.add(customConsumer); + public Builder addCustom(Consumer> customConsumer) { + customConsumer.accept(this.textList); return this; } @@ -871,11 +871,11 @@ protected void clear() { } protected void build(IRichTextBuilder richText) { - this.textList.forEach(t -> t.accept(richText)); + richText.addDrawableLines(this.textList); } private void addKey(IDrawable key) { - textList.add(richText -> richText.addLine(key)); + this.textList.add(key); } private void addKey(IKey key, IDrawable hover) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index ebbbe3b5f99..f7c236c90cb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -39,8 +39,8 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.drawable.Rectangle; @@ -217,27 +217,27 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(IRichTextBuilder keyList) { + private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, recipeLogic::getLastTickSteam, " L/t"); - keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.number( () -> getNumberColor(recipeLogic.getHeatScaled()), recipeLogic::getHeatScaled, "%"); - keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( () -> getNumberColor(getThrottle()), this::getThrottle, "%"); - keyList.addLine(KeyUtil.lang(TextFormatting.GRAY, + keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 14cbb45e76e..457a4476daa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -124,7 +124,7 @@ protected MultiblockUIFactory createUIFactory() { .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(this::getEnergyContainer) .addEnergyTierLine(tier.getIntValue()) - .addCustom(richText -> { + .addCustom(textList -> { if (!isStructureFormed()) return; // Coil energy discount line @@ -139,7 +139,7 @@ protected MultiblockUIFactory createUIFactory() { TextFormatting.GRAY, "gregtech.multiblock.cracking_unit.energy_hover"); - richText.addLine(KeyUtil.setHover(base, hover)); + textList.add(KeyUtil.setHover(base, hover)); }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index e5693ed236d..b5e198bc0bd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -47,7 +47,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; @@ -118,13 +118,13 @@ protected MultiblockUIFactory createUIFactory() { .addProgressLine(progress::getDoubleValue)); } - private Consumer> addHeatCapacity(IntSyncValue temp) { + private Consumer> addHeatCapacity(IntSyncValue temp) { return richText -> { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, temp::getIntValue, "K"); - richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } }; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 6631ab70037..53bef43197d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -55,8 +55,8 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -479,7 +479,7 @@ protected MultiblockUIFactory createUIFactory() { // Energy Usage String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; - richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.energy", TextFormattingUtil.formatNumbers(curCWUt.getIntValue()), TextFormattingUtil.formatNumbers(maxCWUt.getIntValue()), @@ -489,7 +489,7 @@ protected MultiblockUIFactory createUIFactory() { IKey cwutInfo = KeyUtil.string(TextFormatting.AQUA, curCWUt.getIntValue() + " / " + maxCWUt.getIntValue() + " CWU/t"); - richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.computation", cwutInfo)); }) @@ -521,7 +521,7 @@ protected MultiblockUIFactory createUIFactory() { if (!isStructureFormed()) return; if (temp.getDoubleValue() > 1000) { - richText.addLine(KeyUtil.lang(TextFormatting.RED, + richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_temperature")); } // hpcaHandler.addErrors(textList); @@ -999,7 +999,7 @@ public void addErrors(List textList) { } } - public void addWarnings2(IRichTextBuilder richText) { + public void addWarnings2(List richText) { List warnings = new ArrayList<>(); if (numBridges > 1) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, @@ -1014,16 +1014,16 @@ public void addWarnings2(IRichTextBuilder richText) { "gregtech.multiblock.hpca.warning_low_cooling")); } if (!warnings.isEmpty()) { - richText.addLine(KeyUtil.lang(TextFormatting.YELLOW, + richText.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.warning_structure_header")); - warnings.forEach(richText::addLine); + richText.addAll(warnings); } } - public void addErrors2(IRichTextBuilder richText) { + public void addErrors2(List richText) { for (IHPCAComponentHatch component : components) { if (component.isDamaged()) { - richText.addLine(KeyUtil.lang(TextFormatting.RED, + richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_damaged")); return; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 053758cb4c1..d2b4987ebc2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -138,7 +138,7 @@ protected MultiblockUIFactory createUIFactory() { IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.multi_furnace.heating_coil_discount_hover"); - richText.addLine(KeyUtil.setHover(base, hoverText)); + richText.add(KeyUtil.setHover(base, hoverText)); } if (parallel.getIntValue() > 0) { @@ -152,7 +152,7 @@ protected MultiblockUIFactory createUIFactory() { IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.multi_furnace.parallel_hover"); - richText.addLine(KeyUtil.setHover(bodyText, hoverText)); + richText.add(KeyUtil.setHover(bodyText, hoverText)); } }) .addWorkingStatusLine() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index a041084dabc..5f06cfe4834 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -210,7 +210,7 @@ protected MultiblockUIFactory createUIFactory() { "gregtech.machine.machine_hatch.machines", noneText); IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_none_hover"); - richText.addLine(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); + richText.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); } else { // Some amount of machines in hatch String key = logic.getMachineStack().getTranslationKey(); @@ -230,12 +230,12 @@ protected MultiblockUIFactory createUIFactory() { TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_max_eut", energyFormatted, amps, voltageName); - richText.addLine(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); + richText.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); } // Hatch locked status if (isActive()) { - richText.addLine(KeyUtil.lang(TextFormatting.DARK_RED, + richText.add(KeyUtil.lang(TextFormatting.DARK_RED, "gregtech.machine.machine_hatch.locked")); } }) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 9024b1861cd..63b37e2efcb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -157,7 +157,7 @@ protected MultiblockUIFactory createUIFactory() { .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) .addEnergyUsageLine(this::getEnergyContainer) .addEnergyTierLine(tier.getIntValue()) - .addCustom(richText -> { + .addCustom(textList -> { if (!isStructureFormed()) return; int processingSpeed = coil.getIntValue() == 0 ? 75 : 50 * (coil.getIntValue() + 1); IKey speed = KeyUtil.number(() -> getSpeedColor(processingSpeed), () -> processingSpeed, @@ -166,7 +166,7 @@ protected MultiblockUIFactory createUIFactory() { speed); IKey hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.pyrolyse_oven.speed_hover"); - richText.addLine(body.asTextIcon().asHoverable().addTooltipLine(hover)); + textList.add(body.asTextIcon().asHoverable().addTooltipLine(hover)); }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 8322cf1a5e0..7979dbafe59 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -147,7 +147,7 @@ protected MultiblockUIFactory createUIFactory() { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - richText.addLine(KeyUtil.lang(TextFormatting.AQUA, key)); + richText.add(KeyUtil.lang(TextFormatting.AQUA, key)); } }) .addWorkingStatusLine(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index cb0568b302a..9d91434a557 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -215,7 +215,7 @@ protected MultiblockUIFactory createUIFactory() { if (efficiency.getIntValue() > 0) { IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, total.getIntValue(), "%"); - richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.efficiency", efficiencyInfo)); } @@ -228,7 +228,7 @@ protected MultiblockUIFactory createUIFactory() { if (!isStructureFormed()) return; if (efficiency.getIntValue() > 0 && durability.getIntValue() <= MIN_DURABILITY_TO_WARN) { - richText.addLine(KeyUtil.lang(TextFormatting.YELLOW, + richText.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.turbine.rotor_durability_low")); } }) @@ -239,15 +239,15 @@ protected MultiblockUIFactory createUIFactory() { if (!isStructureFormed()) return; if (!rotorFree.getBoolValue()) { - richText.addLine(KeyUtil.lang(TextFormatting.RED, + richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.turbine.obstructed")); - richText.addLine(KeyUtil.lang(TextFormatting.GRAY, + richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.obstructed.desc")); } // todo fix "no rotor" tooltip always being shown on first ui open if (efficiency.getIntValue() <= 0) { - richText.addLine(KeyUtil.lang(TextFormatting.RED, + richText.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.turbine.no_rotor")); } })); From ab3ed1593f46f6289a3d63d14a9ba3390598bdca Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 14 Jan 2025 16:28:52 -0700 Subject: [PATCH 080/264] update note --- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 3e9c9020318..f5e504b3465 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -444,9 +444,9 @@ public static class Builder { /* * NOTE: - * instead of this, hold an IRichTextBuilder and set with a method - * display needs RichText, and warning/error need RichTooltip - * then compare the builder (requires mixin) to see if update is needed + * nvm + * need to figure out how best to serialize this shit + * copying from GregTechDisplayScreen is easy, but extremely tedious to implement **/ private final List textList = new ArrayList<>(); From 144fefe5809ebce997294c1a9d1e79eb05ad33dd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 01:58:27 -0700 Subject: [PATCH 081/264] merge text related mixins under one class --- .../gregtech/mixins/mui2/KeyCompMixin.java | 20 --- .../java/gregtech/mixins/mui2/TextMixins.java | 136 ++++++++++++++++++ 2 files changed, 136 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/gregtech/mixins/mui2/KeyCompMixin.java create mode 100644 src/main/java/gregtech/mixins/mui2/TextMixins.java diff --git a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java b/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java deleted file mode 100644 index 863d58ef120..00000000000 --- a/src/main/java/gregtech/mixins/mui2/KeyCompMixin.java +++ /dev/null @@ -1,20 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.BaseKey; -import com.cleanroommc.modularui.drawable.text.CompoundKey; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -// todo check if can remove once rc3 is released -@Mixin(value = CompoundKey.class, remap = false) -public abstract class KeyCompMixin extends BaseKey { - - @Redirect(method = "get", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) - public String formatTheKeys(IKey key) { - return key.getFormatted(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TextMixins.java b/src/main/java/gregtech/mixins/mui2/TextMixins.java new file mode 100644 index 00000000000..81d2a5e809d --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/TextMixins.java @@ -0,0 +1,136 @@ +package gregtech.mixins.mui2; + +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.BaseKey; +import com.cleanroommc.modularui.drawable.text.CompoundKey; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.RichTextWidget; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.function.Consumer; + +public abstract class TextMixins { + + @Mixin(value = BaseKey.class, remap = false) + public static abstract class BaseKeyMixin { + + @WrapOperation(method = "format(Lnet/minecraft/util/text/TextFormatting;)Lcom/cleanroommc/modularui/drawable/text/BaseKey;", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/FontRenderHelper;addAfter([Lnet/minecraft/util/text/TextFormatting;Lnet/minecraft/util/text/TextFormatting;)V")) + public void nullSafe(TextFormatting[] state, TextFormatting formatting, Operation original) { + if (formatting != null) original.call(state, formatting); + } + } + + // todo check if can remove once rc3 is released + @Mixin(value = CompoundKey.class, remap = false) + public abstract static class KeyCompMixin extends BaseKey { + + @Redirect(method = "get", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) + public String formatTheKeys(IKey key) { + return key.getFormatted(); + } + } + + // todo remove once rc3 is released + @Mixin(value = RichTooltip.class, remap = false) + public abstract static class TooltipMixin { + + @Shadow + private boolean dirty; + + @Shadow + @Final + private RichText text; + + @Shadow + private Consumer tooltipBuilder; + + @Shadow + public abstract RichTooltip getThis(); + + @Shadow + public abstract void markDirty(); + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public void buildTooltip() { + this.dirty = false; + if (this.tooltipBuilder != null) { + this.text.clearText(); + this.tooltipBuilder.accept(getThis()); + } + } + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { + Consumer existingBuilder = this.tooltipBuilder; + if (existingBuilder != null) { + this.tooltipBuilder = tooltip -> { + existingBuilder.accept(getThis()); + tooltipBuilder.accept(getThis()); + }; + } else { + this.tooltipBuilder = tooltipBuilder; + } + markDirty(); + return getThis(); + } + } + + @Mixin(value = RichTextWidget.class, remap = false) + private abstract static class RichTextWidgetMixin extends Widget { + + @Shadow + private boolean autoUpdate; + + @Shadow + private boolean dirty; + + @Shadow + @Final + private RichText text; + + @Shadow + private Consumer builder; + + /** + * @author GTCEu - Ghzdude + * @reason Implement MUI2 PR#83 + */ + @Overwrite + public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { + super.draw(context, widgetTheme); + if (this.autoUpdate || this.dirty) { + if (this.builder != null) { + this.text.clearText(); + this.builder.accept(this.text); + } + this.dirty = false; + } + this.text.drawAtZero(context, getArea(), widgetTheme); + } + } +} From ac83cd2aeaded1a0f44c943cb9f812258085d1f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 02:51:20 -0700 Subject: [PATCH 082/264] create better impl for keys with tooltips --- .../api/mui/drawables/HoverableKey.java | 123 ++++++++++++++++++ src/main/java/gregtech/api/util/KeyUtil.java | 4 +- 2 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 src/main/java/gregtech/api/mui/drawables/HoverableKey.java diff --git a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java new file mode 100644 index 00000000000..af03bc992fd --- /dev/null +++ b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java @@ -0,0 +1,123 @@ +package gregtech.api.mui.drawables; + +import net.minecraft.client.gui.FontRenderer; + +import com.cleanroommc.modularui.api.MCHelper; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IHoverable; +import com.cleanroommc.modularui.api.drawable.IIcon; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.ITooltip; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.widget.sizer.Area; +import com.cleanroommc.modularui.widget.sizer.Box; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +public class HoverableKey implements IIcon, IHoverable, ITooltip { + + private final Box margin = new Box(); + private final Area area = new Area(); + private final List tooltipLines = new ArrayList<>(); + private RichTooltip tooltip; + private IKey key; + + private HoverableKey() { + tooltip(t -> t.setAutoUpdate(true)); + tooltipBuilder(t -> t.addDrawableLines(getTooltipLines())); + } + + public static HoverableKey of(IKey key) { + return new HoverableKey().setKey(key); + } + + public static HoverableKey of(IKey key, IDrawable... lines) { + return of(key).addLines(Arrays.asList(lines)); + } + + public FontRenderer getFontRenderer() { + return MCHelper.getFontRenderer(); + } + + @Override + public int getWidth() { + return getFontRenderer().getStringWidth(key.get()) + this.margin.horizontal(); + } + + @Override + public int getHeight() { + return getFontRenderer().FONT_HEIGHT + this.margin.vertical(); + } + + @Override + public Box getMargin() { + return margin; + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + int w = getWidth(), h = getHeight(); + x += (int) (width / 2f - w / 2f); + y += (int) (height / 2f - h / 2f); + this.key.draw(context, x, y, width, height, widgetTheme); + } + + public IKey getKey() { + return key; + } + + public HoverableKey setKey(IKey key) { + this.key = key; + return getThis(); + } + + public List getTooltipLines() { + return tooltipLines; + } + + public HoverableKey addLines(Collection drawables) { + this.getTooltipLines().addAll(drawables); + return getThis(); + } + + @Override + @Nullable + public RichTooltip getTooltip() { + return tooltip; + } + + @Override + public void setRenderedAt(int x, int y) { + getRenderedArea().setPos(x, y); + } + + @Override + public Area getRenderedArea() { + this.area.setSize(getWidth(), getHeight()); + return this.area; + } + + @Override + public @NotNull RichTooltip tooltip() { + if (this.tooltip == null) this.tooltip = new RichTooltip(area -> area.set(getRenderedArea())); + return tooltip; + } + + @Override + public HoverableKey tooltip(RichTooltip tooltip) { + this.tooltip = tooltip; + return this; + } + + @Override + public String toString() { + return "HoverableKey(" + key.getFormatted() + ")"; + } +} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 72a24e46ea3..0ba0f65d2de 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,5 +1,7 @@ package gregtech.api.util; +import gregtech.api.mui.drawables.HoverableKey; + import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IDrawable; @@ -89,7 +91,7 @@ public static IKey number(Supplier formatting, LongSupplier supp public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; - return body.asTextIcon().asHoverable().addTooltipDrawableLines(Arrays.asList(hover)); + return HoverableKey.of(body, hover); } private static IKey wrap(TextFormatting formatting) { From 90c52571d8edc6d67c734eb3ed37ee19594b80a8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 02:57:25 -0700 Subject: [PATCH 083/264] implement key serialization improve builder to sync and detect changes server-side --- .../multiblock/ui/MultiblockUIFactory.java | 118 ++++++++++++++---- .../api/mui/serialize/DrawableSerializer.java | 52 ++++++++ .../api/mui/serialize/FormatSerializer.java | 23 ++++ .../api/mui/serialize/JsonHandler.java | 62 +++++++++ .../api/mui/serialize/KeySerializer.java | 59 +++++++++ .../java/gregtech/api/util/JsonUtils.java | 34 +++++ 6 files changed, 323 insertions(+), 25 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java create mode 100644 src/main/java/gregtech/api/mui/serialize/FormatSerializer.java create mode 100644 src/main/java/gregtech/api/mui/serialize/JsonHandler.java create mode 100644 src/main/java/gregtech/api/mui/serialize/KeySerializer.java create mode 100644 src/main/java/gregtech/api/util/JsonUtils.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index f5e504b3465..1cfe2e37907 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -11,6 +11,7 @@ import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLog; import gregtech.api.util.GTUtility; +import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; @@ -24,18 +25,18 @@ import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.value.sync.ValueSyncHandler; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; -import com.cleanroommc.modularui.widget.sizer.Area; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.RichTextWidget; @@ -136,8 +137,9 @@ public void readInitialSync(PacketBuffer buffer) { .child(createButtons(panel, panelSyncManager))); } - private Widget createIndicator() { + private Widget createIndicator(PanelSyncManager syncManager) { var builder = builder(); + builder.sync("indicator", syncManager); return new Widget<>() .size(18) .pos(174 - 5, screenHeight - 18 - 3) @@ -147,19 +149,16 @@ private Widget createIndicator() { } private IDrawable getIndicatorOverlay(Builder builder) { - builder.clear(); - RichTooltip test = new RichTooltip(new Area()); - - this.errorText.accept(builder); - builder.build(test); - if (!test.isEmpty()) { + builder.setAction(this.errorText); + builder.build(); + if (!builder.isEmpty()) { // error return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; } - this.warningText.accept(builder); - builder.build(test); - if (!test.isEmpty()) { + builder.setAction(this.warningText); + builder.build(); + if (!builder.isEmpty()) { // warn return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } @@ -309,19 +308,25 @@ public MultiblockUIFactory customScreen(Supplier> customScreen) } protected Widget createScreen(PanelSyncManager syncManager) { - final var builder = builder(); - this.displayText.accept(builder); - - return new ParentWidget<>() - .child(customScreen != null ? customScreen.get() : new ScrollWidget<>(new VerticalScrollData()) - .sizeRel(1f) - .child(new RichTextWidget() - .sizeRel(1f) - .alignment(Alignment.TopLeft) - .margin(4, 4) - .autoUpdate(true) - .textBuilder(builder::build))) - .child(createIndicator()) + ParentWidget root = new ParentWidget<>(); + if (customScreen != null && customScreen.get() != null) { + root.child(customScreen.get()); + } else { + Builder display = builder(); + display.setAction(this.displayText); + display.sync("display", syncManager); + + root.child(new ScrollWidget<>(new VerticalScrollData()) + .sizeRel(1f) + .child(new RichTextWidget() + .sizeRel(1f) + .alignment(Alignment.TopLeft) + .margin(4, 4) + .autoUpdate(true) + .textBuilder(display::build))); + } + + return root.child(createIndicator(syncManager)) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) .pos(4, 4); @@ -449,6 +454,8 @@ public static class Builder { * copying from GregTechDisplayScreen is easy, but extremely tedious to implement **/ private final List textList = new ArrayList<>(); + private Consumer action; + private final SyncHandler syncHandler = makeSyncHandler(); private BooleanSupplier isWorkingEnabled = () -> false; private BooleanSupplier isActive = () -> false; @@ -870,10 +877,71 @@ protected void clear() { textList.clear(); } + protected boolean hasChanged() { + if (this.action == null) return false; + List old = new ArrayList<>(); + for (var drawable : this.textList) old.add(JsonUtils.toJsonString(drawable)); + build(); + if (textList.size() != old.size()) return true; + for (int i = 0; i < textList.size(); i++) { + if (!JsonUtils.toJsonString(textList.get(i)).equals(old.get(i))) + return true; + } + return false; + } + + protected void sync(String key, PanelSyncManager syncManager) { + syncManager.syncValue(key, this.syncHandler); + } + + private SyncHandler makeSyncHandler() { + return new SyncHandler() { + + @Override + public void detectAndSendChanges(boolean init) { + if (init || hasChanged()) { + sync(0, this::syncText); + } + } + + private void syncText(PacketBuffer buffer) { + buffer.writeVarInt(textList.size()); + for (IDrawable drawable : textList) { + var jsonString = JsonUtils.toJsonString(drawable); + NetworkUtils.writeStringSafe(buffer, jsonString); + } + } + + @Override + public void readOnClient(int id, PacketBuffer buf) { + if (id == 0) { + clear(); + for (int i = buf.readVarInt(); i > 0; i--) { + String jsonString = NetworkUtils.readStringSafe(buf); + addKey(JsonUtils.fromJsonString(jsonString)); + } + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) {} + }; + } + protected void build(IRichTextBuilder richText) { + if (dirty) build(); richText.addDrawableLines(this.textList); } + protected void build() { + this.textList.clear(); + if (this.action != null) this.action.accept(this); + } + + protected void setAction(Consumer action) { + this.action = action; + } + private void addKey(IDrawable key) { this.textList.add(key); } diff --git a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java new file mode 100644 index 00000000000..e1716052854 --- /dev/null +++ b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java @@ -0,0 +1,52 @@ +package gregtech.api.mui.serialize; + +import gregtech.api.mui.drawables.HoverableKey; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; + +import java.util.ArrayList; +import java.util.List; + +public class DrawableSerializer implements JsonHandler { + + @Override + public IDrawable deserialize(JsonElement json, JsonDeserializationContext context) + throws JsonParseException { + if (!json.isJsonObject()) return IDrawable.EMPTY; + JsonObject parsed = json.getAsJsonObject(); + if (parsed.has("key") && parsed.has("tooltip")) { + IKey key = context.deserialize(parsed.get("key"), IKey.class); + + List list = new ArrayList<>(); + for (JsonElement jsonElement : parsed.getAsJsonArray("tooltip")) { + list.add(context.deserialize(jsonElement, IDrawable.class)); + } + return HoverableKey.of(key).addLines(list); + } else { + return context.deserialize(parsed, IKey.class); + } + } + + @Override + public JsonElement serialize(IDrawable src, JsonSerializationContext context) { + if (src instanceof IKey) return context.serialize(src, IKey.class); + JsonObject object = new JsonObject(); + if (src instanceof HoverableKey hoverable) { + object.add("key", context.serialize(hoverable.getKey(), IKey.class)); + JsonArray array = new JsonArray(); + for (IDrawable tooltipLine : hoverable.getTooltipLines()) { + array.add(context.serialize(tooltipLine, IDrawable.class)); + } + object.add("tooltip", array); + return object; + } + return object; + } +} diff --git a/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java b/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java new file mode 100644 index 00000000000..1fe8f7e2476 --- /dev/null +++ b/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java @@ -0,0 +1,23 @@ +package gregtech.api.mui.serialize; + +import net.minecraft.util.text.TextFormatting; + +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; + +public class FormatSerializer implements JsonHandler { + + @Override + public TextFormatting deserialize(JsonElement json, + JsonDeserializationContext context) throws JsonParseException { + return TextFormatting.getValueByName(json.getAsString()); + } + + @Override + public JsonElement serialize(TextFormatting src, + JsonSerializationContext context) { + return context.serialize(src.getFriendlyName()); + } +} diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java new file mode 100644 index 00000000000..1af00ce72bd --- /dev/null +++ b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java @@ -0,0 +1,62 @@ +package gregtech.api.mui.serialize; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.google.gson.JsonArray; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; +import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSerializationContext; +import com.google.gson.JsonSerializer; + +import java.lang.reflect.Type; +import java.util.Arrays; +import java.util.function.IntFunction; + +public interface JsonHandler extends JsonSerializer, JsonDeserializer { + + @Override + default JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { + return serialize(src, context); + } + + @Override + default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) + throws JsonParseException { + return deserialize(json, context); + } + + JsonElement serialize(T src, JsonSerializationContext context); + + T deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException; + + default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { + JsonArray array = new JsonArray(); + Type arrayType = objects.getClass().getComponentType(); + for (R t : objects) { + array.add(context.serialize(t, arrayType)); + } + return array; + } + + default R[] deserializeArray(JsonArray jsonElements, JsonDeserializationContext context, + IntFunction function) { + if (jsonElements == null) return function.apply(0); + R[] array2 = function.apply(jsonElements.size()); + Type arrayType = array2.getClass().getComponentType(); + Arrays.setAll(array2, i -> handleArg(jsonElements.get(i), context, arrayType)); + return array2; + } + + static Object handleArg(JsonElement element, JsonDeserializationContext context, Type arrayType) { + // args can sometimes be keys + if (element.isJsonObject()) { + return context.deserialize(element.getAsJsonObject(), IDrawable.class); + } else if (element instanceof JsonPrimitive primitive && primitive.isNumber()) { + return primitive.getAsNumber(); + } else { + return context.deserialize(element, arrayType); + } + } +} diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java new file mode 100644 index 00000000000..60e1e7ed75a --- /dev/null +++ b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java @@ -0,0 +1,59 @@ +package gregtech.api.mui.serialize; + +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.CompoundKey; +import com.cleanroommc.modularui.drawable.text.DynamicKey; +import com.cleanroommc.modularui.drawable.text.LangKey; +import com.cleanroommc.modularui.drawable.text.StringKey; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonSerializationContext; +import org.apache.commons.lang3.ArrayUtils; + +public class KeySerializer implements JsonHandler { + + @Override + public IKey deserialize(JsonElement json, JsonDeserializationContext context) + throws JsonParseException { + JsonObject object = json.getAsJsonObject(); + if (object.has("string")) { + return IKey.str(object.get("string").getAsString()); + } else if (object.has("lang")) { + String lang = context.deserialize(object.get("lang"), String.class); + TextFormatting[] formatting = deserializeArray( + object.getAsJsonArray("format"), context, TextFormatting[]::new); + Object[] args = deserializeArray( + object.getAsJsonArray("args"), context, Object[]::new); + return IKey.lang(lang, args).format(formatting); + } else if (object.has("keys")) { + IKey[] keys = deserializeArray( + object.getAsJsonArray("keys"), context, IKey[]::new); + TextFormatting[] formatting = deserializeArray( + object.getAsJsonArray("format"), context, TextFormatting[]::new); + return IKey.comp(keys).format(formatting); + } + return IKey.EMPTY; + } + + @Override + public JsonElement serialize(IKey src, JsonSerializationContext context) { + JsonObject obj = new JsonObject(); + if (src instanceof StringKey || src instanceof DynamicKey) { + obj.add("string", context.serialize(src.getFormatted())); + } else if (src instanceof LangKey langKey) { + obj.add("lang", context.serialize(langKey.getKeySupplier().get())); + obj.add("format", serializeArray(langKey.getFormatting(), context)); + Object[] args = langKey.getArgsSupplier().get(); + if (!ArrayUtils.isEmpty(args)) + obj.add("args", serializeArray(args, context)); + } else if (src instanceof CompoundKey compoundKey) { + obj.add("keys", serializeArray(compoundKey.getKeys(), context)); + obj.add("format", context.serialize(compoundKey.getFormatting())); + } + return obj; + } +} diff --git a/src/main/java/gregtech/api/util/JsonUtils.java b/src/main/java/gregtech/api/util/JsonUtils.java new file mode 100644 index 00000000000..d59cb026569 --- /dev/null +++ b/src/main/java/gregtech/api/util/JsonUtils.java @@ -0,0 +1,34 @@ +package gregtech.api.util; + +import gregtech.api.mui.serialize.DrawableSerializer; +import gregtech.api.mui.serialize.FormatSerializer; +import gregtech.api.mui.serialize.KeySerializer; + +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class JsonUtils { + + private static final Gson gson = new GsonBuilder() + .setPrettyPrinting() + .registerTypeAdapter(IKey.class, new KeySerializer()) + .registerTypeAdapter(IDrawable.class, new DrawableSerializer()) + .registerTypeAdapter(TextFormatting.class, new FormatSerializer()) + .create(); + + public static String toJsonString(IDrawable drawable) { + return getGson().toJson(drawable, IDrawable.class); + } + + public static Gson getGson() { + return gson; + } + + public static IDrawable fromJsonString(String jsonString) { + return getGson().fromJson(jsonString, IDrawable.class); + } +} From 8bfe42c374097af5b2158606cc3e77fc3d80a30f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 03:38:02 -0700 Subject: [PATCH 084/264] remove note --- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 1cfe2e37907..c68af5cb9a7 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -447,12 +447,6 @@ protected static Builder builder() { @SuppressWarnings({ "UnusedReturnValue", "unused" }) public static class Builder { - /* - * NOTE: - * nvm - * need to figure out how best to serialize this shit - * copying from GregTechDisplayScreen is easy, but extremely tedious to implement - **/ private final List textList = new ArrayList<>(); private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); From fc84db6f244346f806ed99544cac266420b4a6bb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:27:33 -0700 Subject: [PATCH 085/264] remove most dynamic keys use overridable methods for screen/indicator remove initial syncing for ui --- .../multiblock/FuelMultiblockController.java | 18 +- .../MultiMapMultiblockController.java | 2 +- .../multiblock/MultiblockWithDisplayBase.java | 28 +-- .../RecipeMapMultiblockController.java | 30 ++- .../multiblock/ui/MultiblockUIFactory.java | 185 ++++++++---------- src/main/java/gregtech/api/util/KeyUtil.java | 8 + .../multi/MetaTileEntityLargeBoiler.java | 45 +++-- .../electric/MetaTileEntityCrackingUnit.java | 62 +++--- .../MetaTileEntityElectricBlastFurnace.java | 50 ++--- .../electric/MetaTileEntityFusionReactor.java | 1 - .../multi/electric/MetaTileEntityHPCA.java | 132 ++++++------- .../electric/MetaTileEntityMultiSmelter.java | 86 ++++---- .../MetaTileEntityProcessingArray.java | 123 ++++++------ .../electric/MetaTileEntityPyrolyseOven.java | 47 ++--- .../MetaTileEntityResearchStation.java | 43 ++-- .../MetaTileEntityLargeCombustionEngine.java | 84 ++++---- .../generator/MetaTileEntityLargeTurbine.java | 124 ++++++------ 17 files changed, 498 insertions(+), 570 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index dba93b5a3c3..db4413aa676 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -5,6 +5,7 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.GTUtility; @@ -57,6 +58,22 @@ protected void addDisplayText(List textList) { .addWorkingStatusLine(); } + @Override + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; + + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) + .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) + .addWorkingStatusLine(); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowDynamoTierLine(isDynamoTierTooLow()) + .addMaintenanceProblemLines(getMaintenanceProblems()); + } + protected long getMaxVoltage() { IEnergyContainer energyContainer = recipeMapWorkable.getEnergyContainer(); if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { @@ -185,7 +202,6 @@ protected void addFuelText(List textList) { */ protected void createFuelTooltip(@NotNull RichTooltip tooltip, @NotNull FixedIntArraySyncValue amounts, @NotNull StringSyncValue fuelNameValue) { - tooltip.setAutoUpdate(true); if (isStructureFormed()) { Fluid fluid = fuelNameValue.getStringValue() == null ? null : FluidRegistry.getFluid(fuelNameValue.getStringValue()); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index fe116630290..42d5a631057 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -135,7 +135,7 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM @Override protected MultiblockUIFactory createUIFactory() { IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); - return new MultiblockUIFactory(this) + return super.createUIFactory() .createFlexButton((panel, syncManager) -> { if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) return null; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index ed86374343f..d91ae9b51a1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -49,7 +49,6 @@ public abstract class MultiblockWithDisplayBase extends MultiblockControllerBase private static final String NBT_VOIDING_MODE = "VoidingMode"; private static final String NBT_VOIDING_ITEMS = "VoidingItems"; private static final String NBT_VOIDING_FLUIDS = "VoidingFluids"; - private static final int UI_SYNC = GregtechDataCodes.assignId(); private MultiblockUIFactory uiFactory; private boolean voidingItems = false; @@ -206,8 +205,6 @@ protected void formStructure(PatternMatchContext context) { } this.variantActiveBlocks = context.getOrDefault("VABlock", new LinkedList<>()); replaceVariantBlocksActive(false); - if (uiFactory != null) - writeCustomData(UI_SYNC, uiFactory::writeInitialSync);; } @Override @@ -355,6 +352,7 @@ protected TraceabilityPredicate maintenancePredicate() { * each element of list is displayed on new line * to use translation, use TextComponentTranslation */ + @Deprecated protected void addDisplayText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed()); } @@ -503,6 +501,7 @@ protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { * Returns a list of text indicating any current warnings in this Multiblock. * Recommended to only display warnings if the structure is already formed. */ + @Deprecated protected void addWarningText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed(), false) .addMaintenanceProblemLines(getMaintenanceProblems()); @@ -512,6 +511,7 @@ protected void addWarningText(List textList) { * Returns a list of translation keys indicating any current errors in this Multiblock. * Prioritized over any warnings provided by {@link MultiblockWithDisplayBase#addWarningText}. */ + @Deprecated protected void addErrorText(List textList) { MultiblockDisplayText.builder(textList, isStructureFormed()) .addMufflerObstructedLine(hasMufflerMechanics() && !isMufflerFaceFree()); @@ -552,14 +552,22 @@ public boolean usesMui2() { return true; } + protected void configureDisplayText(MultiblockUIFactory.Builder builder) {} + + protected void configureErrorText(MultiblockUIFactory.Builder builder) {} + + protected void configureWarningText(MultiblockUIFactory.Builder builder) {} + protected MultiblockUIFactory createUIFactory() { - return new MultiblockUIFactory(this); + return new MultiblockUIFactory(this) + .configureDisplayText(this::configureDisplayText) + .configureWarningText(this::configureWarningText) + .configureErrorText(this::configureErrorText); } @Override public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - if (uiFactory == null) return null; - writeCustomData(UI_SYNC, uiFactory::writeInitialSync); // is this too early to sync? + if (uiFactory == null) uiFactory = createUIFactory(); return this.uiFactory.buildUI(guiData, panelSyncManager); } @@ -607,8 +615,6 @@ public void writeInitialSyncData(PacketBuffer buf) { buf.writeBoolean(voidingFluids); buf.writeBoolean(voidingItems); buf.writeInt(voidingMode.ordinal()); - if (uiFactory == null) uiFactory = createUIFactory(); - this.uiFactory.writeInitialSync(buf); } @Override @@ -619,8 +625,6 @@ public void receiveInitialSyncData(PacketBuffer buf) { voidingFluids = buf.readBoolean(); voidingItems = buf.readBoolean(); voidingMode = VoidingMode.values()[buf.readInt()]; - if (uiFactory == null) uiFactory = createUIFactory(); - this.uiFactory.readInitialSync(buf); } @Override @@ -661,10 +665,6 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { if (dataId == IS_WORKING) { lastActive = buf.readBoolean(); } - if (dataId == UI_SYNC) { - uiFactory.readInitialSync(buf); - uiFactory.markDirty(); - } } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index d65d583ffc3..f34f7f00473 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -34,8 +34,6 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -191,22 +189,18 @@ protected void addWarningText(List textList) { .addMaintenanceProblemLines(getMaintenanceProblems()); } - @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)) - .configureWarningText(builder -> builder - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c68af5cb9a7..38892cd4e7a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -32,7 +32,6 @@ import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; -import com.cleanroommc.modularui.value.sync.ValueSyncHandler; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; @@ -45,74 +44,30 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.function.BiFunction; -import java.util.function.BooleanSupplier; import java.util.function.Consumer; -import java.util.function.DoubleSupplier; -import java.util.function.IntSupplier; import java.util.function.Supplier; public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; - protected Consumer valueSyncer; protected Consumer displayText, warningText, errorText; - protected BiFunction> flexButton = (panel, syncManager) -> null; - private Consumer writer, reader; + protected BiFunction flexButton = (panel, syncManager) -> null; private int width = 198, height = 202; private int screenHeight = 109; - private Supplier> customScreen; - private boolean dirty; + private Supplier customScreen; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; - var mufflerObstructed = new BooleanSyncValue( - () -> mte.hasMufflerMechanics() && !mte.isMufflerFaceFree(), null); - - this.valueSyncer = syncManager -> syncManager.syncValue("muffler", mufflerObstructed); - this.errorText = builder -> builder.addMufflerObstructedLine(mufflerObstructed.getBoolValue()); - this.warningText = builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); - this.displayText = builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed()); - this.writer = mufflerObstructed::write; - this.reader = mufflerObstructed::read; + configureErrorText(builder -> builder.addMufflerObstructedLine(!mte.isMufflerFaceFree())); + configureWarningText(builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems())); + configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } - /** - * Use this to sync a value to the PanelSyncManager
- * Also initially syncs the value before ui is constructed - */ - public MultiblockUIFactory syncValue(String name, ValueSyncHandler syncHandler) { - this.valueSyncer = this.valueSyncer.andThen(syncManager -> syncManager.syncValue(name, syncHandler)); - return syncValue(syncHandler); - } - - /** - * Initially syncs the value before ui is constructed
- * Use this if the value will be passed into a widget. - */ - public MultiblockUIFactory syncValue(ValueSyncHandler syncHandler) { - this.writer = this.writer.andThen(buffer -> { - try { - syncHandler.write(buffer); - } catch (IOException ignored) {} - }); - this.reader = this.reader.andThen(buffer -> { - try { - syncHandler.read(buffer); - } catch (IOException ignored) {} - }); - return this; - } - - public void writeInitialSync(PacketBuffer buffer) { - this.writer.accept(buffer); - } - - public void readInitialSync(PacketBuffer buffer) { - this.reader.accept(buffer); + private static @NotNull Consumer addAction(@Nullable Consumer first, @NotNull Consumer andThen) { + return first == null ? andThen : first.andThen(andThen); } /** @@ -120,7 +75,7 @@ public void readInitialSync(PacketBuffer buffer) { * It is not recommended to override this method */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - this.valueSyncer.accept(panelSyncManager); + // this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); // TODO createExtras() hook for overrides? @@ -138,14 +93,37 @@ public void readInitialSync(PacketBuffer buffer) { } private Widget createIndicator(PanelSyncManager syncManager) { - var builder = builder(); - builder.sync("indicator", syncManager); + Builder error = builder(); + error.sync("error", syncManager); + error.setAction(this.errorText); + + Builder warning = builder(); + warning.sync("warning", syncManager); + warning.setAction(this.warningText); + + IDrawable indicator = new DynamicDrawable(() -> { + if (!error.isEmpty()) { + return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; + } else if (!warning.isEmpty()) { + return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; + } else { + // todo getLogo()? + return GTGuiTextures.GREGTECH_LOGO; + } + }); + return new Widget<>() .size(18) .pos(174 - 5, screenHeight - 18 - 3) - .overlay(new DynamicDrawable(() -> getIndicatorOverlay(builder))) + .overlay(indicator) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) - .tooltipBuilder(builder::build); + .tooltipBuilder(t -> { + if (!error.isEmpty()) { + error.build(t); + } else if (!warning.isEmpty()) { + warning.build(t); + } + }); } private IDrawable getIndicatorOverlay(Builder builder) { @@ -173,7 +151,7 @@ private IDrawable getIndicatorOverlay(Builder builder) { * This is called every tick on the client-side */ public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { - this.warningText = merge ? this.warningText.andThen(warningText) : warningText; + this.warningText = merge ? addAction(this.warningText, warningText) : warningText; return this; } @@ -192,7 +170,7 @@ public MultiblockUIFactory configureWarningText(Consumer warningText) { * This is called every tick on the client-side */ public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { - this.errorText = merge ? this.errorText.andThen(errorText) : errorText; + this.errorText = merge ? addAction(this.errorText, errorText) : errorText; return this; } @@ -212,7 +190,7 @@ public MultiblockUIFactory configureErrorText(Consumer errorText) { * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { - this.displayText = merge ? this.displayText.andThen(displayText) : displayText; + this.displayText = merge ? addAction(this.displayText, displayText) : displayText; return this; } @@ -232,7 +210,7 @@ public MultiblockUIFactory configureDisplayText(Consumer displayText) { *
* Size will be 18x18. */ - public MultiblockUIFactory createFlexButton(BiFunction> flexButton) { + public MultiblockUIFactory createFlexButton(BiFunction flexButton) { this.flexButton = flexButton; return this; } @@ -302,7 +280,7 @@ protected Flow createBars(@NotNull ModularPanel mainPanel, return column; } - public MultiblockUIFactory customScreen(Supplier> customScreen) { + public MultiblockUIFactory customScreen(Supplier customScreen) { this.customScreen = customScreen; return this; } @@ -334,7 +312,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { @NotNull protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - var flexButton = this.flexButton.apply(mainPanel, panelSyncManager); + IWidget flexButton = this.flexButton.apply(mainPanel, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() .size(18) @@ -419,10 +397,6 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull .marginTop(5); } - public void markDirty() { - dirty = true; - } - public static final class Screen { public static int WIDTH = 190; @@ -451,8 +425,8 @@ public static class Builder { private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); - private BooleanSupplier isWorkingEnabled = () -> false; - private BooleanSupplier isActive = () -> false; + private boolean isWorkingEnabled; + private boolean isActive; private boolean isStructureFormed; // Keys for the three-state working system, can be set custom by multiblocks. @@ -478,7 +452,7 @@ public Builder title(String lang) { } /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ - public Builder setWorkingStatus(BooleanSupplier isWorkingEnabled, BooleanSupplier isActive) { + public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { this.isWorkingEnabled = isWorkingEnabled; this.isActive = isActive; return this; @@ -506,21 +480,20 @@ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String r *
* Added if the structure is formed and if the passed energy container has greater than zero capacity. */ - public Builder addEnergyUsageLine(Supplier energyContainer) { - if (!isStructureFormed || energyContainer.get() == null) return this; - if (energyContainer.get().getEnergyCapacity() <= 0) return this; - - IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", () -> { - var e = energyContainer.get(); - long maxVoltage = Math.max(e.getInputVoltage(), e.getOutputVoltage()); - return TextFormattingUtil.formatNumbers(maxVoltage); - }, () -> { - var e = energyContainer.get(); - long maxVoltage = Math.max(e.getInputVoltage(), e.getOutputVoltage()); - return GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]; - }); + public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { + if (!isStructureFormed || energyContainer == null) return this; + if (energyContainer.getEnergyCapacity() <= 0) return this; + + long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", + TextFormattingUtil.formatNumbers(maxVoltage), + GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); + addKey(bodyText, hoverText); return this; } @@ -625,7 +598,7 @@ public Builder addComputationUsageLine(int maxCWUt) { */ public Builder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; - if (isActive.getAsBoolean() && currentCWUt > 0) { + if (isActive && currentCWUt > 0) { var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -642,15 +615,13 @@ public Builder addComputationUsageExactLine(int currentCWUt) { public Builder addWorkingStatusLine() { if (!isStructureFormed) return this; - addKey(KeyUtil.string(() -> { - if (!isWorkingEnabled.getAsBoolean()) { - return pausedKey.getFormatted(); - } else if (isActive.getAsBoolean()) { - return runningKey.getFormatted(); - } else { - return idlingKey.getFormatted(); - } - })); + if (!isWorkingEnabled) { + addKey(pausedKey); + } else if (isActive) { + addKey(runningKey); + } else { + addKey(idlingKey); + } return this; } @@ -662,7 +633,7 @@ public Builder addWorkingStatusLine() { */ public Builder addWorkPausedLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || !isWorkingEnabled.getAsBoolean()) { + if (!checkState || !isWorkingEnabled) { addKey(pausedKey); } return this; @@ -676,7 +647,7 @@ public Builder addWorkPausedLine(boolean checkState) { */ public Builder addRunningPerfectlyLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || isActive.getAsBoolean()) { + if (!checkState || isActive) { addKey(runningKey); } return this; @@ -690,7 +661,7 @@ public Builder addRunningPerfectlyLine(boolean checkState) { */ public Builder addIdlingLine(boolean checkState) { if (!isStructureFormed) return this; - if (!checkState || (isWorkingEnabled.getAsBoolean() && !isActive.getAsBoolean())) { + if (!checkState || (isWorkingEnabled && !isActive)) { addKey(idlingKey); } return this; @@ -703,10 +674,11 @@ public Builder addIdlingLine(boolean checkState) { * * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. */ - public Builder addProgressLine(DoubleSupplier progressPercent) { - if (!isStructureFormed || !isActive.getAsBoolean()) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", - () -> ((int) (progressPercent.getAsDouble() * 100)))); + public Builder addProgressLine(double progressPercent) { + if (!isStructureFormed || !isActive) return this; + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.progress", + (int) (progressPercent * 100))); return this; } @@ -749,8 +721,8 @@ public Builder addLowPowerLine(boolean isLowPower) { public Builder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; if (isLowComputation) { - addKey(IKey.comp(IKey.str(TextFormatting.YELLOW.toString()), - IKey.lang("gregtech.multiblock.computation.not_enough_computation"))); + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.computation.not_enough_computation")); } return this; } @@ -841,13 +813,13 @@ public Builder addMufflerObstructedLine(boolean isObstructed) { *
* Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ - public Builder addFuelNeededLine(String fuelName, IntSupplier previousRecipeDuration) { - if (!isStructureFormed || !isActive.getAsBoolean() || fuelName == null) return this; + public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + if (!isStructureFormed || !isActive || fuelName == null) return this; addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), - KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration::getAsInt))); + KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); return this; } @@ -894,6 +866,7 @@ private SyncHandler makeSyncHandler() { @Override public void detectAndSendChanges(boolean init) { if (init || hasChanged()) { + if (init) build(); sync(0, this::syncText); } } @@ -940,7 +913,7 @@ private void addKey(IDrawable key) { this.textList.add(key); } - private void addKey(IKey key, IDrawable hover) { + private void addKey(IKey key, IDrawable... hover) { addKey(KeyUtil.setHover(key, hover)); } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 0ba0f65d2de..f1909757aaa 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -85,6 +85,14 @@ public static IKey number(Supplier formatting, LongSupplier supp return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong())); } + public static IKey number(Supplier formatting, long number) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(number)); + } + + public static IKey number(Supplier formatting, long number, String suffix) { + return string(formatting, () -> TextFormattingUtil.formatNumbers(number) + suffix); + } + public static IKey number(Supplier formatting, LongSupplier supplier, String suffix) { return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index f7c236c90cb..9fe352e064b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -46,7 +46,6 @@ import com.cleanroommc.modularui.drawable.Rectangle; 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.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncHandler; @@ -175,25 +174,29 @@ protected void addWarningText(List textList) { } } + @Override + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addCustom(this::addCustomData) + .addWorkingStatusLine(); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + super.configureWarningText(builder); + builder.addCustom(richText -> { + if (isStructureFormed() && getWaterFilled() == 0) { + richText.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + richText.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); + } + }); + } + @Override protected MultiblockUIFactory createUIFactory() { - final var waterFilled = new BooleanSyncValue( - () -> getWaterFilled() > 0, null); - - return new MultiblockUIFactory(this) - .syncValue("water_filled", waterFilled) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) - .addCustom(this::addCustomData) - .addWorkingStatusLine()) - .configureWarningText(builder -> builder.addCustom(richText -> { - if (isStructureFormed() && !waterFilled.getBoolValue()) { - richText.add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); - } - })) + return super.createUIFactory() .createFlexButton((panel, syncManager) -> { PanelSyncHandler throttle = (PanelSyncHandler) syncManager.panel("throttle_panel", this::makeThrottlePanel, true); @@ -221,7 +224,7 @@ private void addCustomData(List keyList) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, - recipeLogic::getLastTickSteam, " L/t"); + recipeLogic.getLastTickSteam(), " L/t"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); @@ -229,14 +232,14 @@ private void addCustomData(List keyList) { // Efficiency line IKey efficiency = KeyUtil.number( () -> getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic::getHeatScaled, "%"); + recipeLogic.getHeatScaled(), "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( () -> getNumberColor(getThrottle()), - this::getThrottle, "%"); + getThrottle(), "%"); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 457a4476daa..024a4e4a4ea 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -35,8 +35,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -114,38 +112,34 @@ protected void addDisplayText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addCustom(textList -> { - if (!isStructureFormed()) return; - - // Coil energy discount line - IKey energyDiscount = KeyUtil.number(TextFormatting.AQUA, - 100 - 10L * coilTier, "%"); - - IKey base = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.cracking_unit.energy", - energyDiscount); - - IKey hover = KeyUtil.lang( - TextFormatting.GRAY, - "gregtech.multiblock.cracking_unit.energy_hover"); - - textList.add(KeyUtil.setHover(base, hover)); - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)) - .configureWarningText(builder -> builder - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(textList -> { + if (!isStructureFormed()) return; + + // Coil energy discount line + IKey energyDiscount = KeyUtil.number(TextFormatting.AQUA, + 100 - 10L * getCoilTier(), "%"); + + IKey base = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.cracking_unit.energy", + energyDiscount); + + IKey hover = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.cracking_unit.energy_hover"); + + textList.add(KeyUtil.setHover(base, hover)); + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index b5e198bc0bd..e6d1ee5ef68 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -48,15 +48,12 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.function.Consumer; import static gregtech.api.util.RelativeDirection.*; @@ -99,35 +96,24 @@ protected void addDisplayText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue temp = new IntSyncValue(this::getCurrentTemperature, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("temp", temp) - .syncValue("tier", tier) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addCustom(addHeatCapacity(temp)) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)); - } - - private Consumer> addHeatCapacity(IntSyncValue temp) { - return richText -> { - if (isStructureFormed()) { - var heatString = KeyUtil.number(TextFormatting.RED, - temp::getIntValue, "K"); - - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.blast_furnace.max_temperature", heatString)); - } - }; + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(this::addHeatCapacity) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + private void addHeatCapacity(List keyList) { + if (isStructureFormed()) { + var heatString = KeyUtil.number(TextFormatting.RED, + getCurrentTemperature(), "K"); + + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.blast_furnace.max_temperature", heatString)); + } } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index a22bf3dadcb..be51a02d314 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -446,7 +446,6 @@ protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); return new MultiblockUIFactory(this) - .syncValue(progress) .setSize(198, 236) .setScreenHeight(138) .configureDisplayText(false, builder -> {}) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 53bef43197d..88ebf65747d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -57,7 +57,6 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -457,76 +456,69 @@ protected void addErrorText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { - IntSyncValue curCWUt = new IntSyncValue(() -> hpcaHandler.cachedCWUt, null); - IntSyncValue maxCWUt = new IntSyncValue(hpcaHandler::getMaxCWUt, null); - BooleanSyncValue hasNoEnergy = new BooleanSyncValue(() -> hasNotEnoughEnergy, null); - DoubleSyncValue temp = new DoubleSyncValue(() -> temperature, null); - - return new MultiblockUIFactory(this) - .syncValue("cur_cwut", curCWUt) - .syncValue("max_cwut", maxCWUt) - .syncValue("no_energy", hasNoEnergy) - .syncValue("temp", temp) - .configureDisplayText(builder -> builder - .setWorkingStatus(() -> true, () -> hpcaHandler.getAllocatedCWUt() > 0) - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.idling", - "gregtech.multiblock.data_bank.providing") - .addCustom(richText -> { - if (!isStructureFormed()) return; - - // Energy Usage - String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.hpca.energy", - TextFormattingUtil.formatNumbers(curCWUt.getIntValue()), - TextFormattingUtil.formatNumbers(maxCWUt.getIntValue()), - voltageName)); - - // Provided Computation - IKey cwutInfo = KeyUtil.string(TextFormatting.AQUA, - curCWUt.getIntValue() + " / " + maxCWUt.getIntValue() + " CWU/t"); - - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.hpca.computation", - cwutInfo)); - }) - .addWorkingStatusLine()) - .configureWarningText(builder -> builder - .addLowPowerLine(hasNoEnergy.getBoolValue()) - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (temp.getDoubleValue() > 500) { - // Temperature warning - richText.add(KeyUtil.lang( - TextFormatting.YELLOW, - "gregtech.multiblock.hpca.warning_temperature")); - - // Active cooler overdrive warning - richText.add(KeyUtil.lang( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.warning_temperature_active_cool")); - } + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) + .setWorkingStatusKeys( + "gregtech.multiblock.idling", + "gregtech.multiblock.idling", + "gregtech.multiblock.data_bank.providing") + .addCustom(richText -> { + if (!isStructureFormed()) return; + + // Energy Usage + String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; + richText.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.energy", + TextFormattingUtil.formatNumbers(hpcaHandler.cachedCWUt), + TextFormattingUtil.formatNumbers(hpcaHandler.getMaxCWUt()), + voltageName)); + + // Provided Computation + IKey cwutInfo = KeyUtil.string(TextFormatting.AQUA, + hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t"); + + richText.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.computation", + cwutInfo)); + }) + .addWorkingStatusLine(); + } - // Structure warnings - // hpcaHandler.addWarnings(richText); - hpcaHandler.addWarnings2(richText); - }) - .addMaintenanceProblemLines(getMaintenanceProblems())) - .configureErrorText(builder -> builder - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (temp.getDoubleValue() > 1000) { - richText.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.hpca.error_temperature")); - } - // hpcaHandler.addErrors(textList); - hpcaHandler.addErrors2(richText); - })); + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(hasNotEnoughEnergy) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (temperature > 500) { + // Temperature warning + richText.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.hpca.warning_temperature")); + + // Active cooler overdrive warning + richText.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.warning_temperature_active_cool")); + } + + // Structure warnings + // hpcaHandler.addWarnings(richText); + hpcaHandler.addWarnings2(richText); + }) + .addMaintenanceProblemLines(getMaintenanceProblems()); + } + + @Override + protected void configureErrorText(MultiblockUIFactory.Builder builder) { + builder.addCustom(richText -> { + if (!isStructureFormed()) return; + + if (temperature > 1000) { + richText.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.hpca.error_temperature")); + } + // hpcaHandler.addErrors(textList); + hpcaHandler.addErrors2(richText); + }); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index d2b4987ebc2..19c7258695d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -39,8 +39,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -110,53 +108,43 @@ protected void addDisplayText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - IntSyncValue discount = new IntSyncValue(() -> heatingCoilDiscount, null); - IntSyncValue parallel = new IntSyncValue(() -> getRecipeMapWorkable().getParallelLimit(), null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .syncValue("discount", discount) - .syncValue("para", parallel) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (discount.getIntValue() > 1) { - IKey coilDiscount = KeyUtil.number(TextFormatting.AQUA, - (long) (100.0 / discount.getIntValue()), "%"); - - IKey base = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.heating_coil_discount", - coilDiscount); - - IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.heating_coil_discount_hover"); - - richText.add(KeyUtil.setHover(base, hoverText)); - } - - if (parallel.getIntValue() > 0) { - IKey parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, - parallel.getIntValue()); - - IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.parallel", - parallels); - - IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.parallel_hover"); - - richText.add(KeyUtil.setHover(bodyText, hoverText)); - } - }) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + if (heatingCoilDiscount > 1) { + IKey coilDiscount = KeyUtil.number(TextFormatting.AQUA, + (long) (100.0 / heatingCoilDiscount), "%"); + + IKey base = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.heating_coil_discount", + coilDiscount); + + IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.heating_coil_discount_hover"); + + richText.add(KeyUtil.setHover(base, hoverText)); + } + + if (recipeMapWorkable.getParallelLimit() > 0) { + IKey parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, + recipeMapWorkable.getParallelLimit()); + + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.parallel", + parallels); + + IKey hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.multi_furnace.parallel_hover"); + + richText.add(KeyUtil.setHover(bodyText, hoverText)); + } + }) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 5f06cfe4834..e4fd5a11478 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -52,8 +52,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -180,70 +178,67 @@ protected void addDisplayText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { ProcessingArrayWorkable logic = (ProcessingArrayWorkable) recipeMapWorkable; - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> logic.currentMachineStack.isEmpty() ? -1 : logic.machineTier, null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addCustom(richText -> { - if (!isStructureFormed()) return; - - // Machine mode text - // Shared text components for both states - IKey maxMachinesText = KeyUtil.string(TextFormatting.DARK_PURPLE, - Integer.toString(getMachineLimit())); - maxMachinesText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_max", maxMachinesText); - - if (logic.activeRecipeMap == null) { - // No machines in hatch - IKey noneText = KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.machine.machine_hatch.machines_none"); - IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines", noneText); - IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_none_hover"); - richText.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); - } else { - // Some amount of machines in hatch - String key = logic.getMachineStack().getTranslationKey(); - IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, - key + ".name"); - mapText = KeyUtil.lang( - TextFormatting.DARK_PURPLE, - "%sx %s", - logic.getParallelLimit(), mapText); - IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines", mapText); - String voltageName = GTValues.VNF[logic.machineTier]; - int amps = logic.getMachineStack().getCount(); - String energyFormatted = TextFormattingUtil - .formatNumbers(GTValues.V[logic.machineTier] * amps); - IKey hoverText = KeyUtil.lang( - TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_max_eut", - energyFormatted, amps, voltageName); - richText.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); - } - - // Hatch locked status - if (isActive()) { - richText.add(KeyUtil.lang(TextFormatting.DARK_RED, - "gregtech.machine.machine_hatch.locked")); - } - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)) - .configureWarningText(builder -> builder - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy())); + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(richText -> { + if (!isStructureFormed()) return; + + // Machine mode text + // Shared text components for both states + IKey maxMachinesText = KeyUtil.string(TextFormatting.DARK_PURPLE, + Integer.toString(getMachineLimit())); + maxMachinesText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_max", maxMachinesText); + + if (logic.activeRecipeMap == null) { + // No machines in hatch + IKey noneText = KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.machine.machine_hatch.machines_none"); + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines", noneText); + IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_none_hover"); + richText.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); + } else { + // Some amount of machines in hatch + String key = logic.getMachineStack().getTranslationKey(); + IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, + key + ".name"); + mapText = KeyUtil.lang( + TextFormatting.DARK_PURPLE, + "%sx %s", + logic.getParallelLimit(), mapText); + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines", mapText); + String voltageName = GTValues.VNF[logic.machineTier]; + int amps = logic.getMachineStack().getCount(); + String energyFormatted = TextFormattingUtil + .formatNumbers(GTValues.V[logic.machineTier] * amps); + IKey hoverText = KeyUtil.lang( + TextFormatting.GRAY, + "gregtech.machine.machine_hatch.machines_max_eut", + energyFormatted, amps, voltageName); + richText.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); + } + + // Hatch locked status + if (isActive()) { + richText.add(KeyUtil.lang(TextFormatting.DARK_RED, + "gregtech.machine.machine_hatch.locked")); + } + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 63b37e2efcb..cf861505bf0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -35,8 +35,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -145,32 +143,25 @@ private TextFormatting getSpeedColor(int speed) { } @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - IntSyncValue coil = new IntSyncValue(() -> coilTier, null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .syncValue("coil", coil) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .addEnergyUsageLine(this::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addCustom(textList -> { - if (!isStructureFormed()) return; - int processingSpeed = coil.getIntValue() == 0 ? 75 : 50 * (coil.getIntValue() + 1); - IKey speed = KeyUtil.number(() -> getSpeedColor(processingSpeed), () -> processingSpeed, - "%"); - IKey body = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.pyrolyse_oven.speed", - speed); - IKey hover = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.pyrolyse_oven.speed_hover"); - textList.add(body.asTextIcon().asHoverable().addTooltipLine(hover)); - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addCustom(textList -> { + if (!isStructureFormed()) return; + + int processingSpeed = coilTier == 0 ? 75 : 50 * (coilTier + 1); + IKey speed = KeyUtil.number(() -> getSpeedColor(processingSpeed), processingSpeed, "%"); + + IKey body = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.pyrolyse_oven.speed", speed); + IKey hover = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.pyrolyse_oven.speed_hover"); + textList.add(KeyUtil.setHover(body, hover)); + }) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 6e3a853c2dd..5f6ff0a5635 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -40,8 +40,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; -import com.cleanroommc.modularui.value.sync.DoubleSyncValue; -import com.cleanroommc.modularui.value.sync.IntSyncValue; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -250,28 +248,25 @@ protected void addWarningText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); - IntSyncValue tier = new IntSyncValue(() -> GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage()), null); - return new MultiblockUIFactory(this) - .syncValue("progress", progress) - .syncValue("tier", tier) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::isActive) - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.work_paused", - "gregtech.machine.research_station.researching") - .addEnergyUsageLine(recipeMapWorkable::getEnergyContainer) - .addEnergyTierLine(tier.getIntValue()) - .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(progress::getDoubleValue)) - .configureWarningText(builder -> builder - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) - .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) - .addMaintenanceProblemLines(getMaintenanceProblems())); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .setWorkingStatusKeys( + "gregtech.multiblock.idling", + "gregtech.multiblock.work_paused", + "gregtech.machine.research_station.researching") + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) + .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) + .addMaintenanceProblemLines(getMaintenanceProblems()); } private static class ResearchStationRecipeLogic extends ComputationRecipeLogic { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 7979dbafe59..0d462391aa0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -47,7 +47,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; -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.ProgressWidget; @@ -121,52 +120,50 @@ protected void addErrorText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - final BooleanSyncValue hasLubricant = new BooleanSyncValue(() -> getLubricantAmount()[0] > 0, null); - StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); - IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); - - return new MultiblockUIFactory(this) - .syncValue("lubricant", hasLubricant) - .syncValue("fuel_amount", fuelAmount) - .syncValue("prev_duration", prevDuration) - .configureDisplayText(builder -> { - builder.setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive); - - if (isExtreme) { - builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); - } else { - builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); - } - // todo fix prev duration being 0 on first ui open - builder.addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) - .addCustom(richText -> { - if (isStructureFormed() && recipeLogic.isOxygenBoosted) { - String key = isExtreme ? - "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : - "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - richText.add(KeyUtil.lang(TextFormatting.AQUA, key)); - } - }) - .addWorkingStatusLine(); - }) - .configureErrorText(builder -> builder.addCustom(keyList -> { - if (!isStructureFormed()) return; - - if (checkIntakesObstructed()) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.obstructed")); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_combustion_engine.obstructed.desc")); - } + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + + if (isExtreme) { + builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); + } else { + builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); + } - if (!hasLubricant.getBoolValue()) { - keyList.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.no_lubricant")); + // todo fix prev duration being 0 on first ui open + builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) + .addCustom(richText -> { + if (isStructureFormed() && recipeLogic.isOxygenBoosted) { + String key = isExtreme ? + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : + "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; + richText.add(KeyUtil.lang(TextFormatting.AQUA, key)); } - })); + }) + .addWorkingStatusLine(); + } + + @Override + protected void configureErrorText(MultiblockUIFactory.Builder builder) { + super.configureErrorText(builder); + var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; + + builder.addCustom(keyList -> { + if (!isStructureFormed()) return; + + if (checkIntakesObstructed()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.obstructed")); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_combustion_engine.obstructed.desc")); + } + + if (!recipeLogic.checkLubricant()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.large_combustion_engine.no_lubricant")); + } + }); } @Override @@ -310,6 +307,7 @@ yield new ProgressWidget() .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltip(t -> t.setAutoUpdate(true)) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } case 1 -> { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 9d91434a557..697fa63c22e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -34,7 +34,6 @@ import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.StringSyncValue; @@ -186,71 +185,67 @@ protected void addErrorText(List textList) { } @Override - protected MultiblockUIFactory createUIFactory() { + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - IntSyncValue efficiency = new IntSyncValue( - () -> getRotorHolder() == null ? 0 : getRotorHolder().getRotorEfficiency(), null); - IntSyncValue total = new IntSyncValue( - () -> getRotorHolder() == null ? 0 : getRotorHolder().getTotalEfficiency(), null); - IntSyncValue durability = new IntSyncValue( - () -> getRotorHolder() == null ? 0 : getRotorHolder().getRotorDurabilityPercent(), null); - BooleanSyncValue rotorFree = new BooleanSyncValue( - this::isRotorFaceFree, null); - StringSyncValue fuelAmount = new StringSyncValue(recipeLogic::getRecipeFluidInputInfo, null); - IntSyncValue prevDuration = new IntSyncValue(recipeLogic::getPreviousRecipeDuration, null); - - return new MultiblockUIFactory(this) - .syncValue("efficiency", efficiency) - .syncValue("total", total) - .syncValue("durability", durability) - .syncValue("rotor_free", rotorFree) - .syncValue("fuel_amount", fuelAmount) - .syncValue("prev_duration", prevDuration) - .configureDisplayText(builder -> builder - .setWorkingStatus(recipeLogic::isWorkingEnabled, recipeLogic::isActive) - .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (efficiency.getIntValue() > 0) { - IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, - total.getIntValue(), "%"); - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.efficiency", - efficiencyInfo)); - } - }) - // todo fix prev duration being 0 on first ui open - .addFuelNeededLine(fuelAmount.getValue(), prevDuration::getIntValue) - .addWorkingStatusLine()) - .configureWarningText(false, builder -> builder - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (efficiency.getIntValue() > 0 && durability.getIntValue() <= MIN_DURABILITY_TO_WARN) { - richText.add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.turbine.rotor_durability_low")); - } - }) - .addLowDynamoTierLine(isDynamoTierTooLow()) - .addMaintenanceProblemLines(getMaintenanceProblems())) - .configureErrorText(builder -> builder - .addCustom(richText -> { - if (!isStructureFormed()) return; - - if (!rotorFree.getBoolValue()) { - richText.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.turbine.obstructed")); - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.obstructed.desc")); - } + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) + .addCustom(keyList -> { + if (!isStructureFormed()) return; + if (getRotorHolder() == null) return; + + int rotorEfficiency = getRotorHolder().getRotorEfficiency(); + int totalEfficiency = getRotorHolder().getTotalEfficiency(); + + if (rotorEfficiency > 0) { + IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, + totalEfficiency, "%"); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.efficiency", + efficiencyInfo)); + } + }) + // todo fix prev duration being 0 on first ui open + .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) + .addWorkingStatusLine(); + } - // todo fix "no rotor" tooltip always being shown on first ui open - if (efficiency.getIntValue() <= 0) { - richText.add(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.turbine.no_rotor")); - } - })); + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addCustom(keyList -> { + if (!isStructureFormed()) return; + if (getRotorHolder() == null) return; + + int rotorEfficiency = getRotorHolder().getRotorEfficiency(); + int rotorDurability = getRotorHolder().getRotorDurabilityPercent(); + + if (rotorEfficiency > 0 && rotorDurability <= MIN_DURABILITY_TO_WARN) { + keyList.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.turbine.rotor_durability_low")); + } + }); + super.configureWarningText(builder); + } + + @Override + protected void configureErrorText(MultiblockUIFactory.Builder builder) { + builder.addCustom(keyList -> { + if (!isStructureFormed()) return; + if (getRotorHolder() == null) return; + + if (!isRotorFaceFree()) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.obstructed")); + keyList.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.obstructed.desc")); + } + int rotorEfficiency = getRotorHolder().getRotorEfficiency(); + + // todo fix "no rotor" tooltip always being shown on first ui open + if (rotorEfficiency <= 0) { + keyList.add(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.turbine.no_rotor")); + } + }); } @Override @@ -365,6 +360,7 @@ yield new ProgressWidget() .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltip(t -> t.setAutoUpdate(true)) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } case 1 -> { From bfa5084b114c2c0a0b674bed6003f6585417f66d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 15:26:47 -0700 Subject: [PATCH 086/264] fix npe when serializing null arrays de/serialize numbers correctly --- .../api/mui/serialize/JsonHandler.java | 39 +++++++++++++++---- .../multi/electric/MetaTileEntityHPCA.java | 12 ++---- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java index 1af00ce72bd..042e52c54f7 100644 --- a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java +++ b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java @@ -5,10 +5,12 @@ import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; +import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Type; import java.util.Arrays; @@ -33,26 +35,47 @@ default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { JsonArray array = new JsonArray(); + if (ArrayUtils.isEmpty(objects)) return array; Type arrayType = objects.getClass().getComponentType(); for (R t : objects) { - array.add(context.serialize(t, arrayType)); + JsonElement element = context.serialize(t, arrayType); + if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { + JsonObject typed = new JsonObject(); + typed.addProperty("typed", t.getClass().getSimpleName()); + typed.add("element", element); + array.add(typed); + } else { + array.add(element); + } } return array; } - default R[] deserializeArray(JsonArray jsonElements, JsonDeserializationContext context, + default R[] deserializeArray(JsonArray jsonArray, JsonDeserializationContext context, IntFunction function) { - if (jsonElements == null) return function.apply(0); - R[] array2 = function.apply(jsonElements.size()); - Type arrayType = array2.getClass().getComponentType(); - Arrays.setAll(array2, i -> handleArg(jsonElements.get(i), context, arrayType)); - return array2; + if (jsonArray == null || jsonArray.size() == 0) return function.apply(0); + R[] array = function.apply(jsonArray.size()); + Type arrayType = array.getClass().getComponentType(); + Arrays.setAll(array, i -> handleArg(jsonArray.get(i), context, arrayType)); + return array; } static Object handleArg(JsonElement element, JsonDeserializationContext context, Type arrayType) { // args can sometimes be keys if (element.isJsonObject()) { - return context.deserialize(element.getAsJsonObject(), IDrawable.class); + JsonObject object = element.getAsJsonObject(); + if (!object.has("typed")) + return context.deserialize(object, IDrawable.class); + + JsonElement value = object.get("element"); + return switch (object.get("typed").getAsString()) { + case "Integer" -> value.getAsInt(); + case "Long" -> value.getAsLong(); + case "Double" -> value.getAsDouble(); + case "Float" -> value.getAsFloat(); + case "Byte" -> value.getAsByte(); + default -> value.getAsNumber(); + }; } else if (element instanceof JsonPrimitive primitive && primitive.isNumber()) { return primitive.getAsNumber(); } else { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 88ebf65747d..697d98a9823 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -469,17 +469,13 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; richText.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.energy", - TextFormattingUtil.formatNumbers(hpcaHandler.cachedCWUt), - TextFormattingUtil.formatNumbers(hpcaHandler.getMaxCWUt()), + TextFormattingUtil.formatNumbers(hpcaHandler.cachedEUt), + TextFormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), voltageName)); // Provided Computation - IKey cwutInfo = KeyUtil.string(TextFormatting.AQUA, - hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t"); - - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.hpca.computation", - cwutInfo)); + richText.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", + hpcaHandler.cachedCWUt, hpcaHandler.getMaxCWUt())); }) .addWorkingStatusLine(); } From 3afcb002360d6bc8bb34f2ab058fa44fbfed62a3 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 15:35:08 -0700 Subject: [PATCH 087/264] no need to sync energy container --- .../multiblock/RecipeMapMultiblockController.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index f34f7f00473..b1b0068533e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -4,7 +4,6 @@ import gregtech.api.capability.IDistinctBusController; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultipleTankHandler; -import gregtech.api.capability.impl.EnergyContainerHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; @@ -270,26 +269,12 @@ public void readFromNBT(NBTTagCompound data) { public void writeInitialSyncData(PacketBuffer buf) { super.writeInitialSyncData(buf); buf.writeBoolean(isDistinct); - buf.writeLong(energyContainer.getEnergyCapacity()); - buf.writeLong(energyContainer.getInputVoltage()); - buf.writeLong(energyContainer.getInputAmperage()); - buf.writeLong(energyContainer.getOutputVoltage()); - buf.writeLong(energyContainer.getOutputAmperage()); } @Override public void receiveInitialSyncData(PacketBuffer buf) { super.receiveInitialSyncData(buf); isDistinct = buf.readBoolean(); - - long capacity = buf.readLong(); - long inVoltage = buf.readLong(); - long inAmps = buf.readLong(); - long outVoltage = buf.readLong(); - long outAmps = buf.readLong(); - - this.energyContainer = new EnergyContainerHandler(this, capacity, - inVoltage, inAmps, outVoltage, outAmps); } @Override From 6baba7f245fb71da5594ef73cb826d5115d94bf8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 16:55:19 -0700 Subject: [PATCH 088/264] add helper method for array access --- .../multiblock/FuelMultiblockController.java | 4 ++-- .../api/mui/sync/FixedIntArraySyncValue.java | 4 ++++ .../MetaTileEntityLargeCombustionEngine.java | 22 +++++++++---------- .../generator/MetaTileEntityLargeTurbine.java | 4 ++-- 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index db4413aa676..38646d15ea9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -209,8 +209,8 @@ protected void createFuelTooltip(@NotNull RichTooltip tooltip, @NotNull FixedInt tooltip.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.fuel_none")); } else { tooltip.addLine( - IKey.lang("gregtech.multiblock.large_combustion_engine.fuel_amount", amounts.getValue()[0], - amounts.getValue()[1], fluid.getLocalizedName(new FluidStack(fluid, 1)))); + IKey.lang("gregtech.multiblock.large_combustion_engine.fuel_amount", amounts.getValue(0), + amounts.getValue(1), fluid.getLocalizedName(new FluidStack(fluid, 1)))); } } else { tooltip.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); diff --git a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java index 461864ac8a7..c3f29ee80b5 100644 --- a/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java +++ b/src/main/java/gregtech/api/mui/sync/FixedIntArraySyncValue.java @@ -88,4 +88,8 @@ public void read(@NotNull PacketBuffer buffer) throws IOException { public int[] getValue() { return this.cache; } + + public int getValue(int index) { + return this.cache[index]; + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 0d462391aa0..668ab77aa91 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -304,8 +304,8 @@ public int getProgressBarCount() { panelSyncManager.syncValue("fuel_name", fuelNameValue); yield new ProgressWidget() - .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : - 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) + .progress(() -> fuelValue.getValue(1) == 0 ? 0 : + 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) .tooltip(t -> t.setAutoUpdate(true)) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); @@ -315,17 +315,17 @@ yield new ProgressWidget() panelSyncManager.syncValue("lubricant_amount", lubricantValue); yield new ProgressWidget() - .progress(() -> lubricantValue.getValue()[1] == 0 ? 0 : - 1.0 * lubricantValue.getValue()[0] / lubricantValue.getValue()[1]) + .progress(() -> lubricantValue.getValue(1) == 0 ? 0 : + 1.0 * lubricantValue.getValue(0) / lubricantValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT, MultiblockUIFactory.Bars.THIRD_WIDTH) .tooltip(tooltip -> tooltip.setAutoUpdate(true)) .tooltipBuilder(t -> { if (isStructureFormed()) { - if (lubricantValue.getValue()[0] == 0) { + if (lubricantValue.getValue(0) == 0) { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); } else { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.lubricant_amount", - lubricantValue.getValue()[0], lubricantValue.getValue()[1])); + lubricantValue.getValue(0), lubricantValue.getValue(0))); } } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); @@ -339,22 +339,22 @@ yield new ProgressWidget() panelSyncManager.syncValue("boost_allowed", boostValue); yield new ProgressWidget() - .progress(() -> oxygenValue.getValue()[1] == 0 ? 0 : - 1.0 * oxygenValue.getValue()[0] / oxygenValue.getValue()[1]) + .progress(() -> oxygenValue.getValue(1) == 0 ? 0 : + 1.0 * oxygenValue.getValue(0) / oxygenValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_OXYGEN, MultiblockUIFactory.Bars.THIRD_WIDTH) .tooltipBuilder(t -> { t.setAutoUpdate(true); if (isStructureFormed()) { if (boostValue.getBoolValue()) { - if (oxygenValue.getValue()[0] == 0) { + if (oxygenValue.getValue(0) == 0) { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_none")); } else if (isExtreme) { t.addLine(IKey.lang( "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount", - oxygenValue.getValue()[0], oxygenValue.getValue()[1])); + oxygenValue.getValue(0), oxygenValue.getValue(0))); } else { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_amount", - oxygenValue.getValue()[0], oxygenValue.getValue()[1])); + oxygenValue.getValue(0), oxygenValue.getValue(1))); } } else if (isExtreme) { t.addLine(IKey.lang( diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 697fa63c22e..69ebfe807af 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -357,8 +357,8 @@ public int getProgressBarCount() { panelSyncManager.syncValue("fuel_name", fuelNameValue); yield new ProgressWidget() - .progress(() -> fuelValue.getValue()[1] == 0 ? 0 : - 1.0 * fuelValue.getValue()[0] / fuelValue.getValue()[1]) + .progress(() -> fuelValue.getValue(1) == 0 ? 0 : + 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) .tooltip(t -> t.setAutoUpdate(true)) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); From cb0a3a2e7f554cd55f093d7f7298c373357f4030 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:17:57 -0700 Subject: [PATCH 089/264] address todo for dynamic color tooltip --- .../generator/MetaTileEntityLargeTurbine.java | 28 ++++++++++--------- .../resources/assets/gregtech/lang/en_us.lang | 4 +-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 69ebfe807af..5f1f3309895 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -392,19 +392,9 @@ yield new ProgressWidget() if (isStructureFormed()) { int speed = rotorSpeedValue.getIntValue(); int maxSpeed = rotorMaxSpeedValue.getIntValue(); - float percent = maxSpeed == 0 ? 0 : 1.0f * speed / maxSpeed; - - // TODO working dynamic color substitutions into IKey.lang - if (percent < 0.4) { - t.addLine( - IKey.lang("gregtech.multiblock.turbine.rotor_speed.low", speed, maxSpeed)); - } else if (percent < 0.8) { - t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_speed.medium", speed, - maxSpeed)); - } else { - t.addLine( - IKey.lang("gregtech.multiblock.turbine.rotor_speed.high", speed, maxSpeed)); - } + + t.addLine(KeyUtil.lang("gregtech.multiblock.turbine.rotor_speed", + getSpeedFormat(maxSpeed, speed), speed, maxSpeed)); } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } @@ -461,6 +451,18 @@ yield new ProgressWidget() }; } + private @NotNull TextFormatting getSpeedFormat(int maxSpeed, int speed) { + float percent = maxSpeed == 0 ? 0 : 1.0f * speed / maxSpeed; + + if (percent < 0.4) { + return TextFormatting.RED; + } else if (percent < 0.8) { + return TextFormatting.YELLOW; + } else { + return TextFormatting.GREEN; + } + } + /** * @return an array of [fuel stored, fuel capacity] */ diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 99b69220bd2..d87d8d025c7 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5877,9 +5877,7 @@ gregtech.multiblock.large_combustion_engine.obstructed.desc=Engine Intakes must gregtech.multiblock.turbine.fuel_amount=Fuel: %sL %s gregtech.multiblock.turbine.fuel_needed=Consumes %s per %s ticks -gregtech.multiblock.turbine.rotor_speed.high=§7Rotor Speed: §a%,d / %,d RPM -gregtech.multiblock.turbine.rotor_speed.medium=§7Rotor Speed: §e%,d / %,d RPM -gregtech.multiblock.turbine.rotor_speed.low=§7Rotor Speed: §c%,d / %,d RPM +gregtech.multiblock.turbine.rotor_speed=§7Rotor Speed: %s%,d / %,d RPM gregtech.multiblock.turbine.rotor_durability.high=§7Rotor Durability: §a%,d%% gregtech.multiblock.turbine.rotor_durability.medium=§7Rotor Durability: §e%,d%% gregtech.multiblock.turbine.rotor_durability.low=§cRotor durability low! From 266d2eb14a046552381cbdcc611b22bbecc9af2e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 17 Jan 2025 17:50:38 -0700 Subject: [PATCH 090/264] this class is no longer necessary --- .../api/mui/widget/GregtechDisplayScreen.java | 308 ------------------ 1 file changed, 308 deletions(-) delete mode 100644 src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java diff --git a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java b/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java deleted file mode 100644 index b83ab43b5a0..00000000000 --- a/src/main/java/gregtech/api/mui/widget/GregtechDisplayScreen.java +++ /dev/null @@ -1,308 +0,0 @@ -package gregtech.api.mui.widget; - -import gregtech.api.GTValues; -import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; -import gregtech.api.util.GTUtility; -import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; - -import net.minecraft.network.PacketBuffer; -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.layout.IViewport; -import com.cleanroommc.modularui.api.layout.IViewportStack; -import com.cleanroommc.modularui.api.widget.IGuiAction; -import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.drawable.Stencil; -import com.cleanroommc.modularui.drawable.text.TextRenderer; -import com.cleanroommc.modularui.network.NetworkUtils; -import com.cleanroommc.modularui.screen.ModularScreen; -import com.cleanroommc.modularui.screen.viewport.GuiContext; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.utils.HoveredWidgetList; -import com.cleanroommc.modularui.value.sync.SyncHandler; -import com.cleanroommc.modularui.widget.ParentWidget; -import com.cleanroommc.modularui.widget.scroll.ScrollArea; -import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; -import com.cleanroommc.modularui.widget.sizer.Area; -import io.netty.buffer.Unpooled; -import org.jetbrains.annotations.NotNull; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.IntSupplier; -import java.util.function.LongSupplier; -import java.util.function.Supplier; - -public class GregtechDisplayScreen extends ParentWidget implements IViewport, Interactable { - - private final DisplaySyncHandler syncHandler; - private final TextRenderer textRenderer = new TextRenderer(); - private final ScrollArea scroll = new ScrollArea(); - private final MultiblockWithDisplayBase mte; - - public GregtechDisplayScreen(MultiblockWithDisplayBase mte) { - this.mte = mte; - this.syncHandler = new DisplaySyncHandler(); - setSyncHandler(this.syncHandler); - this.syncHandler.setChangeListener(() -> scroll.getScrollY().setScrollSize(syncHandler.getActiveHeight())); - scroll.setScrollDataY(new VerticalScrollData()); - sizeRel(1f); - listenGuiAction((IGuiAction.MouseReleased) mouseButton -> { - this.scroll.mouseReleased(getContext()); - return false; - }); - addLine(buffer -> NetworkUtils.writeStringSafe(buffer, mte.getMetaFullName()), - buffer -> KeyUtil.lang(TextFormatting.WHITE, NetworkUtils.readStringSafe(buffer))); - addLine(buffer -> buffer.writeBoolean(mte.isStructureFormed()), buffer -> { - if (buffer.readBoolean()) return null; - return KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); - }); - } - - @Override - public Area getArea() { - return this.scroll; - } - - @Override - public void getSelfAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) { - if (isInside(stack, x, y)) { - widgets.add(this, stack.peek()); - } - } - - @Override - public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) {} - - @Override - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - // draw the keys - int x = getArea().getPadding().left; - int y = getArea().getPadding().top - scroll.getScrollY().getScroll(); - - textRenderer.setShadow(widgetTheme.getTextShadow()); - textRenderer.setAlignment(Alignment.CenterLeft, getArea().width, 12); - textRenderer.setScale(1f); - - for (var key : syncHandler.builtKeys) { - if (key == null) continue; - textRenderer.setPos(x, y); - textRenderer.draw(key.getFormatted()); - y += 12; - } - } - - @Override - public void onResized() { - if (this.scroll.getScrollY() != null) { - this.scroll.getScrollY().clamp(this.scroll); - } - } - - @Override - public boolean canHover() { - return super.canHover() || - this.scroll.isInsideScrollbarArea(getContext().getMouseX(), getContext().getMouseY()); - } - - @Override - public @NotNull Interactable.Result onMousePressed(int mouseButton) { - GuiContext context = getContext(); - if (this.scroll.mouseClicked(context)) { - return Interactable.Result.STOP; - } - return Interactable.Result.IGNORE; - } - - @Override - public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) { - return this.scroll.mouseScroll(getContext()); - } - - @Override - public boolean onMouseRelease(int mouseButton) { - this.scroll.mouseReleased(getContext()); - return false; - } - - @Override - public void onUpdate() { - super.onUpdate(); - this.scroll.drag(getContext().getAbsMouseX(), getContext().getAbsMouseY()); - } - - public GregtechDisplayScreen addLine(Consumer serializer, Function deserializer) { - this.syncHandler.addLine(serializer, deserializer); - return getThis(); - } - - public GregtechDisplayScreen energy(LongSupplier maxVoltage, LongSupplier recipeEUt) { - addLine(buffer -> { - long maxV = maxVoltage.getAsLong(); - boolean b = maxV != 0 && maxV >= -recipeEUt.getAsLong(); - buffer.writeBoolean(mte.isStructureFormed() && b); - if (b) buffer.writeLong(maxV); - }, buffer -> { - if (!buffer.readBoolean()) return null; - long maxV = buffer.readLong(); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxV)]); - - return KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", - TextFormattingUtil.formatNumbers(maxV), voltageName); - }); - return getThis(); - } - - public GregtechDisplayScreen fuelNeeded(Supplier amount, IntSupplier duration) { - addLine(buffer -> { - String s = amount.get(); - buffer.writeBoolean(s != null && mte.isStructureFormed()); - if (s != null) { - NetworkUtils.writeStringSafe(buffer, s); - buffer.writeInt(duration.getAsInt()); - } - }, buffer -> { - if (!buffer.readBoolean()) return null; - return KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.fuel_needed", - KeyUtil.string(TextFormatting.RED, NetworkUtils.readStringSafe(buffer)), - KeyUtil.number(TextFormatting.AQUA, buffer.readInt())); - }); - return getThis(); - } - - public GregtechDisplayScreen status() { - addLine(buffer -> { - var arl = mte.getRecipeLogic(); - int i; - if (arl == null) { - i = 0; - } else if (!arl.isWorkingEnabled()) { - i = 1; - } else if (arl.isActive()) { - i = 2; - } else { - i = 3; - } - buffer.writeVarInt(i); - }, buffer -> switch (buffer.readVarInt()) { - case 1 -> KeyUtil.lang(TextFormatting.GOLD, "gregtech.multiblock.work_paused"); - case 2 -> KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.running"); - case 3 -> KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.idling"); - default -> null; - }); - return getThis(); - } - - @Override - public boolean isValidSyncHandler(SyncHandler syncHandler) { - return syncHandler instanceof DisplaySyncHandler; - } - - @Override - public void preDraw(ModularGuiContext context, boolean transformed) { - if (!transformed) { - Stencil.applyAtZero(this.scroll, context); - } - } - - @Override - public void postDraw(ModularGuiContext context, boolean transformed) { - if (!transformed) { - Stencil.remove(); - this.scroll.drawScrollbar(); - } - } - - private static class DisplaySyncHandler extends SyncHandler { - - private final List> serializers = new ArrayList<>(); - private final List> deserializers = new ArrayList<>(); - private IKey[] builtKeys = new IKey[0]; - private final PacketBuffer internalBuffer = new PacketBuffer(Unpooled.buffer()); - private boolean dirty = true; - private Runnable changeListener = null; - private int activeHeight = 0; - - public void addLine(Consumer serializer, Function deserializer) { - serializers.add(serializer); - deserializers.add(deserializer); - } - - private void markDirty() { - this.dirty = true; - } - - @Override - public void detectAndSendChanges(boolean init) { - if (init || dirty) { - if (init) buildKeys(null); - if (dirty) dirty = false; - syncToClient(0, this::serializeKeys); - if (changeListener != null) changeListener.run(); - return; - } - - IKey[] copy = builtKeys.clone(); - internalBuffer.clear(); - serializeKeys(internalBuffer); - buildKeys(internalBuffer); - - for (int i = 0; i < builtKeys.length; i++) { - if (builtKeys[i] == null && copy[i] == null) continue; - if (builtKeys[i] == null || copy[i] == null || !builtKeys[i].get().equals(copy[i].get())) { - markDirty(); - return; - } - } - } - - public void setChangeListener(Runnable changeListener) { - this.changeListener = changeListener; - } - - private void buildKeys(PacketBuffer buffer) { - if (builtKeys.length != deserializers.size()) - builtKeys = new IKey[deserializers.size()]; - - activeHeight = 0; - if (buffer == null) return; - Arrays.setAll(builtKeys, i -> { - var key = deserializers.get(i).apply(buffer); - if (key != null) activeHeight += 12; - return key; - }); - } - - public int getActiveHeight() { - return activeHeight; - } - - private void serializeKeys(PacketBuffer buffer) { - serializers.forEach(s -> s.accept(buffer)); - } - - @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException { - if (id == 0) { - builtKeys = new IKey[deserializers.size()]; - for (int i = 0; i < builtKeys.length; i++) { - builtKeys[i] = deserializers.get(i).apply(buf); - } - } - } - - @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException {} - } -} From 7a10656c5e2257fa0387d9e334eab276a0f4df46 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:35:32 -0700 Subject: [PATCH 091/264] add method overload --- .../api/mui/serialize/DrawableSerializer.java | 18 ++++-------------- .../api/mui/serialize/JsonHandler.java | 7 +++++-- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java index e1716052854..97ec0f26c60 100644 --- a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java +++ b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java @@ -4,15 +4,13 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; public class DrawableSerializer implements JsonHandler { @@ -24,11 +22,8 @@ public IDrawable deserialize(JsonElement json, JsonDeserializationContext contex if (parsed.has("key") && parsed.has("tooltip")) { IKey key = context.deserialize(parsed.get("key"), IKey.class); - List list = new ArrayList<>(); - for (JsonElement jsonElement : parsed.getAsJsonArray("tooltip")) { - list.add(context.deserialize(jsonElement, IDrawable.class)); - } - return HoverableKey.of(key).addLines(list); + IDrawable[] list = deserializeArray(parsed.getAsJsonArray("tooltip"), context, IDrawable[]::new); + return HoverableKey.of(key).addLines(Arrays.asList(list)); } else { return context.deserialize(parsed, IKey.class); } @@ -40,12 +35,7 @@ public JsonElement serialize(IDrawable src, JsonSerializationContext context) { JsonObject object = new JsonObject(); if (src instanceof HoverableKey hoverable) { object.add("key", context.serialize(hoverable.getKey(), IKey.class)); - JsonArray array = new JsonArray(); - for (IDrawable tooltipLine : hoverable.getTooltipLines()) { - array.add(context.serialize(tooltipLine, IDrawable.class)); - } - object.add("tooltip", array); - return object; + object.add("tooltip", serializeArray(hoverable.getTooltipLines(), context)); } return object; } diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java index 042e52c54f7..afd0bb41476 100644 --- a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java +++ b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java @@ -10,7 +10,6 @@ import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; -import org.apache.commons.lang3.ArrayUtils; import java.lang.reflect.Type; import java.util.Arrays; @@ -34,8 +33,12 @@ default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext T deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException; default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { + return serializeArray(Arrays.asList(objects), context); + } + + default JsonArray serializeArray(Iterable objects, JsonSerializationContext context) { JsonArray array = new JsonArray(); - if (ArrayUtils.isEmpty(objects)) return array; + if (objects == null) return array; Type arrayType = objects.getClass().getComponentType(); for (R t : objects) { JsonElement element = context.serialize(t, arrayType); From 854c2f85293427d2282e8974fb1224de5ed947cc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 28 Jan 2025 21:25:23 -0700 Subject: [PATCH 092/264] simplify DrawableSerializer move key serialization into DrawableSerializer --- .../api/mui/serialize/DrawableSerializer.java | 11 +++++++---- .../gregtech/api/mui/serialize/JsonHandler.java | 17 +++++++++++++---- src/main/java/gregtech/api/util/JsonUtils.java | 5 +---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java index 97ec0f26c60..6316ba15ab0 100644 --- a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java +++ b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java @@ -14,6 +14,8 @@ public class DrawableSerializer implements JsonHandler { + KeySerializer keySerializer = new KeySerializer(); + @Override public IDrawable deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException { @@ -25,16 +27,17 @@ public IDrawable deserialize(JsonElement json, JsonDeserializationContext contex IDrawable[] list = deserializeArray(parsed.getAsJsonArray("tooltip"), context, IDrawable[]::new); return HoverableKey.of(key).addLines(Arrays.asList(list)); } else { - return context.deserialize(parsed, IKey.class); + return keySerializer.deserialize(json, context); } } @Override public JsonElement serialize(IDrawable src, JsonSerializationContext context) { - if (src instanceof IKey) return context.serialize(src, IKey.class); JsonObject object = new JsonObject(); - if (src instanceof HoverableKey hoverable) { - object.add("key", context.serialize(hoverable.getKey(), IKey.class)); + if (src instanceof IKey key) { + return keySerializer.serialize(key, context); + } else if (src instanceof HoverableKey hoverable) { + object.add("key", keySerializer.serialize(hoverable.getKey(), context)); object.add("tooltip", serializeArray(hoverable.getTooltipLines(), context)); } return object; diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java index afd0bb41476..447e8723dad 100644 --- a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java +++ b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java @@ -11,8 +11,10 @@ import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; +import java.lang.reflect.Array; import java.lang.reflect.Type; import java.util.Arrays; +import java.util.Collection; import java.util.function.IntFunction; public interface JsonHandler extends JsonSerializer, JsonDeserializer { @@ -33,10 +35,6 @@ default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext T deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException; default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { - return serializeArray(Arrays.asList(objects), context); - } - - default JsonArray serializeArray(Iterable objects, JsonSerializationContext context) { JsonArray array = new JsonArray(); if (objects == null) return array; Type arrayType = objects.getClass().getComponentType(); @@ -54,6 +52,17 @@ default JsonArray serializeArray(Iterable objects, JsonSerializationConte return array; } + @SuppressWarnings("unchecked") + default JsonArray serializeArray(Collection objects, JsonSerializationContext context) { + R[] array = null; + int i = 0; + for (R object : objects) { + if (array == null) array = (R[]) Array.newInstance(object.getClass(), objects.size()); + array[i++] = object; + } + return serializeArray(array, context); + } + default R[] deserializeArray(JsonArray jsonArray, JsonDeserializationContext context, IntFunction function) { if (jsonArray == null || jsonArray.size() == 0) return function.apply(0); diff --git a/src/main/java/gregtech/api/util/JsonUtils.java b/src/main/java/gregtech/api/util/JsonUtils.java index d59cb026569..ebcf949f671 100644 --- a/src/main/java/gregtech/api/util/JsonUtils.java +++ b/src/main/java/gregtech/api/util/JsonUtils.java @@ -2,12 +2,10 @@ import gregtech.api.mui.serialize.DrawableSerializer; import gregtech.api.mui.serialize.FormatSerializer; -import gregtech.api.mui.serialize.KeySerializer; import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.drawable.IKey; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -15,8 +13,7 @@ public class JsonUtils { private static final Gson gson = new GsonBuilder() .setPrettyPrinting() - .registerTypeAdapter(IKey.class, new KeySerializer()) - .registerTypeAdapter(IDrawable.class, new DrawableSerializer()) + .registerTypeHierarchyAdapter(IDrawable.class, new DrawableSerializer()) .registerTypeAdapter(TextFormatting.class, new FormatSerializer()) .create(); From 00e95c44ffdeb98d15f0f70d89f59db124ea40e9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:14:22 -0700 Subject: [PATCH 093/264] add method for additional children to the screen --- .../multiblock/ui/MultiblockUIFactory.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 38892cd4e7a..89327a84c6a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -58,6 +58,7 @@ public class MultiblockUIFactory { private int width = 198, height = 202; private int screenHeight = 109; private Supplier customScreen; + private Consumer> childrenConsumer; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; @@ -285,6 +286,11 @@ public MultiblockUIFactory customScreen(Supplier customScreen) { return this; } + public MultiblockUIFactory addScreenChildren(Consumer> consumer) { + this.childrenConsumer = consumer; + return this; + } + protected Widget createScreen(PanelSyncManager syncManager) { ParentWidget root = new ParentWidget<>(); if (customScreen != null && customScreen.get() != null) { @@ -294,14 +300,22 @@ protected Widget createScreen(PanelSyncManager syncManager) { display.setAction(this.displayText); display.sync("display", syncManager); - root.child(new ScrollWidget<>(new VerticalScrollData()) + var scrollWidget = new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) .child(new RichTextWidget() .sizeRel(1f) .alignment(Alignment.TopLeft) .margin(4, 4) .autoUpdate(true) - .textBuilder(display::build))); + .textBuilder(display::build)); + + if (this.childrenConsumer != null) { + List extra = new ArrayList<>(); + this.childrenConsumer.accept(extra); + extra.forEach(scrollWidget::child); + } + + root.child(scrollWidget); } return root.child(createIndicator(syncManager)) From b4803a1444d41d060f4933890dc2c4f0cd5e6a9e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:37:52 -0700 Subject: [PATCH 094/264] remove custom screen update fusion reactor --- .../multiblock/ui/MultiblockUIFactory.java | 54 ++++++++----------- .../electric/MetaTileEntityFusionReactor.java | 5 +- 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 89327a84c6a..5e90eff5197 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -281,44 +281,34 @@ protected Flow createBars(@NotNull ModularPanel mainPanel, return column; } - public MultiblockUIFactory customScreen(Supplier customScreen) { - this.customScreen = customScreen; - return this; - } - public MultiblockUIFactory addScreenChildren(Consumer> consumer) { this.childrenConsumer = consumer; return this; } protected Widget createScreen(PanelSyncManager syncManager) { - ParentWidget root = new ParentWidget<>(); - if (customScreen != null && customScreen.get() != null) { - root.child(customScreen.get()); - } else { - Builder display = builder(); - display.setAction(this.displayText); - display.sync("display", syncManager); - - var scrollWidget = new ScrollWidget<>(new VerticalScrollData()) - .sizeRel(1f) - .child(new RichTextWidget() - .sizeRel(1f) - .alignment(Alignment.TopLeft) - .margin(4, 4) - .autoUpdate(true) - .textBuilder(display::build)); - - if (this.childrenConsumer != null) { - List extra = new ArrayList<>(); - this.childrenConsumer.accept(extra); - extra.forEach(scrollWidget::child); - } - - root.child(scrollWidget); - } - - return root.child(createIndicator(syncManager)) + Builder display = builder(); + display.setAction(this.displayText); + display.sync("display", syncManager); + + var scrollWidget = new ScrollWidget<>(new VerticalScrollData()) + .sizeRel(1f) + .child(new RichTextWidget() + .sizeRel(1f) + .alignment(Alignment.TopLeft) + .margin(4, 4) + .autoUpdate(true) + .textBuilder(display::build)); + + if (this.childrenConsumer != null) { + List extra = new ArrayList<>(); + this.childrenConsumer.accept(extra); + extra.forEach(scrollWidget::child); + } + + return new ParentWidget<>() + .child(scrollWidget) + .child(createIndicator(syncManager)) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) .pos(4, 4); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index be51a02d314..0c381c70abc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -449,7 +449,7 @@ protected MultiblockUIFactory createUIFactory() { .setSize(198, 236) .setScreenHeight(138) .configureDisplayText(false, builder -> {}) - .customScreen(() -> new Column() + .addScreenChildren(widgets -> widgets.add(new Column() .padding(4) .expanded() .child(title.asWidget() @@ -457,6 +457,7 @@ protected MultiblockUIFactory createUIFactory() { .size(69, 12)) .child(new ProgressWidget() .size(77, 77) + // todo status tooltip .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() .size(89, 101) .marginTop(11)) @@ -466,7 +467,7 @@ protected MultiblockUIFactory createUIFactory() { .child(GTGuiTextures.FUSION_LEGEND.asWidget() .left(4) .bottom(4) - .size(108, 41))); + .size(108, 41)))); } private void addEnergyBarHoverText(List hoverList) { From 988e502f56277d9d5421970365c5d08142e9a7b9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Jan 2025 11:38:34 -0700 Subject: [PATCH 095/264] remove unused method --- .../multiblock/ui/MultiblockUIFactory.java | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 5e90eff5197..ff165bd9758 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -127,25 +127,6 @@ private Widget createIndicator(PanelSyncManager syncManager) { }); } - private IDrawable getIndicatorOverlay(Builder builder) { - builder.setAction(this.errorText); - builder.build(); - if (!builder.isEmpty()) { - // error - return GTGuiTextures.GREGTECH_LOGO_BLINKING_RED; - } - - builder.setAction(this.warningText); - builder.build(); - if (!builder.isEmpty()) { - // warn - return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; - } - - // todo getLogo()? - return GTGuiTextures.GREGTECH_LOGO_DARK; - } - /** * Returns a list of text indicating any current warnings in this Multiblock.
* Recommended to only display warnings if the structure is already formed.
From 25a60d816753de6a1c63dab0aa8cc671aea8afe4 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Wed, 29 Jan 2025 20:49:37 -0500 Subject: [PATCH 096/264] Move the PSS to the new MUI2 display text methods --- .../MetaTileEntityPowerSubstation.java | 169 +++++++----------- 1 file changed, 69 insertions(+), 100 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 408148207a8..cc38ef58c1d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -24,7 +24,7 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.BlockInfo; -import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -43,8 +43,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -346,112 +344,83 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.idling", - "gregtech.machine.active_transformer.routing") - .addCustom(tl -> { - if (isStructureFormed() && energyBank != null) { - BigInteger energyStored = energyBank.getStored(); - BigInteger energyCapacity = energyBank.getCapacity(); - - // Stored EU line - ITextComponent storedFormatted = TextComponentUtil.stringWithColor( - TextFormatting.GOLD, - TextFormattingUtil.formatNumbers(energyStored) + " EU"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.stored", - storedFormatted)); - - // EU Capacity line - ITextComponent capacityFormatted = TextComponentUtil.stringWithColor( - TextFormatting.GOLD, - TextFormattingUtil.formatNumbers(energyCapacity) + " EU"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.capacity", - capacityFormatted)); - - // Passive Drain line - ITextComponent passiveDrain = TextComponentUtil.stringWithColor( - TextFormatting.DARK_RED, - TextFormattingUtil.formatNumbers(getPassiveDrain()) + " EU/t"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.passive_drain", - passiveDrain)); - - // Average EU IN line - ITextComponent avgValue = TextComponentUtil.stringWithColor( - TextFormatting.GREEN, - TextFormattingUtil.formatNumbers(averageInLastSec) + " EU/t"); - ITextComponent base = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.average_in", - avgValue); - ITextComponent hover = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.average_in_hover"); - tl.add(TextComponentUtil.setHover(base, hover)); - - // Average EU OUT line - avgValue = TextComponentUtil.stringWithColor( - TextFormatting.RED, - TextFormattingUtil.formatNumbers(averageOutLastSec) + " EU/t"); - base = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.average_out", - avgValue); - hover = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.average_out_hover"); - tl.add(TextComponentUtil.setHover(base, hover)); - - // Time to fill/drain line - if (averageInLastSec > averageOutLastSec) { - ITextComponent timeToFill = getTimeToFillDrainText(energyCapacity.subtract(energyStored) - .divide(BigInteger.valueOf((averageInLastSec - averageOutLastSec) * 20))); - TextComponentUtil.setColor(timeToFill, TextFormatting.GREEN); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.time_to_fill", - timeToFill)); - } else if (averageInLastSec < averageOutLastSec) { - ITextComponent timeToDrain = getTimeToFillDrainText( - energyStored.divide(BigInteger.valueOf( - (averageOutLastSec - averageInLastSec) * 20))); - TextComponentUtil.setColor(timeToDrain, TextFormatting.RED); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.power_substation.time_to_drain", - timeToDrain)); - } - } - }) - .addWorkingStatusLine(); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.structureFormed(isStructureFormed()); + builder.setWorkingStatus(true, isActive() && isWorkingEnabled()); // transform into two-state system for display + builder.setWorkingStatusKeys("gregtech.multiblock.idling", "gregtech.multiblock.idling", + "gregtech.machine.active_transformer.routing"); + builder.addCustom(list -> { + if (isStructureFormed() && energyBank != null) { + BigInteger energyStored = energyBank.getStored(); + BigInteger energyCapacity = energyBank.getCapacity(); + + // Stored EU line + IKey storedFormatted = KeyUtil.string(TextFormatting.GOLD, + TextFormattingUtil.formatNumbers(energyStored) + " EU"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.stored", + storedFormatted)); + + // EU Capacity line + IKey capacityFormatted = KeyUtil.string(TextFormatting.GOLD, + TextFormattingUtil.formatNumbers(energyCapacity) + " EU"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.capacity", + capacityFormatted)); + + // Passive Drain line + IKey passiveDrain = KeyUtil.string(TextFormatting.DARK_RED, + TextFormattingUtil.formatNumbers(getPassiveDrain()) + " EU/t"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.passive_drain", + passiveDrain)); + + // Average EU IN line + IKey avgValue = KeyUtil.string(TextFormatting.GREEN, + TextFormattingUtil.formatNumbers(averageInLastSec) + " EU/t"); + IKey base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_in", + avgValue); + IKey hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_in_hover"); + list.add(KeyUtil.setHover(base, hover)); + + // Average EU OUT line + avgValue = KeyUtil.string(TextFormatting.RED, + TextFormattingUtil.formatNumbers(averageOutLastSec) + " EU/t"); + base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_out", avgValue); + hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_out_hover"); + list.add(KeyUtil.setHover(base, hover)); + + // Time to fill/drain line + if (averageInLastSec > averageOutLastSec) { + IKey timeToFill = getTimeToFillDrainText(energyCapacity.subtract(energyStored) + .divide(BigInteger.valueOf((averageInLastSec - averageOutLastSec) * 20))); + timeToFill.format(TextFormatting.GREEN); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_fill", + timeToFill)); + } else if (averageInLastSec < averageOutLastSec) { + IKey timeToDrain = getTimeToFillDrainText( + energyStored.divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20))); + timeToDrain.format(TextFormatting.RED); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_drain", + timeToDrain)); + } + } + }); + builder.addWorkingStatusLine(); } @Override - protected void addWarningText(List textList) { - super.addWarningText(textList); - if (isStructureFormed()) { - if (averageInLastSec < averageOutLastSec) { // decreasing + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addCustom(list -> { + if (isStructureFormed() && averageInLastSec < averageOutLastSec) { BigInteger timeToDrainSeconds = energyBank.getStored() .divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20)); if (timeToDrainSeconds.compareTo(BigInteger.valueOf(60 * 60)) < 0) { // less than 1 hour left - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.power_substation.under_one_hour_left")); } } - } + }); } - private static ITextComponent getTimeToFillDrainText(BigInteger timeToFillSeconds) { + private static IKey getTimeToFillDrainText(BigInteger timeToFillSeconds) { if (timeToFillSeconds.compareTo(BIG_INTEGER_MAX_LONG) > 0) { // too large to represent in a java Duration timeToFillSeconds = BIG_INTEGER_MAX_LONG; @@ -476,10 +445,10 @@ private static ITextComponent getTimeToFillDrainText(BigInteger timeToFillSecond fillTime = duration.toDays() / 365; key = "gregtech.multiblock.power_substation.time_years"; } else { - return new TextComponentTranslation("gregtech.multiblock.power_substation.time_forever"); + return KeyUtil.lang("gregtech.multiblock.power_substation.time_forever"); } - return new TextComponentTranslation(key, TextFormattingUtil.formatNumbers(fillTime)); + return KeyUtil.lang(key, TextFormattingUtil.formatNumbers(fillTime)); } @Override From 2c9d5f9ce9659d8a8dd8e2f90f1b89bc65d3fade Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:41:18 -0700 Subject: [PATCH 097/264] simplify progress bars a bit remove todo as it's been fixed --- .../multiblock/ui/MultiblockUIFactory.java | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index ff165bd9758..1a7477d5246 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -79,18 +79,22 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { // this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); + panel.child(createScreen(panelSyncManager)); + // TODO createExtras() hook for overrides? - var bars = createBars(panel, panelSyncManager); - - return panel.child(createScreen(panelSyncManager)) - .childIf(bars != null, bars) - .child(Flow.row() - .bottom(7) - .height(77) - .margin(4, 0) - .child(SlotGroupWidget.playerInventory(0) - .alignX(0f)) - .child(createButtons(panel, panelSyncManager))); + if (mte instanceof ProgressBarMultiblock progressBarMultiblock && + progressBarMultiblock.getProgressBarCount() > 0) { + panel.height(height + (Bars.HEIGHT * 2) - 2); + panel.child(createBars(progressBarMultiblock, panelSyncManager)); + } + + return panel.child(Flow.row() + .bottom(7) + .height(77) + .margin(4, 0) + .child(SlotGroupWidget.playerInventory(0) + .alignX(0f)) + .child(createButtons(panel, panelSyncManager))); } private Widget createIndicator(PanelSyncManager syncManager) { @@ -213,18 +217,12 @@ public MultiblockUIFactory setScreenHeight(int height) { } /** - * @param mainPanel the main panel, needed for creating popup panels + * @param progressMulti the multiblock with progress bars * @param panelSyncManager the sync manager for synchronizing widgets */ @Nullable - protected Flow createBars(@NotNull ModularPanel mainPanel, + protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, @NotNull PanelSyncManager panelSyncManager) { - if (!(mte instanceof ProgressBarMultiblock progressMulti)) return null; - - final int count = progressMulti.getProgressBarCount(); - if (count < 1) return null; - mainPanel.height(height + (Bars.HEIGHT * 2) - 2); - final int rows = progressMulti.getProgressBarRows(); final int cols = progressMulti.getProgressBarCols(); @@ -233,27 +231,26 @@ protected Flow createBars(@NotNull ModularPanel mainPanel, .top(114) .widthRel(1f) .height(Bars.HEIGHT * 2); - int rowWidth = (Bars.FULL_WIDTH / cols) - (cols - 1); for (int r = 0; r < rows; r++) { Flow row = Flow.row() .widthRel(1f) + .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN) .height(Bars.HEIGHT); + // the numbers for the given row of bars int from = r * cols; int to = Math.min(from + cols, cols); - if (to - from > 1) { - // TODO MUI2 bug workaround, should be able to apply this to every row but it crashes with single - // element rows - row.mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN); - } + // calculate bar width + int barCount = Math.max(1, to - from); + int barWidth = (Bars.FULL_WIDTH / barCount) - (barCount - 1); for (int i = from; i < to; i++) { row.child(progressMulti.createProgressBar(panelSyncManager, i) .height(Bars.HEIGHT) - .width(rowWidth) + .width(barWidth) .direction(ProgressWidget.Direction.RIGHT)); } From 52da7013fbe6e341ab662ef7e732663487bd4180 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 29 Jan 2025 19:48:15 -0700 Subject: [PATCH 098/264] add extra space to lines --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 1a7477d5246..77a7321f854 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -879,7 +879,9 @@ public void readOnServer(int id, PacketBuffer buf) {} protected void build(IRichTextBuilder richText) { if (dirty) build(); - richText.addDrawableLines(this.textList); + for (IDrawable drawable : textList) { + richText.addLine(drawable).spaceLine(2); + } } protected void build() { From caf48e99b94635b67a300c46c83925ff80725184 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Thu, 30 Jan 2025 16:24:59 -0500 Subject: [PATCH 099/264] Pass guiData to `MultiblockUIFactory#createFlexButton` --- .../multiblock/MultiMapMultiblockController.java | 2 +- .../multiblock/ui/MultiblockUIFactory.java | 14 ++++++++------ .../gregtech/api/util/function/TriFunction.java | 7 +++++++ .../multi/MetaTileEntityLargeBoiler.java | 2 +- 4 files changed, 17 insertions(+), 8 deletions(-) create mode 100644 src/main/java/gregtech/api/util/function/TriFunction.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 42d5a631057..493ef72b64f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -136,7 +136,7 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM protected MultiblockUIFactory createUIFactory() { IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); return super.createUIFactory() - .createFlexButton((panel, syncManager) -> { + .createFlexButton((panel, syncManager, guiData) -> { if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) return null; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 77a7321f854..066eb4769a0 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -14,6 +14,7 @@ import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; +import gregtech.api.util.function.TriFunction; import gregtech.common.ConfigHolder; import net.minecraft.network.PacketBuffer; @@ -46,7 +47,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Supplier; @@ -54,7 +54,8 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected Consumer displayText, warningText, errorText; - protected BiFunction flexButton = (panel, syncManager) -> null; + protected TriFunction flexButton = (panel, syncManager, + posGuiData) -> null; private int width = 198, height = 202; private int screenHeight = 109; private Supplier customScreen; @@ -94,7 +95,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { .margin(4, 0) .child(SlotGroupWidget.playerInventory(0) .alignX(0f)) - .child(createButtons(panel, panelSyncManager))); + .child(createButtons(panel, panelSyncManager, guiData))); } private Widget createIndicator(PanelSyncManager syncManager) { @@ -196,7 +197,7 @@ public MultiblockUIFactory configureDisplayText(Consumer displayText) { *
* Size will be 18x18. */ - public MultiblockUIFactory createFlexButton(BiFunction flexButton) { + public MultiblockUIFactory createFlexButton(TriFunction flexButton) { this.flexButton = flexButton; return this; } @@ -293,8 +294,9 @@ protected Widget createScreen(PanelSyncManager syncManager) { } @NotNull - protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - IWidget flexButton = this.flexButton.apply(mainPanel, panelSyncManager); + protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager, + PosGuiData guiData) { + IWidget flexButton = this.flexButton.apply(mainPanel, panelSyncManager, guiData); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() .size(18) diff --git a/src/main/java/gregtech/api/util/function/TriFunction.java b/src/main/java/gregtech/api/util/function/TriFunction.java new file mode 100644 index 00000000000..4b2cdda8258 --- /dev/null +++ b/src/main/java/gregtech/api/util/function/TriFunction.java @@ -0,0 +1,7 @@ +package gregtech.api.util.function; + +@FunctionalInterface +public interface TriFunction { + + R apply(T t, U u, Z z); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 9fe352e064b..283e9e9a4f8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -197,7 +197,7 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() - .createFlexButton((panel, syncManager) -> { + .createFlexButton((panel, syncManager, guiData) -> { PanelSyncHandler throttle = (PanelSyncHandler) syncManager.panel("throttle_panel", this::makeThrottlePanel, true); From 85b46d4ef97f8ea6fc1e6c5b4564361a41d5c80f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 30 Jan 2025 15:50:31 -0700 Subject: [PATCH 100/264] move trifunction back to bifunction and remove panel parameter cleanup/add todos --- .../multiblock/MultiMapMultiblockController.java | 2 +- .../multiblock/ui/MultiblockUIFactory.java | 12 +++++------- .../java/gregtech/api/util/function/TriFunction.java | 7 ------- .../multi/MetaTileEntityLargeBoiler.java | 5 +++-- 4 files changed, 9 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/gregtech/api/util/function/TriFunction.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 493ef72b64f..74fe3e1e34d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -136,7 +136,7 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM protected MultiblockUIFactory createUIFactory() { IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); return super.createUIFactory() - .createFlexButton((panel, syncManager, guiData) -> { + .createFlexButton((guiData, syncManager) -> { if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) return null; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 066eb4769a0..60cb6ed879b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -14,7 +14,6 @@ import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; -import gregtech.api.util.function.TriFunction; import gregtech.common.ConfigHolder; import net.minecraft.network.PacketBuffer; @@ -47,18 +46,16 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.BiFunction; import java.util.function.Consumer; -import java.util.function.Supplier; public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; protected Consumer displayText, warningText, errorText; - protected TriFunction flexButton = (panel, syncManager, - posGuiData) -> null; + protected BiFunction flexButton = (guiData, syncManager) -> null; private int width = 198, height = 202; private int screenHeight = 109; - private Supplier customScreen; private Consumer> childrenConsumer; public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { @@ -197,7 +194,8 @@ public MultiblockUIFactory configureDisplayText(Consumer displayText) { *
* Size will be 18x18. */ - public MultiblockUIFactory createFlexButton(TriFunction flexButton) { + public MultiblockUIFactory createFlexButton( + BiFunction flexButton) { this.flexButton = flexButton; return this; } @@ -296,7 +294,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { @NotNull protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager, PosGuiData guiData) { - IWidget flexButton = this.flexButton.apply(mainPanel, panelSyncManager, guiData); + IWidget flexButton = this.flexButton.apply(guiData, panelSyncManager); if (flexButton == null) { flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() .size(18) diff --git a/src/main/java/gregtech/api/util/function/TriFunction.java b/src/main/java/gregtech/api/util/function/TriFunction.java deleted file mode 100644 index 4b2cdda8258..00000000000 --- a/src/main/java/gregtech/api/util/function/TriFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package gregtech.api.util.function; - -@FunctionalInterface -public interface TriFunction { - - R apply(T t, U u, Z z); -} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 283e9e9a4f8..ed73ae86345 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -197,7 +197,8 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() - .createFlexButton((panel, syncManager, guiData) -> { + .createFlexButton((guiData, syncManager) -> { + // todo remove cast in next mui2 version PanelSyncHandler throttle = (PanelSyncHandler) syncManager.panel("throttle_panel", this::makeThrottlePanel, true); @@ -206,7 +207,6 @@ protected MultiblockUIFactory createUIFactory() { .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) // todo lang .addTooltipLine("Configure Boiler Throttle") - // TODO make this work .background(GTGuiTextures.BUTTON) .onMousePressed(i -> { if (throttle.isPanelOpen()) { @@ -214,6 +214,7 @@ protected MultiblockUIFactory createUIFactory() { } else { throttle.openPanel(); } + // todo remove this call in next mui2 version Interactable.playButtonClickSound(); return true; }); From 11b3f62f4c8ae3bb5769394b4ca07833924ec1d0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:12:59 -0700 Subject: [PATCH 101/264] fix rebase --- .../multiblock/ui/MultiblockUIFactory.java | 12 +- .../api/mui/serialize/KeySerializer.java | 16 ++- src/main/java/gregtech/api/util/KeyUtil.java | 52 ++----- .../multi/MetaTileEntityLargeBoiler.java | 15 +- .../electric/MetaTileEntityFluidDrill.java | 2 +- .../electric/MetaTileEntityFusionReactor.java | 2 +- .../multi/electric/MetaTileEntityHPCA.java | 6 +- .../MetaTileEntityPowerSubstation.java | 13 +- .../MetaTileEntityLargeCombustionEngine.java | 4 +- .../generator/MetaTileEntityLargeTurbine.java | 10 +- .../mixins/mui2/IntSyncValueMixin.java | 24 ---- .../java/gregtech/mixins/mui2/TextMixins.java | 136 ------------------ src/main/resources/mixins.gregtech.mui2.json | 2 - 13 files changed, 48 insertions(+), 246 deletions(-) delete mode 100644 src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java delete mode 100644 src/main/java/gregtech/mixins/mui2/TextMixins.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 60cb6ed879b..2196f9aecfd 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -412,9 +412,9 @@ public static class Builder { private boolean isStructureFormed; // Keys for the three-state working system, can be set custom by multiblocks. - private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").format(TextFormatting.GRAY); - private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").format(TextFormatting.GOLD); - private IKey runningKey = IKey.lang("gregtech.multiblock.running").format(TextFormatting.GREEN); + private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").style(TextFormatting.GRAY); + private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD); + private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN); private boolean dirty; public Builder structureFormed(boolean structureFormed) { @@ -451,9 +451,9 @@ public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { * @param runningKey The translation key for the Running state, or "isActive". */ public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { - if (idlingKey != null) this.idlingKey = IKey.lang(idlingKey).format(TextFormatting.GRAY); - if (pausedKey != null) this.pausedKey = IKey.lang(pausedKey).format(TextFormatting.GOLD); - if (runningKey != null) this.runningKey = IKey.lang(runningKey).format(TextFormatting.GREEN); + if (idlingKey != null) this.idlingKey = IKey.lang(idlingKey).style(TextFormatting.GRAY); + if (pausedKey != null) this.pausedKey = IKey.lang(pausedKey).style(TextFormatting.GOLD); + if (runningKey != null) this.runningKey = IKey.lang(runningKey).style(TextFormatting.GREEN); return this; } diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java index 60e1e7ed75a..03b679e082d 100644 --- a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java +++ b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java @@ -16,6 +16,8 @@ public class KeySerializer implements JsonHandler { + // todo fix formatting + @Override public IKey deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException { @@ -24,17 +26,17 @@ public IKey deserialize(JsonElement json, JsonDeserializationContext context) return IKey.str(object.get("string").getAsString()); } else if (object.has("lang")) { String lang = context.deserialize(object.get("lang"), String.class); - TextFormatting[] formatting = deserializeArray( - object.getAsJsonArray("format"), context, TextFormatting[]::new); + // FormattingState formatting = new FormattingState(); + // formatting.parseFrom(object.get("format").getAsString()); Object[] args = deserializeArray( object.getAsJsonArray("args"), context, Object[]::new); - return IKey.lang(lang, args).format(formatting); + return IKey.lang(lang, args); } else if (object.has("keys")) { IKey[] keys = deserializeArray( object.getAsJsonArray("keys"), context, IKey[]::new); TextFormatting[] formatting = deserializeArray( object.getAsJsonArray("format"), context, TextFormatting[]::new); - return IKey.comp(keys).format(formatting); + return IKey.comp(keys).style(formatting); } return IKey.EMPTY; } @@ -46,13 +48,15 @@ public JsonElement serialize(IKey src, JsonSerializationContext context) { obj.add("string", context.serialize(src.getFormatted())); } else if (src instanceof LangKey langKey) { obj.add("lang", context.serialize(langKey.getKeySupplier().get())); - obj.add("format", serializeArray(langKey.getFormatting(), context)); + // var formatting = langKey.getFormatting(); + // if (formatting != null) + // obj.addProperty("format", formatting.toString()); Object[] args = langKey.getArgsSupplier().get(); if (!ArrayUtils.isEmpty(args)) obj.add("args", serializeArray(args, context)); } else if (src instanceof CompoundKey compoundKey) { obj.add("keys", serializeArray(compoundKey.getKeys(), context)); - obj.add("format", context.serialize(compoundKey.getFormatting())); + // obj.add("format", context.serialize(compoundKey.getFormatting())); } return obj; } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index f1909757aaa..ed7e3797a04 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -8,7 +8,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import org.apache.commons.lang3.ArrayUtils; -import java.util.Arrays; import java.util.function.LongSupplier; import java.util.function.Supplier; @@ -26,19 +25,19 @@ public static IKey string(Supplier s) { public static IKey string(TextFormatting formatting, String string) { if (string == null) return IKey.EMPTY; - return IKey.str(string).format(formatting); + return IKey.str(string).style(formatting); } public static IKey string(TextFormatting formatting, Supplier stringSupplier) { - return IKey.dynamic(stringSupplier).format(formatting); + return IKey.dynamic(stringSupplier).style(formatting); } public static IKey string(Supplier formatting, String s) { - return IKey.dynamic(() -> IKey.str(s).format(formatting.get()).getFormatted()); + return IKey.dynamic(() -> IKey.str(s).style(formatting.get()).getFormatted()); } public static IKey string(Supplier formatting, Supplier stringSupplier) { - return IKey.dynamic(() -> IKey.str(stringSupplier.get()).format(formatting.get()).getFormatted()); + return IKey.dynamic(() -> IKey.str(stringSupplier.get()).style(formatting.get()).getFormatted()); } public static IKey lang(String lang, Object... args) { @@ -46,23 +45,15 @@ public static IKey lang(String lang, Object... args) { } public static IKey lang(TextFormatting formatting, String lang, Object... args) { - return IKey.lang(lang, checkFormatting(formatting, args)).format(formatting); + return IKey.lang(lang, args).style(formatting); } - public static IKey lang(TextFormatting formatting, String lang, Supplier... argSuppliers) { - if (ArrayUtils.isEmpty(argSuppliers)) return IKey.lang(lang).format(formatting); - if (argSuppliers.length == 1) - return IKey.dynamic( - () -> IKey.lang(lang, fixArg(formatting, argSuppliers[0].get())).format(formatting).getFormatted()); - final Object[] args = new Object[argSuppliers.length]; - return IKey.dynamic(() -> { - Arrays.setAll(args, value -> fixArg(formatting, argSuppliers[value].get())); - return IKey.lang(lang, args).format(formatting).getFormatted(); - }); + public static IKey lang(TextFormatting formatting, String lang, Supplier argSupplier) { + return IKey.lang(lang, argSupplier).style(formatting); } - public static IKey lang(Supplier formatting, String lang, Supplier... argSuppliers) { - return IKey.dynamic(() -> lang(formatting.get(), lang, argSuppliers).get()); + public static IKey lang(Supplier formatting, String lang, Supplier argSupplier) { + return IKey.dynamic(() -> lang(lang, argSupplier.get()).style(formatting.get()).getFormatted()); } public static IKey number(TextFormatting formatting, long number) { @@ -101,29 +92,4 @@ public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; return HoverableKey.of(body, hover); } - - private static IKey wrap(TextFormatting formatting) { - return IKey.str(formatting.toString()); - } - - private static Object[] checkFormatting(TextFormatting formatting, Object[] args) { - if (ArrayUtils.isEmpty(args)) return args; - Arrays.setAll(args, value -> fixArg(formatting, args[value])); - return args; - } - - private static Object fixArg(TextFormatting formatting, Object arg) { - if (arg instanceof IKey key) { - if (hasFormatting(key.getFormatted())) - return IKey.comp(key, wrap(formatting)); - } else if (arg instanceof String s) { - if (hasFormatting(s)) - return s + formatting; - } - return arg; - } - - private static boolean hasFormatting(String s) { - return s.contains(SECTION); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index ed73ae86345..27fb5e08b57 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -39,16 +39,15 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; +import com.cleanroommc.modularui.api.IPanelHandler; 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.ItemDrawable; import com.cleanroommc.modularui.drawable.Rectangle; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; -import com.cleanroommc.modularui.value.sync.PanelSyncHandler; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; @@ -198,9 +197,7 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() .createFlexButton((guiData, syncManager) -> { - // todo remove cast in next mui2 version - PanelSyncHandler throttle = (PanelSyncHandler) syncManager.panel("throttle_panel", - this::makeThrottlePanel, true); + var throttle = syncManager.panel("throttle_panel", this::makeThrottlePanel, true); return new ButtonWidget<>() .width(18) @@ -214,8 +211,6 @@ protected MultiblockUIFactory createUIFactory() { } else { throttle.openPanel(); } - // todo remove this call in next mui2 version - Interactable.playButtonClickSound(); return true; }); }); @@ -246,7 +241,7 @@ private void addCustomData(List keyList) { } } - private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, PanelSyncHandler syncHandler) { + private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandler syncHandler) { IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); DoubleSyncValue sliderValue = new DoubleSyncValue( () -> (double) getThrottlePercentage() / 100, @@ -437,8 +432,8 @@ public int getProgressBarCount() { @Override public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { - IntSyncValue waterFilledValue = new IntSyncValue(this::getWaterFilled, null); - IntSyncValue waterCapacityValue = new IntSyncValue(this::getWaterCapacity, null); + IntSyncValue waterFilledValue = new IntSyncValue(this::getWaterFilled); + IntSyncValue waterCapacityValue = new IntSyncValue(this::getWaterCapacity); panelSyncManager.syncValue("water_filled", waterFilledValue); panelSyncManager.syncValue("water_capacity", waterCapacityValue); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 426d93dab5c..0694da8039d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -389,7 +389,7 @@ public int getProgressBarCount() { @Override public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { IntSyncValue operationsValue = new IntSyncValue(() -> BedrockFluidVeinHandler.getOperationsRemaining(getWorld(), - minerLogic.getChunkX(), minerLogic.getChunkZ()), null); + minerLogic.getChunkX(), minerLogic.getChunkZ())); panelSyncManager.syncValue("operations_remaining", operationsValue); return new ProgressWidget() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 0c381c70abc..3a49ae18d3b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -444,7 +444,7 @@ protected MultiblockUIFactory createUIFactory() { title = GTGuiTextures.FUSION_REACTOR_MK3_TITLE; } - DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent, null); + DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent); return new MultiblockUIFactory(this) .setSize(198, 236) .setScreenHeight(138) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 697d98a9823..cbf70584383 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -600,8 +600,8 @@ public int getProgressBarCount() { int index) { return switch (index) { case 0 -> { - IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt, null); - IntSyncValue maxCWUtValue = new IntSyncValue(hpcaHandler::getMaxCWUt, null); + IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt); + IntSyncValue maxCWUtValue = new IntSyncValue(hpcaHandler::getMaxCWUt); panelSyncManager.syncValue("current_cwut", currentCWUtValue); panelSyncManager.syncValue("max_cwut", maxCWUtValue); @@ -619,7 +619,7 @@ yield new ProgressWidget() }); } case 1 -> { - DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature, null); + DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature); panelSyncManager.syncValue("temperature", temperatureValue); yield new ProgressWidget() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index cc38ef58c1d..fc89a6253d2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -11,16 +11,15 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IBatteryData; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.IProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; -import gregtech.api.pattern.BlockPattern; -import gregtech.api.pattern.FactoryBlockPattern; -import gregtech.api.pattern.MultiblockShapeInfo; +import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.BigIntegerSyncValue; +import gregtech.api.pattern.BlockPattern; +import gregtech.api.pattern.FactoryBlockPattern; +import gregtech.api.pattern.MultiblockShapeInfo; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.BlockInfo; @@ -391,13 +390,13 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { if (averageInLastSec > averageOutLastSec) { IKey timeToFill = getTimeToFillDrainText(energyCapacity.subtract(energyStored) .divide(BigInteger.valueOf((averageInLastSec - averageOutLastSec) * 20))); - timeToFill.format(TextFormatting.GREEN); + timeToFill.style(TextFormatting.GREEN); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_fill", timeToFill)); } else if (averageInLastSec < averageOutLastSec) { IKey timeToDrain = getTimeToFillDrainText( energyStored.divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20))); - timeToDrain.format(TextFormatting.RED); + timeToDrain.style(TextFormatting.RED); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_drain", timeToDrain)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 668ab77aa91..1114044e546 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -299,7 +299,7 @@ public int getProgressBarCount() { return null; } return fluid.getName(); - }, null); + }); panelSyncManager.syncValue("fuel_amount", fuelValue); panelSyncManager.syncValue("fuel_name", fuelNameValue); @@ -334,7 +334,7 @@ yield new ProgressWidget() } case 2 -> { FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null); - BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed, null); + BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed); panelSyncManager.syncValue("oxygen_amount", oxygenValue); panelSyncManager.syncValue("boost_allowed", boostValue); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 5f1f3309895..9983f816dc9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -352,7 +352,7 @@ public int getProgressBarCount() { return null; } return fluid.getName(); - }, null); + }); panelSyncManager.syncValue("fuel_amount", fuelValue); panelSyncManager.syncValue("fuel_name", fuelNameValue); @@ -370,7 +370,7 @@ yield new ProgressWidget() return 0; } return rotorHolder.getRotorSpeed(); - }, null); + }); IntSyncValue rotorMaxSpeedValue = new IntSyncValue(() -> { IRotorHolder rotorHolder = getRotorHolder(); @@ -378,7 +378,7 @@ yield new ProgressWidget() return 0; } return rotorHolder.getMaxRotorHolderSpeed(); - }, null); + }); panelSyncManager.syncValue("rotor_speed", rotorSpeedValue); panelSyncManager.syncValue("rotor_max_speed", rotorMaxSpeedValue); @@ -407,14 +407,14 @@ yield new ProgressWidget() return 0; } return rotorHolder.getRotorDurabilityPercent(); - }, null); + }); IntSyncValue efficiencyValue = new IntSyncValue(() -> { IRotorHolder rotorHolder = getRotorHolder(); if (rotorHolder == null) { return 0; } return rotorHolder.getRotorEfficiency(); - }, null); + }); panelSyncManager.syncValue("rotor_durability", durabilityValue); panelSyncManager.syncValue("rotor_efficiency", efficiencyValue); diff --git a/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java b/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java deleted file mode 100644 index c571e2de1b8..00000000000 --- a/src/main/java/gregtech/mixins/mui2/IntSyncValueMixin.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.value.sync.IntSyncValue; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.IntConsumer; -import java.util.function.IntSupplier; - -// todo remove once mui2 rc3 is released -@Mixin(value = IntSyncValue.class, remap = false) -public abstract class IntSyncValueMixin { - - @Shadow - private int cache; - - @Inject(method = "(Ljava/util/function/IntSupplier;Ljava/util/function/IntConsumer;)V", at = @At("TAIL")) - public void setCache(IntSupplier getter, IntConsumer setter, CallbackInfo ci) { - this.cache = getter.getAsInt(); - } -} diff --git a/src/main/java/gregtech/mixins/mui2/TextMixins.java b/src/main/java/gregtech/mixins/mui2/TextMixins.java deleted file mode 100644 index 81d2a5e809d..00000000000 --- a/src/main/java/gregtech/mixins/mui2/TextMixins.java +++ /dev/null @@ -1,136 +0,0 @@ -package gregtech.mixins.mui2; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.BaseKey; -import com.cleanroommc.modularui.drawable.text.CompoundKey; -import com.cleanroommc.modularui.drawable.text.RichText; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widgets.RichTextWidget; -import com.llamalad7.mixinextras.injector.wrapoperation.Operation; -import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -import java.util.function.Consumer; - -public abstract class TextMixins { - - @Mixin(value = BaseKey.class, remap = false) - public static abstract class BaseKeyMixin { - - @WrapOperation(method = "format(Lnet/minecraft/util/text/TextFormatting;)Lcom/cleanroommc/modularui/drawable/text/BaseKey;", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/drawable/text/FontRenderHelper;addAfter([Lnet/minecraft/util/text/TextFormatting;Lnet/minecraft/util/text/TextFormatting;)V")) - public void nullSafe(TextFormatting[] state, TextFormatting formatting, Operation original) { - if (formatting != null) original.call(state, formatting); - } - } - - // todo check if can remove once rc3 is released - @Mixin(value = CompoundKey.class, remap = false) - public abstract static class KeyCompMixin extends BaseKey { - - @Redirect(method = "get", - at = @At(value = "INVOKE", - target = "Lcom/cleanroommc/modularui/api/drawable/IKey;get()Ljava/lang/String;")) - public String formatTheKeys(IKey key) { - return key.getFormatted(); - } - } - - // todo remove once rc3 is released - @Mixin(value = RichTooltip.class, remap = false) - public abstract static class TooltipMixin { - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer tooltipBuilder; - - @Shadow - public abstract RichTooltip getThis(); - - @Shadow - public abstract void markDirty(); - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void buildTooltip() { - this.dirty = false; - if (this.tooltipBuilder != null) { - this.text.clearText(); - this.tooltipBuilder.accept(getThis()); - } - } - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public RichTooltip tooltipBuilder(Consumer tooltipBuilder) { - Consumer existingBuilder = this.tooltipBuilder; - if (existingBuilder != null) { - this.tooltipBuilder = tooltip -> { - existingBuilder.accept(getThis()); - tooltipBuilder.accept(getThis()); - }; - } else { - this.tooltipBuilder = tooltipBuilder; - } - markDirty(); - return getThis(); - } - } - - @Mixin(value = RichTextWidget.class, remap = false) - private abstract static class RichTextWidgetMixin extends Widget { - - @Shadow - private boolean autoUpdate; - - @Shadow - private boolean dirty; - - @Shadow - @Final - private RichText text; - - @Shadow - private Consumer builder; - - /** - * @author GTCEu - Ghzdude - * @reason Implement MUI2 PR#83 - */ - @Overwrite - public void draw(ModularGuiContext context, WidgetTheme widgetTheme) { - super.draw(context, widgetTheme); - if (this.autoUpdate || this.dirty) { - if (this.builder != null) { - this.text.clearText(); - this.builder.accept(this.text); - } - this.dirty = false; - } - this.text.drawAtZero(context, getArea(), widgetTheme); - } - } -} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index 946632bf1c0..f313fa2b32d 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,8 +8,6 @@ "maxShiftBy": 10 }, "mixins": [ - "IntSyncValueMixin", - "KeyCompMixin", "ModularPanelMixin" ], "client": [ From 7ee7ca5945e8c1a8af3db9e99485bc00e3cdff9c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:29:02 -0700 Subject: [PATCH 102/264] fix formatting --- .../api/mui/serialize/KeySerializer.java | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java index 03b679e082d..27a075c3256 100644 --- a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java +++ b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java @@ -1,5 +1,8 @@ package gregtech.api.mui.serialize; +import com.cleanroommc.modularui.drawable.text.FormattingState; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; + import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IKey; @@ -14,9 +17,17 @@ import com.google.gson.JsonSerializationContext; import org.apache.commons.lang3.ArrayUtils; +import java.util.Map; + public class KeySerializer implements JsonHandler { - // todo fix formatting + private static final Map FORMATTING_MAP = new Object2ObjectOpenHashMap<>(); + + static { + for (var tf : TextFormatting.values()) { + FORMATTING_MAP.put(tf.toString(), tf); + } + } @Override public IKey deserialize(JsonElement json, JsonDeserializationContext context) @@ -26,11 +37,10 @@ public IKey deserialize(JsonElement json, JsonDeserializationContext context) return IKey.str(object.get("string").getAsString()); } else if (object.has("lang")) { String lang = context.deserialize(object.get("lang"), String.class); - // FormattingState formatting = new FormattingState(); - // formatting.parseFrom(object.get("format").getAsString()); + TextFormatting[] formatting = deserializeArray(object.getAsJsonArray("format"), context, TextFormatting[]::new); Object[] args = deserializeArray( object.getAsJsonArray("args"), context, Object[]::new); - return IKey.lang(lang, args); + return IKey.lang(lang, args).style(formatting); } else if (object.has("keys")) { IKey[] keys = deserializeArray( object.getAsJsonArray("keys"), context, IKey[]::new); @@ -48,16 +58,25 @@ public JsonElement serialize(IKey src, JsonSerializationContext context) { obj.add("string", context.serialize(src.getFormatted())); } else if (src instanceof LangKey langKey) { obj.add("lang", context.serialize(langKey.getKeySupplier().get())); - // var formatting = langKey.getFormatting(); - // if (formatting != null) - // obj.addProperty("format", formatting.toString()); + TextFormatting[] formattings = convert(langKey.getFormatting()); + obj.add("format", serializeArray(formattings, context)); Object[] args = langKey.getArgsSupplier().get(); if (!ArrayUtils.isEmpty(args)) obj.add("args", serializeArray(args, context)); } else if (src instanceof CompoundKey compoundKey) { obj.add("keys", serializeArray(compoundKey.getKeys(), context)); - // obj.add("format", context.serialize(compoundKey.getFormatting())); + obj.add("format", serializeArray(convert(compoundKey.getFormatting()), context)); } return obj; } + + public static TextFormatting[] convert(FormattingState state) { + if (state == null) return new TextFormatting[0]; + String s = state.getFormatting(); + TextFormatting[] formattings = new TextFormatting[s.length() / 2]; + for (int i = 0; i < s.length(); i += 2) { + formattings[i / 2] = FORMATTING_MAP.get(s.substring(i, i + 2)); + } + return formattings; + } } From 51db1e7d8139caa997331df59f25aea5186d121f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Feb 2025 23:36:26 -0700 Subject: [PATCH 103/264] add note --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 2196f9aecfd..4d057f0d19e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -268,6 +268,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { display.setAction(this.displayText); display.sync("display", syncManager); + // todo scrolling doesn't work for rich text widget var scrollWidget = new ScrollWidget<>(new VerticalScrollData()) .sizeRel(1f) .child(new RichTextWidget() From 9d51988defc1c603098576b07a260517255d159b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 13:11:47 -0700 Subject: [PATCH 104/264] fix prev duration being zero --- .../api/capability/impl/MultiblockFuelRecipeLogic.java | 7 +++++++ .../generator/MetaTileEntityLargeCombustionEngine.java | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java index e48dbcb530d..324934fb394 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockFuelRecipeLogic.java @@ -23,6 +23,7 @@ public class MultiblockFuelRecipeLogic extends MultiblockRecipeLogic { protected long totalContinuousRunningTime; + private int previousDuration = 0; public MultiblockFuelRecipeLogic(RecipeMapMultiblockController tileEntity) { super(tileEntity); @@ -127,6 +128,7 @@ public String getRecipeFluidInputInfo() { } else { recipe = previousRecipe; } + previousDuration = recipe.getDuration(); FluidStack requiredFluidInput = recipe.getFluidInputs().get(0).getInputFluidStack(); int ocAmount = GTUtility.safeCastLongToInt(getMaxVoltage() / recipe.getEUt()); @@ -139,6 +141,11 @@ public String getRecipeFluidInputInfo() { return TextFormatting.RED + TextFormattingUtil.formatNumbers(neededAmount) + "L"; } + @Override + public int getPreviousRecipeDuration() { + return previousDuration; + } + public FluidStack getInputFluidStack() { // Previous Recipe is always null on first world load, so try to acquire a new recipe if (previousRecipe == null) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 1114044e546..8c9234788e9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -131,7 +131,6 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); } - // todo fix prev duration being 0 on first ui open builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) .addCustom(richText -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { From c77ab0e7063d614c58d7c68f02ed77f61b1f7eed Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:25:19 -0700 Subject: [PATCH 105/264] add string with formatting and number method to KeyUtil don't use lang for basic string formatting --- .../multiblock/ui/MultiblockUIFactory.java | 4 ++-- src/main/java/gregtech/api/util/KeyUtil.java | 15 ++++++++++++++- .../electric/MetaTileEntityProcessingArray.java | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 4d057f0d19e..22dffadeb02 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -471,8 +471,8 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", - TextFormattingUtil.formatNumbers(maxVoltage), - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + KeyUtil.number(maxVoltage), + KeyUtil.string(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)])); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index ed7e3797a04..a2c4f2c9ab4 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -28,10 +28,19 @@ public static IKey string(TextFormatting formatting, String string) { return IKey.str(string).style(formatting); } + public static IKey string(TextFormatting formatting, String string, Object... args) { + if (string == null) return IKey.EMPTY; + return IKey.str(string, args).style(formatting); + } + public static IKey string(TextFormatting formatting, Supplier stringSupplier) { return IKey.dynamic(stringSupplier).style(formatting); } + public static IKey string(TextFormatting formatting, Supplier stringSupplier, Supplier argSupplier) { + return IKey.dynamic(() -> String.format(stringSupplier.get(), argSupplier.get())).style(formatting); + } + public static IKey string(Supplier formatting, String s) { return IKey.dynamic(() -> IKey.str(s).style(formatting.get()).getFormatted()); } @@ -56,8 +65,12 @@ public static IKey lang(Supplier formatting, String lang, Suppli return IKey.dynamic(() -> lang(lang, argSupplier.get()).style(formatting.get()).getFormatted()); } + public static IKey number(long number) { + return string(TextFormattingUtil.formatNumbers(number)); + } + public static IKey number(TextFormatting formatting, long number) { - return string(formatting, TextFormattingUtil.formatNumbers(number)); + return number(number).style(formatting); } public static IKey number(TextFormatting formatting, long number, String suffix) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index e4fd5a11478..2dd9a95b2d9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -208,7 +208,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { String key = logic.getMachineStack().getTranslationKey(); IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, key + ".name"); - mapText = KeyUtil.lang( + mapText = KeyUtil.string( TextFormatting.DARK_PURPLE, "%sx %s", logic.getParallelLimit(), mapText); From e96dbdd9b754c774e5cbd25e2bba6a0c0594774f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 14:27:46 -0700 Subject: [PATCH 106/264] spotless --- .../java/gregtech/api/mui/serialize/KeySerializer.java | 10 +++++----- src/main/java/gregtech/api/util/KeyUtil.java | 3 ++- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java index 27a075c3256..4563c179125 100644 --- a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java +++ b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java @@ -1,13 +1,11 @@ package gregtech.api.mui.serialize; -import com.cleanroommc.modularui.drawable.text.FormattingState; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; - import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.text.CompoundKey; import com.cleanroommc.modularui.drawable.text.DynamicKey; +import com.cleanroommc.modularui.drawable.text.FormattingState; import com.cleanroommc.modularui.drawable.text.LangKey; import com.cleanroommc.modularui.drawable.text.StringKey; import com.google.gson.JsonDeserializationContext; @@ -15,6 +13,7 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonSerializationContext; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import org.apache.commons.lang3.ArrayUtils; import java.util.Map; @@ -37,7 +36,8 @@ public IKey deserialize(JsonElement json, JsonDeserializationContext context) return IKey.str(object.get("string").getAsString()); } else if (object.has("lang")) { String lang = context.deserialize(object.get("lang"), String.class); - TextFormatting[] formatting = deserializeArray(object.getAsJsonArray("format"), context, TextFormatting[]::new); + TextFormatting[] formatting = deserializeArray(object.getAsJsonArray("format"), context, + TextFormatting[]::new); Object[] args = deserializeArray( object.getAsJsonArray("args"), context, Object[]::new); return IKey.lang(lang, args).style(formatting); @@ -59,7 +59,7 @@ public JsonElement serialize(IKey src, JsonSerializationContext context) { } else if (src instanceof LangKey langKey) { obj.add("lang", context.serialize(langKey.getKeySupplier().get())); TextFormatting[] formattings = convert(langKey.getFormatting()); - obj.add("format", serializeArray(formattings, context)); + obj.add("format", serializeArray(formattings, context)); Object[] args = langKey.getArgsSupplier().get(); if (!ArrayUtils.isEmpty(args)) obj.add("args", serializeArray(args, context)); diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index a2c4f2c9ab4..36851211535 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -37,7 +37,8 @@ public static IKey string(TextFormatting formatting, Supplier stringSupp return IKey.dynamic(stringSupplier).style(formatting); } - public static IKey string(TextFormatting formatting, Supplier stringSupplier, Supplier argSupplier) { + public static IKey string(TextFormatting formatting, Supplier stringSupplier, + Supplier argSupplier) { return IKey.dynamic(() -> String.format(stringSupplier.get(), argSupplier.get())).style(formatting); } From d51c5db0620da29365181c98d373df5254044e03 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 15:35:52 -0700 Subject: [PATCH 107/264] cleanup and new voltage key methods --- .../multiblock/ui/MultiblockUIFactory.java | 20 ++++++----------- .../api/mui/drawables/HoverableKey.java | 2 +- src/main/java/gregtech/api/util/KeyUtil.java | 22 +++++++++++++++++++ .../MetaTileEntityLargeCombustionEngine.java | 1 - .../generator/MetaTileEntityLargeTurbine.java | 9 ++++---- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 22dffadeb02..2cd34bdfc77 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -10,7 +10,6 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLog; -import gregtech.api.util.GTUtility; import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; @@ -472,7 +471,7 @@ public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", KeyUtil.number(maxVoltage), - KeyUtil.string(GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)])); + KeyUtil.voltage(GTValues.VOCNF, maxVoltage)); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); @@ -509,8 +508,7 @@ public Builder addEnergyUsageExactLine(long energyUsage) { if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); + var voltageName = KeyUtil.overclock(GTValues.VOCNF, energyUsage); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); @@ -528,8 +526,7 @@ public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); @@ -549,8 +546,7 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.string( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); + var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_amps", @@ -567,7 +563,7 @@ public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { public Builder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; if (maxCWUt > 0) { - var computation = KeyUtil.string(TextFormatting.AQUA, TextFormattingUtil.formatNumbers(maxCWUt)); + var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.computation.max", computation)); } @@ -582,8 +578,7 @@ public Builder addComputationUsageLine(int maxCWUt) { public Builder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; if (isActive && currentCWUt > 0) { - var computation = KeyUtil.string(TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); + var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.computation.usage", computation)); } @@ -673,8 +668,7 @@ public Builder addProgressLine(double progressPercent) { public Builder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; if (numParallels > 1) { - var parallels = KeyUtil.string(TextFormatting.DARK_PURPLE, - TextFormattingUtil.formatNumbers(numParallels)); + var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.parallel", parallels)); diff --git a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java index af03bc992fd..7cbf0a30a51 100644 --- a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java +++ b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java @@ -30,7 +30,7 @@ public class HoverableKey implements IIcon, IHoverable, ITooltip { private IKey key; private HoverableKey() { - tooltip(t -> t.setAutoUpdate(true)); + tooltipAutoUpdate(true); tooltipBuilder(t -> t.addDrawableLines(getTooltipLines())); } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 36851211535..41d9fa06feb 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -102,6 +102,28 @@ public static IKey number(Supplier formatting, LongSupplier supp return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } + /** + * Calls {@link GTUtility#getFloorTierByVoltage(long)} to get the voltage tier + * + * @param array Array of voltage names + * @param voltage The max voltage + * @return the voltage name for the given voltage tier + */ + public static IKey voltage(String[] array, long voltage) { + return string(array[GTUtility.getFloorTierByVoltage(voltage)]); + } + + /** + * Calls {@link GTUtility#getFloorTierByVoltage(long)} to get the voltage tier + * + * @param array Array of voltage names + * @param voltage The max voltage + * @return the voltage name for the given voltage tier + */ + public static IKey overclock(String[] array, long voltage) { + return string(array[GTUtility.getOCTierByVoltage(voltage)]); + } + public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; return HoverableKey.of(body, hover); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 8c9234788e9..e1f332526fa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -145,7 +145,6 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { @Override protected void configureErrorText(MultiblockUIFactory.Builder builder) { - super.configureErrorText(builder); var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; builder.addCustom(keyList -> { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 9983f816dc9..a8f8e8e5ebf 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -212,8 +212,8 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { @Override protected void configureWarningText(MultiblockUIFactory.Builder builder) { builder.addCustom(keyList -> { - if (!isStructureFormed()) return; - if (getRotorHolder() == null) return; + if (!isStructureFormed() || getRotorHolder() == null) + return; int rotorEfficiency = getRotorHolder().getRotorEfficiency(); int rotorDurability = getRotorHolder().getRotorDurabilityPercent(); @@ -229,8 +229,8 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { @Override protected void configureErrorText(MultiblockUIFactory.Builder builder) { builder.addCustom(keyList -> { - if (!isStructureFormed()) return; - if (getRotorHolder() == null) return; + if (!isStructureFormed() || getRotorHolder() == null) + return; if (!isRotorFaceFree()) { keyList.add(KeyUtil.lang(TextFormatting.RED, @@ -240,7 +240,6 @@ protected void configureErrorText(MultiblockUIFactory.Builder builder) { } int rotorEfficiency = getRotorHolder().getRotorEfficiency(); - // todo fix "no rotor" tooltip always being shown on first ui open if (rotorEfficiency <= 0) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.turbine.no_rotor")); From a41ee0fa8d268395594f5e60300203a24602d096 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 16:10:34 -0700 Subject: [PATCH 108/264] add status tooltip for fusion reactor --- .../multiblock/ui/MultiblockUIFactory.java | 17 ++++++++++++----- .../electric/MetaTileEntityFusionReactor.java | 9 ++++++++- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 2cd34bdfc77..0a70a0e66df 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -396,7 +396,7 @@ public static final class Bars { private Bars() {} } - protected static Builder builder() { + public static Builder builder() { return new Builder(); } @@ -812,11 +812,11 @@ public Builder addCustom(Consumer> customConsumer) { return this; } - protected boolean isEmpty() { + public boolean isEmpty() { return textList.isEmpty(); } - protected void clear() { + public void clear() { textList.clear(); } @@ -872,13 +872,20 @@ public void readOnServer(int id, PacketBuffer buf) {} }; } - protected void build(IRichTextBuilder richText) { - if (dirty) build(); + public void build(IRichTextBuilder richText) { + if (dirty) { + build(); + dirty = false; + } for (IDrawable drawable : textList) { richText.addLine(drawable).spaceLine(2); } } + public void markDirty() { + dirty = true; + } + protected void build() { this.textList.clear(); if (this.action != null) this.action.accept(this); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 3a49ae18d3b..465b8a3a6fa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -457,7 +457,14 @@ protected MultiblockUIFactory createUIFactory() { .size(69, 12)) .child(new ProgressWidget() .size(77, 77) - // todo status tooltip + .tooltipAutoUpdate(true) + // this is fine client only because these values are already synced + .tooltipBuilder(tooltip -> MultiblockUIFactory.builder() + .structureFormed(isStructureFormed()) + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), + recipeMapWorkable.isActive()) + .addWorkingStatusLine() + .build(tooltip)) .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() .size(89, 101) .marginTop(11)) From 2d23857308952ed9ac0e954e20a98c0a5f84b1af Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Feb 2025 18:06:42 -0700 Subject: [PATCH 109/264] fix format number with precision truncate PSS stored/capacity show full amount in hoverable tooltip --- .../gregtech/api/util/TextFormattingUtil.java | 42 ++++++++++++++++++- .../MetaTileEntityPowerSubstation.java | 24 ++++++++--- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/api/util/TextFormattingUtil.java b/src/main/java/gregtech/api/util/TextFormattingUtil.java index ba3e3606f43..cbf02c18bf4 100644 --- a/src/main/java/gregtech/api/util/TextFormattingUtil.java +++ b/src/main/java/gregtech/api/util/TextFormattingUtil.java @@ -1,5 +1,6 @@ package gregtech.api.util; +import java.math.BigInteger; import java.text.NumberFormat; public class TextFormattingUtil { @@ -13,9 +14,23 @@ public class TextFormattingUtil { 1_000_000_000_000_000_000L }; + private static final BigInteger[] metricBigSuffixValues = { + BigInteger.TEN.pow(3), + BigInteger.TEN.pow(6), + BigInteger.TEN.pow(9), + BigInteger.TEN.pow(12), + BigInteger.TEN.pow(15), + BigInteger.TEN.pow(18), + BigInteger.TEN.pow(21), + BigInteger.TEN.pow(24), + BigInteger.TEN.pow(27), + BigInteger.TEN.pow(30) + }; + private static final char[] metricSuffixChars = { - 'k', 'M', 'G', 'T', 'P', 'E' + 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y', 'R', 'Q' }; + private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(); public static String formatLongToCompactString(long value, int precision) { @@ -36,13 +51,36 @@ public static String formatLongToCompactString(long value, int precision) { long suffixValue = metricSuffixValues[i]; stb.append(value / suffixValue); - long truncatedDigit = value % suffixValue / (suffixValue / 10); + long truncatedDigit = value % suffixValue / (suffixValue / (long) Math.pow(10, precision - 3)); if (truncatedDigit > 0) { stb.append('.').append(truncatedDigit); } return stb.append(metricSuffixChars[i]).toString(); } + public static String formatBigIntToCompactString(BigInteger value, int precision) { + if (BigInteger.ZERO.equals(value) || value.abs().compareTo(BigInteger.TEN.pow(precision)) < 0) { + return value.toString(); // deal with easy case + } + + StringBuilder stb = new StringBuilder(); + if (value.signum() == -1) { + stb.append('-'); + value = value.abs(); + } + + int c = 0; + while (value.compareTo(metricBigSuffixValues[c]) >= 0) { + c++; + } + + return stb.append(value.divide(metricBigSuffixValues[c - 1])) + .append('.') + .append(value.toString(), 4, precision + 1) + .append(metricSuffixChars[c - 1]) + .toString(); + } + public static String formatLongToCompactString(long value) { return formatLongToCompactString(value, 3); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index fc89a6253d2..4ded890e31d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -354,16 +354,28 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { BigInteger energyCapacity = energyBank.getCapacity(); // Stored EU line - IKey storedFormatted = KeyUtil.string(TextFormatting.GOLD, + IKey storedFormatted = KeyUtil.string( TextFormattingUtil.formatNumbers(energyStored) + " EU"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.stored", - storedFormatted)); + + IKey truncated = KeyUtil.string(TextFormatting.GOLD, + TextFormattingUtil.formatBigIntToCompactString(energyStored, 7) + " EU"); + + IKey bodyStored = (KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.stored", + truncated)); + + list.add(KeyUtil.setHover(bodyStored, storedFormatted)); // EU Capacity line - IKey capacityFormatted = KeyUtil.string(TextFormatting.GOLD, + IKey capacityFormatted = KeyUtil.string( TextFormattingUtil.formatNumbers(energyCapacity) + " EU"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.capacity", - capacityFormatted)); + + IKey capCompact = KeyUtil.string(TextFormatting.GOLD, + TextFormattingUtil.formatBigIntToCompactString(energyCapacity, 7) + " EU"); + + IKey bodyCap = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.capacity", + capCompact); + + list.add(KeyUtil.setHover(bodyCap, capacityFormatted)); // Passive Drain line IKey passiveDrain = KeyUtil.string(TextFormatting.DARK_RED, From 40773101c0a31bde13d1ec01a1ea6ab62114047c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 00:33:16 -0700 Subject: [PATCH 110/264] add runnable to update structure formed for error/warning builders more cleanup --- .../multiblock/RecipeMapMultiblockController.java | 1 - .../multiblock/ui/MultiblockUIFactory.java | 12 +++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index b1b0068533e..7e17911e8ac 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -199,7 +199,6 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { protected void configureWarningText(MultiblockUIFactory.Builder builder) { builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); - super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 0a70a0e66df..898ab700849 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -98,10 +98,12 @@ private Widget createIndicator(PanelSyncManager syncManager) { Builder error = builder(); error.sync("error", syncManager); error.setAction(this.errorText); + error.onRebuild(() -> error.isStructureFormed = mte.isStructureFormed()); Builder warning = builder(); warning.sync("warning", syncManager); warning.setAction(this.warningText); + warning.onRebuild(() -> warning.isStructureFormed = mte.isStructureFormed()); IDrawable indicator = new DynamicDrawable(() -> { if (!error.isEmpty()) { @@ -118,7 +120,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { .size(18) .pos(174 - 5, screenHeight - 18 - 3) .overlay(indicator) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (!error.isEmpty()) { error.build(t); @@ -416,6 +418,7 @@ public static class Builder { private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD); private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN); private boolean dirty; + private Runnable onRebuild; public Builder structureFormed(boolean structureFormed) { this.isStructureFormed = structureFormed; @@ -874,6 +877,9 @@ public void readOnServer(int id, PacketBuffer buf) {} public void build(IRichTextBuilder richText) { if (dirty) { + if (this.onRebuild != null) { + this.onRebuild.run(); + } build(); dirty = false; } @@ -895,6 +901,10 @@ protected void setAction(Consumer action) { this.action = action; } + public void onRebuild(Runnable onRebuild) { + this.onRebuild = onRebuild; + } + private void addKey(IDrawable key) { this.textList.add(key); } From ed38cb8e0c296706b93e97a6edc23097dea511f2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 00:42:51 -0700 Subject: [PATCH 111/264] more cleanup 2.0 --- .../MultiMapMultiblockController.java | 2 +- .../multiblock/ui/MultiblockUIFactory.java | 4 +-- .../multi/MetaTileEntityLargeBoiler.java | 2 +- .../electric/MetaTileEntityFluidDrill.java | 2 +- .../multi/electric/MetaTileEntityHPCA.java | 4 +-- .../MetaTileEntityPowerSubstation.java | 2 +- .../MetaTileEntityLargeCombustionEngine.java | 6 ++-- .../generator/MetaTileEntityLargeTurbine.java | 6 ++-- .../multiblockpart/MetaTileEntityItemBus.java | 32 ++++++++----------- 9 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 74fe3e1e34d..85ccc575bdd 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -148,7 +148,7 @@ protected MultiblockUIFactory createUIFactory() { .disableHoverBackground() .value(recipeMapValue) .length(getAvailableRecipeMaps().length) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> t.addLine(IKey.comp( IKey.lang("gregtech.multiblock.multiple_recipemaps.value", IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 898ab700849..e43ffe8dea4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -330,7 +330,7 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, .stateBackground(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) .stateBackground(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) .background(GTGuiTextures.BUTTON) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? IKey.lang("gregtech.multiblock.universal.distinct_enabled") : IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); @@ -354,7 +354,7 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull .background(GTGuiTextures.BUTTON) .value(voidingValue) .length(4) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> t.addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 27fb5e08b57..9714042fca7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -441,7 +441,7 @@ public int getProgressBarCount() { .progress(() -> waterCapacityValue.getIntValue() == 0 ? 0 : waterFilledValue.getIntValue() * 1.0 / waterCapacityValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { if (waterFilledValue.getIntValue() == 0) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 0694da8039d..42acb1b6fe6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -395,7 +395,7 @@ public int getProgressBarCount() { return new ProgressWidget() .progress(() -> operationsValue.getIntValue() * 1.0 / BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS) .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { if (operationsValue.getIntValue() == 0) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index cbf70584383..7bc17c8e9e5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -608,7 +608,7 @@ public int getProgressBarCount() { yield new ProgressWidget() .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { t.addLine(IKey.lang("gregtech.multiblock.hpca.computation", @@ -625,7 +625,7 @@ yield new ProgressWidget() yield new ProgressWidget() .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { double temp = temperatureValue.getDoubleValue(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 4ded890e31d..1ffc2250af2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -583,8 +583,8 @@ public int getProgressBarCount() { .progress( () -> energyStoredValue.getValue().doubleValue() / energyCapacityValue.getValue().doubleValue()) .texture(GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW, MultiblockUIFactory.Bars.FULL_WIDTH) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { t.addLine(IKey.lang("gregtech.multiblock.energy_stored", energyStoredValue.getValue(), energyCapacityValue.getValue())); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index e1f332526fa..4ff54723629 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -305,7 +305,7 @@ yield new ProgressWidget() .progress(() -> fuelValue.getValue(1) == 0 ? 0 : 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltip(t -> t.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } case 1 -> { @@ -316,7 +316,7 @@ yield new ProgressWidget() .progress(() -> lubricantValue.getValue(1) == 0 ? 0 : 1.0 * lubricantValue.getValue(0) / lubricantValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { if (lubricantValue.getValue(0) == 0) { @@ -340,8 +340,8 @@ yield new ProgressWidget() .progress(() -> oxygenValue.getValue(1) == 0 ? 0 : 1.0 * oxygenValue.getValue(0) / oxygenValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_OXYGEN, MultiblockUIFactory.Bars.THIRD_WIDTH) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { - t.setAutoUpdate(true); if (isStructureFormed()) { if (boostValue.getBoolValue()) { if (oxygenValue.getValue(0) == 0) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index a8f8e8e5ebf..cb41d6a177c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -359,7 +359,7 @@ yield new ProgressWidget() .progress(() -> fuelValue.getValue(1) == 0 ? 0 : 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltip(t -> t.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); } case 1 -> { @@ -386,7 +386,7 @@ yield new ProgressWidget() .progress(() -> rotorMaxSpeedValue.getIntValue() == 0 ? 0 : 1.0 * rotorSpeedValue.getIntValue() / rotorMaxSpeedValue.getIntValue()) .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { int speed = rotorSpeedValue.getIntValue(); @@ -422,7 +422,7 @@ yield new ProgressWidget() .progress(() -> durabilityValue.getIntValue() / 100.0) .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltip(tooltip -> tooltip.setAutoUpdate(true)) + .tooltipAutoUpdate(true) .tooltipBuilder(t -> { if (isStructureFormed()) { if (efficiencyValue.getIntValue() <= 0) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index 9cf39460989..f1e0acbca35 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -297,9 +297,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage } BooleanSyncValue workingStateValue = new BooleanSyncValue(() -> workingEnabled, val -> workingEnabled = val); - panelSyncManager.syncValue("working_state", workingStateValue); BooleanSyncValue collapseStateValue = new BooleanSyncValue(() -> autoCollapse, val -> autoCollapse = val); - panelSyncManager.syncValue("collapse_state", collapseStateValue); boolean hasGhostCircuit = hasGhostCircuitInventory() && this.circuitInventory != null; @@ -318,26 +316,24 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage .child(GTGuiTextures.getLogo(getUITheme()).asWidget().size(17).top(18 * 3 + 5)) .child(new ToggleButton() .top(18 * 2) - .value(new BoolValue.Dynamic(workingStateValue::getBoolValue, - workingStateValue::setBoolValue)) + .value(workingStateValue) .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) - .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(isExportHatch ? - (workingStateValue.getBoolValue() ? - IKey.lang("gregtech.gui.item_auto_output.tooltip.enabled") : - IKey.lang("gregtech.gui.item_auto_output.tooltip.disabled")) : - (workingStateValue.getBoolValue() ? - IKey.lang("gregtech.gui.item_auto_input.tooltip.enabled") : - IKey.lang("gregtech.gui.item_auto_input.tooltip.disabled"))))) + .tooltipAutoUpdate(true) + .tooltipBuilder(t -> t.addLine(isExportHatch ? + (workingStateValue.getBoolValue() ? + IKey.lang("gregtech.gui.item_auto_output.tooltip.enabled") : + IKey.lang("gregtech.gui.item_auto_output.tooltip.disabled")) : + (workingStateValue.getBoolValue() ? + IKey.lang("gregtech.gui.item_auto_input.tooltip.enabled") : + IKey.lang("gregtech.gui.item_auto_input.tooltip.disabled"))))) .child(new ToggleButton() .top(18) - .value(new BoolValue.Dynamic(collapseStateValue::getBoolValue, - collapseStateValue::setBoolValue)) + .value(collapseStateValue) .overlay(GTGuiTextures.BUTTON_AUTO_COLLAPSE) - .tooltipBuilder(t -> t.setAutoUpdate(true) - .addLine(collapseStateValue.getBoolValue() ? - IKey.lang("gregtech.gui.item_auto_collapse.tooltip.enabled") : - IKey.lang("gregtech.gui.item_auto_collapse.tooltip.disabled")))) + .tooltipAutoUpdate(true) + .tooltipBuilder(t -> t.addLine(collapseStateValue.getBoolValue() ? + IKey.lang("gregtech.gui.item_auto_collapse.tooltip.enabled") : + IKey.lang("gregtech.gui.item_auto_collapse.tooltip.disabled")))) .childIf(hasGhostCircuit, new GhostCircuitSlotWidget() .slot(SyncHandlers.itemSlot(circuitInventory, 0)) .background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY)) From 603b65dac5af2824c13b0906a3aecb2dc5fdcf40 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 00:52:44 -0700 Subject: [PATCH 112/264] simplify item bus grid construction --- .../multiblockpart/MetaTileEntityItemBus.java | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java index f1e0acbca35..c3dae2f0e06 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityItemBus.java @@ -38,10 +38,8 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandlers; @@ -276,29 +274,10 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage rowSize * 18 + 14); // Bus Inv width int backgroundHeight = 18 + 18 * rowSize + 94; - List> widgets = new ArrayList<>(); - for (int i = 0; i < rowSize; i++) { - widgets.add(new ArrayList<>()); - for (int j = 0; j < rowSize; j++) { - int index = i * rowSize + j; - IItemHandlerModifiable handler = isExportHatch ? exportItems : importItems; - widgets.get(i) - .add(new ItemSlot() - .slot(SyncHandlers.itemSlot(handler, index) - .slotGroup("item_inv") - .changeListener((newItem, onlyAmountChanged, client, init) -> { - if (onlyAmountChanged && - handler instanceof GTItemStackHandler gtHandler) { - gtHandler.onContentsChanged(index); - } - }) - .accessibility(!isExportHatch, true))); - } - } - BooleanSyncValue workingStateValue = new BooleanSyncValue(() -> workingEnabled, val -> workingEnabled = val); BooleanSyncValue collapseStateValue = new BooleanSyncValue(() -> autoCollapse, val -> autoCollapse = val); + IItemHandlerModifiable handler = isExportHatch ? exportItems : importItems; boolean hasGhostCircuit = hasGhostCircuitInventory() && this.circuitInventory != null; return GTGuis.createPanel(this, backgroundWidth, backgroundHeight) @@ -309,7 +288,16 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManage .minElementMargin(0, 0) .minColWidth(18).minRowHeight(18) .alignX(0.5f) - .matrix(widgets)) + .mapTo(rowSize, rowSize * rowSize, index -> new ItemSlot() + .slot(SyncHandlers.itemSlot(handler, index) + .slotGroup("item_inv") + .changeListener((newItem, onlyAmountChanged, client, init) -> { + if (onlyAmountChanged && + handler instanceof GTItemStackHandler gtHandler) { + gtHandler.onContentsChanged(index); + } + }) + .accessibility(!isExportHatch, true)))) .child(Flow.column() .pos(backgroundWidth - 7 - 18, backgroundHeight - 18 * 4 - 7 - 5) .width(18).height(18 * 4 + 5) From a359a10b0b4f39d4aea0a0eea12f18cbdf97b5ba Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:06:19 -0700 Subject: [PATCH 113/264] actually mark dirty on change only add muffler and maint line they're enabled --- .../multiblock/ui/MultiblockUIFactory.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index e43ffe8dea4..7d69ac374d0 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -59,8 +59,14 @@ public class MultiblockUIFactory { public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; - configureErrorText(builder -> builder.addMufflerObstructedLine(!mte.isMufflerFaceFree())); - configureWarningText(builder -> builder.addMaintenanceProblemLines(mte.getMaintenanceProblems())); + configureErrorText(builder -> { + if (mte.hasMufflerMechanics()) + builder.addMufflerObstructedLine(!mte.isMufflerFaceFree()); + }); + configureWarningText(builder -> { + if (mte.hasMaintenanceMechanics()) + builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); + }); configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } @@ -816,11 +822,11 @@ public Builder addCustom(Consumer> customConsumer) { } public boolean isEmpty() { - return textList.isEmpty(); + return this.textList.isEmpty(); } public void clear() { - textList.clear(); + this.textList.clear(); } protected boolean hasChanged() { @@ -846,8 +852,12 @@ private SyncHandler makeSyncHandler() { @Override public void detectAndSendChanges(boolean init) { if (init || hasChanged()) { - if (init) build(); + if (init) { + onRebuild(); + build(); + } sync(0, this::syncText); + markDirty(); } } @@ -877,9 +887,7 @@ public void readOnServer(int id, PacketBuffer buf) {} public void build(IRichTextBuilder richText) { if (dirty) { - if (this.onRebuild != null) { - this.onRebuild.run(); - } + onRebuild(); build(); dirty = false; } @@ -888,12 +896,18 @@ public void build(IRichTextBuilder richText) { } } + private void onRebuild() { + if (this.onRebuild != null) { + this.onRebuild.run(); + } + } + public void markDirty() { dirty = true; } protected void build() { - this.textList.clear(); + clear(); if (this.action != null) this.action.accept(this); } From d7536e2ed8dd46f65d49928e8f71fa25b505d55f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 13:59:50 -0700 Subject: [PATCH 114/264] add hpca grid to screen --- .../api/capability/IHPCAComponentHatch.java | 11 ++++++++ .../java/gregtech/api/mui/GTGuiTextures.java | 19 ++++++++++++++ .../multi/electric/MetaTileEntityHPCA.java | 25 +++++++++++++++++++ .../hpca/MetaTileEntityHPCABridge.java | 8 ++++++ .../hpca/MetaTileEntityHPCAComputation.java | 13 ++++++++++ .../hpca/MetaTileEntityHPCACooler.java | 8 ++++++ 6 files changed, 84 insertions(+) diff --git a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java index fbd9915ebdb..47a9cce3729 100644 --- a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java +++ b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java @@ -1,6 +1,9 @@ package gregtech.api.capability; import gregtech.api.gui.resources.TextureArea; +import gregtech.api.mui.GTGuiTextures; + +import com.cleanroommc.modularui.drawable.UITexture; public interface IHPCAComponentHatch { @@ -46,5 +49,13 @@ default void setDamaged(boolean damaged) {} /** * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. */ + @Deprecated TextureArea getComponentIcon(); + + /** + * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. + */ + default UITexture getComponentIcon2() { + return GTGuiTextures.HPCA_ICON_EMPTY_COMPONENT; + } } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 3d0adff0eb2..e082b6800ad 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -174,6 +174,25 @@ public static class IDs { .canApplyTheme() .build(); + // HPCA Component icons + public static final UITexture BLANK_TRANSPARENT = fullImage("textures/gui/base/blank_transparent.png"); + public static final UITexture HPCA_COMPONENT_OUTLINE = fullImage("textures/gui/widget/hpca/component_outline.png"); + public static final UITexture HPCA_ICON_EMPTY_COMPONENT = fullImage("textures/gui/widget/hpca/empty_component.png"); + public static final UITexture HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT = fullImage( + "textures/gui/widget/hpca/advanced_computation_component.png"); + public static final UITexture HPCA_ICON_BRIDGE_COMPONENT = fullImage( + "textures/gui/widget/hpca/bridge_component.png"); + public static final UITexture HPCA_ICON_COMPUTATION_COMPONENT = fullImage( + "textures/gui/widget/hpca/computation_component.png"); + public static final UITexture HPCA_ICON_ACTIVE_COOLER_COMPONENT = fullImage( + "textures/gui/widget/hpca/active_cooler_component.png"); + public static final UITexture HPCA_ICON_HEAT_SINK_COMPONENT = fullImage( + "textures/gui/widget/hpca/heat_sink_component.png"); + public static final UITexture HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT = fullImage( + "textures/gui/widget/hpca/damaged_advanced_computation_component.png"); + public static final UITexture HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT = fullImage( + "textures/gui/widget/hpca/damaged_computation_component.png"); + public static final UITexture[] BUTTON_BLACKLIST = slice("textures/gui/widget/button_blacklist.png", 16, 32, 16, 16, true); public static final UITexture[] BUTTON_IGNORE_DAMAGE = slice("textures/gui/widget/button_filter_damage.png", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 7bc17c8e9e5..c6c04a36527 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -57,10 +57,13 @@ import codechicken.lib.vec.Matrix4; 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.UITexture; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.layout.Grid; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import org.jetbrains.annotations.NotNull; @@ -455,6 +458,20 @@ protected void addErrorText(List textList) { } } + @Override + protected MultiblockUIFactory createUIFactory() { + return super.createUIFactory() + .addScreenChildren(iWidgets -> iWidgets.add(new Grid() + .coverChildren() + .leftRel(0.5f) + .bottom(4) + .minElementMargin(1) + .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) + .asWidget() + // could add tooltips here showing the name of the component + .size(18)))); + } + @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) @@ -1018,6 +1035,7 @@ public void addErrors2(List richText) { } } + @Deprecated public TextureArea getComponentTexture(int index) { if (components.size() <= index) { return GuiTextures.BLANK_TRANSPARENT; @@ -1025,6 +1043,13 @@ public TextureArea getComponentTexture(int index) { return components.get(index).getComponentIcon(); } + public UITexture getComponentTexture2(int index) { + if (components.size() <= index) { + return GTGuiTextures.BLANK_TRANSPARENT; + } + return components.get(index).getComponentIcon2(); + } + public void tryGatherClientComponents(World world, BlockPos pos, EnumFacing frontFacing, EnumFacing upwardsFacing, boolean flip) { EnumFacing relativeUp = RelativeDirection.UP.getRelativeFacing(frontFacing, upwardsFacing, flip); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java index 9af74c4227b..f49e6f19287 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java @@ -5,11 +5,14 @@ import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import net.minecraft.util.ResourceLocation; +import com.cleanroommc.modularui.drawable.UITexture; + public class MetaTileEntityHPCABridge extends MetaTileEntityHPCAComponent { public MetaTileEntityHPCABridge(ResourceLocation metaTileEntityId) { @@ -41,6 +44,11 @@ public TextureArea getComponentIcon() { return GuiTextures.HPCA_ICON_BRIDGE_COMPONENT; } + @Override + public UITexture getComponentIcon2() { + return GTGuiTextures.HPCA_ICON_BRIDGE_COMPONENT; + } + @Override public SimpleOverlayRenderer getFrontActiveOverlay() { return Textures.HPCA_BRIDGE_ACTIVE_OVERLAY; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java index a27376901c9..2c9eadb5ff8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java @@ -6,11 +6,14 @@ import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import net.minecraft.util.ResourceLocation; +import com.cleanroommc.modularui.drawable.UITexture; + public class MetaTileEntityHPCAComputation extends MetaTileEntityHPCAComponent implements IHPCAComputationProvider { private final boolean advanced; @@ -46,6 +49,16 @@ public TextureArea getComponentIcon() { GuiTextures.HPCA_ICON_COMPUTATION_COMPONENT; } + @Override + public UITexture getComponentIcon2() { + if (isDamaged()) { + return advanced ? GTGuiTextures.HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : + GTGuiTextures.HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT; + } + return advanced ? GTGuiTextures.HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT : + GTGuiTextures.HPCA_ICON_COMPUTATION_COMPONENT; + } + @Override public SimpleOverlayRenderer getFrontActiveOverlay() { if (isDamaged()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java index 90d00239f88..fe5aa72cbd9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java @@ -6,11 +6,14 @@ import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.mui.GTGuiTextures; import gregtech.client.renderer.texture.Textures; import gregtech.client.renderer.texture.cube.SimpleOverlayRenderer; import net.minecraft.util.ResourceLocation; +import com.cleanroommc.modularui.drawable.UITexture; + public class MetaTileEntityHPCACooler extends MetaTileEntityHPCAComponent implements IHPCACoolantProvider { private final boolean advanced; @@ -40,6 +43,11 @@ public TextureArea getComponentIcon() { return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; } + @Override + public UITexture getComponentIcon2() { + return advanced ? GTGuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GTGuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; + } + @Override public SimpleOverlayRenderer getFrontActiveOverlay() { return advanced ? Textures.HPCA_ACTIVE_COOLER_ACTIVE_OVERLAY : getFrontOverlay(); From 390a15da43be0cb3a449318815219a8ac260db9c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 18:59:43 -0500 Subject: [PATCH 115/264] Mostly working multi miner port --- .../multiblock/MultiblockWithDisplayBase.java | 1 + .../java/gregtech/api/mui/GTGuiTextures.java | 3 +- .../electric/MetaTileEntityLargeMiner.java | 142 ++++++++---------- .../resources/assets/gregtech/lang/en_us.lang | 9 +- 4 files changed, 71 insertions(+), 84 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index d91ae9b51a1..e6d10ccf24c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -364,6 +364,7 @@ protected void addDisplayText(List textList) { */ protected void handleDisplayClick(String componentData, ClickData clickData) {} + @Deprecated protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 198, 208); diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index e082b6800ad..9236b67ea6b 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -430,7 +430,8 @@ public static class IDs { "textures/gui/widget/button_no_distinct_buses.png", true); public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); - public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); + public static final UITexture[] BUTTON_MINER_MODES = slice("textures/gui/widget/button_miner_modes.png", 18, 72, 18, + 18, true); public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png", true); // TODO new texture public static final UITexture BUTTON_THROTTLE_PLUS = fullImage("textures/gui/widget/button_throttle_plus.png", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index ec77f1e21e3..9143fafd95d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -7,9 +7,7 @@ import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.miner.MultiblockMinerLogic; import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.AdvancedTextWidget; import gregtech.api.gui.widgets.ImageCycleButtonWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.IDataInfoProvider; @@ -17,8 +15,9 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -27,7 +26,7 @@ import gregtech.api.unification.material.Material; import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; -import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMetalCasing; @@ -57,6 +56,9 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -232,79 +234,75 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t } @Override - protected void addDisplayText(List textList) { - super.addDisplayText(textList); + protected MultiblockUIFactory createUIFactory() { + return super.createUIFactory() + .createFlexButton((posGuiData, panelSyncManager) -> { + IntSyncValue buttonSync = new IntSyncValue(this::getCurrentMode, this::setCurrentMode); - if (this.isStructureFormed()) { - if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { - int energyContainer = getEnergyTier(); - long maxVoltage = GTValues.V[energyContainer]; - String voltageName = GTValues.VNF[energyContainer]; - textList.add(new TextComponentTranslation("gregtech.multiblock.max_energy_per_tick", maxVoltage, - voltageName)); - } - - int workingAreaChunks = this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH; - int workingArea = getWorkingArea(minerLogic.getCurrentRadius()); - textList.add(new TextComponentTranslation("gregtech.machine.miner.startx", - this.minerLogic.getX().get() == Integer.MAX_VALUE ? 0 : this.minerLogic.getX().get())); - textList.add(new TextComponentTranslation("gregtech.machine.miner.starty", - this.minerLogic.getY().get() == Integer.MAX_VALUE ? 0 : this.minerLogic.getY().get())); - textList.add(new TextComponentTranslation("gregtech.machine.miner.startz", - this.minerLogic.getZ().get() == Integer.MAX_VALUE ? 0 : this.minerLogic.getZ().get())); - if (this.minerLogic.isChunkMode()) { - textList.add(new TextComponentTranslation("gregtech.machine.miner.working_area_chunks", - workingAreaChunks, workingAreaChunks)); - } else { - textList.add( - new TextComponentTranslation("gregtech.machine.miner.working_area", workingArea, workingArea)); - } - if (this.minerLogic.isDone()) - textList.add(new TextComponentTranslation("gregtech.machine.miner.done") - .setStyle(new Style().setColor(TextFormatting.GREEN))); - else if (this.minerLogic.isWorking()) - textList.add(new TextComponentTranslation("gregtech.machine.miner.working") - .setStyle(new Style().setColor(TextFormatting.GOLD))); - else if (!this.isWorkingEnabled()) - textList.add(new TextComponentTranslation("gregtech.multiblock.work_paused")); - } - } - - private void addDisplayText2(List textList) { - if (this.isStructureFormed()) { - ITextComponent mCoords = new TextComponentString(" ") - .appendSibling(new TextComponentTranslation("gregtech.machine.miner.minex", - this.minerLogic.getMineX().get())) - .appendText("\n ") - .appendSibling(new TextComponentTranslation("gregtech.machine.miner.miney", - this.minerLogic.getMineY().get())) - .appendText("\n ") - .appendSibling(new TextComponentTranslation("gregtech.machine.miner.minez", - this.minerLogic.getMineZ().get())); - textList.add(mCoords); - } + return new CycleButtonWidget() + .stateCount(4) + .value(buttonSync) + .addTooltip(0, IKey.lang("gregtech.multiblock.miner.neither_mode")) + .addTooltip(1, IKey.lang("gregtech.multiblock.miner.chunk_mode")) + .addTooltip(2, IKey.lang("gregtech.multiblock.miner.silk_touch_mode")) + .addTooltip(3, IKey.lang("gregtech.multiblock.miner.both_modes")) + .stateBackground(0, GTGuiTextures.BUTTON_MINER_MODES[0]) + .stateBackground(1, GTGuiTextures.BUTTON_MINER_MODES[1]) + .stateBackground(2, GTGuiTextures.BUTTON_MINER_MODES[2]) + .stateBackground(3, GTGuiTextures.BUTTON_MINER_MODES[3]); + }); } @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(isStructureFormed() && !drainEnergy(true)) - .addCustom(tl -> { - if (isStructureFormed() && isInventoryFull) { - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.machine.miner.invfull")); + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) + .addEnergyUsageLine(energyContainer) + .addCustom(list -> { + if (isStructureFormed()) { + int workingAreaChunks = this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH; + int workingArea = getWorkingArea(minerLogic.getCurrentRadius()); + + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_at")); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_pos", + minerLogic.getX().get(), minerLogic.getY().get(), minerLogic.getZ().get())); + + if (minerLogic.isChunkMode()) { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.working_area_chunks", + workingAreaChunks, + workingAreaChunks)); + } else { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.working_area", + workingArea, workingArea)); + } + + if (minerLogic.isDone()) { + list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.machine.miner.done")); + } else if (minerLogic.isWorking()) { + list.add(KeyUtil.lang(TextFormatting.GOLD, "gregtech.machine.miner.working")); + } else if (!isWorkingEnabled()) { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.work_paused")); + } } }); } @Override - protected void addErrorText(List textList) { - super.addErrorText(textList); - if (isStructureFormed() && !drainFluid(true)) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.machine.miner.multi.needsfluid")); - } + protected void configureErrorText(MultiblockUIFactory.Builder builder) { + builder.addCustom(list -> { + if (isStructureFormed() && !drainFluid(false)) { + list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); + } + }); + } + + @Override + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(!drainEnergy(true)); + builder.addCustom(list -> { + if (isStructureFormed() && isInventoryFull) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); + } + }); } public IBlockState getCasingState() { @@ -383,14 +381,6 @@ public long getMaxVoltage() { return GTValues.V[GTUtility.getTierByVoltage(energyContainer.getInputVoltage())]; } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - ModularUI.Builder builder = super.createUITemplate(entityPlayer); - builder.widget(new AdvancedTextWidget(63, 31, this::addDisplayText2, 0xFFFFFF) - .setMaxWidthLimit(68).setClickHandler(this::handleDisplayClick)); - return builder; - } - // used for UI private int getCurrentMode() { // 0 -> not chunk mode, not silk touch mode diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index d87d8d025c7..5779c657c8b 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -4887,13 +4887,8 @@ gregtech.machine.miner.multi.production=Produces §f3x§7 more crushed ore than gregtech.machine.miner.fluid_usage=Uses §f%,d L/t §7of §f%s§7, doubled per overclock. gregtech.machine.miner.multi.description=A multiblock mining machine that covers a large area and produces huge quantity of ore. gregtech.machine.miner.multi.needsfluid=No Drilling Fluid! - -gregtech.machine.miner.startx=sX: %d -gregtech.machine.miner.starty=sY: %d -gregtech.machine.miner.startz=sZ: %d -gregtech.machine.miner.minex=mX: %d -gregtech.machine.miner.miney=mY: %d -gregtech.machine.miner.minez=mZ: %d +gregtech.machine.miner.mining_at=Currently mining at: +gregtech.machine.miner.mining_pos=X: %s Y: %s Z: %s gregtech.machine.miner.radius=Radius: %d gregtech.machine.miner.working_area=Working Area: %dx%d blocks gregtech.machine.miner.working_area_chunks=Working Area: %dx%d chunks From 577153b21cae5c10ceb7acdffa362f56a99d2d60 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Feb 2025 17:26:23 -0700 Subject: [PATCH 116/264] fix mine pos for large miner --- .../multi/electric/MetaTileEntityLargeMiner.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 9143fafd95d..a131bb85097 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -264,7 +264,9 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_at")); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_pos", - minerLogic.getX().get(), minerLogic.getY().get(), minerLogic.getZ().get())); + minerLogic.getMineX().get(), + minerLogic.getMineY().get(), + minerLogic.getMineZ().get())); if (minerLogic.isChunkMode()) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.working_area_chunks", From 1cbe50eddf8f4067646be45b805d1efe222f4b65 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 22:40:01 -0500 Subject: [PATCH 117/264] Finish off the large miner. Prevent the mode button from being pressed while active. Revert flex button texture split. --- .../java/gregtech/api/mui/GTGuiTextures.java | 3 +- .../electric/MetaTileEntityLargeMiner.java | 36 ++++++++----------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 9236b67ea6b..e082b6800ad 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -430,8 +430,7 @@ public static class IDs { "textures/gui/widget/button_no_distinct_buses.png", true); public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); - public static final UITexture[] BUTTON_MINER_MODES = slice("textures/gui/widget/button_miner_modes.png", 18, 72, 18, - 18, true); + public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png", true); // TODO new texture public static final UITexture BUTTON_THROTTLE_PLUS = fullImage("textures/gui/widget/button_throttle_plus.png", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index a131bb85097..2f6a2ddeae0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -6,9 +6,6 @@ import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.miner.MultiblockMinerLogic; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.IDataInfoProvider; import gregtech.api.metatileentity.MetaTileEntity; @@ -57,6 +54,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.google.common.collect.Lists; @@ -239,17 +237,25 @@ protected MultiblockUIFactory createUIFactory() { .createFlexButton((posGuiData, panelSyncManager) -> { IntSyncValue buttonSync = new IntSyncValue(this::getCurrentMode, this::setCurrentMode); - return new CycleButtonWidget() + return new CycleButtonWidget() { + + @Override + public @NotNull Result onMousePressed(int mouseButton) { + if (minerLogic.isWorking()) { + Interactable.playButtonClickSound(); + return Result.IGNORE; + } else { + return super.onMousePressed(mouseButton); + } + } + } .stateCount(4) .value(buttonSync) + .stateBackground(GTGuiTextures.BUTTON_MINER_MODES) .addTooltip(0, IKey.lang("gregtech.multiblock.miner.neither_mode")) .addTooltip(1, IKey.lang("gregtech.multiblock.miner.chunk_mode")) .addTooltip(2, IKey.lang("gregtech.multiblock.miner.silk_touch_mode")) - .addTooltip(3, IKey.lang("gregtech.multiblock.miner.both_modes")) - .stateBackground(0, GTGuiTextures.BUTTON_MINER_MODES[0]) - .stateBackground(1, GTGuiTextures.BUTTON_MINER_MODES[1]) - .stateBackground(2, GTGuiTextures.BUTTON_MINER_MODES[2]) - .stateBackground(3, GTGuiTextures.BUTTON_MINER_MODES[3]); + .addTooltip(3, IKey.lang("gregtech.multiblock.miner.both_modes")); }); } @@ -423,18 +429,6 @@ private void setCurrentMode(int mode) { } } - @Override - protected @NotNull Widget getFlexButton(int x, int y, int width, int height) { - return new ImageCycleButtonWidget(x, y, width, height, GuiTextures.BUTTON_MINER_MODES, 4, this::getCurrentMode, - this::setCurrentMode) - .setTooltipHoverString(mode -> switch (mode) { - case 0 -> "gregtech.multiblock.miner.neither_mode"; - case 1 -> "gregtech.multiblock.miner.chunk_mode"; - case 2 -> "gregtech.multiblock.miner.silk_touch_mode"; - default -> "gregtech.multiblock.miner.both_modes"; - }); - } - @Override public boolean onScrewdriverClick(EntityPlayer playerIn, EnumHand hand, EnumFacing facing, CuboidRayTraceResult hitResult) { From 27ace53ff798f592d2314dffb395361809488c92 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:01:32 -0500 Subject: [PATCH 118/264] Remove MUI0 methods from FuelMultiblockController, MetaTileEntityCrackingUnit, MetaTileEntityElectricBlastFurnace, MetaTileEntityLargeBoiler, MetaTileEntityLargeCombustionEngine, MetaTileEntityLargeTurbine, MetaTileEntityMultiSmelter, MetaTileEntityProcessingArray, MetaTileEntityPyrolyseOven, MetaTileEntityResearchStation, and RecipeMapMultiblockController. --- .../multiblock/FuelMultiblockController.java | 18 ----- .../RecipeMapMultiblockController.java | 18 ----- .../multi/MetaTileEntityLargeBoiler.java | 53 --------------- .../electric/MetaTileEntityCrackingUnit.java | 34 ---------- .../MetaTileEntityElectricBlastFurnace.java | 24 ------- .../electric/MetaTileEntityMultiSmelter.java | 47 -------------- .../MetaTileEntityProcessingArray.java | 65 ------------------- .../electric/MetaTileEntityPyrolyseOven.java | 30 --------- .../MetaTileEntityResearchStation.java | 24 ------- .../MetaTileEntityLargeCombustionEngine.java | 44 ------------- .../generator/MetaTileEntityLargeTurbine.java | 63 ------------------ 11 files changed, 420 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index 38646d15ea9..4b77471d840 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -47,17 +47,6 @@ protected void initializeAbilities() { this.energyContainer = new EnergyContainerList(outputEnergy); } - @Override - protected void addDisplayText(List textList) { - MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addWorkingStatusLine(); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; @@ -83,13 +72,6 @@ protected long getMaxVoltage() { } } - @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowDynamoTierLine(isDynamoTierTooLow()) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - protected boolean isDynamoTierTooLow() { if (isStructureFormed()) { IEnergyContainer energyContainer = recipeMapWorkable.getEnergyContainer(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 7e17911e8ac..69facf52fe3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -170,24 +170,6 @@ protected boolean allowSameFluidFillForOutputs() { return true; } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - - @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 9714042fca7..9bc5e0e08b7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -108,46 +108,6 @@ private void resetTileAbilities() { this.steamOutputTank = new FluidTankList(true); } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addCustom(tl -> { - if (isStructureFormed()) { - // Steam Output line - ITextComponent steamOutput = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(recipeLogic.getLastTickSteam()) + " L/t"); - - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.steam_output", - steamOutput)); - - // Efficiency line - ITextComponent efficiency = TextComponentUtil.stringWithColor( - getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic.getHeatScaled() + "%"); - - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.efficiency", - efficiency)); - - // Throttle line - ITextComponent throttle = TextComponentUtil.stringWithColor( - getNumberColor(getThrottle()), - getThrottle() + "%"); - - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.throttle", - throttle)); - } - }) - .addWorkingStatusLine(); - } - private TextFormatting getNumberColor(int number) { if (number == 0) { return TextFormatting.DARK_RED; @@ -160,19 +120,6 @@ private TextFormatting getNumberColor(int number) { } } - @Override - protected void addWarningText(List textList) { - super.addWarningText(textList); - if (isStructureFormed()) { - if (getWaterFilled() == 0) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); - } - } - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 024a4e4a4ea..1b6b4642d76 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -82,35 +82,6 @@ public SoundEvent getBreakdownSound() { return GTSoundEvents.BREAKDOWN_ELECTRICAL; } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(tl -> { - // Coil energy discount line - if (isStructureFormed()) { - ITextComponent energyDiscount = TextComponentUtil.stringWithColor(TextFormatting.AQUA, - (100 - 10 * coilTier) + "%"); - - ITextComponent base = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.cracking_unit.energy", - energyDiscount); - - ITextComponent hover = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.cracking_unit.energy_hover"); - - tl.add(TextComponentUtil.setHover(base, hover)); - } - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) @@ -137,11 +108,6 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { - builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); - } - @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index e6d1ee5ef68..c1f7c0dad6f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -71,30 +71,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { return new MetaTileEntityElectricBlastFurnace(metaTileEntityId); } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(tl -> { - // Coil heat capacity line - if (isStructureFormed()) { - ITextComponent heatString = TextComponentUtil.stringWithColor( - TextFormatting.RED, - TextFormattingUtil.formatNumbers(blastFurnaceTemperature) + "K"); - - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.blast_furnace.max_temperature", - heatString)); - } - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 19c7258695d..ef914dc0fda 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -60,53 +60,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { return new MetaTileEntityMultiSmelter(metaTileEntityId); } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(tl -> { - if (isStructureFormed()) { - // Heating coil discount - if (heatingCoilDiscount > 1) { - ITextComponent coilDiscount = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(100.0 / heatingCoilDiscount) + "%"); - - ITextComponent base = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.heating_coil_discount", - coilDiscount); - - ITextComponent hoverText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.heating_coil_discount_hover"); - - TextComponentUtil.setHover(base, hoverText); - tl.add(base); - } - - // Custom parallels line so we can have a hover text - if (recipeMapWorkable.getParallelLimit() > 1) { - ITextComponent parallels = TextComponentUtil.stringWithColor( - TextFormatting.DARK_PURPLE, - TextFormattingUtil.formatNumbers(recipeMapWorkable.getParallelLimit())); - ITextComponent bodyText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.parallel", - parallels); - ITextComponent hoverText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.multi_furnace.parallel_hover"); - tl.add(TextComponentUtil.setHover(bodyText, hoverText)); - } - } - }) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 2dd9a95b2d9..4beb76fb53b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -117,66 +117,6 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { return tier == 0 ? Textures.ROBUST_TUNGSTENSTEEL_CASING : Textures.STURDY_HSSE_CASING; } - @Override - protected void addDisplayText(List textList) { - ProcessingArrayWorkable logic = (ProcessingArrayWorkable) recipeMapWorkable; - - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) - .addEnergyTierLine(logic.currentMachineStack == ItemStack.EMPTY ? -1 : logic.machineTier) - .addCustom(tl -> { - if (isStructureFormed()) { - - // Machine mode text - // Shared text components for both states - ITextComponent maxMachinesText = TextComponentUtil.stringWithColor(TextFormatting.DARK_PURPLE, - Integer.toString(getMachineLimit())); - maxMachinesText = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_max", maxMachinesText); - - if (logic.activeRecipeMap == null) { - // No machines in hatch - ITextComponent noneText = TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.machine.machine_hatch.machines_none"); - ITextComponent bodyText = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines", noneText); - ITextComponent hoverText1 = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_none_hover"); - tl.add(TextComponentUtil.setHover(bodyText, hoverText1, maxMachinesText)); - } else { - // Some amount of machines in hatch - String key = logic.getMachineStack().getTranslationKey(); - ITextComponent mapText = TextComponentUtil.translationWithColor(TextFormatting.DARK_PURPLE, - key + ".name"); - mapText = TextComponentUtil.translationWithColor( - TextFormatting.DARK_PURPLE, - "%sx %s", - logic.getParallelLimit(), mapText); - ITextComponent bodyText = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines", mapText); - ITextComponent voltageName = new TextComponentString(GTValues.VNF[logic.machineTier]); - int amps = logic.getMachineStack().getCount(); - String energyFormatted = TextFormattingUtil - .formatNumbers(GTValues.V[logic.machineTier] * amps); - ITextComponent hoverText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.machine.machine_hatch.machines_max_eut", - energyFormatted, amps, voltageName); - tl.add(TextComponentUtil.setHover(bodyText, hoverText, maxMachinesText)); - } - - // Hatch locked status - if (isActive()) { - tl.add(TextComponentUtil.translationWithColor(TextFormatting.DARK_RED, - "gregtech.machine.machine_hatch.locked")); - } - } - }) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { ProcessingArrayWorkable logic = (ProcessingArrayWorkable) recipeMapWorkable; @@ -236,11 +176,6 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { - builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); - } - @SideOnly(Side.CLIENT) @NotNull @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index cf861505bf0..27f09538dfc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -100,36 +100,6 @@ protected void formStructure(PatternMatchContext context) { this.coilTier = 0; } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(tl -> { - if (isStructureFormed()) { - int processingSpeed = coilTier == 0 ? 75 : 50 * (coilTier + 1); - ITextComponent speedIncrease = TextComponentUtil.stringWithColor( - getSpeedColor(processingSpeed), - processingSpeed + "%"); - - ITextComponent base = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.pyrolyse_oven.speed", - speedIncrease); - - ITextComponent hover = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.pyrolyse_oven.speed_hover"); - - tl.add(TextComponentUtil.setHover(base, hover)); - } - }) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - private TextFormatting getSpeedColor(int speed) { if (speed < 100) { return TextFormatting.RED; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 5f6ff0a5635..6875cbc13be 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -223,30 +223,6 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List tooltip.add(I18n.format("gregtech.machine.research_station.tooltip.4")); } - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.work_paused", - "gregtech.machine.research_station.researching") - .addEnergyUsageLine(recipeMapWorkable.getEnergyContainer()) - .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); - } - - @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) - .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 4ff54723629..a6497e4c6fc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -75,50 +75,6 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { return new MetaTileEntityLargeCombustionEngine(metaTileEntityId, tier); } - @Override - protected void addDisplayText(List textList) { - LargeCombustionEngineWorkableHandler recipeLogic = ((LargeCombustionEngineWorkableHandler) recipeMapWorkable); - - MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); - - if (isExtreme) { - builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); - } else { - builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); - } - - builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addCustom(tl -> { - if (isStructureFormed() && recipeLogic.isOxygenBoosted) { - String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : - "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; - tl.add(TextComponentUtil.translationWithColor(TextFormatting.AQUA, key)); - } - }) - .addWorkingStatusLine(); - } - - @Override - protected void addErrorText(List textList) { - super.addErrorText(textList); - if (isStructureFormed()) { - if (checkIntakesObstructed()) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.obstructed")); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.large_combustion_engine.obstructed.desc")); - } - - FluidStack lubricantStack = getInputFluidInventory().drain(Materials.Lubricant.getFluid(Integer.MAX_VALUE), - false); - if (lubricantStack == null || lubricantStack.amount == 0) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.large_combustion_engine.no_lubricant")); - } - } - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index cb41d6a177c..13c4f09ebba 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -121,69 +121,6 @@ protected long getMaxVoltage() { } } - @Override - protected void addDisplayText(List textList) { - MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; - - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) - .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(tl -> { - if (isStructureFormed()) { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder.getRotorEfficiency() > 0) { - ITextComponent efficiencyInfo = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(rotorHolder.getTotalEfficiency()) + "%"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.turbine.efficiency", - efficiencyInfo)); - } - } - }) - .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addWorkingStatusLine(); - } - - @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addCustom(tl -> { - if (isStructureFormed()) { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder.getRotorEfficiency() > 0) { - if (rotorHolder.getRotorDurabilityPercent() <= MIN_DURABILITY_TO_WARN) { - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.multiblock.turbine.rotor_durability_low")); - } - } - } - }) - .addLowDynamoTierLine(isDynamoTierTooLow()) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - - @Override - protected void addErrorText(List textList) { - super.addErrorText(textList); - if (isStructureFormed()) { - if (!isRotorFaceFree()) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.turbine.obstructed")); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.turbine.obstructed.desc")); - } - - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder.getRotorEfficiency() <= 0) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.turbine.no_rotor")); - } - } - } - @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; From bdc92b3d6dcc05ca14ad0b3b00e8595ca49fbbea Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:05:57 -0500 Subject: [PATCH 119/264] spotless --- .../metatileentities/multi/MetaTileEntityLargeBoiler.java | 3 --- .../multi/electric/MetaTileEntityCrackingUnit.java | 3 --- .../multi/electric/MetaTileEntityElectricBlastFurnace.java | 2 -- .../multi/electric/MetaTileEntityMultiSmelter.java | 6 ------ .../multi/electric/MetaTileEntityProcessingArray.java | 4 ---- .../multi/electric/MetaTileEntityPyrolyseOven.java | 3 --- .../multi/electric/MetaTileEntityResearchStation.java | 2 -- .../generator/MetaTileEntityLargeCombustionEngine.java | 3 --- .../electric/generator/MetaTileEntityLargeTurbine.java | 3 --- 9 files changed, 29 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 9bc5e0e08b7..c07b8ef20f7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -15,8 +15,6 @@ import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.utils.TooltipHelper; import gregtech.core.sound.GTSoundEvents; @@ -27,7 +25,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fluids.IFluidTank; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 1b6b4642d76..a3ee2b3c391 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -5,7 +5,6 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -16,7 +15,6 @@ import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMetalCasing; @@ -28,7 +26,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index c1f7c0dad6f..5124cde5065 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -9,7 +9,6 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -21,7 +20,6 @@ import gregtech.api.recipes.properties.impl.TemperatureProperty; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index ef914dc0fda..49aaee4e946 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -6,7 +6,6 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ParallelLogicType; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; @@ -21,8 +20,6 @@ import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; @@ -33,7 +30,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -41,8 +37,6 @@ import com.cleanroommc.modularui.api.drawable.IKey; import org.jetbrains.annotations.NotNull; -import java.util.List; - import static gregtech.api.recipes.logic.OverclockingLogic.standardOC; public class MetaTileEntityMultiSmelter extends RecipeMapMultiblockController { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 4beb76fb53b..84a3a1ee556 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -14,7 +14,6 @@ import gregtech.api.metatileentity.multiblock.ICleanroomReceiver; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -28,7 +27,6 @@ import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -43,8 +41,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 27f09538dfc..62942115eb3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -5,7 +5,6 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -16,7 +15,6 @@ import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMachineCasing.MachineCasingType; @@ -28,7 +26,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 6875cbc13be..aeaebb3357a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -11,7 +11,6 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -34,7 +33,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index a6497e4c6fc..5eb691f3dea 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -12,7 +12,6 @@ import gregtech.api.metatileentity.multiblock.FuelMultiblockController; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; @@ -24,7 +23,6 @@ import gregtech.api.unification.material.Materials; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; -import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.blocks.BlockMetalCasing.MetalCasingType; @@ -37,7 +35,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 13c4f09ebba..dc0ed78b477 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -16,15 +16,12 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fluids.Fluid; From a0bd8383f1666c2f68e7a27a016bbae93ebef7d2 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:09:01 -0500 Subject: [PATCH 120/264] Move RecipeMapSteamMultiblockController to the MUI2 methods. --- .../RecipeMapSteamMultiblockController.java | 40 +++++++------------ 1 file changed, 15 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index fd396609419..fa6e79698fc 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -10,18 +10,18 @@ import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MTETrait; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; -import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.items.IItemHandlerModifiable; @@ -29,8 +29,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; - -import java.util.List; +import com.cleanroommc.modularui.api.drawable.IKey; public abstract class RecipeMapSteamMultiblockController extends MultiblockWithDisplayBase { @@ -101,24 +100,18 @@ private void resetTileAbilities() { } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom(tl -> { + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addCustom(list -> { // custom steam tank line IFluidTank steamFluidTank = recipeMapWorkable.getSteamFluidTankCombined(); if (steamFluidTank != null && steamFluidTank.getCapacity() > 0) { String stored = TextFormattingUtil.formatNumbers(steamFluidTank.getFluidAmount()); String capacity = TextFormattingUtil.formatNumbers(steamFluidTank.getCapacity()); - ITextComponent steamInfo = TextComponentUtil.stringWithColor( - TextFormatting.BLUE, - stored + " / " + capacity + " L"); - - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.steam.steam_stored", - steamInfo)); + IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, stored + " / " + capacity + " L"); + list.add( + KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.steam.steam_stored", steamInfo)); } }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) @@ -127,15 +120,12 @@ protected void addDisplayText(List textList) { } @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addCustom(tl -> { - if (isStructureFormed() && recipeMapWorkable.isHasNotEnoughEnergy()) { - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.multiblock.steam.low_steam")); - } - }) + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addCustom(list -> { + if (isStructureFormed() && recipeMapWorkable.isHasNotEnoughEnergy()) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.steam.low_steam")); + } + }) .addMaintenanceProblemLines(getMaintenanceProblems()); } From 2f1da36d2035e152f7b27a7451d79b88240b72cd Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Feb 2025 23:25:36 -0500 Subject: [PATCH 121/264] AT to MUI2 --- .../MetaTileEntityActiveTransformer.java | 45 +++++++------------ 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 721be147b02..17ba047729a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -9,13 +9,13 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; -import gregtech.api.util.TextComponentUtil; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -31,7 +31,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -41,6 +40,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -164,45 +164,34 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(true, isActive()) // set to true because we only want a two-state system (running or - // not running) + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(true, isActive()) .setWorkingStatusKeys( "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") .addWorkingStatusLine() - .addCustom(tl -> { + .addCustom(list -> { if (isStructureFormed()) { // Max input line - ITextComponent maxInputFormatted = TextComponentUtil.stringWithColor( - TextFormatting.WHITE, - TextFormattingUtil.formatNumbers( - powerInput.getInputVoltage() * powerInput.getInputAmperage()) + " EU/t"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GREEN, - "gregtech.multiblock.active_transformer.max_in", + IKey maxInputFormatted = KeyUtil.string(TextFormatting.WHITE, TextFormattingUtil + .formatNumbers(powerInput.getInputVoltage() * powerInput.getInputAmperage()) + " EU/t"); + list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.active_transformer.max_in", maxInputFormatted)); // Max output line - ITextComponent maxOutputFormatted = TextComponentUtil.stringWithColor( - TextFormatting.WHITE, - TextFormattingUtil.formatNumbers( - powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()) + " EU/t"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.RED, - "gregtech.multiblock.active_transformer.max_out", + IKey maxOutputFormatted = KeyUtil + .string(TextFormatting.WHITE, TextFormattingUtil.formatNumbers( + powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()) + + " EU/t"); + list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.active_transformer.max_out", maxOutputFormatted)); // Average I/O line - ITextComponent avgInputFormatted = TextComponentUtil.stringWithColor( - TextFormatting.WHITE, + IKey avgIOFormatted = KeyUtil.string(TextFormatting.WHITE, TextFormattingUtil.formatNumbers(averageIOLastSec) + " EU/t"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.AQUA, - "gregtech.multiblock.active_transformer.average_io", - avgInputFormatted)); + list.add(KeyUtil.lang(TextFormatting.AQUA, "gregtech.multiblock.active_transformer.average_io", + avgIOFormatted)); } }); } From b4990cd9f1a1d909d525eba082c89a0e089b4e61 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:08:26 -0500 Subject: [PATCH 122/264] Cleanroom mui2-ified + move the order of some text around to make more sense (to me :trollface:) --- .../electric/MetaTileEntityCleanroom.java | 61 ++++++++----------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index c502855dc5e..0902c470a87 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -20,8 +20,8 @@ import gregtech.api.metatileentity.multiblock.ICleanroomReceiver; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -30,8 +30,8 @@ import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.BlockInfo; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.api.util.Mods; -import gregtech.api.util.TextComponentUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.TooltipHelper; @@ -62,7 +62,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; @@ -75,6 +74,7 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -484,55 +484,44 @@ protected boolean isMachineBanned(MetaTileEntity metaTileEntity) { } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) .addEnergyUsageLine(energyContainer) - .addCustom(tl -> { + .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) + .addCustom(list -> { // Cleanliness status line if (isStructureFormed()) { - ITextComponent cleanState; + IKey cleanState; if (isClean()) { - cleanState = TextComponentUtil.translationWithColor( - TextFormatting.GREEN, - "gregtech.multiblock.cleanroom.clean_state", - this.cleanAmount); + cleanState = KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.cleanroom.clean_state", + cleanAmount); } else { - cleanState = TextComponentUtil.translationWithColor( - TextFormatting.DARK_RED, - "gregtech.multiblock.cleanroom.dirty_state", - this.cleanAmount); + cleanState = KeyUtil.lang(TextFormatting.DARK_RED, + "gregtech.multiblock.cleanroom.dirty_state", cleanAmount); } - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.cleanroom.clean_status", + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.cleanroom.clean_status", cleanState)); } }) - .addCustom(tl -> { - if (!cleanroomLogic.isVoltageHighEnough()) { - ITextComponent energyNeeded = new TextComponentString( - GTValues.VNF[cleanroomFilter.getMinTier()]); - tl.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.cleanroom.low_tier", energyNeeded)); - } - }) - .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) - .addWorkingStatusLine() - .addProgressLine(getProgressPercent() / 100.0); + .addProgressLine(getProgressPercent() / 100.0) + .addWorkingStatusLine(); } @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(!drainEnergy(true)) - .addCustom(tl -> { + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(!drainEnergy(true)) + .addCustom(list -> { if (isStructureFormed() && !isClean()) { - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.warning_contaminated")); } + + if (!cleanroomLogic.isVoltageHighEnough()) { + IKey energyNeeded = IKey.str(GTValues.VNF[cleanroomFilter.getMinTier()]); + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.low_tier", + energyNeeded)); + } }) .addMaintenanceProblemLines(getMaintenanceProblems()); } From ccaa3331eef289aa57cf7c79ce2fcb7239c0c11c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:11:06 -0500 Subject: [PATCH 123/264] data bank --- .../multi/electric/MetaTileEntityDataBank.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index 432bb59a2d0..4b4c7facaba 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -9,6 +9,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -250,11 +251,9 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display - .setWorkingStatusKeys( - "gregtech.multiblock.idling", + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display + .setWorkingStatusKeys("gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.multiblock.data_bank.providing") .addEnergyUsageExactLine(getEnergyUsage()) @@ -262,9 +261,8 @@ protected void addDisplayText(List textList) { } @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(hasNotEnoughEnergy) + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(hasNotEnoughEnergy) .addMaintenanceProblemLines(getMaintenanceProblems()); } From 308a6c7c628af6723160ced13a33e65252ad1102 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:14:13 -0500 Subject: [PATCH 124/264] network switch --- .../electric/MetaTileEntityNetworkSwitch.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java index fc49827d51b..a4fc3469646 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -9,9 +9,11 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; +import gregtech.api.util.KeyUtil; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -145,9 +147,8 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display .setWorkingStatusKeys( "gregtech.multiblock.idling", "gregtech.multiblock.idling", @@ -158,13 +159,13 @@ protected void addDisplayText(List textList) { } @Override - protected void addWarningText(List textList) { - super.addWarningText(textList); - if (isStructureFormed() && computationHandler.hasNonBridgingConnections()) { - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.multiblock.computation.non_bridging.detailed")); - } + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + super.configureWarningText(builder); + builder.addCustom(list -> { + if (isStructureFormed() && computationHandler.hasNonBridgingConnections()) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.non_bridging.detailed")); + } + }); } /** Handles computation load across multiple receivers and to multiple transmitters. */ From 10ace8dcdf2983ef85055b489e60c320fdd28b5a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:15:22 -0500 Subject: [PATCH 125/264] remove old mui0 methods from HPCA --- .../multi/electric/MetaTileEntityHPCA.java | 95 ------------------- 1 file changed, 95 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index c6c04a36527..b9f73f8d4d8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -363,101 +363,6 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { } } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - ModularUI.Builder builder = super.createUITemplate(entityPlayer); - - // Create the hover grid - builder.widget(new gregtech.api.gui.widgets.ProgressWidget( - () -> hpcaHandler.getAllocatedCWUt() > 0 ? progressSupplier.getAsDouble() : 0, - 74, 57, 47, 47, GuiTextures.HPCA_COMPONENT_OUTLINE, - gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) - .setIgnoreColor(true) - .setHoverTextConsumer(hpcaHandler::addInfo)); - int startX = 76; - int startY = 59; - for (int i = 0; i < 3; i++) { - for (int j = 0; j < 3; j++) { - final int index = i * 3 + j; - Supplier textureSupplier = () -> hpcaHandler.getComponentTexture(index); - builder.widget(new SuppliedImageWidget(startX + (15 * j), startY + (15 * i), 13, 13, textureSupplier) - .setIgnoreColor(true)); - } - } - return builder; - } - - @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) // transform into two-state system for - // display - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.idling", - "gregtech.multiblock.data_bank.providing") - .addCustom(tl -> { - if (isStructureFormed()) { - // Energy Usage - ITextComponent voltageName = new TextComponentString( - GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.energy", - TextFormattingUtil.formatNumbers(hpcaHandler.cachedEUt), - TextFormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), - voltageName)); - - // Provided Computation - ITextComponent cwutInfo = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.computation", - cwutInfo)); - } - }) - .addWorkingStatusLine(); - } - - @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(hasNotEnoughEnergy) - .addCustom(tl -> { - if (isStructureFormed()) { - if (temperature > 500) { - // Temperature warning - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.multiblock.hpca.warning_temperature")); - - // Active cooler overdrive warning - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.hpca.warning_temperature_active_cool")); - } - - // Structure warnings - hpcaHandler.addWarnings(tl); - } - }) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - - @Override - protected void addErrorText(List textList) { - super.addErrorText(textList); - if (isStructureFormed()) { - if (temperature > 1000) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.hpca.error_temperature")); - } - hpcaHandler.addErrors(textList); - } - } - @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() From 8708aa954572015f8a78eba15a38b08114323eae Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:35:02 -0500 Subject: [PATCH 126/264] Fluid Drill multiblock --- .../java/gregtech/api/fluids/GTFluid.java | 19 +++++++ .../java/gregtech/api/util/GTUtility.java | 11 ++++ .../electric/MetaTileEntityFluidDrill.java | 56 ++++++------------- 3 files changed, 48 insertions(+), 38 deletions(-) diff --git a/src/main/java/gregtech/api/fluids/GTFluid.java b/src/main/java/gregtech/api/fluids/GTFluid.java index 5b808f034f8..2e309220df7 100644 --- a/src/main/java/gregtech/api/fluids/GTFluid.java +++ b/src/main/java/gregtech/api/fluids/GTFluid.java @@ -1,5 +1,7 @@ package gregtech.api.fluids; +import com.cleanroommc.modularui.api.drawable.IKey; + import gregtech.api.fluids.attribute.AttributedFluid; import gregtech.api.fluids.attribute.FluidAttribute; import gregtech.api.unification.material.Material; @@ -78,6 +80,23 @@ public GTMaterialFluid(@NotNull String fluidName, ResourceLocation still, Resour return localizedName; } + public @NotNull IKey toIKey() { + IKey localizedName; + String customMaterialTranslation = "fluid." + material.getUnlocalizedName(); + + if (net.minecraft.util.text.translation.I18n.canTranslate(customMaterialTranslation)) { + localizedName = IKey.lang(customMaterialTranslation); + } else { + localizedName = IKey.lang(material.getUnlocalizedName()); + } + + if (translationKey != null) { + return IKey.lang(translationKey, localizedName); + } + + return localizedName; + } + @Override @SideOnly(Side.CLIENT) public String getLocalizedName(FluidStack stack) { diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 287c1a76c5a..1fdf0bca663 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1,5 +1,7 @@ package gregtech.api.util; +import com.cleanroommc.modularui.api.drawable.IKey; + import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.machines.MachineItemBlock; @@ -896,6 +898,15 @@ public static TextComponentTranslation getFluidTranslation(@Nullable Fluid fluid return new TextComponentTranslation(fluid.getUnlocalizedName()); } + @Contract("null -> null") + public static IKey getFluidIKey(@Nullable Fluid fluid) { + if (fluid == null) return null; + if (fluid instanceof GTFluid.GTMaterialFluid materialFluid) { + return materialFluid.toIKey(); + } + return IKey.lang(fluid.getUnlocalizedName()); + } + public static @NotNull Pair createPairedSupplier(int ticksPerCycle, int width, double splitPoint) { AtomicDouble tracker = new AtomicDouble(0.0); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 42acb1b6fe6..4ab24c33e1e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -164,60 +164,40 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { } @Override - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .setWorkingStatusKeys( "gregtech.multiblock.idling", "gregtech.multiblock.work_paused", "gregtech.multiblock.miner.drilling") .addEnergyUsageLine(energyContainer) - .addCustom(tl -> { + .addCustom(list -> { if (isStructureFormed()) { if (minerLogic.getDrilledFluid() != null) { // Fluid name Fluid drilledFluid = minerLogic.getDrilledFluid(); - ITextComponent fluidInfo = TextComponentUtil - .setColor(GTUtility.getFluidTranslation(drilledFluid), TextFormatting.GREEN); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.fluid_rig.drilled_fluid", - fluidInfo)); - - // Fluid amount - ITextComponent amountInfo = TextComponentUtil.stringWithColor( - TextFormatting.BLUE, - TextFormattingUtil.formatNumbers( - minerLogic.getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + - " L/s"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.fluid_rig.fluid_amount", - amountInfo)); + IKey fluidInfo = GTUtility.getFluidIKey(drilledFluid).style(TextFormatting.GREEN); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", fluidInfo)); + + IKey amountInfo = KeyUtil.lang(TextFormatting.BLUE, TextFormattingUtil.formatNumbers(minerLogic.getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + " L/s"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.fluid_amount", amountInfo)); } else { - ITextComponent noFluid = TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.fluid_rig.no_fluid_in_area"); - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.fluid_rig.drilled_fluid", - noFluid)); + IKey noFluid = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.fluid_rig.no_fluid_in_area"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", noFluid)); } } }) - .addWorkingStatusLine() - .addProgressLine(minerLogic.getProgressPercent()); + .addProgressLine(minerLogic.getProgressPercent()) + .addWorkingStatusLine(); } @Override - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addLowPowerLine(isStructureFormed() && !drainEnergy(true)) - .addCustom(tl -> { - if (isStructureFormed() && minerLogic.isInventoryFull()) { - tl.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.machine.miner.invfull")); - } + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) + .addCustom(list -> { + if (isStructureFormed() && minerLogic.isInventoryFull()) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); + } }); } From c45549e2901b4ce9c3e7b3f2034f637d5dd2b613 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 00:48:41 -0500 Subject: [PATCH 127/264] Mark handleDisplayClick as deprecated --- .../api/metatileentity/multiblock/MultiblockWithDisplayBase.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index e6d10ccf24c..6463decbc3a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -362,6 +362,7 @@ protected void addDisplayText(List textList) { * with special click event handler * Data is the data specified in the component */ + @Deprecated protected void handleDisplayClick(String componentData, ClickData clickData) {} @Deprecated From c0be81a347373df54e61df0579828b81ab54258d Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:44:32 -0500 Subject: [PATCH 128/264] Central Monitor kinda ish not really --- .../MetaTileEntityCentralMonitor.java | 96 +++++++++++++------ .../resources/assets/gregtech/lang/en_us.lang | 3 +- 2 files changed, 68 insertions(+), 31 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 7fbac5668a6..718bc1c26d4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -7,8 +7,6 @@ import gregtech.api.cover.Cover; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; -import gregtech.api.gui.Widget; -import gregtech.api.gui.widgets.AdvancedTextWidget; import gregtech.api.gui.widgets.WidgetGroup; import gregtech.api.metatileentity.IFastRenderMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; @@ -16,12 +14,14 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pipenet.tile.IPipeTile; import gregtech.api.pipenet.tile.TileEntityPipeBase; import gregtech.api.util.FacingPos; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.RenderUtil; @@ -49,9 +49,7 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; -import net.minecraft.util.text.ITextComponent; -import net.minecraft.util.text.TextComponentString; -import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.relauncher.Side; @@ -60,6 +58,9 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.value.sync.IntSyncValue; +import com.cleanroommc.modularui.widgets.ButtonWidget; import org.jetbrains.annotations.Nullable; import org.lwjgl.opengl.GL11; @@ -70,7 +71,7 @@ public class MetaTileEntityCentralMonitor extends MultiblockWithDisplayBase implements IFastRenderMetaTileEntity { - private final static long ENERGY_COST = -ConfigHolder.machines.centralMonitorEuCost; + private final static long ENERGY_COST = ConfigHolder.machines.centralMonitorEuCost; public final static int MAX_HEIGHT = 9; public final static int MAX_WIDTH = 14; // run-time data @@ -278,33 +279,55 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected void addDisplayText(List textList) { - super.addDisplayText(textList); - textList.add(new TextComponentTranslation("gregtech.multiblock.central_monitor.height", this.height)); - if (!isStructureFormed()) { - ITextComponent buttonText = new TextComponentTranslation( - "gregtech.multiblock.central_monitor.height_modify", height); - buttonText.appendText(" "); - buttonText.appendSibling(AdvancedTextWidget.withButton(new TextComponentString("[-]"), "sub")); - buttonText.appendText(" "); - buttonText.appendSibling(AdvancedTextWidget.withButton(new TextComponentString("[+]"), "add")); - textList.add(buttonText); - } else { - textList.add(new TextComponentTranslation("gregtech.multiblock.central_monitor.width", this.width)); - textList.add(new TextComponentTranslation("gregtech.multiblock.central_monitor.low_power")); - } + protected MultiblockUIFactory createUIFactory() { + return super.createUIFactory() + .createFlexButton((posGuiData, panelSyncManager) -> { + IntSyncValue intSync = new IntSyncValue(() -> height, this::setHeight); + panelSyncManager.syncValue("height", intSync); + + return new ButtonWidget<>() + .addTooltipLine(IKey.lang("gregtech.multiblock.central_monitor.button_tooltip")) + .onMousePressed(mouseData -> { + int currentHeight = intSync.getIntValue(); + + if (mouseData == 0 && currentHeight < MAX_HEIGHT) { + intSync.setIntValue(currentHeight + 1); + return true; + } else if (mouseData == 1 && currentHeight > 3) { + intSync.setIntValue(currentHeight - 1); + return true; + } else if (mouseData == 2) { + intSync.setIntValue(3); + } + + return false; + }); + }); } @Override - public boolean shouldShowVoidingModeButton() { - return false; + protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + builder.addCustom(list -> { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", this.height)); + + if (isStructureFormed()) { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.width", this.width)); + } + }); } @Override - protected void handleDisplayClick(String componentData, Widget.ClickData clickData) { - super.handleDisplayClick(componentData, clickData); - int modifier = componentData.equals("add") ? 1 : -1; - setHeight(this.height + modifier); + protected void configureWarningText(MultiblockUIFactory.Builder builder) { + builder.addCustom(list -> { + if (isStructureFormed() && !drainEnergy(true)) { + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.low_power")); + } + }); + } + + @Override + public boolean shouldShowVoidingModeButton() { + return false; } @Override @@ -370,8 +393,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity metaTileEntityHol @Override protected void updateFormedValid() { if (this.getOffsetTimer() % 20 == 0) { - setActive(inputEnergy.changeEnergy(ENERGY_COST * this.getMultiblockParts().size()) == - ENERGY_COST * this.getMultiblockParts().size()); + setActive(drainEnergy(false)); if (checkCovers()) { this.getMultiblockParts().forEach(part -> { Set covers = getAllCovers(); @@ -384,6 +406,20 @@ protected void updateFormedValid() { } } + /** + * @return if the Central Monitor was able to drain enough energy. + */ + private boolean drainEnergy(boolean simulate) { + long energyToDrain = ENERGY_COST * this.getMultiblockParts().size(); + long resultEnergy = inputEnergy.getEnergyStored() - energyToDrain; + if (resultEnergy >= 0L && resultEnergy <= inputEnergy.getEnergyCapacity()) { + if (!simulate) + inputEnergy.changeEnergy(-energyToDrain); + return true; + } + return false; + } + public Set getAllCovers() { Set allCovers = new HashSet<>(); if (netCovers != null) { @@ -630,7 +666,7 @@ public void addInformation(ItemStack stack, @Nullable World player, List tooltip.add(I18n.format("gregtech.multiblock.central_monitor.tooltip.1")); tooltip.add(I18n.format("gregtech.multiblock.central_monitor.tooltip.2", MAX_WIDTH, MAX_HEIGHT)); tooltip.add(I18n.format("gregtech.multiblock.central_monitor.tooltip.3")); - tooltip.add(I18n.format("gregtech.multiblock.central_monitor.tooltip.4", -ENERGY_COST)); + tooltip.add(I18n.format("gregtech.multiblock.central_monitor.tooltip.4", ENERGY_COST)); } @Override diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 5779c657c8b..f3f62464925 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -4980,13 +4980,14 @@ gregtech.multiblock.high_performance_computing_array.description=The High Perfor gregtech.machine.central_monitor.name=Central Monitor gregtech.multiblock.central_monitor.low_power=Low Power -gregtech.multiblock.central_monitor.height=Screen Height: +gregtech.multiblock.central_monitor.height=Screen Height: %d gregtech.multiblock.central_monitor.width=Screen Width: %d gregtech.multiblock.central_monitor.height_modify=Modify Height: %d gregtech.multiblock.central_monitor.tooltip.1=This is a machine that monitors machines proxied by the Digital Interface Cover. You can easily monitor the Fluids, Items, Energy, and States of machines proxied in Energy Network. gregtech.multiblock.central_monitor.tooltip.2=You can build the central monitor screen from 3X2 to %dX%d (width X height). gregtech.multiblock.central_monitor.tooltip.3=The default height is 3. You can adjust the screen height in the GUI before the structure is formed. gregtech.multiblock.central_monitor.tooltip.4=Energy consumption: %d EU/s for each screen. +gregtech.multiblock.central_monitor.button_tooltip=Left click to increase height, right click to decrease height. Middle click to reset gregtech.multiblock.monitor_screen.tooltip.1=The GUI can be opened with a right-click of a screwdriver. gregtech.multiblock.monitor_screen.tooltip.2=The proxy mode of Digital Interface Cover can delegate machines' capabilities and GUI. (Yes, you can connect pipes directly on the screen.) gregtech.multiblock.monitor_screen.tooltip.3=The screen also supports plugins. From 8492eb39c745f0fcce01993d34b893320b8b4038 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 01:44:51 -0500 Subject: [PATCH 129/264] spotless --- .../java/gregtech/api/fluids/GTFluid.java | 3 +-- .../java/gregtech/api/util/GTUtility.java | 3 +-- .../electric/MetaTileEntityDataBank.java | 2 -- .../electric/MetaTileEntityFluidDrill.java | 27 +++++++++++-------- .../multi/electric/MetaTileEntityHPCA.java | 5 ---- .../electric/MetaTileEntityNetworkSwitch.java | 3 --- 6 files changed, 18 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/api/fluids/GTFluid.java b/src/main/java/gregtech/api/fluids/GTFluid.java index 2e309220df7..23237a0ecdd 100644 --- a/src/main/java/gregtech/api/fluids/GTFluid.java +++ b/src/main/java/gregtech/api/fluids/GTFluid.java @@ -1,7 +1,5 @@ package gregtech.api.fluids; -import com.cleanroommc.modularui.api.drawable.IKey; - import gregtech.api.fluids.attribute.AttributedFluid; import gregtech.api.fluids.attribute.FluidAttribute; import gregtech.api.unification.material.Material; @@ -14,6 +12,7 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import com.cleanroommc.modularui.api.drawable.IKey; import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 1fdf0bca663..d902ad2580a 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -1,7 +1,5 @@ package gregtech.api.util; -import com.cleanroommc.modularui.api.drawable.IKey; - import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.machines.MachineItemBlock; @@ -57,6 +55,7 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.api.drawable.IKey; import com.google.common.util.concurrent.AtomicDouble; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import org.apache.commons.lang3.ArrayUtils; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index 4b4c7facaba..ebd225c4630 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -7,7 +7,6 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; @@ -29,7 +28,6 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; -import net.minecraft.util.text.ITextComponent; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fml.relauncher.Side; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 4ab24c33e1e..d5663d0fcb2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -22,7 +22,6 @@ import gregtech.api.util.GTTransferUtils; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.api.worldgen.bedrockFluids.BedrockFluidVeinHandler; import gregtech.client.renderer.ICubeRenderer; @@ -37,7 +36,6 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; @@ -177,13 +175,20 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { // Fluid name Fluid drilledFluid = minerLogic.getDrilledFluid(); IKey fluidInfo = GTUtility.getFluidIKey(drilledFluid).style(TextFormatting.GREEN); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", fluidInfo)); - - IKey amountInfo = KeyUtil.lang(TextFormatting.BLUE, TextFormattingUtil.formatNumbers(minerLogic.getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + " L/s"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.fluid_amount", amountInfo)); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", + fluidInfo)); + + IKey amountInfo = KeyUtil.lang(TextFormatting.BLUE, + TextFormattingUtil.formatNumbers( + minerLogic.getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + + " L/s"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.fluid_amount", + amountInfo)); } else { - IKey noFluid = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.fluid_rig.no_fluid_in_area"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", noFluid)); + IKey noFluid = KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.fluid_rig.no_fluid_in_area"); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", + noFluid)); } } }) @@ -195,9 +200,9 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { protected void configureWarningText(MultiblockUIFactory.Builder builder) { builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) .addCustom(list -> { - if (isStructureFormed() && minerLogic.isInventoryFull()) { - list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); - } + if (isStructureFormed() && minerLogic.isInventoryFull()) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); + } }); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index b9f73f8d4d8..1adc8fb4e5e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -5,10 +5,7 @@ import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.resources.IGuiTexture; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.SuppliedImageWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; @@ -34,7 +31,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; @@ -73,7 +69,6 @@ import java.util.Collection; import java.util.List; import java.util.Set; -import java.util.function.Supplier; import static gregtech.api.util.RelativeDirection.*; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java index a4fc3469646..82b7b150416 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -8,13 +8,11 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -25,7 +23,6 @@ import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; From f7b61c5233de11de67d4903bc33f4d84b25c8160 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 4 Feb 2025 12:51:56 -0700 Subject: [PATCH 130/264] move `getFluidIKey` to KeyUtil and rename deprecate methods and schedule removal remove SECTION add notes --- .../java/gregtech/api/fluids/GTFluid.java | 3 ++ .../java/gregtech/api/util/GTUtility.java | 16 ++++------ src/main/java/gregtech/api/util/KeyUtil.java | 29 +++++++++++++++++-- .../electric/MetaTileEntityFluidDrill.java | 4 ++- 4 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/api/fluids/GTFluid.java b/src/main/java/gregtech/api/fluids/GTFluid.java index 23237a0ecdd..c864caaee8d 100644 --- a/src/main/java/gregtech/api/fluids/GTFluid.java +++ b/src/main/java/gregtech/api/fluids/GTFluid.java @@ -14,6 +14,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import it.unimi.dsi.fastutil.objects.ObjectLinkedOpenHashSet; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; @@ -63,6 +64,8 @@ public GTMaterialFluid(@NotNull String fluidName, ResourceLocation still, Resour return this.material; } + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.10") public @NotNull TextComponentTranslation toTextComponentTranslation() { TextComponentTranslation localizedName; String customMaterialTranslation = "fluid." + material.getUnlocalizedName(); diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index d902ad2580a..d679364399e 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -55,11 +55,11 @@ import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import com.cleanroommc.modularui.api.drawable.IKey; import com.google.common.util.concurrent.AtomicDouble; import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.tuple.Pair; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -879,6 +879,8 @@ public static ResourceLocation gregtechId(@NotNull String path) { } @Contract("null -> null") + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.10") public static TextComponentTranslation getFluidTranslation(@Nullable FluidStack stack) { if (stack == null) return null; if (stack.getFluid() instanceof GTFluid.GTMaterialFluid materialFluid) { @@ -889,6 +891,8 @@ public static TextComponentTranslation getFluidTranslation(@Nullable FluidStack } @Contract("null -> null") + @Deprecated + @ApiStatus.ScheduledForRemoval(inVersion = "2.10") public static TextComponentTranslation getFluidTranslation(@Nullable Fluid fluid) { if (fluid == null) return null; if (fluid instanceof GTFluid.GTMaterialFluid materialFluid) { @@ -897,15 +901,7 @@ public static TextComponentTranslation getFluidTranslation(@Nullable Fluid fluid return new TextComponentTranslation(fluid.getUnlocalizedName()); } - @Contract("null -> null") - public static IKey getFluidIKey(@Nullable Fluid fluid) { - if (fluid == null) return null; - if (fluid instanceof GTFluid.GTMaterialFluid materialFluid) { - return materialFluid.toIKey(); - } - return IKey.lang(fluid.getUnlocalizedName()); - } - + @Deprecated public static @NotNull Pair createPairedSupplier(int ticksPerCycle, int width, double splitPoint) { AtomicDouble tracker = new AtomicDouble(0.0); diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 41d9fa06feb..c68c61a28b3 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,20 +1,23 @@ package gregtech.api.util; +import gregtech.api.fluids.GTFluid; import gregtech.api.mui.drawables.HoverableKey; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.LongSupplier; import java.util.function.Supplier; public class KeyUtil { - public static final String SECTION = "§"; - public static IKey string(String s) { return IKey.str(s); } @@ -28,6 +31,7 @@ public static IKey string(TextFormatting formatting, String string) { return IKey.str(string).style(formatting); } + // maybe enforce using keys for args in lang/string keys since they format correctly public static IKey string(TextFormatting formatting, String string, Object... args) { if (string == null) return IKey.EMPTY; return IKey.str(string, args).style(formatting); @@ -128,4 +132,25 @@ public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; return HoverableKey.of(body, hover); } + + @NotNull + public static IKey fluid(@Nullable FluidStack fluid) { + if (fluid == null) return IKey.EMPTY; + return fluid(fluid.getFluid(), fluid); + } + + @NotNull + public static IKey fluid(@Nullable Fluid fluid) { + return fluid(fluid, null); + } + + @NotNull + public static IKey fluid(@Nullable Fluid fluid, @Nullable FluidStack stack) { + if (fluid == null) return IKey.EMPTY; + if (fluid instanceof GTFluid.GTMaterialFluid gtFluid) { + return gtFluid.toIKey(); + } + if (stack == null) return IKey.lang(fluid.getUnlocalizedName()); + else return IKey.lang(fluid.getUnlocalizedName(stack)); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index d5663d0fcb2..f88ad8f2dea 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -174,7 +174,9 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { if (minerLogic.getDrilledFluid() != null) { // Fluid name Fluid drilledFluid = minerLogic.getDrilledFluid(); - IKey fluidInfo = GTUtility.getFluidIKey(drilledFluid).style(TextFormatting.GREEN); + IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); + + // todo should this check if fluid info is empty? list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", fluidInfo)); From d727985d03c7911bb9609f067a257df536d81775 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 4 Feb 2025 13:03:59 -0700 Subject: [PATCH 131/264] use number method and add note --- .../multi/electric/MetaTileEntityActiveTransformer.java | 5 +++-- .../centralmonitor/MetaTileEntityCentralMonitor.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 17ba047729a..46b7b662226 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -174,8 +174,9 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addCustom(list -> { if (isStructureFormed()) { // Max input line - IKey maxInputFormatted = KeyUtil.string(TextFormatting.WHITE, TextFormattingUtil - .formatNumbers(powerInput.getInputVoltage() * powerInput.getInputAmperage()) + " EU/t"); + IKey maxInputFormatted = KeyUtil.number(TextFormatting.WHITE, + powerInput.getInputVoltage() * powerInput.getInputAmperage(), + " EU/t"); list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.active_transformer.max_in", maxInputFormatted)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 718bc1c26d4..4b89850df9d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -285,6 +285,7 @@ protected MultiblockUIFactory createUIFactory() { IntSyncValue intSync = new IntSyncValue(() -> height, this::setHeight); panelSyncManager.syncValue("height", intSync); + // todo make this a popup? return new ButtonWidget<>() .addTooltipLine(IKey.lang("gregtech.multiblock.central_monitor.button_tooltip")) .onMousePressed(mouseData -> { From 6b8fbb309ced5975cf6b98612030f312c4b951cf Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 4 Feb 2025 22:46:16 -0500 Subject: [PATCH 132/264] Move the status line to be more consistent with other multiblocks and use KeyUtil.number for the other two lines. --- .../MetaTileEntityActiveTransformer.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 46b7b662226..de911af6609 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -16,7 +16,6 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.client.utils.TooltipHelper; @@ -170,31 +169,27 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addWorkingStatusLine() .addCustom(list -> { if (isStructureFormed()) { // Max input line IKey maxInputFormatted = KeyUtil.number(TextFormatting.WHITE, - powerInput.getInputVoltage() * powerInput.getInputAmperage(), - " EU/t"); + powerInput.getInputVoltage() * powerInput.getInputAmperage(), " EU/t"); list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.active_transformer.max_in", maxInputFormatted)); // Max output line - IKey maxOutputFormatted = KeyUtil - .string(TextFormatting.WHITE, TextFormattingUtil.formatNumbers( - powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()) + - " EU/t"); + IKey maxOutputFormatted = KeyUtil.number(TextFormatting.WHITE, + powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage(), " EU/t"); list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.active_transformer.max_out", maxOutputFormatted)); // Average I/O line - IKey avgIOFormatted = KeyUtil.string(TextFormatting.WHITE, - TextFormattingUtil.formatNumbers(averageIOLastSec) + " EU/t"); + IKey avgIOFormatted = KeyUtil.number(TextFormatting.WHITE, averageIOLastSec, " EU/t"); list.add(KeyUtil.lang(TextFormatting.AQUA, "gregtech.multiblock.active_transformer.average_io", avgIOFormatted)); } - }); + }) + .addWorkingStatusLine(); } @Override From 728c2dc620bcd932f68832ec915167f5c41b57fa Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 7 Feb 2025 20:04:25 -0700 Subject: [PATCH 133/264] fix BigIntegerSyncValue --- src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java b/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java index 6b48af3f85a..5a4a397f9b8 100644 --- a/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java +++ b/src/main/java/gregtech/api/mui/sync/BigIntegerSyncValue.java @@ -77,12 +77,12 @@ public boolean updateCacheFromSource(boolean isFirstSync) { @Override public void write(@NotNull PacketBuffer buffer) throws IOException { - buffer.writeByteArray(cache.toByteArray()); + buffer.writeByteArray(getValue().toByteArray()); } @Override public void read(@NotNull PacketBuffer buffer) throws IOException { - this.cache = new BigInteger(buffer.readByteArray()); + setValue(new BigInteger(buffer.readByteArray()), true, false); } @Override From 947bac6ec4974cfc687d8deef39a2cd00081d066 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:07:33 -0700 Subject: [PATCH 134/264] add Operations default operation is new line with space add KeyManager for adding custom keys with operations --- .../RecipeMapSteamMultiblockController.java | 9 +- .../multiblock/ui/MultiblockUIFactory.java | 130 ++++++++++++++++-- .../multi/MetaTileEntityLargeBoiler.java | 9 +- .../MetaTileEntityElectricBlastFurnace.java | 5 +- .../multi/electric/MetaTileEntityHPCA.java | 11 +- 5 files changed, 133 insertions(+), 31 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index fa6e79698fc..a1d72477407 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -102,16 +102,17 @@ private void resetTileAbilities() { @Override protected void configureDisplayText(MultiblockUIFactory.Builder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom(list -> { + .addCustom(keyManager -> { // custom steam tank line IFluidTank steamFluidTank = recipeMapWorkable.getSteamFluidTankCombined(); if (steamFluidTank != null && steamFluidTank.getCapacity() > 0) { String stored = TextFormattingUtil.formatNumbers(steamFluidTank.getFluidAmount()); String capacity = TextFormattingUtil.formatNumbers(steamFluidTank.getCapacity()); - IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, stored + " / " + capacity + " L"); - list.add( - KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.steam.steam_stored", steamInfo)); + IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, "%s/%s L", stored, capacity); + IKey steamStored = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.steam.steam_stored", steamInfo); + keyManager.add(steamStored); } }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7d69ac374d0..6bfe3ae81d8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -40,6 +40,10 @@ import com.cleanroommc.modularui.widgets.RichTextWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -57,6 +61,11 @@ public class MultiblockUIFactory { private int screenHeight = 109; private Consumer> childrenConsumer; + static { + // register operations + Operation.init(); + } + public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; configureErrorText(builder -> { @@ -409,9 +418,11 @@ public static Builder builder() { } @SuppressWarnings({ "UnusedReturnValue", "unused" }) - public static class Builder { + public static class Builder implements KeyManager { private final List textList = new ArrayList<>(); + private final List operations = new ArrayList<>(); + private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); @@ -811,13 +822,13 @@ public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { /** Insert an empty line into the text list. */ public Builder addEmptyLine() { - this.textList.add(IKey.LINE_FEED); + addKey(IKey.LINE_FEED); return this; } /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - customConsumer.accept(this.textList); + public Builder addCustom(Consumer customConsumer) { + customConsumer.accept(this); return this; } @@ -827,12 +838,12 @@ public boolean isEmpty() { public void clear() { this.textList.clear(); + this.operations.clear(); } protected boolean hasChanged() { if (this.action == null) return false; - List old = new ArrayList<>(); - for (var drawable : this.textList) old.add(JsonUtils.toJsonString(drawable)); + List old = toString(this.textList); build(); if (textList.size() != old.size()) return true; for (int i = 0; i < textList.size(); i++) { @@ -842,6 +853,14 @@ protected boolean hasChanged() { return false; } + private static List toString(List drawables) { + List strings = new ArrayList<>(); + for (IDrawable drawable : drawables) { + strings.add(JsonUtils.toJsonString(drawable)); + } + return strings; + } + protected void sync(String key, PanelSyncManager syncManager) { syncManager.syncValue(key, this.syncHandler); } @@ -863,8 +882,9 @@ public void detectAndSendChanges(boolean init) { private void syncText(PacketBuffer buffer) { buffer.writeVarInt(textList.size()); - for (IDrawable drawable : textList) { - var jsonString = JsonUtils.toJsonString(drawable); + for (int i = 0; i < textList.size(); i++) { + buffer.writeByte(Operation.getId(operations.get(i))); + var jsonString = JsonUtils.toJsonString(textList.get(i)); NetworkUtils.writeStringSafe(buffer, jsonString); } } @@ -874,8 +894,9 @@ public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { clear(); for (int i = buf.readVarInt(); i > 0; i--) { + int op = buf.readByte(); String jsonString = NetworkUtils.readStringSafe(buf); - addKey(JsonUtils.fromJsonString(jsonString)); + addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); } } } @@ -891,8 +912,8 @@ public void build(IRichTextBuilder richText) { build(); dirty = false; } - for (IDrawable drawable : textList) { - richText.addLine(drawable).spaceLine(2); + for (int i = 0; i < operations.size(); i++) { + operations.get(i).apply(textList.get(i), richText); } } @@ -919,12 +940,95 @@ public void onRebuild(Runnable onRebuild) { this.onRebuild = onRebuild; } + private void addKey(IKey key, IDrawable... hover) { + addKey(KeyUtil.setHover(key, hover)); + } + private void addKey(IDrawable key) { + addKey(key, Operation.NEW_LINE_SPACE); + } + + private void addKey(@NotNull IDrawable key, @NotNull Operation op) { + if (textList.size() != operations.size()) { + throw new IllegalStateException("textList and operations must be the same size!"); + } this.textList.add(key); + Operation.checkOp(op); + this.operations.add(op); } - private void addKey(IKey key, IDrawable... hover) { - addKey(KeyUtil.setHover(key, hover)); + @Override + public void add(IDrawable drawable, Operation op) { + addKey(drawable, op); + } + } + + @FunctionalInterface + public interface Operation { + + Int2ObjectMap ID_MAP = new Int2ObjectArrayMap<>(); + Object2IntMap REVERSE_MAP = new Object2IntArrayMap<>(); + + Operation NO_OP = (drawable, richText) -> {}; + Operation NEW_LINE = (drawable, richText) -> richText.addLine(drawable); + Operation ADD = (drawable, richText) -> richText.add(drawable); + Operation NEW_LINE_SPACE = NEW_LINE.andThen(richText -> richText.spaceLine(2)); + + static void init() { + registerOp(NO_OP); + registerOp(NEW_LINE); + registerOp(ADD); + registerOp(NEW_LINE_SPACE); + } + + static Operation getById(int id) { + return ID_MAP.get(id); + } + + static int getId(Operation op) { + return REVERSE_MAP.get(op); + } + + static void registerOp(Operation op) { + int nextId = ID_MAP.size(); + ID_MAP.put(nextId, op); + REVERSE_MAP.put(op, nextId); + } + + static void checkOp(Operation op) { + if (!REVERSE_MAP.containsKey(op)) + throw new IllegalStateException("Operation is not registered!"); + Operation check = ID_MAP.get(REVERSE_MAP.getInt(op)); + if (check != op) throw new IllegalStateException("Operation is not identical!"); + } + + void apply(IDrawable drawable, IRichTextBuilder richText); + + default Operation andThen(Operation after) { + return (drawable, richText) -> { + this.apply(drawable, richText); + after.apply(drawable, richText); + }; + } + + default Operation andThen(Consumer> after) { + return (drawable, richText) -> { + this.apply(drawable, richText); + after.accept(richText); + }; + } + } + + public interface KeyManager { + + default void add(IDrawable drawable) { + add(drawable, Operation.NEW_LINE_SPACE); + } + + void add(IDrawable drawable, Operation op); + + default void addAll(Iterable drawables) { + drawables.forEach(this::add); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index c07b8ef20f7..2b4f042c682 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -37,7 +37,6 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.IPanelHandler; -import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.drawable.Rectangle; @@ -160,27 +159,27 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(List keyList) { + private void addCustomData(MultiblockUIFactory.KeyManager keyManager) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, recipeLogic.getLastTickSteam(), " L/t"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.number( () -> getNumberColor(recipeLogic.getHeatScaled()), recipeLogic.getHeatScaled(), "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( () -> getNumberColor(getThrottle()), getThrottle(), "%"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 5124cde5065..5b64ef56eea 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -45,7 +45,6 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; -import com.cleanroommc.modularui.api.drawable.IDrawable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -80,12 +79,12 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(List keyList) { + private void addHeatCapacity(MultiblockUIFactory.KeyManager keyManager) { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, getCurrentTemperature(), "K"); - keyList.add(KeyUtil.lang(TextFormatting.GRAY, + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 1adc8fb4e5e..b174d2b75d3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -51,7 +51,6 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; -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.UITexture; @@ -904,7 +903,7 @@ public void addErrors(List textList) { } } - public void addWarnings2(List richText) { + public void addWarnings2(MultiblockUIFactory.KeyManager keyManager) { List warnings = new ArrayList<>(); if (numBridges > 1) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, @@ -919,16 +918,16 @@ public void addWarnings2(List richText) { "gregtech.multiblock.hpca.warning_low_cooling")); } if (!warnings.isEmpty()) { - richText.add(KeyUtil.lang(TextFormatting.YELLOW, + keyManager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.warning_structure_header")); - richText.addAll(warnings); + keyManager.addAll(warnings); } } - public void addErrors2(List richText) { + public void addErrors2(MultiblockUIFactory.KeyManager keyManager) { for (IHPCAComponentHatch component : components) { if (component.isDamaged()) { - richText.add(KeyUtil.lang(TextFormatting.RED, + keyManager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_damaged")); return; } From d69b9aab2ef301eb285057c6f03e5dc8b80f78a5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:21:15 -0700 Subject: [PATCH 135/264] move classes/interfaces out of MultiblockUIFactory --- .../multiblock/FuelMultiblockController.java | 6 +- .../multiblock/MultiblockWithDisplayBase.java | 7 +- .../RecipeMapMultiblockController.java | 6 +- .../RecipeMapSteamMultiblockController.java | 6 +- .../multiblock/ui/KeyManager.java | 16 + .../multiblock/ui/MultiblockUIBuilder.java | 571 +++++++++++++++ .../multiblock/ui/MultiblockUIFactory.java | 656 +----------------- .../multiblock/ui/Operation.java | 66 ++ .../multi/MetaTileEntityLargeBoiler.java | 8 +- .../MetaTileEntityActiveTransformer.java | 4 +- .../electric/MetaTileEntityCleanroom.java | 6 +- .../electric/MetaTileEntityCrackingUnit.java | 4 +- .../electric/MetaTileEntityDataBank.java | 6 +- .../MetaTileEntityElectricBlastFurnace.java | 7 +- .../electric/MetaTileEntityFluidDrill.java | 5 +- .../multi/electric/MetaTileEntityHPCA.java | 12 +- .../electric/MetaTileEntityLargeMiner.java | 7 +- .../electric/MetaTileEntityMultiSmelter.java | 4 +- .../electric/MetaTileEntityNetworkSwitch.java | 6 +- .../MetaTileEntityPowerSubstation.java | 5 +- .../MetaTileEntityProcessingArray.java | 4 +- .../electric/MetaTileEntityPyrolyseOven.java | 4 +- .../MetaTileEntityResearchStation.java | 6 +- .../MetaTileEntityCentralMonitor.java | 5 +- .../MetaTileEntityLargeCombustionEngine.java | 5 +- .../generator/MetaTileEntityLargeTurbine.java | 7 +- 26 files changed, 738 insertions(+), 701 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index 4b77471d840..f610fc5edb5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -5,7 +5,7 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.GTUtility; @@ -48,7 +48,7 @@ protected void initializeAbilities() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) @@ -58,7 +58,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowDynamoTierLine(isDynamoTierTooLow()) .addMaintenanceProblemLines(getMaintenanceProblems()); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 6463decbc3a..637134efb90 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -12,6 +12,7 @@ import gregtech.api.gui.widgets.ImageWidget; import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.gui.widgets.ProgressWidget; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; @@ -554,11 +555,11 @@ public boolean usesMui2() { return true; } - protected void configureDisplayText(MultiblockUIFactory.Builder builder) {} + protected void configureDisplayText(MultiblockUIBuilder builder) {} - protected void configureErrorText(MultiblockUIFactory.Builder builder) {} + protected void configureErrorText(MultiblockUIBuilder builder) {} - protected void configureWarningText(MultiblockUIFactory.Builder builder) {} + protected void configureWarningText(MultiblockUIBuilder builder) {} protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 69facf52fe3..661bda3ee38 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -10,7 +10,7 @@ import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.IDataInfoProvider; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; @@ -170,7 +170,7 @@ protected boolean allowSameFluidFillForOutputs() { return true; } - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) @@ -179,7 +179,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index a1d72477407..aa129c1c46d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -10,7 +10,7 @@ import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MTETrait; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; @@ -100,7 +100,7 @@ private void resetTileAbilities() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addCustom(keyManager -> { // custom steam tank line @@ -121,7 +121,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom(list -> { if (isStructureFormed() && recipeMapWorkable.isHasNotEnoughEnergy()) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.steam.low_steam")); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java new file mode 100644 index 00000000000..772ad5dfb28 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java @@ -0,0 +1,16 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import com.cleanroommc.modularui.api.drawable.IDrawable; + +public interface KeyManager { + + default void add(IDrawable drawable) { + add(drawable, Operation.NEW_LINE_SPACE); + } + + void add(IDrawable drawable, Operation op); + + default void addAll(Iterable drawables) { + drawables.forEach(this::add); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java new file mode 100644 index 00000000000..15c349eb883 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -0,0 +1,571 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import gregtech.api.GTValues; +import gregtech.api.capability.IEnergyContainer; +import gregtech.api.util.JsonUtils; +import gregtech.api.util.KeyUtil; +import gregtech.api.util.TextFormattingUtil; +import gregtech.common.ConfigHolder; + +import net.minecraft.network.PacketBuffer; +import net.minecraft.util.text.TextFormatting; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.value.sync.SyncHandler; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +@SuppressWarnings({ "UnusedReturnValue", "unused" }) +public class MultiblockUIBuilder implements KeyManager { + + private final List textList = new ArrayList<>(); + private final List operations = new ArrayList<>(); + + private Consumer action; + private final SyncHandler syncHandler = makeSyncHandler(); + + private boolean isWorkingEnabled; + private boolean isActive; + private boolean isStructureFormed; + + // Keys for the three-state working system, can be set custom by multiblocks. + private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").style(TextFormatting.GRAY); + private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD); + private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN); + private boolean dirty; + private Runnable onRebuild; + + void updateFormed(boolean isStructureFormed) { + this.isStructureFormed = isStructureFormed; + } + + public MultiblockUIBuilder structureFormed(boolean structureFormed) { + updateFormed(structureFormed); + if (!structureFormed) { + var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); + var hover = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.invalid_structure.tooltip"); + addKey(base, hover); + } + return this; + } + + public MultiblockUIBuilder title(String lang) { + addKey(KeyUtil.lang(TextFormatting.WHITE, lang)); + return this; + } + + /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ + public MultiblockUIBuilder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { + this.isWorkingEnabled = isWorkingEnabled; + this.isActive = isActive; + return this; + } + + /** + * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. + * You still must call {@link MultiblockUIBuilder#addWorkingStatusLine()} for these to appear! + *
+ * Pass any key as null for it to continue to use the default key. + * + * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". + * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". + * @param runningKey The translation key for the Running state, or "isActive". + */ + public MultiblockUIBuilder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { + if (idlingKey != null) this.idlingKey = IKey.lang(idlingKey).style(TextFormatting.GRAY); + if (pausedKey != null) this.pausedKey = IKey.lang(pausedKey).style(TextFormatting.GOLD); + if (runningKey != null) this.runningKey = IKey.lang(runningKey).style(TextFormatting.GREEN); + return this; + } + + /** + * Adds the max EU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the passed energy container has greater than zero capacity. + */ + public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) { + if (!isStructureFormed || energyContainer == null) return this; + if (energyContainer.getEnergyCapacity() <= 0) return this; + + long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", + KeyUtil.number(maxVoltage), + KeyUtil.voltage(GTValues.VOCNF, maxVoltage)); + + var hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_hover"); + + addKey(bodyText, hoverText); + return this; + } + + /** + * Adds the max Recipe Tier that this multiblock can use for recipe lookup. + *
+ * Added if the structure is formed and if the passed tier is a valid energy tier index for {@link GTValues#VNF}. + */ + public MultiblockUIBuilder addEnergyTierLine(int tier) { + if (!isStructureFormed) return this; + if (tier < GTValues.ULV || tier > GTValues.MAX) return this; + + var bodyText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); + var hoverText = KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_recipe_tier_hover"); + addKey(bodyText, hoverText); + return this; + } + + /** + * Adds the exact EU/t that this multiblock needs to run. + *
+ * Added if the structure is formed and if the passed value is greater than zero. + */ + public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { + if (!isStructureFormed) return this; + if (energyUsage > 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.overclock(GTValues.VOCNF, energyUsage); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce. + *
+ * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. + */ + public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { + if (!isStructureFormed) return this; + if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); + } + return this; + } + + /** + * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp outputting + * multis. + *
+ * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than + * zero. + */ + public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { + if (!isStructureFormed) return this; + if (maxVoltage != 0 && amperage != 0) { + String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); + // wrap in text component to keep it from being formatted + var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.max_energy_per_tick_amps", + energyFormatted, amperage, voltageName)); + } + return this; + } + + /** + * Adds the max CWU/t that this multiblock can use. + *
+ * Added if the structure is formed and if the max CWU/t is greater than zero. + */ + public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { + if (!isStructureFormed) return this; + if (maxCWUt > 0) { + var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.computation.max", computation)); + } + return this; + } + + /** + * Adds a currently used CWU/t line. + *
+ * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. + */ + public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { + if (!isStructureFormed) return this; + if (isActive && currentCWUt > 0) { + var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.computation.usage", computation)); + } + return this; + } + + /** + * Adds a three-state indicator line, showing if the machine is running, paused, or idling. + *
+ * Added if the structure is formed. + */ + public MultiblockUIBuilder addWorkingStatusLine() { + if (!isStructureFormed) return this; + + if (!isWorkingEnabled) { + addKey(pausedKey); + } else if (isActive) { + addKey(runningKey); + } else { + addKey(idlingKey); + } + return this; + } + + /** + * Adds the "Work Paused." line. + *
+ * Added if working is not enabled, or if the checkState passed parameter is false. Also added only if formed. + */ + public MultiblockUIBuilder addWorkPausedLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || !isWorkingEnabled) { + addKey(pausedKey); + } + return this; + } + + /** + * Adds the "Running Perfectly." line. + *
+ * Added if machine is active, or if the checkState passed parameter is false. Also added only if formed. + */ + public MultiblockUIBuilder addRunningPerfectlyLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || isActive) { + addKey(runningKey); + } + return this; + } + + /** + * Adds the "Idling." line. + *
+ * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. Also + * added only if formed. + */ + public MultiblockUIBuilder addIdlingLine(boolean checkState) { + if (!isStructureFormed) return this; + if (!checkState || (isWorkingEnabled && !isActive)) { + addKey(idlingKey); + } + return this; + } + + /** + * Adds a simple progress line that displays progress as a percentage. + *
+ * Added if structure is formed and the machine is active. + * + * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. + */ + public MultiblockUIBuilder addProgressLine(double progressPercent) { + if (!isStructureFormed || !isActive) return this; + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.progress", + (int) (progressPercent * 100))); + return this; + } + + /** + * Adds a line indicating how many parallels this multi can potentially perform. + *
+ * Added if structure is formed and the number of parallels is greater than one. + */ + public MultiblockUIBuilder addParallelsLine(int numParallels) { + if (!isStructureFormed) return this; + if (numParallels > 1) { + var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.parallel", parallels)); + } + return this; + } + + /** + * Adds a warning line when the machine is low on power. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { + if (!isStructureFormed) return this; + if (isLowPower) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy")); + } + return this; + } + + /** + * Adds a warning line when the machine is low on computation. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { + if (!isStructureFormed) return this; + if (isLowComputation) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.computation.not_enough_computation")); + } + return this; + } + + /** + * Adds a warning line when the machine's dynamo tier is too low for current conditions. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { + if (!isStructureFormed) return this; + if (isTooLow) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.not_enough_energy_output")); + } + return this; + } + + /** + * Adds warning line(s) when the machine has maintenance problems. + *
+ * Added if there are any maintenance problems, one line per problem as well as a header.
+ * Will check the config + * setting for if maintenance is enabled automatically. + */ + public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { + if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; + if (maintenanceProblems < 63) { + addKey(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.has_problems")); + + // Wrench + if ((maintenanceProblems & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wrench")); + } + + // Screwdriver + if (((maintenanceProblems >> 1) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.screwdriver")); + } + + // Soft Mallet + if (((maintenanceProblems >> 2) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.soft_mallet")); + } + + // Hammer + if (((maintenanceProblems >> 3) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.hard_hammer")); + } + + // Wire Cutters + if (((maintenanceProblems >> 4) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.wire_cutter")); + } + + // Crowbar + if (((maintenanceProblems >> 5) & 1) == 0) { + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.problem.crowbar")); + } + } + return this; + } + + /** + * Adds two error lines when the machine's muffler hatch is obstructed. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { + if (!isStructureFormed) return this; + if (isObstructed) { + addKey(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.universal.muffler_obstructed")); + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.universal.muffler_obstructed_desc")); + } + return this; + } + + /** + * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. + *
+ * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. + */ + public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + if (!isStructureFormed || !isActive || fuelName == null) return this; + + addKey(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.turbine.fuel_needed", + KeyUtil.string(TextFormatting.RED, fuelName), + KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); + return this; + } + + /** Insert an empty line into the text list. */ + public MultiblockUIBuilder addEmptyLine() { + addKey(IKey.LINE_FEED); + return this; + } + + /** Add custom text dynamically, allowing for custom application logic. */ + public MultiblockUIBuilder addCustom(Consumer customConsumer) { + customConsumer.accept(this); + return this; + } + + public boolean isEmpty() { + return this.textList.isEmpty(); + } + + public void clear() { + this.textList.clear(); + this.operations.clear(); + } + + protected boolean hasChanged() { + if (this.action == null) return false; + List old = toString(this.textList); + build(); + if (textList.size() != old.size()) return true; + for (int i = 0; i < textList.size(); i++) { + if (!JsonUtils.toJsonString(textList.get(i)).equals(old.get(i))) + return true; + } + return false; + } + + private static List toString(List drawables) { + List strings = new ArrayList<>(); + for (IDrawable drawable : drawables) { + strings.add(JsonUtils.toJsonString(drawable)); + } + return strings; + } + + protected void sync(String key, PanelSyncManager syncManager) { + syncManager.syncValue(key, this.syncHandler); + } + + private SyncHandler makeSyncHandler() { + return new SyncHandler() { + + @Override + public void detectAndSendChanges(boolean init) { + if (init || hasChanged()) { + if (init) { + onRebuild(); + build(); + } + sync(0, this::syncText); + markDirty(); + } + } + + private void syncText(PacketBuffer buffer) { + buffer.writeVarInt(textList.size()); + for (int i = 0; i < textList.size(); i++) { + buffer.writeByte(Operation.getId(operations.get(i))); + var jsonString = JsonUtils.toJsonString(textList.get(i)); + NetworkUtils.writeStringSafe(buffer, jsonString); + } + } + + @Override + public void readOnClient(int id, PacketBuffer buf) { + if (id == 0) { + clear(); + for (int i = buf.readVarInt(); i > 0; i--) { + int op = buf.readByte(); + String jsonString = NetworkUtils.readStringSafe(buf); + addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); + } + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) {} + }; + } + + public void build(IRichTextBuilder richText) { + if (dirty) { + onRebuild(); + build(); + dirty = false; + } + for (int i = 0; i < operations.size(); i++) { + operations.get(i).apply(textList.get(i), richText); + } + } + + private void onRebuild() { + if (this.onRebuild != null) { + this.onRebuild.run(); + } + } + + public void markDirty() { + dirty = true; + } + + protected void build() { + clear(); + if (this.action != null) this.action.accept(this); + } + + protected void setAction(Consumer action) { + this.action = action; + } + + public void onRebuild(Runnable onRebuild) { + this.onRebuild = onRebuild; + } + + private void addKey(IKey key, IDrawable... hover) { + addKey(KeyUtil.setHover(key, hover)); + } + + private void addKey(IDrawable key) { + addKey(key, Operation.NEW_LINE_SPACE); + } + + private void addKey(@NotNull IDrawable key, @NotNull Operation op) { + if (textList.size() != operations.size()) { + throw new IllegalStateException("textList and operations must be the same size!"); + } + this.textList.add(key); + Operation.checkOp(op); + this.operations.add(op); + } + + @Override + public void add(IDrawable drawable, Operation op) { + addKey(drawable, op); + } +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 6bfe3ae81d8..12574eebf59 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -1,36 +1,27 @@ package gregtech.api.metatileentity.multiblock.ui; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.IDistinctBusController; -import gregtech.api.capability.IEnergyContainer; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLog; -import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; -import gregtech.common.ConfigHolder; -import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextFormatting; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.value.sync.SyncHandler; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; @@ -40,10 +31,6 @@ import com.cleanroommc.modularui.widgets.RichTextWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,7 +42,7 @@ public class MultiblockUIFactory { private final MultiblockWithDisplayBase mte; - protected Consumer displayText, warningText, errorText; + protected Consumer displayText, warningText, errorText; protected BiFunction flexButton = (guiData, syncManager) -> null; private int width = 198, height = 202; private int screenHeight = 109; @@ -110,15 +97,15 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { } private Widget createIndicator(PanelSyncManager syncManager) { - Builder error = builder(); + MultiblockUIBuilder error = builder(); error.sync("error", syncManager); error.setAction(this.errorText); - error.onRebuild(() -> error.isStructureFormed = mte.isStructureFormed()); + error.onRebuild(() -> error.updateFormed(mte.isStructureFormed())); - Builder warning = builder(); + MultiblockUIBuilder warning = builder(); warning.sync("warning", syncManager); warning.setAction(this.warningText); - warning.onRebuild(() -> warning.isStructureFormed = mte.isStructureFormed()); + warning.onRebuild(() -> warning.updateFormed(mte.isStructureFormed())); IDrawable indicator = new DynamicDrawable(() -> { if (!error.isEmpty()) { @@ -150,7 +137,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { * Recommended to only display warnings if the structure is already formed.
* This is called every tick on the client-side */ - public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { + public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { this.warningText = merge ? addAction(this.warningText, warningText) : warningText; return this; } @@ -160,7 +147,7 @@ public MultiblockUIFactory configureWarningText(boolean merge, Consumer * Recommended to only display warnings if the structure is already formed.
* This is called every tick on the client-side */ - public MultiblockUIFactory configureWarningText(Consumer warningText) { + public MultiblockUIFactory configureWarningText(Consumer warningText) { return configureWarningText(true, warningText); } @@ -169,7 +156,7 @@ public MultiblockUIFactory configureWarningText(Consumer warningText) { * Prioritized over any warnings provided by {@link #configureWarningText(Consumer)}.
* This is called every tick on the client-side */ - public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { + public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { this.errorText = merge ? addAction(this.errorText, errorText) : errorText; return this; } @@ -179,7 +166,7 @@ public MultiblockUIFactory configureErrorText(boolean merge, Consumer e * Prioritized over any warnings provided by {@link #configureWarningText(Consumer)}.
* This is called every tick on the client-side */ - public MultiblockUIFactory configureErrorText(Consumer errorText) { + public MultiblockUIFactory configureErrorText(Consumer errorText) { return configureErrorText(true, errorText); } @@ -189,7 +176,7 @@ public MultiblockUIFactory configureErrorText(Consumer errorText) { * To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} * or {@link KeyUtil#lang(String, Object...)} */ - public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { + public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { this.displayText = merge ? addAction(this.displayText, displayText) : displayText; return this; } @@ -200,7 +187,7 @@ public MultiblockUIFactory configureDisplayText(boolean merge, Consumer * To use translation, use {@link KeyUtil#lang(TextFormatting, String, Object...)} * or {@link KeyUtil#lang(String, Object...)} */ - public MultiblockUIFactory configureDisplayText(Consumer displayText) { + public MultiblockUIFactory configureDisplayText(Consumer displayText) { return configureDisplayText(true, displayText); } @@ -280,7 +267,7 @@ public MultiblockUIFactory addScreenChildren(Consumer> consumer) { } protected Widget createScreen(PanelSyncManager syncManager) { - Builder display = builder(); + MultiblockUIBuilder display = builder(); display.setAction(this.displayText); display.sync("display", syncManager); @@ -413,622 +400,7 @@ public static final class Bars { private Bars() {} } - public static Builder builder() { - return new Builder(); - } - - @SuppressWarnings({ "UnusedReturnValue", "unused" }) - public static class Builder implements KeyManager { - - private final List textList = new ArrayList<>(); - private final List operations = new ArrayList<>(); - - private Consumer action; - private final SyncHandler syncHandler = makeSyncHandler(); - - private boolean isWorkingEnabled; - private boolean isActive; - private boolean isStructureFormed; - - // Keys for the three-state working system, can be set custom by multiblocks. - private IKey idlingKey = IKey.lang("gregtech.multiblock.idling").style(TextFormatting.GRAY); - private IKey pausedKey = IKey.lang("gregtech.multiblock.work_paused").style(TextFormatting.GOLD); - private IKey runningKey = IKey.lang("gregtech.multiblock.running").style(TextFormatting.GREEN); - private boolean dirty; - private Runnable onRebuild; - - public Builder structureFormed(boolean structureFormed) { - this.isStructureFormed = structureFormed; - if (!structureFormed) { - var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); - var hover = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.invalid_structure.tooltip"); - addKey(base, hover); - } - return this; - } - - public Builder title(String lang) { - addKey(KeyUtil.lang(TextFormatting.WHITE, lang)); - return this; - } - - /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ - public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { - this.isWorkingEnabled = isWorkingEnabled; - this.isActive = isActive; - return this; - } - - /** - * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. - * You still must call {@link Builder#addWorkingStatusLine()} for these to appear! - *
- * Pass any key as null for it to continue to use the default key. - * - * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". - * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". - * @param runningKey The translation key for the Running state, or "isActive". - */ - public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { - if (idlingKey != null) this.idlingKey = IKey.lang(idlingKey).style(TextFormatting.GRAY); - if (pausedKey != null) this.pausedKey = IKey.lang(pausedKey).style(TextFormatting.GOLD); - if (runningKey != null) this.runningKey = IKey.lang(runningKey).style(TextFormatting.GREEN); - return this; - } - - /** - * Adds the max EU/t that this multiblock can use. - *
- * Added if the structure is formed and if the passed energy container has greater than zero capacity. - */ - public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!isStructureFormed || energyContainer == null) return this; - if (energyContainer.getEnergyCapacity() <= 0) return this; - - long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - - IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", - KeyUtil.number(maxVoltage), - KeyUtil.voltage(GTValues.VOCNF, maxVoltage)); - - var hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_hover"); - - addKey(bodyText, hoverText); - return this; - } - - /** - * Adds the max Recipe Tier that this multiblock can use for recipe lookup. - *
- * Added if the structure is formed and if the passed tier is a valid energy tier index for - * {@link GTValues#VNF}. - */ - public Builder addEnergyTierLine(int tier) { - if (!isStructureFormed) return this; - if (tier < GTValues.ULV || tier > GTValues.MAX) return this; - - var bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); - var hoverText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier_hover"); - addKey(bodyText, hoverText); - return this; - } - - /** - * Adds the exact EU/t that this multiblock needs to run. - *
- * Added if the structure is formed and if the passed value is greater than zero. - */ - public Builder addEnergyUsageExactLine(long energyUsage) { - if (!isStructureFormed) return this; - if (energyUsage > 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.overclock(GTValues.VOCNF, energyUsage); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce. - *
- * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. - */ - public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp - * outputting multis. - *
- * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than - * zero. - */ - public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && amperage != 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_amps", - energyFormatted, amperage, voltageName)); - } - return this; - } - - /** - * Adds the max CWU/t that this multiblock can use. - *
- * Added if the structure is formed and if the max CWU/t is greater than zero. - */ - public Builder addComputationUsageLine(int maxCWUt) { - if (!isStructureFormed) return this; - if (maxCWUt > 0) { - var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.computation.max", computation)); - } - return this; - } - - /** - * Adds a currently used CWU/t line. - *
- * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. - */ - public Builder addComputationUsageExactLine(int currentCWUt) { - if (!isStructureFormed) return this; - if (isActive && currentCWUt > 0) { - var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.computation.usage", computation)); - } - return this; - } - - /** - * Adds a three-state indicator line, showing if the machine is running, paused, or idling. - *
- * Added if the structure is formed. - */ - public Builder addWorkingStatusLine() { - if (!isStructureFormed) return this; - - if (!isWorkingEnabled) { - addKey(pausedKey); - } else if (isActive) { - addKey(runningKey); - } else { - addKey(idlingKey); - } - return this; - } - - /** - * Adds the "Work Paused." line. - *
- * Added if working is not enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addWorkPausedLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || !isWorkingEnabled) { - addKey(pausedKey); - } - return this; - } - - /** - * Adds the "Running Perfectly." line. - *
- * Added if machine is active, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addRunningPerfectlyLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || isActive) { - addKey(runningKey); - } - return this; - } - - /** - * Adds the "Idling." line. - *
- * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addIdlingLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || (isWorkingEnabled && !isActive)) { - addKey(idlingKey); - } - return this; - } - - /** - * Adds a simple progress line that displays progress as a percentage. - *
- * Added if structure is formed and the machine is active. - * - * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. - */ - public Builder addProgressLine(double progressPercent) { - if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.progress", - (int) (progressPercent * 100))); - return this; - } - - /** - * Adds a line indicating how many parallels this multi can potentially perform. - *
- * Added if structure is formed and the number of parallels is greater than one. - */ - public Builder addParallelsLine(int numParallels) { - if (!isStructureFormed) return this; - if (numParallels > 1) { - var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.parallel", parallels)); - } - return this; - } - - /** - * Adds a warning line when the machine is low on power. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowPowerLine(boolean isLowPower) { - if (!isStructureFormed) return this; - if (isLowPower) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy")); - } - return this; - } - - /** - * Adds a warning line when the machine is low on computation. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowComputationLine(boolean isLowComputation) { - if (!isStructureFormed) return this; - if (isLowComputation) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.computation.not_enough_computation")); - } - return this; - } - - /** - * Adds a warning line when the machine's dynamo tier is too low for current conditions. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowDynamoTierLine(boolean isTooLow) { - if (!isStructureFormed) return this; - if (isTooLow) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy_output")); - } - return this; - } - - /** - * Adds warning line(s) when the machine has maintenance problems. - *
- * Added if there are any maintenance problems, one line per problem as well as a header.
- * Will check the config setting for if maintenance is enabled automatically. - */ - public Builder addMaintenanceProblemLines(byte maintenanceProblems) { - if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - if (maintenanceProblems < 63) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.has_problems")); - - // Wrench - if ((maintenanceProblems & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wrench")); - } - - // Screwdriver - if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.screwdriver")); - } - - // Soft Mallet - if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.soft_mallet")); - } - - // Hammer - if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.hard_hammer")); - } - - // Wire Cutters - if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wire_cutter")); - } - - // Crowbar - if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.crowbar")); - } - } - return this; - } - - /** - * Adds two error lines when the machine's muffler hatch is obstructed. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addMufflerObstructedLine(boolean isObstructed) { - if (!isStructureFormed) return this; - if (isObstructed) { - addKey(KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.universal.muffler_obstructed")); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.universal.muffler_obstructed_desc")); - } - return this; - } - - /** - * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. - *
- * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. - */ - public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; - - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.turbine.fuel_needed", - KeyUtil.string(TextFormatting.RED, fuelName), - KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); - return this; - } - - /** Insert an empty line into the text list. */ - public Builder addEmptyLine() { - addKey(IKey.LINE_FEED); - return this; - } - - /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer customConsumer) { - customConsumer.accept(this); - return this; - } - - public boolean isEmpty() { - return this.textList.isEmpty(); - } - - public void clear() { - this.textList.clear(); - this.operations.clear(); - } - - protected boolean hasChanged() { - if (this.action == null) return false; - List old = toString(this.textList); - build(); - if (textList.size() != old.size()) return true; - for (int i = 0; i < textList.size(); i++) { - if (!JsonUtils.toJsonString(textList.get(i)).equals(old.get(i))) - return true; - } - return false; - } - - private static List toString(List drawables) { - List strings = new ArrayList<>(); - for (IDrawable drawable : drawables) { - strings.add(JsonUtils.toJsonString(drawable)); - } - return strings; - } - - protected void sync(String key, PanelSyncManager syncManager) { - syncManager.syncValue(key, this.syncHandler); - } - - private SyncHandler makeSyncHandler() { - return new SyncHandler() { - - @Override - public void detectAndSendChanges(boolean init) { - if (init || hasChanged()) { - if (init) { - onRebuild(); - build(); - } - sync(0, this::syncText); - markDirty(); - } - } - - private void syncText(PacketBuffer buffer) { - buffer.writeVarInt(textList.size()); - for (int i = 0; i < textList.size(); i++) { - buffer.writeByte(Operation.getId(operations.get(i))); - var jsonString = JsonUtils.toJsonString(textList.get(i)); - NetworkUtils.writeStringSafe(buffer, jsonString); - } - } - - @Override - public void readOnClient(int id, PacketBuffer buf) { - if (id == 0) { - clear(); - for (int i = buf.readVarInt(); i > 0; i--) { - int op = buf.readByte(); - String jsonString = NetworkUtils.readStringSafe(buf); - addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); - } - } - } - - @Override - public void readOnServer(int id, PacketBuffer buf) {} - }; - } - - public void build(IRichTextBuilder richText) { - if (dirty) { - onRebuild(); - build(); - dirty = false; - } - for (int i = 0; i < operations.size(); i++) { - operations.get(i).apply(textList.get(i), richText); - } - } - - private void onRebuild() { - if (this.onRebuild != null) { - this.onRebuild.run(); - } - } - - public void markDirty() { - dirty = true; - } - - protected void build() { - clear(); - if (this.action != null) this.action.accept(this); - } - - protected void setAction(Consumer action) { - this.action = action; - } - - public void onRebuild(Runnable onRebuild) { - this.onRebuild = onRebuild; - } - - private void addKey(IKey key, IDrawable... hover) { - addKey(KeyUtil.setHover(key, hover)); - } - - private void addKey(IDrawable key) { - addKey(key, Operation.NEW_LINE_SPACE); - } - - private void addKey(@NotNull IDrawable key, @NotNull Operation op) { - if (textList.size() != operations.size()) { - throw new IllegalStateException("textList and operations must be the same size!"); - } - this.textList.add(key); - Operation.checkOp(op); - this.operations.add(op); - } - - @Override - public void add(IDrawable drawable, Operation op) { - addKey(drawable, op); - } - } - - @FunctionalInterface - public interface Operation { - - Int2ObjectMap ID_MAP = new Int2ObjectArrayMap<>(); - Object2IntMap REVERSE_MAP = new Object2IntArrayMap<>(); - - Operation NO_OP = (drawable, richText) -> {}; - Operation NEW_LINE = (drawable, richText) -> richText.addLine(drawable); - Operation ADD = (drawable, richText) -> richText.add(drawable); - Operation NEW_LINE_SPACE = NEW_LINE.andThen(richText -> richText.spaceLine(2)); - - static void init() { - registerOp(NO_OP); - registerOp(NEW_LINE); - registerOp(ADD); - registerOp(NEW_LINE_SPACE); - } - - static Operation getById(int id) { - return ID_MAP.get(id); - } - - static int getId(Operation op) { - return REVERSE_MAP.get(op); - } - - static void registerOp(Operation op) { - int nextId = ID_MAP.size(); - ID_MAP.put(nextId, op); - REVERSE_MAP.put(op, nextId); - } - - static void checkOp(Operation op) { - if (!REVERSE_MAP.containsKey(op)) - throw new IllegalStateException("Operation is not registered!"); - Operation check = ID_MAP.get(REVERSE_MAP.getInt(op)); - if (check != op) throw new IllegalStateException("Operation is not identical!"); - } - - void apply(IDrawable drawable, IRichTextBuilder richText); - - default Operation andThen(Operation after) { - return (drawable, richText) -> { - this.apply(drawable, richText); - after.apply(drawable, richText); - }; - } - - default Operation andThen(Consumer> after) { - return (drawable, richText) -> { - this.apply(drawable, richText); - after.accept(richText); - }; - } - } - - public interface KeyManager { - - default void add(IDrawable drawable) { - add(drawable, Operation.NEW_LINE_SPACE); - } - - void add(IDrawable drawable, Operation op); - - default void addAll(Iterable drawables) { - drawables.forEach(this::add); - } + public static MultiblockUIBuilder builder() { + return new MultiblockUIBuilder(); } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java new file mode 100644 index 00000000000..cf46b339870 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java @@ -0,0 +1,66 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; + +import java.util.function.Consumer; + +@FunctionalInterface +public interface Operation { + + Int2ObjectMap ID_MAP = new Int2ObjectArrayMap<>(); + Object2IntMap REVERSE_MAP = new Object2IntArrayMap<>(); + + Operation NO_OP = (drawable, richText) -> {}; + Operation NEW_LINE = (drawable, richText) -> richText.addLine(drawable); + Operation ADD = (drawable, richText) -> richText.add(drawable); + Operation NEW_LINE_SPACE = NEW_LINE.andThen(richText -> richText.spaceLine(2)); + + static void init() { + registerOp(NO_OP); + registerOp(NEW_LINE); + registerOp(ADD); + registerOp(NEW_LINE_SPACE); + } + + static Operation getById(int id) { + return ID_MAP.get(id); + } + + static int getId(Operation op) { + return REVERSE_MAP.get(op); + } + + static void registerOp(Operation op) { + int nextId = ID_MAP.size(); + ID_MAP.put(nextId, op); + REVERSE_MAP.put(op, nextId); + } + + static void checkOp(Operation op) { + if (!REVERSE_MAP.containsKey(op)) + throw new IllegalStateException("Operation is not registered!"); + Operation check = ID_MAP.get(REVERSE_MAP.getInt(op)); + if (check != op) throw new IllegalStateException("Operation is not identical!"); + } + + void apply(IDrawable drawable, IRichTextBuilder richText); + + default Operation andThen(Operation after) { + return (drawable, richText) -> { + this.apply(drawable, richText); + after.apply(drawable, richText); + }; + } + + default Operation andThen(Consumer> after) { + return (drawable, richText) -> { + this.apply(drawable, richText); + after.accept(richText); + }; + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 2b4f042c682..cfdf5827a8f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -8,6 +8,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.KeyManager; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; @@ -117,14 +119,14 @@ private TextFormatting getNumberColor(int number) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addCustom(this::addCustomData) .addWorkingStatusLine(); } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); builder.addCustom(richText -> { if (isStructureFormed() && getWaterFilled() == 0) { @@ -159,7 +161,7 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(MultiblockUIFactory.KeyManager keyManager) { + private void addCustomData(KeyManager keyManager) { if (isStructureFormed()) { // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index de911af6609..98c14407d8c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -10,7 +10,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -163,7 +163,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(true, isActive()) .setWorkingStatusKeys( "gregtech.multiblock.idling", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 0902c470a87..75d88b392fa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -21,7 +21,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -484,7 +484,7 @@ protected boolean isMachineBanned(MetaTileEntity metaTileEntity) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) .addEnergyUsageLine(energyContainer) .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) @@ -509,7 +509,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)) .addCustom(list -> { if (isStructureFormed() && !isClean()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index a3ee2b3c391..78f2f3f6e35 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -6,7 +6,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -80,7 +80,7 @@ public SoundEvent getBreakdownSound() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index ebd225c4630..07a99b9e8d2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -8,7 +8,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -249,7 +249,7 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display .setWorkingStatusKeys("gregtech.multiblock.idling", "gregtech.multiblock.idling", @@ -259,7 +259,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) .addMaintenanceProblemLines(getMaintenanceProblems()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 5b64ef56eea..62d495b86a0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -10,7 +10,8 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.KeyManager; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -69,7 +70,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) @@ -79,7 +80,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(MultiblockUIFactory.KeyManager keyManager) { + private void addHeatCapacity(KeyManager keyManager) { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, getCurrentTemperature(), "K"); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index f88ad8f2dea..7f7cefabe3d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -162,7 +163,7 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .setWorkingStatusKeys( "gregtech.multiblock.idling", @@ -199,7 +200,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) .addCustom(list -> { if (isStructureFormed() && minerLogic.isInventoryFull()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index b174d2b75d3..f8be2ef4e90 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -9,6 +9,8 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.KeyManager; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -372,7 +374,7 @@ protected MultiblockUIFactory createUIFactory() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) .setWorkingStatusKeys( "gregtech.multiblock.idling", @@ -397,7 +399,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) .addCustom(richText -> { if (!isStructureFormed()) return; @@ -420,7 +422,7 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureErrorText(MultiblockUIFactory.Builder builder) { + protected void configureErrorText(MultiblockUIBuilder builder) { builder.addCustom(richText -> { if (!isStructureFormed()) return; @@ -903,7 +905,7 @@ public void addErrors(List textList) { } } - public void addWarnings2(MultiblockUIFactory.KeyManager keyManager) { + public void addWarnings2(KeyManager keyManager) { List warnings = new ArrayList<>(); if (numBridges > 1) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, @@ -924,7 +926,7 @@ public void addWarnings2(MultiblockUIFactory.KeyManager keyManager) { } } - public void addErrors2(MultiblockUIFactory.KeyManager keyManager) { + public void addErrors2(KeyManager keyManager) { for (IHPCAComponentHatch component : components) { if (component.isDamaged()) { keyManager.add(KeyUtil.lang(TextFormatting.RED, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 2f6a2ddeae0..0a40c20acaa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -13,6 +13,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -260,7 +261,7 @@ protected MultiblockUIFactory createUIFactory() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .addEnergyUsageLine(energyContainer) .addCustom(list -> { @@ -295,7 +296,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureErrorText(MultiblockUIFactory.Builder builder) { + protected void configureErrorText(MultiblockUIBuilder builder) { builder.addCustom(list -> { if (isStructureFormed() && !drainFluid(false)) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); @@ -304,7 +305,7 @@ protected void configureErrorText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)); builder.addCustom(list -> { if (isStructureFormed() && isInventoryFull) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 49aaee4e946..5934e814c99 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -8,7 +8,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.ParallelLogicType; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -55,7 +55,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java index 82b7b150416..b896e78eb0c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -8,7 +8,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -144,7 +144,7 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(true, isActive() && isWorkingEnabled()) // transform into two-state system for display .setWorkingStatusKeys( "gregtech.multiblock.idling", @@ -156,7 +156,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); builder.addCustom(list -> { if (isStructureFormed() && computationHandler.hasNonBridgingConnections()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 1ffc2250af2..215d96d6d74 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -14,6 +14,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.BigIntegerSyncValue; @@ -343,7 +344,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.structureFormed(isStructureFormed()); builder.setWorkingStatus(true, isActive() && isWorkingEnabled()); // transform into two-state system for display builder.setWorkingStatusKeys("gregtech.multiblock.idling", "gregtech.multiblock.idling", @@ -418,7 +419,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom(list -> { if (isStructureFormed() && averageInLastSec < averageOutLastSec) { BigInteger timeToDrainSeconds = energyBank.getStored() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 84a3a1ee556..e70dd905e04 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -15,7 +15,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -114,7 +114,7 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { ProcessingArrayWorkable logic = (ProcessingArrayWorkable) recipeMapWorkable; builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 62942115eb3..a0d3815e29a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -6,7 +6,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.PatternMatchContext; @@ -110,7 +110,7 @@ private TextFormatting getSpeedColor(int speed) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index aeaebb3357a..db325ef9524 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -12,7 +12,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -222,7 +222,7 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .setWorkingStatusKeys( "gregtech.multiblock.idling", @@ -237,7 +237,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) .addMaintenanceProblemLines(getMaintenanceProblems()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 4b89850df9d..41b53b3b953 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -14,6 +14,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -307,7 +308,7 @@ protected MultiblockUIFactory createUIFactory() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { builder.addCustom(list -> { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", this.height)); @@ -318,7 +319,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom(list -> { if (isStructureFormed() && !drainEnergy(true)) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.low_power")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 5eb691f3dea..ee238b69051 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -13,6 +13,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; @@ -73,7 +74,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); @@ -97,7 +98,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureErrorText(MultiblockUIFactory.Builder builder) { + protected void configureErrorText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; builder.addCustom(keyList -> { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index dc0ed78b477..e0d82822eb1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -8,6 +8,7 @@ import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; @@ -119,7 +120,7 @@ protected long getMaxVoltage() { } @Override - protected void configureDisplayText(MultiblockUIFactory.Builder builder) { + protected void configureDisplayText(MultiblockUIBuilder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) @@ -144,7 +145,7 @@ protected void configureDisplayText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureWarningText(MultiblockUIFactory.Builder builder) { + protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom(keyList -> { if (!isStructureFormed() || getRotorHolder() == null) return; @@ -161,7 +162,7 @@ protected void configureWarningText(MultiblockUIFactory.Builder builder) { } @Override - protected void configureErrorText(MultiblockUIFactory.Builder builder) { + protected void configureErrorText(MultiblockUIBuilder builder) { builder.addCustom(keyList -> { if (!isStructureFormed() || getRotorHolder() == null) return; From 0738983e189e0e329b5784ae41ef0f798f767e4f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:29:22 -0700 Subject: [PATCH 136/264] fix hpca componant grid size --- .../metatileentities/multi/electric/MetaTileEntityHPCA.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index f8be2ef4e90..04878a9cd59 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -370,7 +370,7 @@ protected MultiblockUIFactory createUIFactory() { .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) .asWidget() // could add tooltips here showing the name of the component - .size(18)))); + .size(14)))); } @Override From 6573b38ae57c1ba8d8b4aac85e48b199b329264e Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:44:32 -0500 Subject: [PATCH 137/264] HPCA component widget tooltips and remove old MUI0 methods --- .../api/capability/IHPCAComponentHatch.java | 5 ++ .../multi/electric/MetaTileEntityHPCA.java | 89 +++---------------- .../hpca/MetaTileEntityHPCABridge.java | 5 ++ .../hpca/MetaTileEntityHPCAComputation.java | 5 ++ .../hpca/MetaTileEntityHPCACooler.java | 5 ++ .../hpca/MetaTileEntityHPCAEmpty.java | 5 ++ .../helper/HPCAComponentHatchTestImpl.java | 6 ++ 7 files changed, 45 insertions(+), 75 deletions(-) diff --git a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java index 47a9cce3729..3118b2164b7 100644 --- a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java +++ b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java @@ -58,4 +58,9 @@ default void setDamaged(boolean damaged) {} default UITexture getComponentIcon2() { return GTGuiTextures.HPCA_ICON_EMPTY_COMPONENT; } + + /** + * The untranslated name of the tile implementing an HPCA component + */ + String getTileName(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 04878a9cd59..f8ffae0c728 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -21,7 +21,6 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; -import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; @@ -89,12 +88,9 @@ public class MetaTileEntityHPCA extends MultiblockWithDisplayBase private double temperature = IDLE_TEMPERATURE; // start at idle temperature - private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier progressSupplier; - public MetaTileEntityHPCA(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.energyContainer = new EnergyContainerList(new ArrayList<>()); - this.progressSupplier = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 47, false); this.hpcaHandler = new HPCAGridHandler(this); } @@ -369,7 +365,12 @@ protected MultiblockUIFactory createUIFactory() { .minElementMargin(1) .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) .asWidget() - // could add tooltips here showing the name of the component + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + if (isStructureFormed()) { + tooltip.addLine(hpcaHandler.getComponentKey(value)); + } + }) .size(14)))); } @@ -835,76 +836,6 @@ public int getMaxCoolantDemand() { return maxCoolant; } - public void addInfo(List textList) { - // Max Computation - ITextComponent data = TextComponentUtil.stringWithColor(TextFormatting.AQUA, - Integer.toString(getMaxCWUt())); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.info_max_computation", data)); - - // Cooling - TextFormatting coolingColor = getMaxCoolingAmount() < getMaxCoolingDemand() ? TextFormatting.RED : - TextFormatting.GREEN; - data = TextComponentUtil.stringWithColor(coolingColor, Integer.toString(getMaxCoolingDemand())); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.info_max_cooling_demand", data)); - - data = TextComponentUtil.stringWithColor(coolingColor, Integer.toString(getMaxCoolingAmount())); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.info_max_cooling_available", data)); - - // Coolant Required - if (getMaxCoolantDemand() > 0) { - data = TextComponentUtil.stringWithColor( - TextFormatting.YELLOW, - getMaxCoolantDemand() + "L "); - ITextComponent coolantName = TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.hpca.info_coolant_name"); - data.appendSibling(coolantName); - } else { - data = TextComponentUtil.stringWithColor(TextFormatting.GREEN, "0"); - } - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.info_max_coolant_required", data)); - - // Bridging - if (numBridges > 0) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GREEN, - "gregtech.multiblock.hpca.info_bridging_enabled")); - } else { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.hpca.info_bridging_disabled")); - } - } - - public void addWarnings(List textList) { - List warnings = new ArrayList<>(); - if (numBridges > 1) { - warnings.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.warning_multiple_bridges")); - } - if (computationProviders.isEmpty()) { - warnings.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.warning_no_computation")); - } - if (getMaxCoolingDemand() > getMaxCoolingAmount()) { - warnings.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.hpca.warning_low_cooling")); - } - if (!warnings.isEmpty()) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.hpca.warning_structure_header")); - textList.addAll(warnings); - } - } - - public void addErrors(List textList) { - if (components.stream().anyMatch(IHPCAComponentHatch::isDamaged)) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.hpca.error_damaged")); - } - } - public void addWarnings2(KeyManager keyManager) { List warnings = new ArrayList<>(); if (numBridges > 1) { @@ -951,6 +882,14 @@ public UITexture getComponentTexture2(int index) { return components.get(index).getComponentIcon2(); } + public IKey getComponentKey(int index) { + if (components.size() <= index) { + return IKey.EMPTY; + } + + return IKey.lang(components.get(index).getTileName()); + } + public void tryGatherClientComponents(World world, BlockPos pos, EnumFacing frontFacing, EnumFacing upwardsFacing, boolean flip) { EnumFacing relativeUp = RelativeDirection.UP.getRelativeFacing(frontFacing, upwardsFacing, flip); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java index f49e6f19287..ed6c90c2ccb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java @@ -63,4 +63,9 @@ public int getUpkeepEUt() { public boolean canBeDamaged() { return false; } + + @Override + public String getTileName() { + return getMetaFullName(); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java index 2c9eadb5ff8..2352d004875 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java @@ -91,4 +91,9 @@ public int getCoolingPerTick() { public boolean canBeDamaged() { return true; } + + @Override + public String getTileName() { + return getMetaFullName(); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java index fe5aa72cbd9..464145fecd7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java @@ -77,4 +77,9 @@ public boolean isActiveCooler() { public int getMaxCoolantPerTick() { return advanced ? 8 : 0; } + + @Override + public String getTileName() { + return getMetaFullName(); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java index 9c25261401e..53228475386 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java @@ -44,4 +44,9 @@ public int getUpkeepEUt() { public boolean canBeDamaged() { return false; } + + @Override + public String getTileName() { + return getMetaFullName(); + } } diff --git a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java index 47d6dbf742a..d89e653460c 100644 --- a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java +++ b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java @@ -40,4 +40,10 @@ public boolean isBridge() { public TextureArea getComponentIcon() { return null; } + + // not tested + @Override + public String getTileName() { + return ""; + } } From 1d4e00ed5e4b7947c713b29a3905934f28454cb0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 14 Feb 2025 16:46:35 -0700 Subject: [PATCH 138/264] fully implement HPCA's tooltips --- .../multi/electric/MetaTileEntityHPCA.java | 83 ++++++++++++++++--- 1 file changed, 71 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index f8ffae0c728..743a6344e79 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -53,11 +53,13 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.layout.Grid; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -88,9 +90,12 @@ public class MetaTileEntityHPCA extends MultiblockWithDisplayBase private double temperature = IDLE_TEMPERATURE; // start at idle temperature + private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier progressSupplier; + public MetaTileEntityHPCA(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.energyContainer = new EnergyContainerList(new ArrayList<>()); + this.progressSupplier = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 47, false); this.hpcaHandler = new HPCAGridHandler(this); } @@ -358,20 +363,32 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() - .addScreenChildren(iWidgets -> iWidgets.add(new Grid() - .coverChildren() + .addScreenChildren(widgets -> widgets.add(new ParentWidget<>() .leftRel(0.5f) - .bottom(4) - .minElementMargin(1) - .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) - .asWidget() + .bottom(5) + .size(16 * 3 + 2) + .child(new Grid() + .sizeRel(1f) + .padding(1) + .minElementMargin(1) + .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) + .asWidget() + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + hpcaHandler.addInfo(tooltip); + if (isStructureFormed()) { + tooltip.addLine(hpcaHandler.getComponentKey(value)); + } + }) + .size(14))) + .child(new ProgressWidget() + .sizeRel(1f) + .value(new DoubleSyncValue(progressSupplier)) + .texture(GTGuiTextures.HPCA_COMPONENT_OUTLINE, + 47) + .direction(ProgressWidget.Direction.LEFT) .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - if (isStructureFormed()) { - tooltip.addLine(hpcaHandler.getComponentKey(value)); - } - }) - .size(14)))); + .tooltipBuilder(hpcaHandler::addInfo)))); } @Override @@ -836,6 +853,48 @@ public int getMaxCoolantDemand() { return maxCoolant; } + public void addInfo(IRichTextBuilder textList) { + // Max Computation + IKey data = KeyUtil.number(TextFormatting.AQUA, getMaxCWUt()); + textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.info_max_computation", data)); + + // Cooling + TextFormatting coolingColor = getMaxCoolingAmount() < getMaxCoolingDemand() ? TextFormatting.RED : + TextFormatting.GREEN; + data = KeyUtil.number(coolingColor, getMaxCoolingDemand()); + textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.info_max_cooling_demand", data)); + + data = KeyUtil.number(coolingColor, getMaxCoolingAmount()); + textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.info_max_cooling_available", data)); + + // Coolant Required + if (getMaxCoolantDemand() > 0) { + data = KeyUtil.number( + TextFormatting.YELLOW, + getMaxCoolantDemand(), "L "); + IKey coolantName = KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.hpca.info_coolant_name"); + // data.appendSibling(coolantName); + data = IKey.comp(data, coolantName); + } else { + data = KeyUtil.string(TextFormatting.GREEN, "0"); + } + textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.hpca.info_max_coolant_required", data)); + + // Bridging + if (numBridges > 0) { + textList.addLine(KeyUtil.lang(TextFormatting.GREEN, + "gregtech.multiblock.hpca.info_bridging_enabled")); + } else { + textList.addLine(KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.hpca.info_bridging_disabled")); + } + } + public void addWarnings2(KeyManager keyManager) { List warnings = new ArrayList<>(); if (numBridges > 1) { From 377203d268fdccd5aab50c13023bec1c6c955692 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 14 Feb 2025 17:02:44 -0700 Subject: [PATCH 139/264] improve tooltip a bit more --- .../multi/electric/MetaTileEntityHPCA.java | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 743a6344e79..99d7c7ec649 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -60,6 +60,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.ProgressWidget; import com.cleanroommc.modularui.widgets.layout.Grid; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -367,28 +368,28 @@ protected MultiblockUIFactory createUIFactory() { .leftRel(0.5f) .bottom(5) .size(16 * 3 + 2) + .child(new ProgressWidget() + .sizeRel(1f) + .value(new DoubleSyncValue(progressSupplier)) + .texture(GTGuiTextures.HPCA_COMPONENT_OUTLINE, 47) + .direction(ProgressWidget.Direction.LEFT) + .tooltipAutoUpdate(true)) .child(new Grid() .sizeRel(1f) .padding(1) - .minElementMargin(1) - .mapTo(3, 9, value -> new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) - .asWidget() + .mapTo(3, 9, value -> new Widget<>() + .overlay(new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) + .asIcon().size(14).marginLeft(2).marginTop(2)) .tooltipAutoUpdate(true) .tooltipBuilder(tooltip -> { - hpcaHandler.addInfo(tooltip); if (isStructureFormed()) { tooltip.addLine(hpcaHandler.getComponentKey(value)); + tooltip.spaceLine(2); } + hpcaHandler.addInfo(tooltip); }) - .size(14))) - .child(new ProgressWidget() - .sizeRel(1f) - .value(new DoubleSyncValue(progressSupplier)) - .texture(GTGuiTextures.HPCA_COMPONENT_OUTLINE, - 47) - .direction(ProgressWidget.Direction.LEFT) - .tooltipAutoUpdate(true) - .tooltipBuilder(hpcaHandler::addInfo)))); + .size(16) + .padding(1))))); } @Override From 7858b834da5bc7b041eb87abe60ec25afe7dbb05 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 17 Feb 2025 01:50:07 -0500 Subject: [PATCH 140/264] Allow `GTFluidSyncHandler`s to control showing the amount in the tooltip and drawn on the slot separately --- .../api/mui/sync/GTFluidSyncHandler.java | 43 +++++++++++++------ .../covers/filter/SimpleFluidFilter.java | 3 +- .../multi/MetaTileEntityPumpHatch.java | 2 +- .../MetaTileEntityFluidHatch.java | 2 +- .../MetaTileEntityReservoirHatch.java | 2 +- .../MetaTileEntitySteamHatch.java | 2 +- .../common/mui/widget/GTFluidSlot.java | 8 ++-- 7 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 4571c26e93d..aedccc6f318 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -43,7 +43,8 @@ public class GTFluidSyncHandler extends SyncHandler { private boolean canDrainSlot = true; private boolean canFillSlot = true; private boolean phantom; - private BooleanSupplier showAmount = () -> true; + private BooleanSupplier showAmountInTooltip = () -> true; + private BooleanSupplier showAmountOnSlot = () -> true; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; @@ -142,20 +143,36 @@ public boolean isPhantom() { return phantom; } - public GTFluidSyncHandler showAmount(boolean showAmount) { - this.showAmount = () -> showAmount; + public GTFluidSyncHandler showAmountInTooltip(boolean showAmount) { + this.showAmountInTooltip = () -> showAmount; return this; } - public GTFluidSyncHandler showAmount(BooleanSupplier showAmount) { - this.showAmount = showAmount; + public GTFluidSyncHandler showAmountInTooltip(BooleanSupplier showAmount) { + this.showAmountInTooltip = showAmount; return this; } - public boolean showAmount() { + public boolean showAmountInTooltip() { if (!isPhantom() && phantomFluid != null) return false; - return this.showAmount.getAsBoolean(); + return this.showAmountInTooltip.getAsBoolean(); + } + + public GTFluidSyncHandler showAmountOnSlot(boolean showAmount) { + this.showAmountOnSlot = () -> showAmount; + return this; + } + + public GTFluidSyncHandler showAmountOnSlot(BooleanSupplier showAmount) { + this.showAmountOnSlot = showAmount; + return this; + } + + public boolean showAmountOnSlot() { + if (!isPhantom() && phantomFluid != null) + return false; + return this.showAmountOnSlot.getAsBoolean(); } public @NotNull String getFormattedFluidAmount() { @@ -231,9 +248,9 @@ public void tryClickPhantom(MouseData data) { } } else { FluidStack cellFluid = fluidHandlerItem.drain(Integer.MAX_VALUE, false); - if ((this.showAmount.getAsBoolean() || currentFluid == null) && cellFluid != null) { + if ((this.showAmountOnSlot.getAsBoolean() || currentFluid == null) && cellFluid != null) { if (this.canFillSlot()) { - if (!this.showAmount.getAsBoolean()) { + if (!this.showAmountOnSlot.getAsBoolean()) { cellFluid.amount = 1; } if (this.tank.fill(cellFluid, true) > 0) { @@ -250,14 +267,14 @@ public void tryClickPhantom(MouseData data) { case 1 -> { if (this.canFillSlot()) { if (currentFluid != null) { - if (this.showAmount.getAsBoolean()) { + if (this.showAmountOnSlot.getAsBoolean()) { FluidStack toFill = currentFluid.copy(); toFill.amount = 1000; this.tank.fill(toFill, true); } } else if (this.phantomFluid != null) { FluidStack toFill = this.phantomFluid.copy(); - toFill.amount = this.showAmount.getAsBoolean() ? 1 : toFill.amount; + toFill.amount = this.showAmountOnSlot.getAsBoolean() ? 1 : toFill.amount; this.tank.fill(toFill, true); } } @@ -272,7 +289,7 @@ public void tryClickPhantom(MouseData data) { public void tryScrollPhantom(MouseData mouseData) { FluidStack currentFluid = this.tank.getFluid(); int amount = mouseData.mouseButton; - if (!this.showAmount()) { + if (!this.showAmountOnSlot()) { int newAmt = amount == 1 ? 1 : 0; if (newAmt == 0) { setFluid(null); @@ -293,7 +310,7 @@ public void tryScrollPhantom(MouseData mouseData) { if (currentFluid == null) { if (amount > 0 && this.phantomFluid != null) { FluidStack toFill = this.phantomFluid.copy(); - toFill.amount = this.showAmount() ? amount : 1; + toFill.amount = this.showAmountOnSlot() ? amount : 1; this.tank.fill(toFill, true); } return; diff --git a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java index f91d5105799..25bbbf64362 100644 --- a/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java +++ b/src/main/java/gregtech/common/covers/filter/SimpleFluidFilter.java @@ -60,7 +60,8 @@ public void configureFilterTanks(int amount) { .key('F', i -> new GTFluidSlot() .syncHandler(GTFluidSlot.sync(filterReader.getFluidTank(i)) .phantom(true) - .showAmount(getFilterReader()::shouldShowAmount))) + .showAmountOnSlot(getFilterReader()::shouldShowAmount) + .showAmountInTooltip(getFilterReader()::shouldShowAmount))) .build().marginRight(4)) .child(createBlacklistUI()); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java index a17b955729c..a251b2f2a46 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java @@ -128,7 +128,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.exportFluids.getTankAt(0)) - .showAmount(false) + .showAmountOnSlot(false) .accessibility(true, false); // TODO: Change the position of the name when it's standardized. diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 5537385473a..c6bd1860bd8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -280,7 +280,7 @@ public boolean usesMui2() { @Override public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) - .showAmount(false) + .showAmountOnSlot(false) .accessibility(true, !isExportHatch) .handleLocking(() -> this.lockedFluid, fluidStack -> { setLocked(fluidStack != null); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java index 83488327c26..9f8a133d401 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java @@ -153,7 +153,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.fluidTank) - .showAmount(false) + .showAmountOnSlot(false) .accessibility(true, false); // TODO: Change the position of the name when it's standardized. diff --git a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java index bacb525a3aa..78bc61b5a2d 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java @@ -144,7 +144,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) guiSyncManager.registerSlotGroup("item_inv", 2); GTFluidSyncHandler tankSyncHandler = GTFluidSlot.sync(this.importFluids.getTankAt(0)) - .showAmount(false); + .showAmountOnSlot(false); return GTGuis.createPanel(this, 176, 166) .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index bc9ba458098..99de725b5e0 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -57,10 +57,10 @@ public GTFluidSlot() { if (fluid == null) return; tooltip.addLine(IKey.str(fluid.getLocalizedName())); - if (this.syncHandler.showAmount()) + if (this.syncHandler.showAmountInTooltip()) tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); - if (this.syncHandler.isPhantom() && this.syncHandler.showAmount()) + if (this.syncHandler.isPhantom() && this.syncHandler.showAmountInTooltip()) tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); // Add various tooltips from the material @@ -69,7 +69,7 @@ public GTFluidSlot() { tooltip.addLine(IKey.str(s)); } - if (this.syncHandler.showAmount()) + if (this.syncHandler.showAmountInTooltip()) addIngotMolFluidTooltip(fluid, tooltip); }); } @@ -126,7 +126,7 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); - if (content != null && this.syncHandler.showAmount()) { + if (content != null && this.syncHandler.showAmountOnSlot()) { String amount = NumberFormat.formatWithMaxDigits(content.amount, 3) + "L"; this.textRenderer.setAlignment(Alignment.CenterRight, getArea().width - 1f); this.textRenderer.setPos(0, 12); From a3ff38ad9b3a1446486ecba0d0acaf6926f5b3e3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 17 Feb 2025 02:18:25 -0500 Subject: [PATCH 141/264] `GTFluidSlot`s can now render the fluid as taking up a percentage of the slot relative to the stored fluid. --- .../gregtech/api/mui/sync/GTFluidSyncHandler.java | 15 +++++++++++++++ .../gregtech/common/mui/widget/GTFluidSlot.java | 11 ++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index aedccc6f318..1b667ffc6bf 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -45,6 +45,7 @@ public class GTFluidSyncHandler extends SyncHandler { private boolean phantom; private BooleanSupplier showAmountInTooltip = () -> true; private BooleanSupplier showAmountOnSlot = () -> true; + private BooleanSupplier drawAlwaysFull = () -> true; public GTFluidSyncHandler(IFluidTank tank) { this.tank = tank; @@ -175,6 +176,20 @@ public boolean showAmountOnSlot() { return this.showAmountOnSlot.getAsBoolean(); } + public GTFluidSyncHandler drawAlwaysFull(boolean drawAsFull) { + this.drawAlwaysFull = () -> drawAsFull; + return this; + } + + public GTFluidSyncHandler drawAlwaysFull(BooleanSupplier drawAsFull) { + this.drawAlwaysFull = drawAsFull; + return this; + } + + public boolean drawAlwaysFull() { + return this.drawAlwaysFull.getAsBoolean(); + } + public @NotNull String getFormattedFluidAmount() { var tankFluid = this.tank.getFluid(); return String.format("%,d", tankFluid == null ? 0 : tankFluid.amount); diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 99de725b5e0..ba17b952e24 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -124,7 +124,16 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { if (content == null) content = this.syncHandler.getLockedFluid(); - GuiDraw.drawFluidTexture(content, 1, 1, getArea().w() - 2, getArea().h() - 2, 0); + float height = getArea().h() - 2; + int y = 1; + + if (!this.syncHandler.drawAlwaysFull()) { + float newHeight = height * ((float) content.amount / this.syncHandler.getCapacity()); + y += (int) (height - newHeight); + height = newHeight; + } + + GuiDraw.drawFluidTexture(content, 1, y, getArea().w() - 2, height, 0); if (content != null && this.syncHandler.showAmountOnSlot()) { String amount = NumberFormat.formatWithMaxDigits(content.amount, 3) + "L"; From d6456024edfc131524ea85ae71e9b309e172b905 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 17 Feb 2025 02:18:34 -0500 Subject: [PATCH 142/264] Convert the multiblock tank to MUI2 --- .../multi/MetaTileEntityMultiblockTank.java | 40 +++++++++++++++---- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java index eeabc2cd762..6eea621c735 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java @@ -1,5 +1,7 @@ package gregtech.common.metatileentities.multi; +import com.cleanroommc.modularui.widgets.FluidSlot; + import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.PropertyFluidFilter; @@ -11,6 +13,10 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuis; +import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.client.renderer.ICubeRenderer; @@ -19,6 +25,7 @@ import gregtech.common.blocks.BlockSteamCasing; import gregtech.common.blocks.MetaBlocks; import gregtech.common.metatileentities.MetaTileEntities; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; @@ -37,6 +44,11 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.factory.PosGuiData; +import com.cleanroommc.modularui.screen.ModularPanel; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.widgets.TextWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -129,13 +141,27 @@ protected boolean openGUIOnRightClick() { } @Override - protected ModularUI.Builder createUITemplate(@NotNull EntityPlayer entityPlayer) { - return ModularUI.defaultBuilder() - .widget(new LabelWidget(6, 6, getMetaFullName())) - .widget(new TankWidget(importFluids.getTankAt(0), 52, 18, 72, 61) - .setBackgroundTexture(GuiTextures.SLOT) - .setContainerClicking(true, true)) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.SLOT, 0); + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory(this) { + + @Override + public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + var panel = GTGuis.createPanel(MetaTileEntityMultiblockTank.this, 176, 166); + + panel.child(new TextWidget(IKey.lang(getMetaFullName())) + .pos(5, 5)); + panel.child(new GTFluidSlot() + .pos(52, 18) + .size(72, 61) + .background(GTGuiTextures.SLOT) + .syncHandler(GTFluidSlot.sync(importFluids.getTankAt(0)) + .showAmountOnSlot(false) + .drawAlwaysFull(false))); + panel.bindPlayerInventory(); + + return panel; + } + }; } @Override From 81b266adbadc6db3dbd72bd02c60aebd146d96a9 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 17 Feb 2025 02:18:56 -0500 Subject: [PATCH 143/264] spotless --- .../multi/MetaTileEntityMultiblockTank.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java index 6eea621c735..93070c1d27c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java @@ -1,14 +1,8 @@ package gregtech.common.metatileentities.multi; -import com.cleanroommc.modularui.widgets.FluidSlot; - import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.PropertyFluidFilter; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.LabelWidget; -import gregtech.api.gui.widgets.TankWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; @@ -16,7 +10,6 @@ import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; -import gregtech.api.mui.sync.GTFluidSyncHandler; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.client.renderer.ICubeRenderer; From de02b2bbe6270020c8e15310f4033f35449d65ad Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:11:39 -0700 Subject: [PATCH 144/264] Rework MUI2 Multi Syncing (#2734) --- .../RecipeMapSteamMultiblockController.java | 22 +- .../multiblock/ui/CustomKeyFunction.java | 7 + .../multiblock/ui/MultiblockUIBuilder.java | 222 ++++++++++++++---- .../multiblock/ui/MultiblockUIFactory.java | 15 +- .../multiblock/ui/UISyncer.java | 32 +++ .../api/mui/drawables/HoverableKey.java | 123 ---------- .../api/mui/serialize/DrawableSerializer.java | 45 ---- .../api/mui/serialize/FormatSerializer.java | 23 -- .../api/mui/serialize/JsonHandler.java | 97 -------- .../api/mui/serialize/KeySerializer.java | 82 ------- .../java/gregtech/api/util/GTLambdaUtils.java | 13 + .../java/gregtech/api/util/JsonUtils.java | 31 --- src/main/java/gregtech/api/util/KeyUtil.java | 6 +- .../multi/MetaTileEntityLargeBoiler.java | 24 +- .../MetaTileEntityActiveTransformer.java | 10 +- .../electric/MetaTileEntityCleanroom.java | 10 +- .../electric/MetaTileEntityCrackingUnit.java | 4 +- .../MetaTileEntityElectricBlastFurnace.java | 5 +- .../electric/MetaTileEntityFluidDrill.java | 8 +- .../multi/electric/MetaTileEntityHPCA.java | 50 ++-- .../electric/MetaTileEntityLargeMiner.java | 28 +-- .../electric/MetaTileEntityMultiSmelter.java | 2 +- .../electric/MetaTileEntityNetworkSwitch.java | 4 +- .../MetaTileEntityPowerSubstation.java | 52 ++-- .../MetaTileEntityProcessingArray.java | 27 ++- .../electric/MetaTileEntityPyrolyseOven.java | 2 +- .../MetaTileEntityCentralMonitor.java | 4 +- .../MetaTileEntityLargeCombustionEngine.java | 10 +- .../generator/MetaTileEntityLargeTurbine.java | 43 +++- 29 files changed, 406 insertions(+), 595 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java delete mode 100644 src/main/java/gregtech/api/mui/drawables/HoverableKey.java delete mode 100644 src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java delete mode 100644 src/main/java/gregtech/api/mui/serialize/FormatSerializer.java delete mode 100644 src/main/java/gregtech/api/mui/serialize/JsonHandler.java delete mode 100644 src/main/java/gregtech/api/mui/serialize/KeySerializer.java create mode 100644 src/main/java/gregtech/api/util/GTLambdaUtils.java delete mode 100644 src/main/java/gregtech/api/util/JsonUtils.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index aa129c1c46d..2cc27f0044a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -16,7 +16,6 @@ import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; import net.minecraft.entity.player.EntityPlayer; @@ -102,14 +101,15 @@ private void resetTileAbilities() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom(keyManager -> { + .addCustom((keyManager, syncer) -> { // custom steam tank line IFluidTank steamFluidTank = recipeMapWorkable.getSteamFluidTankCombined(); - if (steamFluidTank != null && steamFluidTank.getCapacity() > 0) { - String stored = TextFormattingUtil.formatNumbers(steamFluidTank.getFluidAmount()); - String capacity = TextFormattingUtil.formatNumbers(steamFluidTank.getCapacity()); - - IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, "%s/%s L", stored, capacity); + int stored = syncer.syncInt(steamFluidTank.getFluidAmount()); + int capacity = syncer.syncInt(steamFluidTank.getCapacity()); + if (capacity > 0) { + IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, "%s/%s L", + KeyUtil.number(stored), + KeyUtil.number(capacity)); IKey steamStored = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.steam.steam_stored", steamInfo); keyManager.add(steamStored); @@ -122,12 +122,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { - if (isStructureFormed() && recipeMapWorkable.isHasNotEnoughEnergy()) { + builder.addCustom((list, syncer) -> { + boolean noEnergy = syncer.syncBoolean(recipeMapWorkable.isHasNotEnoughEnergy()); + if (isStructureFormed() && noEnergy) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.steam.low_steam")); } - }) - .addMaintenanceProblemLines(getMaintenanceProblems()); + }).addMaintenanceProblemLines(getMaintenanceProblems()); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java new file mode 100644 index 00000000000..d723fe68483 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java @@ -0,0 +1,7 @@ +package gregtech.api.metatileentity.multiblock.ui; + +@FunctionalInterface +public interface CustomKeyFunction { + + void addCustom(KeyManager manager, UISyncer syncer); +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 15c349eb883..4c6e567ee90 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -2,7 +2,6 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; @@ -16,9 +15,14 @@ import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Consumer; @@ -30,6 +34,8 @@ public class MultiblockUIBuilder implements KeyManager { private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); + @Nullable + private InternalSyncer syncer; private boolean isWorkingEnabled; private boolean isActive; @@ -42,13 +48,25 @@ public class MultiblockUIBuilder implements KeyManager { private boolean dirty; private Runnable onRebuild; + @NotNull + private UISyncer getSyncer() { + if (this.syncer == null) { + this.syncer = new InternalSyncer(isServer()); + } + return this.syncer; + } + void updateFormed(boolean isStructureFormed) { - this.isStructureFormed = isStructureFormed; + this.isStructureFormed = this.getSyncer().syncBoolean(isStructureFormed); + } + + private boolean isServer() { + return !this.syncHandler.getSyncManager().isClient(); } public MultiblockUIBuilder structureFormed(boolean structureFormed) { updateFormed(structureFormed); - if (!structureFormed) { + if (!this.isStructureFormed) { var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); @@ -64,8 +82,8 @@ public MultiblockUIBuilder title(String lang) { /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ public MultiblockUIBuilder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { - this.isWorkingEnabled = isWorkingEnabled; - this.isActive = isActive; + this.isWorkingEnabled = this.getSyncer().syncBoolean(isWorkingEnabled); + this.isActive = this.getSyncer().syncBoolean(isActive); return this; } @@ -93,9 +111,11 @@ public MultiblockUIBuilder setWorkingStatusKeys(String idlingKey, String pausedK */ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) { if (!isStructureFormed || energyContainer == null) return this; - if (energyContainer.getEnergyCapacity() <= 0) return this; + boolean hasEnergy = getSyncer().syncBoolean(energyContainer.getEnergyCapacity() > 0); + if (!hasEnergy) return this; long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + maxVoltage = getSyncer().syncLong(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", @@ -116,6 +136,7 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) */ public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; + tier = getSyncer().syncInt(tier); if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -133,6 +154,7 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { */ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (!isStructureFormed) return this; + energyUsage = getSyncer().syncLong(energyUsage); if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -151,7 +173,10 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + maxVoltage = getSyncer().syncLong(maxVoltage); + recipeEUt = getSyncer().syncLong(recipeEUt); + // todo this recipe eut should always be positive + if (maxVoltage != 0 && maxVoltage >= Math.abs(recipeEUt)) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); @@ -171,6 +196,8 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE */ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (!isStructureFormed) return this; + maxVoltage = getSyncer().syncLong(maxVoltage); + amperage = getSyncer().syncInt(amperage); if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -190,6 +217,7 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe */ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; + maxCWUt = getSyncer().syncInt(maxCWUt); if (maxCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -205,6 +233,7 @@ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { */ public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; + currentCWUt = getSyncer().syncInt(currentCWUt); if (isActive && currentCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -280,6 +309,7 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; + progressPercent = getSyncer().syncDouble(progressPercent); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); @@ -293,6 +323,7 @@ public MultiblockUIBuilder addProgressLine(double progressPercent) { */ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; + numParallels = getSyncer().syncInt(numParallels); if (numParallels > 1) { var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); @@ -309,6 +340,7 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; + isLowPower = getSyncer().syncBoolean(isLowPower); if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -323,6 +355,7 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; + isLowComputation = getSyncer().syncBoolean(isLowComputation); if (isLowComputation) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); @@ -337,6 +370,7 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; + isTooLow = getSyncer().syncBoolean(isTooLow); if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -353,6 +387,7 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; + maintenanceProblems = getSyncer().syncByte(maintenanceProblems); if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -403,6 +438,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; + isObstructed = getSyncer().syncBoolean(isObstructed); if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -418,9 +454,10 @@ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; - - addKey(KeyUtil.lang(TextFormatting.GRAY, + if (!isStructureFormed || !isActive) return this; + fuelName = getSyncer().syncString(fuelName); + previousRecipeDuration = getSyncer().syncInt(previousRecipeDuration); + if (fuelName != null) addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); @@ -434,8 +471,8 @@ public MultiblockUIBuilder addEmptyLine() { } /** Add custom text dynamically, allowing for custom application logic. */ - public MultiblockUIBuilder addCustom(Consumer customConsumer) { - customConsumer.accept(this); + public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { + customConsumer.addCustom(this, getSyncer()); return this; } @@ -450,22 +487,7 @@ public void clear() { protected boolean hasChanged() { if (this.action == null) return false; - List old = toString(this.textList); - build(); - if (textList.size() != old.size()) return true; - for (int i = 0; i < textList.size(); i++) { - if (!JsonUtils.toJsonString(textList.get(i)).equals(old.get(i))) - return true; - } - return false; - } - - private static List toString(List drawables) { - List strings = new ArrayList<>(); - for (IDrawable drawable : drawables) { - strings.add(JsonUtils.toJsonString(drawable)); - } - return strings; + return getSyncer().hasChanged(); } protected void sync(String key, PanelSyncManager syncManager) { @@ -482,29 +504,15 @@ public void detectAndSendChanges(boolean init) { onRebuild(); build(); } - sync(0, this::syncText); - markDirty(); - } - } - - private void syncText(PacketBuffer buffer) { - buffer.writeVarInt(textList.size()); - for (int i = 0; i < textList.size(); i++) { - buffer.writeByte(Operation.getId(operations.get(i))); - var jsonString = JsonUtils.toJsonString(textList.get(i)); - NetworkUtils.writeStringSafe(buffer, jsonString); + syncToClient(0, buf -> getSyncer().writeBuffer(buf)); } } @Override public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { - clear(); - for (int i = buf.readVarInt(); i > 0; i--) { - int op = buf.readByte(); - String jsonString = NetworkUtils.readStringSafe(buf); - addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); - } + getSyncer().readBuffer(buf); + markDirty(); } } @@ -536,7 +544,10 @@ public void markDirty() { protected void build() { clear(); - if (this.action != null) this.action.accept(this); + if (this.action != null) { + if (isServer()) getSyncer().clear(); + this.action.accept(this); + } } protected void setAction(Consumer action) { @@ -568,4 +579,123 @@ private void addKey(@NotNull IDrawable key, @NotNull Operation op) { public void add(IDrawable drawable, Operation op) { addKey(drawable, op); } + + public class InternalSyncer implements UISyncer { + + private final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); + private final boolean isServer; + + public InternalSyncer(boolean isServer) { + this.isServer = isServer; + } + + private boolean isServer() { + return this.isServer; + } + + @Override + public boolean syncBoolean(boolean initial) { + if (isServer()) { + internal.writeBoolean(initial); + return initial; + } else { + return internal.readBoolean(); + } + } + + @Override + public int syncInt(int initial) { + if (isServer()) { + internal.writeInt(initial); + return initial; + } else { + return internal.readInt(); + } + } + + @Override + public long syncLong(long initial) { + if (isServer()) { + internal.writeLong(initial); + return initial; + } else { + return internal.readLong(); + } + } + + @Override + public String syncString(String initial) { + if (isServer()) { + NetworkUtils.writeStringSafe(internal, initial); + return initial; + } else { + return NetworkUtils.readStringSafe(internal); + } + } + + @Override + public byte syncByte(byte initial) { + if (isServer()) { + internal.writeByte(initial); + return initial; + } else { + return internal.readByte(); + } + } + + @Override + public double syncDouble(double initial) { + if (isServer()) { + internal.writeDouble(initial); + return initial; + } else { + return internal.readDouble(); + } + } + + @Override + public float syncFloat(float initial) { + if (isServer()) { + internal.writeFloat(initial); + return initial; + } else { + return internal.readFloat(); + } + } + + @Override + public BigInteger syncBigInt(BigInteger initial) { + if (isServer()) { + internal.writeByteArray(initial.toByteArray()); + return initial; + } else { + byte[] bytes = internal.readByteArray(); + return new BigInteger(bytes); + } + } + + @Override + public void readBuffer(ByteBuf buf) { + clear(); + internal.writeBytes(buf); + } + + @Override + public void writeBuffer(ByteBuf buf) { + buf.writeBytes(internal); + } + + @Override + public boolean hasChanged() { + byte[] old = internal.array().clone(); + onRebuild(); + build(); + return !Arrays.equals(old, internal.array()); + } + + @Override + public void clear() { + this.internal.clear(); + } + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 12574eebf59..954cf23c31c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; @@ -66,16 +67,11 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } - private static @NotNull Consumer addAction(@Nullable Consumer first, @NotNull Consumer andThen) { - return first == null ? andThen : first.andThen(andThen); - } - /** * Constructs the multiblock ui panel
* It is not recommended to override this method */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - // this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); panel.child(createScreen(panelSyncManager)); @@ -113,8 +109,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { } else if (!warning.isEmpty()) { return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } else { - // todo getLogo()? - return GTGuiTextures.GREGTECH_LOGO; + return GTGuiTextures.getLogo(mte.getUITheme()); } }); @@ -138,7 +133,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { * This is called every tick on the client-side */ public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { - this.warningText = merge ? addAction(this.warningText, warningText) : warningText; + this.warningText = merge ? GTLambdaUtils.mergeConsumers(this.warningText, warningText) : warningText; return this; } @@ -157,7 +152,7 @@ public MultiblockUIFactory configureWarningText(Consumer wa * This is called every tick on the client-side */ public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { - this.errorText = merge ? addAction(this.errorText, errorText) : errorText; + this.errorText = merge ? GTLambdaUtils.mergeConsumers(this.errorText, errorText) : errorText; return this; } @@ -177,7 +172,7 @@ public MultiblockUIFactory configureErrorText(Consumer erro * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { - this.displayText = merge ? addAction(this.displayText, displayText) : displayText; + this.displayText = merge ? GTLambdaUtils.mergeConsumers(this.displayText, displayText) : displayText; return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java new file mode 100644 index 00000000000..bc3c99c422e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -0,0 +1,32 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +public interface UISyncer { + + boolean syncBoolean(boolean initial); + + int syncInt(int initial); + + long syncLong(long initial); + + String syncString(String initial); + + byte syncByte(byte initial); + + double syncDouble(double initial); + + float syncFloat(float initial); + + BigInteger syncBigInt(BigInteger initial); + + void readBuffer(ByteBuf buf); + + void writeBuffer(ByteBuf buf); + + boolean hasChanged(); + + void clear(); +} diff --git a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java deleted file mode 100644 index 7cbf0a30a51..00000000000 --- a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java +++ /dev/null @@ -1,123 +0,0 @@ -package gregtech.api.mui.drawables; - -import net.minecraft.client.gui.FontRenderer; - -import com.cleanroommc.modularui.api.MCHelper; -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.drawable.IHoverable; -import com.cleanroommc.modularui.api.drawable.IIcon; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.ITooltip; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.GuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.sizer.Area; -import com.cleanroommc.modularui.widget.sizer.Box; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public class HoverableKey implements IIcon, IHoverable, ITooltip { - - private final Box margin = new Box(); - private final Area area = new Area(); - private final List tooltipLines = new ArrayList<>(); - private RichTooltip tooltip; - private IKey key; - - private HoverableKey() { - tooltipAutoUpdate(true); - tooltipBuilder(t -> t.addDrawableLines(getTooltipLines())); - } - - public static HoverableKey of(IKey key) { - return new HoverableKey().setKey(key); - } - - public static HoverableKey of(IKey key, IDrawable... lines) { - return of(key).addLines(Arrays.asList(lines)); - } - - public FontRenderer getFontRenderer() { - return MCHelper.getFontRenderer(); - } - - @Override - public int getWidth() { - return getFontRenderer().getStringWidth(key.get()) + this.margin.horizontal(); - } - - @Override - public int getHeight() { - return getFontRenderer().FONT_HEIGHT + this.margin.vertical(); - } - - @Override - public Box getMargin() { - return margin; - } - - @Override - public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { - int w = getWidth(), h = getHeight(); - x += (int) (width / 2f - w / 2f); - y += (int) (height / 2f - h / 2f); - this.key.draw(context, x, y, width, height, widgetTheme); - } - - public IKey getKey() { - return key; - } - - public HoverableKey setKey(IKey key) { - this.key = key; - return getThis(); - } - - public List getTooltipLines() { - return tooltipLines; - } - - public HoverableKey addLines(Collection drawables) { - this.getTooltipLines().addAll(drawables); - return getThis(); - } - - @Override - @Nullable - public RichTooltip getTooltip() { - return tooltip; - } - - @Override - public void setRenderedAt(int x, int y) { - getRenderedArea().setPos(x, y); - } - - @Override - public Area getRenderedArea() { - this.area.setSize(getWidth(), getHeight()); - return this.area; - } - - @Override - public @NotNull RichTooltip tooltip() { - if (this.tooltip == null) this.tooltip = new RichTooltip(area -> area.set(getRenderedArea())); - return tooltip; - } - - @Override - public HoverableKey tooltip(RichTooltip tooltip) { - this.tooltip = tooltip; - return this; - } - - @Override - public String toString() { - return "HoverableKey(" + key.getFormatted() + ")"; - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java deleted file mode 100644 index 6316ba15ab0..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java +++ /dev/null @@ -1,45 +0,0 @@ -package gregtech.api.mui.serialize; - -import gregtech.api.mui.drawables.HoverableKey; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; - -import java.util.Arrays; - -public class DrawableSerializer implements JsonHandler { - - KeySerializer keySerializer = new KeySerializer(); - - @Override - public IDrawable deserialize(JsonElement json, JsonDeserializationContext context) - throws JsonParseException { - if (!json.isJsonObject()) return IDrawable.EMPTY; - JsonObject parsed = json.getAsJsonObject(); - if (parsed.has("key") && parsed.has("tooltip")) { - IKey key = context.deserialize(parsed.get("key"), IKey.class); - - IDrawable[] list = deserializeArray(parsed.getAsJsonArray("tooltip"), context, IDrawable[]::new); - return HoverableKey.of(key).addLines(Arrays.asList(list)); - } else { - return keySerializer.deserialize(json, context); - } - } - - @Override - public JsonElement serialize(IDrawable src, JsonSerializationContext context) { - JsonObject object = new JsonObject(); - if (src instanceof IKey key) { - return keySerializer.serialize(key, context); - } else if (src instanceof HoverableKey hoverable) { - object.add("key", keySerializer.serialize(hoverable.getKey(), context)); - object.add("tooltip", serializeArray(hoverable.getTooltipLines(), context)); - } - return object; - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java b/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java deleted file mode 100644 index 1fe8f7e2476..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.api.mui.serialize; - -import net.minecraft.util.text.TextFormatting; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; - -public class FormatSerializer implements JsonHandler { - - @Override - public TextFormatting deserialize(JsonElement json, - JsonDeserializationContext context) throws JsonParseException { - return TextFormatting.getValueByName(json.getAsString()); - } - - @Override - public JsonElement serialize(TextFormatting src, - JsonSerializationContext context) { - return context.serialize(src.getFriendlyName()); - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java deleted file mode 100644 index 447e8723dad..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java +++ /dev/null @@ -1,97 +0,0 @@ -package gregtech.api.mui.serialize; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.lang.reflect.Array; -import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.Collection; -import java.util.function.IntFunction; - -public interface JsonHandler extends JsonSerializer, JsonDeserializer { - - @Override - default JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { - return serialize(src, context); - } - - @Override - default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { - return deserialize(json, context); - } - - JsonElement serialize(T src, JsonSerializationContext context); - - T deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException; - - default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { - JsonArray array = new JsonArray(); - if (objects == null) return array; - Type arrayType = objects.getClass().getComponentType(); - for (R t : objects) { - JsonElement element = context.serialize(t, arrayType); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - JsonObject typed = new JsonObject(); - typed.addProperty("typed", t.getClass().getSimpleName()); - typed.add("element", element); - array.add(typed); - } else { - array.add(element); - } - } - return array; - } - - @SuppressWarnings("unchecked") - default JsonArray serializeArray(Collection objects, JsonSerializationContext context) { - R[] array = null; - int i = 0; - for (R object : objects) { - if (array == null) array = (R[]) Array.newInstance(object.getClass(), objects.size()); - array[i++] = object; - } - return serializeArray(array, context); - } - - default R[] deserializeArray(JsonArray jsonArray, JsonDeserializationContext context, - IntFunction function) { - if (jsonArray == null || jsonArray.size() == 0) return function.apply(0); - R[] array = function.apply(jsonArray.size()); - Type arrayType = array.getClass().getComponentType(); - Arrays.setAll(array, i -> handleArg(jsonArray.get(i), context, arrayType)); - return array; - } - - static Object handleArg(JsonElement element, JsonDeserializationContext context, Type arrayType) { - // args can sometimes be keys - if (element.isJsonObject()) { - JsonObject object = element.getAsJsonObject(); - if (!object.has("typed")) - return context.deserialize(object, IDrawable.class); - - JsonElement value = object.get("element"); - return switch (object.get("typed").getAsString()) { - case "Integer" -> value.getAsInt(); - case "Long" -> value.getAsLong(); - case "Double" -> value.getAsDouble(); - case "Float" -> value.getAsFloat(); - case "Byte" -> value.getAsByte(); - default -> value.getAsNumber(); - }; - } else if (element instanceof JsonPrimitive primitive && primitive.isNumber()) { - return primitive.getAsNumber(); - } else { - return context.deserialize(element, arrayType); - } - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java deleted file mode 100644 index 4563c179125..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.api.mui.serialize; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.CompoundKey; -import com.cleanroommc.modularui.drawable.text.DynamicKey; -import com.cleanroommc.modularui.drawable.text.FormattingState; -import com.cleanroommc.modularui.drawable.text.LangKey; -import com.cleanroommc.modularui.drawable.text.StringKey; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.apache.commons.lang3.ArrayUtils; - -import java.util.Map; - -public class KeySerializer implements JsonHandler { - - private static final Map FORMATTING_MAP = new Object2ObjectOpenHashMap<>(); - - static { - for (var tf : TextFormatting.values()) { - FORMATTING_MAP.put(tf.toString(), tf); - } - } - - @Override - public IKey deserialize(JsonElement json, JsonDeserializationContext context) - throws JsonParseException { - JsonObject object = json.getAsJsonObject(); - if (object.has("string")) { - return IKey.str(object.get("string").getAsString()); - } else if (object.has("lang")) { - String lang = context.deserialize(object.get("lang"), String.class); - TextFormatting[] formatting = deserializeArray(object.getAsJsonArray("format"), context, - TextFormatting[]::new); - Object[] args = deserializeArray( - object.getAsJsonArray("args"), context, Object[]::new); - return IKey.lang(lang, args).style(formatting); - } else if (object.has("keys")) { - IKey[] keys = deserializeArray( - object.getAsJsonArray("keys"), context, IKey[]::new); - TextFormatting[] formatting = deserializeArray( - object.getAsJsonArray("format"), context, TextFormatting[]::new); - return IKey.comp(keys).style(formatting); - } - return IKey.EMPTY; - } - - @Override - public JsonElement serialize(IKey src, JsonSerializationContext context) { - JsonObject obj = new JsonObject(); - if (src instanceof StringKey || src instanceof DynamicKey) { - obj.add("string", context.serialize(src.getFormatted())); - } else if (src instanceof LangKey langKey) { - obj.add("lang", context.serialize(langKey.getKeySupplier().get())); - TextFormatting[] formattings = convert(langKey.getFormatting()); - obj.add("format", serializeArray(formattings, context)); - Object[] args = langKey.getArgsSupplier().get(); - if (!ArrayUtils.isEmpty(args)) - obj.add("args", serializeArray(args, context)); - } else if (src instanceof CompoundKey compoundKey) { - obj.add("keys", serializeArray(compoundKey.getKeys(), context)); - obj.add("format", serializeArray(convert(compoundKey.getFormatting()), context)); - } - return obj; - } - - public static TextFormatting[] convert(FormattingState state) { - if (state == null) return new TextFormatting[0]; - String s = state.getFormatting(); - TextFormatting[] formattings = new TextFormatting[s.length() / 2]; - for (int i = 0; i < s.length(); i += 2) { - formattings[i / 2] = FORMATTING_MAP.get(s.substring(i, i + 2)); - } - return formattings; - } -} diff --git a/src/main/java/gregtech/api/util/GTLambdaUtils.java b/src/main/java/gregtech/api/util/GTLambdaUtils.java new file mode 100644 index 00000000000..5adca846fb6 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTLambdaUtils.java @@ -0,0 +1,13 @@ +package gregtech.api.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public class GTLambdaUtils { + + public static @NotNull Consumer mergeConsumers(@Nullable Consumer first, @NotNull Consumer andThen) { + return first == null ? andThen : first.andThen(andThen); + } +} diff --git a/src/main/java/gregtech/api/util/JsonUtils.java b/src/main/java/gregtech/api/util/JsonUtils.java deleted file mode 100644 index ebcf949f671..00000000000 --- a/src/main/java/gregtech/api/util/JsonUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.api.util; - -import gregtech.api.mui.serialize.DrawableSerializer; -import gregtech.api.mui.serialize.FormatSerializer; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class JsonUtils { - - private static final Gson gson = new GsonBuilder() - .setPrettyPrinting() - .registerTypeHierarchyAdapter(IDrawable.class, new DrawableSerializer()) - .registerTypeAdapter(TextFormatting.class, new FormatSerializer()) - .create(); - - public static String toJsonString(IDrawable drawable) { - return getGson().toJson(drawable, IDrawable.class); - } - - public static Gson getGson() { - return gson; - } - - public static IDrawable fromJsonString(String jsonString) { - return getGson().fromJson(jsonString, IDrawable.class); - } -} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index c68c61a28b3..7e2f11896f8 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,7 +1,6 @@ package gregtech.api.util; import gregtech.api.fluids.GTFluid; -import gregtech.api.mui.drawables.HoverableKey; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.Fluid; @@ -13,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.function.LongSupplier; import java.util.function.Supplier; @@ -130,7 +130,9 @@ public static IKey overclock(String[] array, long voltage) { public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; - return HoverableKey.of(body, hover); + return body.asTextIcon() + .asHoverable() + .addTooltipDrawableLines(Arrays.asList(hover)); } @NotNull diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index cfdf5827a8f..73604802ff7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -11,6 +11,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; @@ -128,11 +129,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom(richText -> { - if (isStructureFormed() && getWaterFilled() == 0) { - richText.add(KeyUtil.lang(TextFormatting.YELLOW, + builder.addCustom((manager, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(getWaterFilled() == 0)) { + manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); - richText.add(KeyUtil.lang(TextFormatting.GRAY, + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.explosion_tooltip")); } }); @@ -161,26 +162,29 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(KeyManager keyManager) { + private void addCustomData(KeyManager keyManager, UISyncer syncer) { if (isStructureFormed()) { + int steam = syncer.syncInt(recipeLogic.getLastTickSteam()); + int heatScaled = syncer.syncInt(recipeLogic.getHeatScaled()); + int throttleAmt = syncer.syncInt(getThrottle()); + // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, - recipeLogic.getLastTickSteam(), " L/t"); + steam, " L/t"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.number( - () -> getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic.getHeatScaled(), "%"); + getNumberColor(heatScaled), heatScaled, "%"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( - () -> getNumberColor(getThrottle()), - getThrottle(), "%"); + getNumberColor(throttleAmt), + throttleAmt, "%"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 98c14407d8c..ad4f72c2e5f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -169,22 +169,24 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { // Max input line IKey maxInputFormatted = KeyUtil.number(TextFormatting.WHITE, - powerInput.getInputVoltage() * powerInput.getInputAmperage(), " EU/t"); + syncer.syncLong(powerInput.getInputVoltage() * powerInput.getInputAmperage()), " EU/t"); list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.active_transformer.max_in", maxInputFormatted)); // Max output line IKey maxOutputFormatted = KeyUtil.number(TextFormatting.WHITE, - powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage(), " EU/t"); + syncer.syncLong(powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()), + " EU/t"); list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.active_transformer.max_out", maxOutputFormatted)); // Average I/O line - IKey avgIOFormatted = KeyUtil.number(TextFormatting.WHITE, averageIOLastSec, " EU/t"); + IKey avgIOFormatted = KeyUtil.number(TextFormatting.WHITE, syncer.syncLong(averageIOLastSec), + " EU/t"); list.add(KeyUtil.lang(TextFormatting.AQUA, "gregtech.multiblock.active_transformer.average_io", avgIOFormatted)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 75d88b392fa..0b1edad8de7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -488,11 +488,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) .addEnergyUsageLine(energyContainer) .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) - .addCustom(list -> { + .addCustom((list, syncer) -> { // Cleanliness status line if (isStructureFormed()) { IKey cleanState; - if (isClean()) { + if (syncer.syncBoolean(isClean())) { // is this method actually synced? cleanState = KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.cleanroom.clean_state", cleanAmount); } else { @@ -511,13 +511,13 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)) - .addCustom(list -> { - if (isStructureFormed() && !isClean()) { + .addCustom((list, syncer) -> { + if (isStructureFormed() && !syncer.syncBoolean(isClean())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.warning_contaminated")); } - if (!cleanroomLogic.isVoltageHighEnough()) { + if (!syncer.syncBoolean(cleanroomLogic.isVoltageHighEnough())) { IKey energyNeeded = IKey.str(GTValues.VNF[cleanroomFilter.getMinTier()]); list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.low_tier", energyNeeded)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 78f2f3f6e35..62d05fd2aa2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -84,12 +84,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(textList -> { + .addCustom((textList, syncer) -> { if (!isStructureFormed()) return; // Coil energy discount line IKey energyDiscount = KeyUtil.number(TextFormatting.AQUA, - 100 - 10L * getCoilTier(), "%"); + syncer.syncLong(100 - 10L * getCoilTier()), "%"); IKey base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.cracking_unit.energy", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 62d495b86a0..d57007262aa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -80,10 +81,10 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(KeyManager keyManager) { + private void addHeatCapacity(KeyManager keyManager, UISyncer syncer) { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, - getCurrentTemperature(), "K"); + syncer.syncInt(getCurrentTemperature()), "K"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 7f7cefabe3d..b0ac1aa59ec 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -170,9 +170,9 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.work_paused", "gregtech.multiblock.miner.drilling") .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { - if (minerLogic.getDrilledFluid() != null) { + if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { // Fluid name Fluid drilledFluid = minerLogic.getDrilledFluid(); IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); @@ -202,8 +202,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) - .addCustom(list -> { - if (isStructureFormed() && minerLogic.isInventoryFull()) { + .addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(minerLogic.isInventoryFull())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 99d7c7ec649..80ed75e6ae2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -21,7 +22,6 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; @@ -399,20 +399,22 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.multiblock.data_bank.providing") - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; // Energy Usage - String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; - richText.add(KeyUtil.lang(TextFormatting.GRAY, + String voltageName = syncer + .syncString(GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.energy", - TextFormattingUtil.formatNumbers(hpcaHandler.cachedEUt), - TextFormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), + KeyUtil.number(syncer.syncLong(hpcaHandler.cachedEUt)), + KeyUtil.number(syncer.syncLong(hpcaHandler.getMaxEUt())), voltageName)); // Provided Computation - richText.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", - hpcaHandler.cachedCWUt, hpcaHandler.getMaxCWUt())); + manager.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", + syncer.syncInt(hpcaHandler.cachedCWUt), + syncer.syncInt(hpcaHandler.getMaxCWUt()))); }) .addWorkingStatusLine(); } @@ -420,37 +422,35 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; - if (temperature > 500) { + if (syncer.syncDouble(temperature) > 500) { // Temperature warning - richText.add(KeyUtil.lang(TextFormatting.YELLOW, + manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.warning_temperature")); // Active cooler overdrive warning - richText.add(KeyUtil.lang(TextFormatting.GRAY, + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_temperature_active_cool")); } // Structure warnings - // hpcaHandler.addWarnings(richText); - hpcaHandler.addWarnings2(richText); + hpcaHandler.addWarnings(manager, syncer); }) .addMaintenanceProblemLines(getMaintenanceProblems()); } @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(richText -> { + builder.addCustom((manager, syncer) -> { if (!isStructureFormed()) return; - if (temperature > 1000) { - richText.add(KeyUtil.lang(TextFormatting.RED, + if (syncer.syncDouble(temperature) > 1000) { + manager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_temperature")); } - // hpcaHandler.addErrors(textList); - hpcaHandler.addErrors2(richText); + hpcaHandler.addErrors(manager, syncer); }); } @@ -896,17 +896,17 @@ public void addInfo(IRichTextBuilder textList) { } } - public void addWarnings2(KeyManager keyManager) { + public void addWarnings(KeyManager keyManager, UISyncer syncer) { List warnings = new ArrayList<>(); - if (numBridges > 1) { + if (syncer.syncInt(numBridges) > 1) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_multiple_bridges")); } - if (computationProviders.isEmpty()) { + if (syncer.syncBoolean(computationProviders.isEmpty())) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_no_computation")); } - if (getMaxCoolingDemand() > getMaxCoolingAmount()) { + if (syncer.syncBoolean(getMaxCoolingDemand() > getMaxCoolingAmount())) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_low_cooling")); } @@ -917,9 +917,9 @@ public void addWarnings2(KeyManager keyManager) { } } - public void addErrors2(KeyManager keyManager) { + public void addErrors(KeyManager keyManager, UISyncer syncer) { for (IHPCAComponentHatch component : components) { - if (component.isDamaged()) { + if (syncer.syncBoolean(component.isDamaged())) { keyManager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_damaged")); return; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 0a40c20acaa..49ce7b689ed 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -264,18 +264,18 @@ protected MultiblockUIFactory createUIFactory() { protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { - int workingAreaChunks = this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH; - int workingArea = getWorkingArea(minerLogic.getCurrentRadius()); + int workingAreaChunks = syncer.syncInt(this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH); + int workingArea = syncer.syncInt(getWorkingArea(minerLogic.getCurrentRadius())); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_at")); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_pos", - minerLogic.getMineX().get(), - minerLogic.getMineY().get(), - minerLogic.getMineZ().get())); + syncer.syncInt(minerLogic.getMineX().get()), + syncer.syncInt(minerLogic.getMineY().get()), + syncer.syncInt(minerLogic.getMineZ().get()))); - if (minerLogic.isChunkMode()) { + if (syncer.syncBoolean(minerLogic.isChunkMode())) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.working_area_chunks", workingAreaChunks, workingAreaChunks)); @@ -284,11 +284,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { workingArea, workingArea)); } - if (minerLogic.isDone()) { + if (syncer.syncBoolean(minerLogic.isDone())) { list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.machine.miner.done")); - } else if (minerLogic.isWorking()) { + } else if (syncer.syncBoolean(minerLogic.isWorking())) { list.add(KeyUtil.lang(TextFormatting.GOLD, "gregtech.machine.miner.working")); - } else if (!isWorkingEnabled()) { + } else if (!syncer.syncBoolean(isWorkingEnabled())) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.work_paused")); } } @@ -297,8 +297,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { - if (isStructureFormed() && !drainFluid(false)) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(!drainFluid(false))) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); } }); @@ -307,8 +307,8 @@ protected void configureErrorText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)); - builder.addCustom(list -> { - if (isStructureFormed() && isInventoryFull) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(isInventoryFull)) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 5934e814c99..41ebaeb15a6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -59,7 +59,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(richText -> { + .addCustom((richText, syncer) -> { if (!isStructureFormed()) return; if (heatingCoilDiscount > 1) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java index b896e78eb0c..4ad8d1fbe4c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -158,8 +158,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom(list -> { - if (isStructureFormed() && computationHandler.hasNonBridgingConnections()) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(computationHandler.hasNonBridgingConnections())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.non_bridging.detailed")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 215d96d6d74..d529c02d7db 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -349,10 +349,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(true, isActive() && isWorkingEnabled()); // transform into two-state system for display builder.setWorkingStatusKeys("gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing"); - builder.addCustom(list -> { - if (isStructureFormed() && energyBank != null) { - BigInteger energyStored = energyBank.getStored(); - BigInteger energyCapacity = energyBank.getCapacity(); + builder.addCustom((manager, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(energyBank != null)) { + BigInteger energyStored = syncer + .syncBigInt(energyBank == null ? BigInteger.ZERO : energyBank.getStored()); + BigInteger energyCapacity = syncer + .syncBigInt(energyBank == null ? BigInteger.ZERO : energyBank.getCapacity()); // Stored EU line IKey storedFormatted = KeyUtil.string( @@ -364,7 +366,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { IKey bodyStored = (KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.stored", truncated)); - list.add(KeyUtil.setHover(bodyStored, storedFormatted)); + manager.add(KeyUtil.setHover(bodyStored, storedFormatted)); // EU Capacity line IKey capacityFormatted = KeyUtil.string( @@ -376,41 +378,45 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { IKey bodyCap = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.capacity", capCompact); - list.add(KeyUtil.setHover(bodyCap, capacityFormatted)); + manager.add(KeyUtil.setHover(bodyCap, capacityFormatted)); // Passive Drain line IKey passiveDrain = KeyUtil.string(TextFormatting.DARK_RED, - TextFormattingUtil.formatNumbers(getPassiveDrain()) + " EU/t"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.passive_drain", + TextFormattingUtil.formatNumbers(syncer.syncLong(getPassiveDrain())) + " EU/t"); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.passive_drain", passiveDrain)); // Average EU IN line - IKey avgValue = KeyUtil.string(TextFormatting.GREEN, - TextFormattingUtil.formatNumbers(averageInLastSec) + " EU/t"); + long avgIn = syncer.syncLong(averageInLastSec); + long avgOut = syncer.syncLong(averageOutLastSec); + + IKey avgValue = KeyUtil.number(TextFormatting.GREEN, avgIn, " EU/t"); IKey base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_in", avgValue); IKey hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_in_hover"); - list.add(KeyUtil.setHover(base, hover)); + manager.add(KeyUtil.setHover(base, hover)); // Average EU OUT line - avgValue = KeyUtil.string(TextFormatting.RED, - TextFormattingUtil.formatNumbers(averageOutLastSec) + " EU/t"); + avgValue = KeyUtil.number(TextFormatting.RED, avgOut, " EU/t"); base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_out", avgValue); hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.average_out_hover"); - list.add(KeyUtil.setHover(base, hover)); + manager.add(KeyUtil.setHover(base, hover)); // Time to fill/drain line - if (averageInLastSec > averageOutLastSec) { + if (avgIn > avgOut) { IKey timeToFill = getTimeToFillDrainText(energyCapacity.subtract(energyStored) - .divide(BigInteger.valueOf((averageInLastSec - averageOutLastSec) * 20))); - timeToFill.style(TextFormatting.GREEN); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_fill", + .divide(BigInteger.valueOf((avgIn - avgOut) * 20))) + .style(TextFormatting.GREEN); + + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_fill", timeToFill)); - } else if (averageInLastSec < averageOutLastSec) { + + } else if (avgIn < avgOut) { IKey timeToDrain = getTimeToFillDrainText( - energyStored.divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20))); - timeToDrain.style(TextFormatting.RED); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_drain", + energyStored.divide(BigInteger.valueOf((avgOut - avgIn) * 20))) + .style(TextFormatting.RED); + + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.power_substation.time_to_drain", timeToDrain)); } } @@ -420,7 +426,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { if (isStructureFormed() && averageInLastSec < averageOutLastSec) { BigInteger timeToDrainSeconds = energyBank.getStored() .divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index e70dd905e04..7355e0c91eb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -120,17 +120,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; // Machine mode text // Shared text components for both states - IKey maxMachinesText = KeyUtil.string(TextFormatting.DARK_PURPLE, - Integer.toString(getMachineLimit())); + IKey maxMachinesText = KeyUtil.number(TextFormatting.DARK_PURPLE, + syncer.syncInt(getMachineLimit())); maxMachinesText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_max", maxMachinesText); - if (logic.activeRecipeMap == null) { + if (syncer.syncBoolean(logic.activeRecipeMap == null)) { // No machines in hatch IKey noneText = KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.machine_hatch.machines_none"); @@ -138,32 +138,33 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.machine.machine_hatch.machines", noneText); IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_none_hover"); - richText.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); + manager.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); } else { // Some amount of machines in hatch - String key = logic.getMachineStack().getTranslationKey(); + String key = syncer.syncString(logic.getMachineStack().getTranslationKey()); IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, key + ".name"); mapText = KeyUtil.string( TextFormatting.DARK_PURPLE, "%sx %s", - logic.getParallelLimit(), mapText); + syncer.syncInt(logic.getParallelLimit()), mapText); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines", mapText); - String voltageName = GTValues.VNF[logic.machineTier]; - int amps = logic.getMachineStack().getCount(); + int tier = syncer.syncInt(logic.machineTier); + IKey voltageName = KeyUtil.string(GTValues.VNF[tier]); + int amps = syncer.syncInt(logic.getMachineStack().getCount()); String energyFormatted = TextFormattingUtil - .formatNumbers(GTValues.V[logic.machineTier] * amps); + .formatNumbers(GTValues.V[tier] * amps); IKey hoverText = KeyUtil.lang( TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_max_eut", energyFormatted, amps, voltageName); - richText.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); + manager.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); } // Hatch locked status - if (isActive()) { - richText.add(KeyUtil.lang(TextFormatting.DARK_RED, + if (syncer.syncBoolean(isActive())) { + manager.add(KeyUtil.lang(TextFormatting.DARK_RED, "gregtech.machine.machine_hatch.locked")); } }) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index a0d3815e29a..8734ee35a67 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -114,7 +114,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(textList -> { + .addCustom((textList, syncer) -> { if (!isStructureFormed()) return; int processingSpeed = coilTier == 0 ? 75 : 50 * (coilTier + 1); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 41b53b3b953..596e7e217a9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -309,7 +309,7 @@ protected MultiblockUIFactory createUIFactory() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", this.height)); if (isStructureFormed()) { @@ -320,7 +320,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { if (isStructureFormed() && !drainEnergy(true)) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.low_power")); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index ee238b69051..8dcd2bd032a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -86,8 +86,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { } builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addCustom(richText -> { - if (isStructureFormed() && recipeLogic.isOxygenBoosted) { + .addCustom((richText, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(recipeLogic.isOxygenBoosted)) { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; @@ -101,17 +101,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureErrorText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - builder.addCustom(keyList -> { + builder.addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - if (checkIntakesObstructed()) { + if (syncer.syncBoolean(checkIntakesObstructed())) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.obstructed")); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_combustion_engine.obstructed.desc")); } - if (!recipeLogic.checkLubricant()) { + if (syncer.syncBoolean(!recipeLogic.checkLubricant())) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.no_lubricant")); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index e0d82822eb1..87cdd7edd46 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -124,12 +124,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(keyList -> { + .addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - if (getRotorHolder() == null) return; - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); - int totalEfficiency = getRotorHolder().getTotalEfficiency(); + int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); + int totalEfficiency = syncer.syncInt(getRotorTotalEfficiency()); if (rotorEfficiency > 0) { IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, @@ -139,19 +138,39 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { efficiencyInfo)); } }) - // todo fix prev duration being 0 on first ui open .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) .addWorkingStatusLine(); } + private int getRotorEffeciency() { + if (getRotorHolder() != null) { + return getRotorHolder().getRotorEfficiency(); + } + return 0; + } + + private int getRotorTotalEfficiency() { + if (getRotorHolder() != null) { + return getRotorHolder().getTotalEfficiency(); + } + return 0; + } + + private int getRotorDurability() { + if (getRotorHolder() != null) { + return getRotorHolder().getRotorDurabilityPercent(); + } + return 0; + } + @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { - if (!isStructureFormed() || getRotorHolder() == null) + builder.addCustom((keyList, syncer) -> { + if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) return; - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); - int rotorDurability = getRotorHolder().getRotorDurabilityPercent(); + int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); + int rotorDurability = syncer.syncInt(getRotorDurability()); if (rotorEfficiency > 0 && rotorDurability <= MIN_DURABILITY_TO_WARN) { keyList.add(KeyUtil.lang(TextFormatting.YELLOW, @@ -163,8 +182,8 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { - if (!isStructureFormed() || getRotorHolder() == null) + builder.addCustom((keyList, syncer) -> { + if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) return; if (!isRotorFaceFree()) { @@ -173,7 +192,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.obstructed.desc")); } - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); + int rotorEfficiency = syncer.syncInt(getRotorHolder().getRotorEfficiency()); if (rotorEfficiency <= 0) { keyList.add(KeyUtil.lang(TextFormatting.RED, From f9e6995a6ab17d06b9ca7fe8762590596f5a452d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:13:53 -0700 Subject: [PATCH 145/264] spotless pls --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 954cf23c31c..942c5384978 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -192,8 +192,7 @@ public MultiblockUIFactory configureDisplayText(Consumer di *
* Size will be 18x18. */ - public MultiblockUIFactory createFlexButton( - BiFunction flexButton) { + public MultiblockUIFactory createFlexButton(BiFunction flexButton) { this.flexButton = flexButton; return this; } From 7bc76c963822bb0162fd42941daf6e1a35d5b9df Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 23 Feb 2025 08:54:16 -0700 Subject: [PATCH 146/264] move key manager and sync handler to internal classes --- .../multiblock/ui/MultiblockUIBuilder.java | 73 ++++++++++--------- 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 4c6e567ee90..5c88059450b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -27,13 +27,15 @@ import java.util.function.Consumer; @SuppressWarnings({ "UnusedReturnValue", "unused" }) -public class MultiblockUIBuilder implements KeyManager { +public class MultiblockUIBuilder { private final List textList = new ArrayList<>(); private final List operations = new ArrayList<>(); private Consumer action; - private final SyncHandler syncHandler = makeSyncHandler(); + private final InternalSyncHandler syncHandler = new InternalSyncHandler(); + private final KeyManager manager = new InternalKeyManager(); + @Nullable private InternalSyncer syncer; @@ -472,7 +474,7 @@ public MultiblockUIBuilder addEmptyLine() { /** Add custom text dynamically, allowing for custom application logic. */ public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { - customConsumer.addCustom(this, getSyncer()); + customConsumer.addCustom(this.manager, getSyncer()); return this; } @@ -494,33 +496,6 @@ protected void sync(String key, PanelSyncManager syncManager) { syncManager.syncValue(key, this.syncHandler); } - private SyncHandler makeSyncHandler() { - return new SyncHandler() { - - @Override - public void detectAndSendChanges(boolean init) { - if (init || hasChanged()) { - if (init) { - onRebuild(); - build(); - } - syncToClient(0, buf -> getSyncer().writeBuffer(buf)); - } - } - - @Override - public void readOnClient(int id, PacketBuffer buf) { - if (id == 0) { - getSyncer().readBuffer(buf); - markDirty(); - } - } - - @Override - public void readOnServer(int id, PacketBuffer buf) {} - }; - } - public void build(IRichTextBuilder richText) { if (dirty) { onRebuild(); @@ -575,9 +550,14 @@ private void addKey(@NotNull IDrawable key, @NotNull Operation op) { this.operations.add(op); } - @Override - public void add(IDrawable drawable, Operation op) { - addKey(drawable, op); + public class InternalKeyManager implements KeyManager { + + private InternalKeyManager() {} + + @Override + public void add(IDrawable drawable, Operation op) { + addKey(drawable, op); + } } public class InternalSyncer implements UISyncer { @@ -698,4 +678,31 @@ public void clear() { this.internal.clear(); } } + + public class InternalSyncHandler extends SyncHandler { + + private InternalSyncHandler() {} + + @Override + public void detectAndSendChanges(boolean init) { + if (init || hasChanged()) { + if (init) { + onRebuild(); + build(); + } + syncToClient(0, buf -> getSyncer().writeBuffer(buf)); + } + } + + @Override + public void readOnClient(int id, PacketBuffer buf) { + if (id == 0) { + getSyncer().readBuffer(buf); + markDirty(); + } + } + + @Override + public void readOnServer(int id, PacketBuffer buf) {} + } } From ee7ae8f2b16792f1682a8065344723984a82416e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 24 Feb 2025 09:47:37 -0700 Subject: [PATCH 147/264] add ScrollableTextWidget small fix for rows remove createRootPanel() --- .../multiblock/ui/MultiblockUIFactory.java | 35 ++- .../mui/widget/ScrollableTextWidget.java | 221 ++++++++++++++++++ 2 files changed, 234 insertions(+), 22 deletions(-) create mode 100644 src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 942c5384978..fdc50a97a67 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -10,6 +10,7 @@ import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; +import gregtech.common.mui.widget.ScrollableTextWidget; import net.minecraft.util.text.TextFormatting; @@ -24,12 +25,9 @@ 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.ScrollWidget; import com.cleanroommc.modularui.widget.Widget; -import com.cleanroommc.modularui.widget.scroll.VerticalScrollData; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; -import com.cleanroommc.modularui.widgets.RichTextWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; @@ -72,9 +70,8 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { * It is not recommended to override this method */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - var panel = createRootPanel(); - - panel.child(createScreen(panelSyncManager)); + var panel = GTGuis.createPanel(mte, width, height) + .child(createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? if (mte instanceof ProgressBarMultiblock progressBarMultiblock && @@ -208,10 +205,6 @@ public MultiblockUIFactory setScreenHeight(int height) { return this; } - protected @NotNull ModularPanel createRootPanel() { - return GTGuis.createPanel(mte, width, height); - } - /** * @param progressMulti the multiblock with progress bars * @param panelSyncManager the sync manager for synchronizing widgets @@ -237,7 +230,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, // the numbers for the given row of bars int from = r * cols; - int to = Math.min(from + cols, cols); + int to = Math.min(from + cols, progressMulti.getProgressBarCount()); // calculate bar width int barCount = Math.max(1, to - from); @@ -265,24 +258,22 @@ protected Widget createScreen(PanelSyncManager syncManager) { display.setAction(this.displayText); display.sync("display", syncManager); - // todo scrolling doesn't work for rich text widget - var scrollWidget = new ScrollWidget<>(new VerticalScrollData()) + var scrollableTextWidget = new ScrollableTextWidget() .sizeRel(1f) - .child(new RichTextWidget() - .sizeRel(1f) - .alignment(Alignment.TopLeft) - .margin(4, 4) - .autoUpdate(true) - .textBuilder(display::build)); + .alignment(Alignment.TopLeft) + .margin(4, 4) + .autoUpdate(true) + .textBuilder(display::build); + + var parent = new ParentWidget<>(); if (this.childrenConsumer != null) { List extra = new ArrayList<>(); this.childrenConsumer.accept(extra); - extra.forEach(scrollWidget::child); + extra.forEach(parent::child); } - return new ParentWidget<>() - .child(scrollWidget) + return parent.child(scrollableTextWidget) .child(createIndicator(syncManager)) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java new file mode 100644 index 00000000000..54c597aeeb8 --- /dev/null +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -0,0 +1,221 @@ +package gregtech.common.mui.widget; + +import com.cleanroommc.modularui.api.GuiAxis; +import com.cleanroommc.modularui.api.ITheme; +import com.cleanroommc.modularui.api.drawable.IHoverable; +import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.api.layout.IViewport; +import com.cleanroommc.modularui.api.layout.IViewportStack; +import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.Stencil; +import com.cleanroommc.modularui.drawable.text.RichText; +import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.screen.ModularScreen; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; +import com.cleanroommc.modularui.utils.HoveredWidgetList; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widget.scroll.ScrollArea; +import com.cleanroommc.modularui.widget.scroll.ScrollData; +import com.cleanroommc.modularui.widget.sizer.Area; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public class ScrollableTextWidget extends Widget + implements IRichTextBuilder, Interactable, IViewport { + + private final RichText text = new RichText(); + private Consumer builder; + private boolean dirty = false; + private boolean autoUpdate = false; + + private final ScrollArea scroll = new ScrollArea(); + private final TextRenderer renderer = new TextRenderer(); + + @Override + public void onInit() { + this.scroll.setScrollData(ScrollData.of(GuiAxis.Y)); + } + + @Override + public void onUpdate() { + super.onUpdate(); + this.scroll.drag(getContext().getAbsMouseX(), getContext().getAbsMouseY()); + } + + public void markDirty() { + this.dirty = true; + } + + @Override + public void drawForeground(ModularGuiContext context) { + super.drawForeground(context); + if (getHoveredElement() instanceof IHoverable hoverable) { + hoverable.onHover(); + RichTooltip tooltip = hoverable.getTooltip(); + if (tooltip != null) { + tooltip.draw(context); + } + } + } + + @Override + public @NotNull Result onMousePressed(int mouseButton) { + ModularGuiContext context = getContext(); + if (this.scroll.mouseClicked(context)) { + return Result.STOP; + } + if (getHoveredElement() instanceof Interactable interactable) { + return interactable.onMousePressed(mouseButton); + } + return Result.ACCEPT; + } + + @Override + public boolean onMouseScroll(ModularScreen.UpOrDown scrollDirection, int amount) { + if (this.scroll.mouseScroll(getContext())) { + return true; + } + if (getHoveredElement() instanceof Interactable interactable) { + return interactable.onMouseScroll(scrollDirection, amount); + } + return false; + } + + @Override + public boolean onMouseRelease(int mouseButton) { + this.scroll.mouseReleased(getContext()); + if (getHoveredElement() instanceof Interactable interactable) { + return interactable.onMouseRelease(mouseButton); + } + return false; + } + + @Nullable + public Object getHoveredElement() { + if (!isHovering()) return null; + getContext().pushMatrix(); + getContext().translate(getArea().x, getArea().y); + Object o = this.text.getHoveringElement(getContext()); + getContext().popMatrix(); + return o; + } + + @Override + public Area getArea() { + return this.scroll; + } + + public ScrollArea getScrollArea() { + return this.scroll; + } + + @Override + public void transformChildren(IViewportStack stack) { + stack.translate(0, -getScrollY()); + } + + @Override + public void getSelfAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) { + if (isInside(stack, x, y)) { + widgets.add(this, stack.peek()); + } + } + + @Override + public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) { + if (getArea().isInside(x, y) && !getScrollArea().isInsideScrollbarArea(x, y) && hasChildren()) { + IViewport.getChildrenAt(this, stack, widgets, x, y); + } + } + + @Override + public void onResized() { + if (this.scroll.getScrollX() != null) { + this.scroll.getScrollX().clamp(this.scroll); + } + if (this.scroll.getScrollY() != null) { + this.scroll.getScrollY().clamp(this.scroll); + } + } + + @Override + public boolean canHover() { + return super.canHover() || + this.scroll.isInsideScrollbarArea(getContext().getMouseX(), getContext().getMouseY()); + } + + @Override + public void preDraw(ModularGuiContext context, boolean transformed) { + if (!transformed) { + Stencil.applyAtZero(this.scroll, context); + } else { + drawText(context); + } + } + + @Override + protected WidgetTextFieldTheme getWidgetThemeInternal(ITheme theme) { + return theme.getTextFieldTheme(); + } + + private void drawText(ModularGuiContext context) { + if (this.autoUpdate || this.dirty) { + if (this.builder != null) { + this.text.clearText(); + this.builder.accept(this.text); + } + this.dirty = false; + } + this.text.setupRenderer(this.renderer, getArea().getPadding().left, getArea().getPadding().top - getScrollY(), + getArea().paddedWidth(), getArea().paddedHeight(), + getWidgetThemeInternal(context.getTheme()).getTextColor(), + getWidgetThemeInternal(context.getTheme()).getTextShadow()); + this.text.compileAndDraw(this.renderer, context, false); + this.scroll.getScrollY().setScrollSize((int) this.renderer.getLastHeight()); + } + + @Override + public void postDraw(ModularGuiContext context, boolean transformed) { + if (!transformed) { + Stencil.remove(); + this.scroll.drawScrollbar(); + } + } + + public int getScrollY() { + return this.scroll.getScrollY() != null ? this.scroll.getScrollY().getScroll() : 0; + } + + @Override + public IRichTextBuilder getRichText() { + return this.text; + } + + /** + * Sets the auto update property. If auto update is true the text will be deleted each time it is drawn. + * If {@link #builder} is not null, it will then be called. + * + * @param autoUpdate auto update + * @return this + */ + public ScrollableTextWidget autoUpdate(boolean autoUpdate) { + this.autoUpdate = autoUpdate; + return this; + } + + /** + * A builder which is called every time before drawing when {@link #dirty} is true. + * + * @param builder text builder + * @return this + */ + public ScrollableTextWidget textBuilder(Consumer builder) { + this.builder = builder; + markDirty(); + return this; + } +} From 4c4c4c4eb17df95627955cfefd4926285ed15d09 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Tue, 25 Feb 2025 19:13:34 -0500 Subject: [PATCH 148/264] Add machine mode to the GUI of MultiMapControllers - MUI2 (#2713) --- .../multiblock/MultiMapMultiblockController.java | 13 +++++++++++++ .../multiblock/ui/MultiblockUIBuilder.java | 15 +++++++++++++++ .../resources/assets/gregtech/lang/en_us.lang | 2 ++ 3 files changed, 30 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 85ccc575bdd..1fccce2d897 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -3,10 +3,12 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IMultipleRecipeMaps; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.RecipeMap; +import gregtech.api.util.GTUtility; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -156,6 +158,17 @@ protected MultiblockUIFactory createUIFactory() { }); } + @Override + protected void configureDisplayText(MultiblockUIBuilder builder) { + builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addRecipeMapLine(getCurrentRecipeMap()) + .addEnergyUsageLine(this.getEnergyContainer()) + .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) + .addParallelsLine(recipeMapWorkable.getParallelLimit()) + .addWorkingStatusLine() + .addProgressLine(recipeMapWorkable.getProgressPercent()); + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 5c88059450b..5127de40bfb 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -2,6 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; +import gregtech.api.recipes.RecipeMap; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; @@ -466,6 +467,20 @@ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipe return this; } + /** + * Adds the name of a recipe map to the display. + * + * @param map the {@link RecipeMap} to get the name of + */ + public MultiblockUIBuilder addRecipeMapLine(RecipeMap map) { + if (!isStructureFormed) return this; + + IKey mapName = KeyUtil.lang(TextFormatting.YELLOW, map.getTranslationKey()); + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.machine_mode", mapName)); + + return this; + } + /** Insert an empty line into the text list. */ public MultiblockUIBuilder addEmptyLine() { addKey(IKey.LINE_FEED); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index f3f62464925..edd26fb7efd 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5973,6 +5973,8 @@ gregtech.multiblock.hpca.info_coolant_name=PCB Coolant gregtech.multiblock.hpca.info_bridging_enabled=Bridging Enabled gregtech.multiblock.hpca.info_bridging_disabled=Bridging Disabled +gregtech.multiblock.machine_mode=Machine Mode: %s + gregtech.command.usage=Usage: /gregtech gregtech.command.worldgen.usage=Usage: /gregtech worldgen gregtech.command.worldgen.reload.usage=Usage: /gregtech worldgen reload From bc7a3f18f89388d774ab772bcf8146aae471ba1b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:23:06 -0700 Subject: [PATCH 149/264] fix getting hovered element --- .../gregtech/common/mui/widget/ScrollableTextWidget.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index 54c597aeeb8..cd878d8038e 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -98,7 +98,6 @@ public boolean onMouseRelease(int mouseButton) { public Object getHoveredElement() { if (!isHovering()) return null; getContext().pushMatrix(); - getContext().translate(getArea().x, getArea().y); Object o = this.text.getHoveringElement(getContext()); getContext().popMatrix(); return o; @@ -126,11 +125,7 @@ public void getSelfAt(IViewportStack stack, HoveredWidgetList widgets, int x, in } @Override - public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) { - if (getArea().isInside(x, y) && !getScrollArea().isInsideScrollbarArea(x, y) && hasChildren()) { - IViewport.getChildrenAt(this, stack, widgets, x, y); - } - } + public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, int y) {} @Override public void onResized() { From cbae95389b5f12f2d00f8b86e4cbb5306b61d670 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:40:34 -0700 Subject: [PATCH 150/264] fix background and simplify --- .../mui/widget/ScrollableTextWidget.java | 25 ++++--------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index cd878d8038e..76685e8705f 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -1,7 +1,6 @@ package gregtech.common.mui.widget; import com.cleanroommc.modularui.api.GuiAxis; -import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.drawable.IHoverable; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.layout.IViewport; @@ -13,7 +12,6 @@ import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; -import com.cleanroommc.modularui.theme.WidgetTextFieldTheme; import com.cleanroommc.modularui.utils.HoveredWidgetList; import com.cleanroommc.modularui.widget.Widget; import com.cleanroommc.modularui.widget.scroll.ScrollArea; @@ -97,15 +95,12 @@ public boolean onMouseRelease(int mouseButton) { @Nullable public Object getHoveredElement() { if (!isHovering()) return null; - getContext().pushMatrix(); - Object o = this.text.getHoveringElement(getContext()); - getContext().popMatrix(); - return o; + return this.text.getHoveringElement(getContext()); } @Override public Area getArea() { - return this.scroll; + return getScrollArea(); } public ScrollArea getScrollArea() { @@ -129,12 +124,7 @@ public void getWidgetsAt(IViewportStack stack, HoveredWidgetList widgets, int x, @Override public void onResized() { - if (this.scroll.getScrollX() != null) { - this.scroll.getScrollX().clamp(this.scroll); - } - if (this.scroll.getScrollY() != null) { - this.scroll.getScrollY().clamp(this.scroll); - } + this.scroll.getScrollY().clamp(this.scroll); } @Override @@ -152,11 +142,6 @@ public void preDraw(ModularGuiContext context, boolean transformed) { } } - @Override - protected WidgetTextFieldTheme getWidgetThemeInternal(ITheme theme) { - return theme.getTextFieldTheme(); - } - private void drawText(ModularGuiContext context) { if (this.autoUpdate || this.dirty) { if (this.builder != null) { @@ -167,8 +152,8 @@ private void drawText(ModularGuiContext context) { } this.text.setupRenderer(this.renderer, getArea().getPadding().left, getArea().getPadding().top - getScrollY(), getArea().paddedWidth(), getArea().paddedHeight(), - getWidgetThemeInternal(context.getTheme()).getTextColor(), - getWidgetThemeInternal(context.getTheme()).getTextShadow()); + getWidgetTheme(context.getTheme()).getTextColor(), + getWidgetTheme(context.getTheme()).getTextShadow()); this.text.compileAndDraw(this.renderer, context, false); this.scroll.getScrollY().setScrollSize((int) this.renderer.getLastHeight()); } From 9b9fa3b05856a85fb345679cb0b541ff92ec7f10 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 18:47:07 -0700 Subject: [PATCH 151/264] add method for syncing objects --- .../multiblock/ui/MultiblockUIBuilder.java | 19 +++++++++++++++++++ .../multiblock/ui/UISyncer.java | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 5127de40bfb..d5cf968d1e6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -14,6 +14,8 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; +import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; import io.netty.buffer.ByteBuf; @@ -25,6 +27,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; @SuppressWarnings({ "UnusedReturnValue", "unused" }) @@ -669,6 +672,22 @@ public BigInteger syncBigInt(BigInteger initial) { } } + @Override + @NotNull + public T syncObject(@NotNull T initial, IByteBufSerializer serializer, + IByteBufDeserializer deserializer) { + if (isServer) { + serializer.serializeSafe(internal, Objects.requireNonNull(initial)); + return initial; + } else { + try { + return deserializer.deserialize(internal); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } + } + @Override public void readBuffer(ByteBuf buf) { clear(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index bc3c99c422e..be3080632f6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -1,5 +1,7 @@ package gregtech.api.metatileentity.multiblock.ui; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; +import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import io.netty.buffer.ByteBuf; import java.math.BigInteger; @@ -22,6 +24,8 @@ public interface UISyncer { BigInteger syncBigInt(BigInteger initial); + T syncObject(T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + void readBuffer(ByteBuf buf); void writeBuffer(ByteBuf buf); From 336ad3acd164e2a432bb3bf101e48ac0669c16b8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:02:08 -0700 Subject: [PATCH 152/264] fix issues with ScrollableTextWidget no need to add keys on server --- .../multiblock/ui/MultiblockUIBuilder.java | 1 + .../common/mui/widget/ScrollableTextWidget.java | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index d5cf968d1e6..c9c2a59a6ea 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -560,6 +560,7 @@ private void addKey(IDrawable key) { } private void addKey(@NotNull IDrawable key, @NotNull Operation op) { + if (isServer()) return; if (textList.size() != operations.size()) { throw new IllegalStateException("textList and operations must be the same size!"); } diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index 76685e8705f..55e82d4f2b0 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -5,6 +5,7 @@ import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.api.layout.IViewport; import com.cleanroommc.modularui.api.layout.IViewportStack; +import com.cleanroommc.modularui.api.widget.IGuiAction; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.Stencil; import com.cleanroommc.modularui.drawable.text.RichText; @@ -33,6 +34,13 @@ public class ScrollableTextWidget extends Widget private final ScrollArea scroll = new ScrollArea(); private final TextRenderer renderer = new TextRenderer(); + public ScrollableTextWidget() { + listenGuiAction((IGuiAction.MouseReleased) mouseButton -> { + this.scroll.mouseReleased(getContext()); + return false; + }); + } + @Override public void onInit() { this.scroll.setScrollData(ScrollData.of(GuiAxis.Y)); @@ -155,7 +163,8 @@ private void drawText(ModularGuiContext context) { getWidgetTheme(context.getTheme()).getTextColor(), getWidgetTheme(context.getTheme()).getTextShadow()); this.text.compileAndDraw(this.renderer, context, false); - this.scroll.getScrollY().setScrollSize((int) this.renderer.getLastHeight()); + int diff = ((int) this.renderer.getLastHeight() - getArea().h()) / 2; + this.scroll.getScrollY().setScrollSize(getArea().h() + Math.max(0, diff)); } @Override From f5297058e0bcd178fd56ec6269306caa574583b1 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 20:21:43 -0700 Subject: [PATCH 153/264] add overload for syncObject simplify UISyncer methods --- .../multiblock/ui/MultiblockUIBuilder.java | 32 ++----------------- .../multiblock/ui/UISyncer.java | 23 ++++++++++--- 2 files changed, 21 insertions(+), 34 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index c9c2a59a6ea..d231cc4e666 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -13,7 +13,6 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; -import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -23,7 +22,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.math.BigInteger; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -538,7 +536,6 @@ public void markDirty() { protected void build() { clear(); if (this.action != null) { - if (isServer()) getSyncer().clear(); this.action.accept(this); } } @@ -622,16 +619,6 @@ public long syncLong(long initial) { } } - @Override - public String syncString(String initial) { - if (isServer()) { - NetworkUtils.writeStringSafe(internal, initial); - return initial; - } else { - return NetworkUtils.readStringSafe(internal); - } - } - @Override public byte syncByte(byte initial) { if (isServer()) { @@ -662,22 +649,11 @@ public float syncFloat(float initial) { } } - @Override - public BigInteger syncBigInt(BigInteger initial) { - if (isServer()) { - internal.writeByteArray(initial.toByteArray()); - return initial; - } else { - byte[] bytes = internal.readByteArray(); - return new BigInteger(bytes); - } - } - @Override @NotNull public T syncObject(@NotNull T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { - if (isServer) { + if (isServer()) { serializer.serializeSafe(internal, Objects.requireNonNull(initial)); return initial; } else { @@ -703,15 +679,11 @@ public void writeBuffer(ByteBuf buf) { @Override public boolean hasChanged() { byte[] old = internal.array().clone(); + this.internal.clear(); onRebuild(); build(); return !Arrays.equals(old, internal.array()); } - - @Override - public void clear() { - this.internal.clear(); - } } public class InternalSyncHandler extends SyncHandler { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index be3080632f6..ddd7f82958d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -1,20 +1,31 @@ package gregtech.api.metatileentity.multiblock.ui; +import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; +import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; +import com.cleanroommc.modularui.utils.serialization.IEquals; import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; import java.math.BigInteger; public interface UISyncer { + IByteBufAdapter BIG_INT = ByteBufAdapters.makeAdapter( + buffer -> new BigInteger(buffer.readByteArray()), + (buffer, value) -> buffer.writeByteArray(value.toByteArray()), + IEquals.defaultTester()); + boolean syncBoolean(boolean initial); int syncInt(int initial); long syncLong(long initial); - String syncString(String initial); + default @NotNull String syncString(@NotNull String initial) { + return syncObject(initial, ByteBufAdapters.STRING); + } byte syncByte(byte initial); @@ -22,15 +33,19 @@ public interface UISyncer { float syncFloat(float initial); - BigInteger syncBigInt(BigInteger initial); + default BigInteger syncBigInt(BigInteger initial) { + return syncObject(initial, BIG_INT); + } T syncObject(T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + default T syncObject(T initial, IByteBufAdapter adapter) { + return syncObject(initial, adapter, adapter); + } + void readBuffer(ByteBuf buf); void writeBuffer(ByteBuf buf); boolean hasChanged(); - - void clear(); } From d13e666c5b3472ff9374fee0d5c6f66d2002718a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 25 Feb 2025 21:11:58 -0700 Subject: [PATCH 154/264] rework adding screen widgets improve MultiblockUIFactory --- .../multiblock/ui/MultiblockUIBuilder.java | 4 +- .../multiblock/ui/MultiblockUIFactory.java | 70 +++++++++++++------ .../electric/MetaTileEntityFusionReactor.java | 57 ++++++++------- .../multi/electric/MetaTileEntityHPCA.java | 2 +- 4 files changed, 81 insertions(+), 52 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index d231cc4e666..bae3249ce7d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -508,7 +508,7 @@ protected boolean hasChanged() { return getSyncer().hasChanged(); } - protected void sync(String key, PanelSyncManager syncManager) { + public void sync(String key, PanelSyncManager syncManager) { syncManager.syncValue(key, this.syncHandler); } @@ -540,7 +540,7 @@ protected void build() { } } - protected void setAction(Consumer action) { + public void setAction(Consumer action) { this.action = action; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index fdc50a97a67..17409cf31e6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -33,8 +33,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; @@ -45,7 +43,8 @@ public class MultiblockUIFactory { protected BiFunction flexButton = (guiData, syncManager) -> null; private int width = 198, height = 202; private int screenHeight = 109; - private Consumer> childrenConsumer; + private ScreenFunction screenFunction; + private static final Consumer NO_OP = b -> {}; static { // register operations @@ -90,6 +89,13 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { } private Widget createIndicator(PanelSyncManager syncManager) { + if (warningText == NO_OP && errorText == NO_OP) { + return new Widget<>() + .size(18) + .pos(174 - 5, screenHeight - 18 - 3) + .overlay(GTGuiTextures.getLogo(mte.getUITheme())); + } + MultiblockUIBuilder error = builder(); error.sync("error", syncManager); error.setAction(this.errorText); @@ -143,6 +149,11 @@ public MultiblockUIFactory configureWarningText(Consumer wa return configureWarningText(true, warningText); } + public MultiblockUIFactory disableWarningText() { + this.warningText = NO_OP; + return this; + } + /** * Returns a list of translation keys indicating any current errors in this Multiblock.
* Prioritized over any warnings provided by {@link #configureWarningText(Consumer)}.
@@ -162,6 +173,11 @@ public MultiblockUIFactory configureErrorText(Consumer erro return configureErrorText(true, errorText); } + public MultiblockUIFactory disableErrorText() { + this.errorText = NO_OP; + return this; + } + /** * Called per tick on client side
* Each element of list is displayed on new line
@@ -183,6 +199,11 @@ public MultiblockUIFactory configureDisplayText(Consumer di return configureDisplayText(true, displayText); } + public MultiblockUIFactory disableDisplayText() { + this.displayText = NO_OP; + return this; + } + /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no * additional functionality for this Multiblock. @@ -248,33 +269,32 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, return column; } - public MultiblockUIFactory addScreenChildren(Consumer> consumer) { - this.childrenConsumer = consumer; + public MultiblockUIFactory addScreenChildren(ScreenFunction function) { + this.screenFunction = function; return this; } protected Widget createScreen(PanelSyncManager syncManager) { - MultiblockUIBuilder display = builder(); - display.setAction(this.displayText); - display.sync("display", syncManager); - - var scrollableTextWidget = new ScrollableTextWidget() - .sizeRel(1f) - .alignment(Alignment.TopLeft) - .margin(4, 4) - .autoUpdate(true) - .textBuilder(display::build); - var parent = new ParentWidget<>(); - if (this.childrenConsumer != null) { - List extra = new ArrayList<>(); - this.childrenConsumer.accept(extra); - extra.forEach(parent::child); + if (this.screenFunction != null) { + this.screenFunction.addWidgets(parent, syncManager); } - return parent.child(scrollableTextWidget) - .child(createIndicator(syncManager)) + if (displayText != NO_OP) { + MultiblockUIBuilder display = builder(); + display.setAction(this.displayText); + display.sync("display", syncManager); + + parent.child(new ScrollableTextWidget() + .sizeRel(1f) + .alignment(Alignment.TopLeft) + .margin(4, 4) + .autoUpdate(true) + .textBuilder(display::build)); + } + + return parent.child(createIndicator(syncManager)) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) .pos(4, 4); @@ -385,6 +405,12 @@ public static final class Bars { private Bars() {} } + @FunctionalInterface + public interface ScreenFunction { + + void addWidgets(ParentWidget parent, PanelSyncManager syncManager); + } + public static MultiblockUIBuilder builder() { return new MultiblockUIBuilder(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 465b8a3a6fa..1953f4d3ebd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -19,6 +19,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -445,36 +446,38 @@ protected MultiblockUIFactory createUIFactory() { } DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent); + final MultiblockUIBuilder status = MultiblockUIFactory.builder(); + status.setAction(b -> b.structureFormed(isStructureFormed()) + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addWorkingStatusLine()); return new MultiblockUIFactory(this) .setSize(198, 236) .setScreenHeight(138) - .configureDisplayText(false, builder -> {}) - .addScreenChildren(widgets -> widgets.add(new Column() - .padding(4) - .expanded() - .child(title.asWidget() - .marginBottom(8) - .size(69, 12)) - .child(new ProgressWidget() - .size(77, 77) - .tooltipAutoUpdate(true) - // this is fine client only because these values are already synced - .tooltipBuilder(tooltip -> MultiblockUIFactory.builder() - .structureFormed(isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), - recipeMapWorkable.isActive()) - .addWorkingStatusLine() - .build(tooltip)) - .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() - .size(89, 101) - .marginTop(11)) - .direction(ProgressWidget.Direction.CIRCULAR_CW) - .value(progress) - .texture(null, GTGuiTextures.FUSION_PROGRESS, 77)) - .child(GTGuiTextures.FUSION_LEGEND.asWidget() - .left(4) - .bottom(4) - .size(108, 41)))); + .disableDisplayText() + .addScreenChildren((parent, syncManager) -> { + status.sync("status", syncManager); + parent.child(new Column() + .padding(4) + .expanded() + .child(title.asWidget() + .marginBottom(8) + .size(69, 12)) + .child(new ProgressWidget() + .size(77, 77) + .tooltipAutoUpdate(true) + // todo this tooltip is not updating correctly + .tooltipBuilder(status::build) + .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() + .size(89, 101) + .marginTop(11)) + .direction(ProgressWidget.Direction.CIRCULAR_CW) + .value(progress) + .texture(null, GTGuiTextures.FUSION_PROGRESS, 77)) + .child(GTGuiTextures.FUSION_LEGEND.asWidget() + .left(4) + .bottom(4) + .size(108, 41))); + }); } private void addEnergyBarHoverText(List hoverList) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 80ed75e6ae2..c0f828a8a7a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -364,7 +364,7 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() - .addScreenChildren(widgets -> widgets.add(new ParentWidget<>() + .addScreenChildren((parent, syncManager) -> parent.child(new ParentWidget<>() .leftRel(0.5f) .bottom(5) .size(16 * 3 + 2) From 4c162c03d077ea6f4c2063393cd3d2c70848599f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:52:20 -0700 Subject: [PATCH 155/264] add methods for syncing collections --- .../multiblock/ui/MultiblockUIBuilder.java | 22 +++++++++++++++++++ .../multiblock/ui/UISyncer.java | 10 +++++++++ 2 files changed, 32 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index bae3249ce7d..839f1814e1a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -22,8 +22,10 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Objects; import java.util.function.Consumer; @@ -665,6 +667,26 @@ public T syncObject(@NotNull T initial, IByteBufSerializer serializer, } } + @Override + public Collection syncCollection(Collection initial, IByteBufSerializer serializer, + IByteBufDeserializer deserializer) { + if (isServer()) { + internal.writeVarInt(initial.size()); + initial.forEach(t -> serializer.serializeSafe(internal, t)); + } else { + initial.clear(); + int size = internal.readVarInt(); + try { + for (int i = 0; i < size; i++) { + initial.add(deserializer.deserialize(internal)); + } + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + return initial; + } + @Override public void readBuffer(ByteBuf buf) { clear(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index ddd7f82958d..6ec3c0308b9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -9,6 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.math.BigInteger; +import java.util.Collection; public interface UISyncer { @@ -43,6 +44,15 @@ default T syncObject(T initial, IByteBufAdapter adapter) { return syncObject(initial, adapter, adapter); } + Collection syncCollection(Collection initial, + IByteBufSerializer serializer, + IByteBufDeserializer deserializer); + + default Collection syncCollection(Collection initial, + IByteBufAdapter adapter) { + return syncCollection(initial, adapter, adapter); + } + void readBuffer(ByteBuf buf); void writeBuffer(ByteBuf buf); From 6a507d8b5f5a35da1f367e439233d11b352148a7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:00:42 -0700 Subject: [PATCH 156/264] add generic return for collection --- .../multiblock/ui/MultiblockUIBuilder.java | 4 ++-- .../api/metatileentity/multiblock/ui/UISyncer.java | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 839f1814e1a..28f899729b7 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -668,8 +668,8 @@ public T syncObject(@NotNull T initial, IByteBufSerializer serializer, } @Override - public Collection syncCollection(Collection initial, IByteBufSerializer serializer, - IByteBufDeserializer deserializer) { + public > C syncCollection(C initial, IByteBufSerializer serializer, + IByteBufDeserializer deserializer) { if (isServer()) { internal.writeVarInt(initial.size()); initial.forEach(t -> serializer.serializeSafe(internal, t)); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 6ec3c0308b9..de9e694db08 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -44,12 +44,11 @@ default T syncObject(T initial, IByteBufAdapter adapter) { return syncObject(initial, adapter, adapter); } - Collection syncCollection(Collection initial, - IByteBufSerializer serializer, - IByteBufDeserializer deserializer); + > C syncCollection(C initial, + IByteBufSerializer serializer, + IByteBufDeserializer deserializer); - default Collection syncCollection(Collection initial, - IByteBufAdapter adapter) { + default > C syncCollection(C initial, IByteBufAdapter adapter) { return syncCollection(initial, adapter, adapter); } From e4905c90b1ca96d00dc2bc79a7f4f167ae326099 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:30:05 -0700 Subject: [PATCH 157/264] fix fusion reactor tooltip(?) --- .../multi/electric/MetaTileEntityFusionReactor.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 1953f4d3ebd..98646128b13 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -446,15 +446,15 @@ protected MultiblockUIFactory createUIFactory() { } DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent); - final MultiblockUIBuilder status = MultiblockUIFactory.builder(); - status.setAction(b -> b.structureFormed(isStructureFormed()) - .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addWorkingStatusLine()); return new MultiblockUIFactory(this) .setSize(198, 236) .setScreenHeight(138) .disableDisplayText() .addScreenChildren((parent, syncManager) -> { + MultiblockUIBuilder status = MultiblockUIFactory.builder(); + status.setAction(b -> b.structureFormed(true) + .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) + .addWorkingStatusLine()); status.sync("status", syncManager); parent.child(new Column() .padding(4) @@ -465,7 +465,6 @@ protected MultiblockUIFactory createUIFactory() { .child(new ProgressWidget() .size(77, 77) .tooltipAutoUpdate(true) - // todo this tooltip is not updating correctly .tooltipBuilder(status::build) .background(GTGuiTextures.FUSION_DIAGRAM.asIcon() .size(89, 101) From f95cf782b7e74109323159f1d8149cc594e88300 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:50:15 -0700 Subject: [PATCH 158/264] add javadocs/comments + method rename remove unneeded methods from UISyncer replace CustomKeyFunction.java --- .../multiblock/ui/CustomKeyFunction.java | 7 --- .../multiblock/ui/MultiblockUIBuilder.java | 46 ++++++++++++++----- .../multiblock/ui/UISyncer.java | 7 --- 3 files changed, 34 insertions(+), 26 deletions(-) delete mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java deleted file mode 100644 index d723fe68483..00000000000 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package gregtech.api.metatileentity.multiblock.ui; - -@FunctionalInterface -public interface CustomKeyFunction { - - void addCustom(KeyManager manager, UISyncer syncer); -} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 28f899729b7..fe6a37b182c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -28,6 +28,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.function.BiConsumer; import java.util.function.Consumer; @SuppressWarnings({ "UnusedReturnValue", "unused" }) @@ -55,7 +56,7 @@ public class MultiblockUIBuilder { private Runnable onRebuild; @NotNull - private UISyncer getSyncer() { + private InternalSyncer getSyncer() { if (this.syncer == null) { this.syncer = new InternalSyncer(isServer()); } @@ -491,8 +492,8 @@ public MultiblockUIBuilder addEmptyLine() { } /** Add custom text dynamically, allowing for custom application logic. */ - public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { - customConsumer.addCustom(this.manager, getSyncer()); + public MultiblockUIBuilder addCustom(BiConsumer customConsumer) { + customConsumer.accept(this.manager, getSyncer()); return this; } @@ -514,10 +515,17 @@ public void sync(String key, PanelSyncManager syncManager) { syncManager.syncValue(key, this.syncHandler); } + /** + * Builds the passed in rich text with operations and drawables.
+ * Will clear and rebuild if this builder is marked dirty + * + * @param richText the rich text to add drawables to + */ public void build(IRichTextBuilder richText) { if (dirty) { + clear(); onRebuild(); - build(); + runAction(); dirty = false; } for (int i = 0; i < operations.size(); i++) { @@ -531,21 +539,37 @@ private void onRebuild() { } } + /** + * Mark this builder as dirty. Will be rebuilt during {@link #build(IRichTextBuilder) build()} + */ public void markDirty() { dirty = true; } - protected void build() { - clear(); + /* + * this is run on the server side to write values to the internal syncer + * those values are then synced to the client and read back in the same order + */ + private void runAction() { if (this.action != null) { this.action.accept(this); } } + /** + * Set the action for this builder. Called on server and client. + * + * @param action the action to apply to this builder + */ public void setAction(Consumer action) { this.action = action; } + /** + * The runnable is called prior to rebuilding, usually used for updating {@link #structureFormed(boolean)} + * + * @param onRebuild the runnable to run prior to rebuilding + */ public void onRebuild(Runnable onRebuild) { this.onRebuild = onRebuild; } @@ -583,7 +607,7 @@ public class InternalSyncer implements UISyncer { private final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); private final boolean isServer; - public InternalSyncer(boolean isServer) { + private InternalSyncer(boolean isServer) { this.isServer = isServer; } @@ -687,23 +711,21 @@ public > C syncCollection(C initial, IByteBufSerializ return initial; } - @Override public void readBuffer(ByteBuf buf) { clear(); internal.writeBytes(buf); } - @Override public void writeBuffer(ByteBuf buf) { buf.writeBytes(internal); } - @Override public boolean hasChanged() { byte[] old = internal.array().clone(); this.internal.clear(); + clear(); onRebuild(); - build(); + runAction(); return !Arrays.equals(old, internal.array()); } } @@ -717,7 +739,7 @@ public void detectAndSendChanges(boolean init) { if (init || hasChanged()) { if (init) { onRebuild(); - build(); + runAction(); } syncToClient(0, buf -> getSyncer().writeBuffer(buf)); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index de9e694db08..799e9e0e8a4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -5,7 +5,6 @@ import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import com.cleanroommc.modularui.utils.serialization.IEquals; -import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.NotNull; import java.math.BigInteger; @@ -51,10 +50,4 @@ > C syncCollection(C initial, default > C syncCollection(C initial, IByteBufAdapter adapter) { return syncCollection(initial, adapter, adapter); } - - void readBuffer(ByteBuf buf); - - void writeBuffer(ByteBuf buf); - - boolean hasChanged(); } From 7607e6de39564a7f8a0cae2e3dfb4181d2d07f25 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 15:53:12 -0700 Subject: [PATCH 159/264] add screen widgets after display --- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 17409cf31e6..a035485a686 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -277,10 +277,6 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { protected Widget createScreen(PanelSyncManager syncManager) { var parent = new ParentWidget<>(); - if (this.screenFunction != null) { - this.screenFunction.addWidgets(parent, syncManager); - } - if (displayText != NO_OP) { MultiblockUIBuilder display = builder(); display.setAction(this.displayText); @@ -294,6 +290,10 @@ protected Widget createScreen(PanelSyncManager syncManager) { .textBuilder(display::build)); } + if (this.screenFunction != null) { + this.screenFunction.addWidgets(parent, syncManager); + } + return parent.child(createIndicator(syncManager)) .background(GTGuiTextures.DISPLAY) .size(190, screenHeight) From 8a95a68eac57c28bc88deac6b8c70d69dd4e9933 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 26 Feb 2025 16:14:11 -0700 Subject: [PATCH 160/264] make steam multis use bronze theme brute force themed displays --- .../RecipeMapSteamMultiblockController.java | 6 ++++++ .../multiblock/ui/MultiblockUIFactory.java | 18 ++++++++++++++++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 2cc27f0044a..0ccda35523e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -11,6 +11,7 @@ import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MTETrait; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; @@ -130,6 +131,11 @@ protected void configureWarningText(MultiblockUIBuilder builder) { }).addMaintenanceProblemLines(getMaintenanceProblems()); } + @Override + public GTGuiTheme getUITheme() { + return GTGuiTheme.BRONZE; + } + @Override public TraceabilityPredicate autoAbilities() { return autoAbilities(true, true, true, true, true); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index a035485a686..b436f4970f6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -6,6 +6,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; @@ -18,6 +19,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.IWidget; import com.cleanroommc.modularui.drawable.DynamicDrawable; +import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; @@ -84,7 +86,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { .height(77) .margin(4, 0) .child(SlotGroupWidget.playerInventory(0) - .alignX(0f)) + .left(2)) .child(createButtons(panel, panelSyncManager, guiData))); } @@ -295,11 +297,23 @@ protected Widget createScreen(PanelSyncManager syncManager) { } return parent.child(createIndicator(syncManager)) - .background(GTGuiTextures.DISPLAY) + .background(getDisplayBackground()) .size(190, screenHeight) .pos(4, 4); } + // todo this should be part of the theme instead + private UITexture getDisplayBackground() { + var theme = mte.getUITheme(); + if (theme == GTGuiTheme.BRONZE) { + return GTGuiTextures.DISPLAY_BRONZE; + } else if (theme == GTGuiTheme.STEEL) { + return GTGuiTextures.DISPLAY_STEEL; + } else { + return GTGuiTextures.DISPLAY; + } + } + @NotNull protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager, PosGuiData guiData) { From 734fe6caebfc071ddbb486ad96259cb03a1a9c51 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Feb 2025 12:40:28 -0700 Subject: [PATCH 161/264] mark item and fluid outputs as notnull --- .../capability/impl/AbstractRecipeLogic.java | 17 ++++++++++------- .../api/capability/impl/BoilerRecipeLogic.java | 2 -- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index d86d2827139..1c810716695 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -43,6 +43,7 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static gregtech.api.GTValues.ULV; @@ -70,8 +71,10 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, protected int progressTime; protected int maxProgressTime; protected long recipeEUt; - protected List fluidOutputs; - protected List itemOutputs; + @NotNull + protected List fluidOutputs = Collections.emptyList(); + @NotNull + protected List itemOutputs = Collections.emptyList(); protected boolean isActive; protected boolean workingEnabled = true; @@ -974,8 +977,8 @@ protected void completeRecipe() { this.progressTime = 0; setMaxProgress(0); this.recipeEUt = 0; - this.fluidOutputs = null; - this.itemOutputs = null; + this.fluidOutputs = Collections.emptyList(); + this.itemOutputs = Collections.emptyList(); this.hasNotEnoughEnergy = false; this.wasActiveAndNeedsUpdate = true; this.parallelRecipesPerformed = 0; @@ -1135,8 +1138,8 @@ public void invalidate() { progressTime = 0; maxProgressTime = 0; recipeEUt = 0; - fluidOutputs = null; - itemOutputs = null; + fluidOutputs = Collections.emptyList(); + itemOutputs = Collections.emptyList(); parallelRecipesPerformed = 0; isOutputsFull = false; invalidInputsForRecipes = false; @@ -1211,7 +1214,7 @@ public void deserializeNBT(@NotNull NBTTagCompound compound) { this.itemOutputs.add(new ItemStack(itemOutputsList.getCompoundTagAt(i))); } NBTTagList fluidOutputsList = compound.getTagList("FluidOutputs", Constants.NBT.TAG_COMPOUND); - this.fluidOutputs = new ArrayList<>(); + this.fluidOutputs = new ArrayList<>(fluidOutputsList.tagCount()); for (int i = 0; i < fluidOutputsList.tagCount(); i++) { this.fluidOutputs.add(FluidStack.loadFluidStackFromNBT(fluidOutputsList.getCompoundTagAt(i))); } diff --git a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java index a2163db4637..5624ba6eab7 100644 --- a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java @@ -49,8 +49,6 @@ public class BoilerRecipeLogic extends AbstractRecipeLogic implements ICategoryO public BoilerRecipeLogic(MetaTileEntityLargeBoiler tileEntity) { super(tileEntity, null); - this.fluidOutputs = Collections.emptyList(); - this.itemOutputs = Collections.emptyList(); } @Override From ef385d4af089af8d335cdfc79f9029ca7215042e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Mar 2025 11:56:38 -0700 Subject: [PATCH 162/264] make new list for syncing add method to sync arrays --- .../multiblock/ui/MultiblockUIBuilder.java | 22 +++++++++++++++++-- .../multiblock/ui/UISyncer.java | 6 +++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index fe6a37b182c..c38a7e897ee 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -692,21 +693,38 @@ public T syncObject(@NotNull T initial, IByteBufSerializer serializer, } @Override + @SuppressWarnings("unchecked") public > C syncCollection(C initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { if (isServer()) { internal.writeVarInt(initial.size()); initial.forEach(t -> serializer.serializeSafe(internal, t)); + return initial; } else { - initial.clear(); int size = internal.readVarInt(); + List copy = new ArrayList<>(internal.readVarInt()); try { for (int i = 0; i < size; i++) { - initial.add(deserializer.deserialize(internal)); + copy.add(deserializer.deserialize(internal)); } } catch (IOException e) { throw new IllegalStateException(e); } + return (C) copy; + } + } + + @Override + @SuppressWarnings("unchecked") + public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { + if (isServer()) { + internal.writeVarInt(initial.length); + for (T t : initial) { + serializer.serializeSafe(internal, t); + } + } else { + initial = (T[]) Array.newInstance(initial.getClass().getComponentType(), internal.readVarInt()); + Arrays.setAll(initial, i -> deserializer.deserializeSafe(internal)); } return initial; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 799e9e0e8a4..586258807db 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -50,4 +50,10 @@ > C syncCollection(C initial, default > C syncCollection(C initial, IByteBufAdapter adapter) { return syncCollection(initial, adapter, adapter); } + + T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + + default T[] syncArray(T[] initial, IByteBufAdapter adapter) { + return syncArray(initial, adapter, adapter); + } } From 069f7885b406a050aa75565abe349ec333c5725a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Mar 2025 12:37:07 -0700 Subject: [PATCH 163/264] add supplier methods to UISyncer to avoid potential client NPEs --- .../multiblock/ui/MultiblockUIBuilder.java | 70 ++++++++++--------- .../multiblock/ui/UISyncer.java | 54 +++++++++++--- .../generator/MetaTileEntityLargeTurbine.java | 35 ++-------- 3 files changed, 90 insertions(+), 69 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index c38a7e897ee..62873a1ba32 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -30,7 +30,11 @@ import java.util.List; import java.util.Objects; import java.util.function.BiConsumer; +import java.util.function.BooleanSupplier; import java.util.function.Consumer; +import java.util.function.DoubleSupplier; +import java.util.function.IntSupplier; +import java.util.function.LongSupplier; @SuppressWarnings({ "UnusedReturnValue", "unused" }) public class MultiblockUIBuilder { @@ -65,7 +69,7 @@ private InternalSyncer getSyncer() { } void updateFormed(boolean isStructureFormed) { - this.isStructureFormed = this.getSyncer().syncBoolean(isStructureFormed); + this.isStructureFormed = getSyncer().syncBoolean(isStructureFormed); } private boolean isServer() { @@ -317,10 +321,9 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; - progressPercent = getSyncer().syncDouble(progressPercent); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", - (int) (progressPercent * 100))); + (int) (getSyncer().syncDouble(progressPercent) * 100))); return this; } @@ -333,10 +336,9 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; numParallels = getSyncer().syncInt(numParallels); if (numParallels > 1) { - var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.parallel", parallels)); + "gregtech.multiblock.parallel", + KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels))); } return this; } @@ -348,8 +350,7 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; - isLowPower = getSyncer().syncBoolean(isLowPower); - if (isLowPower) { + if (getSyncer().syncBoolean(isLowPower)) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); } @@ -363,8 +364,7 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; - isLowComputation = getSyncer().syncBoolean(isLowComputation); - if (isLowComputation) { + if (getSyncer().syncBoolean(isLowComputation)) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); } @@ -378,8 +378,7 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; - isTooLow = getSyncer().syncBoolean(isTooLow); - if (isTooLow) { + if (getSyncer().syncBoolean(isTooLow)) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); } @@ -446,8 +445,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; - isObstructed = getSyncer().syncBoolean(isObstructed); - if (isObstructed) { + if (getSyncer().syncBoolean(isObstructed)) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -465,7 +463,7 @@ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipe if (!isStructureFormed || !isActive) return this; fuelName = getSyncer().syncString(fuelName); previousRecipeDuration = getSyncer().syncInt(previousRecipeDuration); - if (fuelName != null) addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); @@ -617,60 +615,66 @@ private boolean isServer() { } @Override - public boolean syncBoolean(boolean initial) { + public boolean syncBoolean(@NotNull BooleanSupplier initial) { if (isServer()) { - internal.writeBoolean(initial); - return initial; + boolean val = initial.getAsBoolean(); + internal.writeBoolean(val); + return val; } else { return internal.readBoolean(); } } @Override - public int syncInt(int initial) { + public int syncInt(@NotNull IntSupplier initial) { if (isServer()) { - internal.writeInt(initial); - return initial; + int val = initial.getAsInt(); + internal.writeInt(val); + return val; } else { return internal.readInt(); } } @Override - public long syncLong(long initial) { + public long syncLong(@NotNull LongSupplier initial) { if (isServer()) { - internal.writeLong(initial); - return initial; + long val = initial.getAsLong(); + internal.writeLong(val); + return val; } else { return internal.readLong(); } } @Override - public byte syncByte(byte initial) { + public byte syncByte(@NotNull ByteSupplier initial) { if (isServer()) { - internal.writeByte(initial); - return initial; + byte val = initial.getByte(); + internal.writeByte(val); + return val; } else { return internal.readByte(); } } @Override - public double syncDouble(double initial) { + public double syncDouble(@NotNull DoubleSupplier initial) { if (isServer()) { - internal.writeDouble(initial); - return initial; + double val = initial.getAsDouble(); + internal.writeDouble(val); + return val; } else { return internal.readDouble(); } } @Override - public float syncFloat(float initial) { + public float syncFloat(@NotNull FloatSupplier initial) { if (isServer()) { - internal.writeFloat(initial); - return initial; + float val = initial.getFloat(); + internal.writeFloat(val); + return val; } else { return internal.readFloat(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 586258807db..48ff67c6c07 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -9,6 +9,10 @@ import java.math.BigInteger; import java.util.Collection; +import java.util.function.BooleanSupplier; +import java.util.function.DoubleSupplier; +import java.util.function.IntSupplier; +import java.util.function.LongSupplier; public interface UISyncer { @@ -17,21 +21,45 @@ public interface UISyncer { (buffer, value) -> buffer.writeByteArray(value.toByteArray()), IEquals.defaultTester()); - boolean syncBoolean(boolean initial); + boolean syncBoolean(@NotNull BooleanSupplier initial); - int syncInt(int initial); + int syncInt(@NotNull IntSupplier initial); - long syncLong(long initial); + long syncLong(@NotNull LongSupplier initial); - default @NotNull String syncString(@NotNull String initial) { - return syncObject(initial, ByteBufAdapters.STRING); + byte syncByte(@NotNull ByteSupplier initial); + + double syncDouble(@NotNull DoubleSupplier initial); + + float syncFloat(@NotNull FloatSupplier initial); + + default boolean syncBoolean(boolean initial) { + return syncBoolean(() -> initial); + } + + default int syncInt(int initial) { + return syncInt(() -> initial); + } + + default long syncLong(long initial) { + return syncLong(() -> initial); + } + + default byte syncByte(byte initial) { + return syncByte(() -> initial); } - byte syncByte(byte initial); + default double syncDouble(double initial) { + return syncDouble(() -> initial); + } - double syncDouble(double initial); + default float syncFloat(float initial) { + return syncFloat(() -> initial); + } - float syncFloat(float initial); + default @NotNull String syncString(@NotNull String initial) { + return syncObject(initial, ByteBufAdapters.STRING); + } default BigInteger syncBigInt(BigInteger initial) { return syncObject(initial, BIG_INT); @@ -56,4 +84,14 @@ default > C syncCollection(C initial, IByteBufAdapter default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); } + + interface ByteSupplier { + + byte getByte(); + } + + interface FloatSupplier { + + float getFloat(); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 87cdd7edd46..7f927b5a71b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -127,8 +127,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); - int totalEfficiency = syncer.syncInt(getRotorTotalEfficiency()); + int rotorEfficiency = syncer.syncInt(() -> getRotorHolder().getRotorEfficiency()); + int totalEfficiency = syncer.syncInt(() -> getRotorHolder().getTotalEfficiency()); if (rotorEfficiency > 0) { IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, @@ -142,35 +142,14 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addWorkingStatusLine(); } - private int getRotorEffeciency() { - if (getRotorHolder() != null) { - return getRotorHolder().getRotorEfficiency(); - } - return 0; - } - - private int getRotorTotalEfficiency() { - if (getRotorHolder() != null) { - return getRotorHolder().getTotalEfficiency(); - } - return 0; - } - - private int getRotorDurability() { - if (getRotorHolder() != null) { - return getRotorHolder().getRotorDurabilityPercent(); - } - return 0; - } - @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom((keyList, syncer) -> { - if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) + if (!isStructureFormed() || syncer.syncBoolean(() -> getRotorHolder() == null)) return; - int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); - int rotorDurability = syncer.syncInt(getRotorDurability()); + int rotorEfficiency = syncer.syncInt(() -> getRotorHolder().getRotorEfficiency()); + int rotorDurability = syncer.syncInt(() -> getRotorHolder().getRotorDurabilityPercent()); if (rotorEfficiency > 0 && rotorDurability <= MIN_DURABILITY_TO_WARN) { keyList.add(KeyUtil.lang(TextFormatting.YELLOW, @@ -183,7 +162,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { builder.addCustom((keyList, syncer) -> { - if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) + if (!isStructureFormed() || syncer.syncBoolean(() -> getRotorHolder() == null)) return; if (!isRotorFaceFree()) { @@ -192,7 +171,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.obstructed.desc")); } - int rotorEfficiency = syncer.syncInt(getRotorHolder().getRotorEfficiency()); + int rotorEfficiency = syncer.syncInt(() -> getRotorHolder().getRotorEfficiency()); if (rotorEfficiency <= 0) { keyList.add(KeyUtil.lang(TextFormatting.RED, From 7071eee74d9d8151717c82b80ed7a583fcd9d121 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Mar 2025 12:40:30 -0700 Subject: [PATCH 164/264] add javadoc --- .../multiblock/ui/UISyncer.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 48ff67c6c07..cc96b789138 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -21,16 +21,52 @@ public interface UISyncer { (buffer, value) -> buffer.writeByteArray(value.toByteArray()), IEquals.defaultTester()); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ boolean syncBoolean(@NotNull BooleanSupplier initial); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ int syncInt(@NotNull IntSupplier initial); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ long syncLong(@NotNull LongSupplier initial); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ byte syncByte(@NotNull ByteSupplier initial); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ double syncDouble(@NotNull DoubleSupplier initial); + /** + * Calls the supplier server side only so there's no potential NPEs for the client + * + * @param initial supplier to be called on the server + * @return synced value + */ float syncFloat(@NotNull FloatSupplier initial); default boolean syncBoolean(boolean initial) { From b21914b655788575ec21f15f92077ac5e4ce4db4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 1 Mar 2025 23:35:15 -0700 Subject: [PATCH 165/264] add extra fluid methods --- src/main/java/gregtech/api/util/KeyUtil.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 7e2f11896f8..902424ca274 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -135,6 +135,16 @@ public static IDrawable setHover(IKey body, IDrawable... hover) { .addTooltipDrawableLines(Arrays.asList(hover)); } + @NotNull + public static IKey fluid(TextFormatting formatting, FluidStack fluid) { + return fluid(fluid.getFluid(), fluid).style(formatting); + } + + @NotNull + public static IKey fluid(TextFormatting formatting, Fluid fluid) { + return fluid(fluid).style(formatting); + } + @NotNull public static IKey fluid(@Nullable FluidStack fluid) { if (fluid == null) return IKey.EMPTY; From 063307c835202b6961009f19f200cadf13915fc2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 2 Mar 2025 11:43:48 -0700 Subject: [PATCH 166/264] nvm don't make copy --- .../metatileentity/multiblock/ui/MultiblockUIBuilder.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 62873a1ba32..08304c4db60 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -697,7 +697,6 @@ public T syncObject(@NotNull T initial, IByteBufSerializer serializer, } @Override - @SuppressWarnings("unchecked") public > C syncCollection(C initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { if (isServer()) { @@ -706,15 +705,14 @@ public > C syncCollection(C initial, IByteBufSerializ return initial; } else { int size = internal.readVarInt(); - List copy = new ArrayList<>(internal.readVarInt()); try { for (int i = 0; i < size; i++) { - copy.add(deserializer.deserialize(internal)); + initial.add(deserializer.deserialize(internal)); } } catch (IOException e) { throw new IllegalStateException(e); } - return (C) copy; + return initial; } } From 9d07fb7ba497fddad0267da1b42c6f15b079e660 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 3 Mar 2025 23:54:26 -0500 Subject: [PATCH 167/264] Display recipe outputs in multiblocks - MUI2 (#2714) Co-authored-by: Ghzdude <44148655+ghzdude@users.noreply.github.com> --- .../capability/impl/AbstractRecipeLogic.java | 6 + .../MultiMapMultiblockController.java | 3 +- .../RecipeMapMultiblockController.java | 3 +- .../RecipeMapSteamMultiblockController.java | 3 +- .../multiblock/ui/MultiblockUIBuilder.java | 230 +++++++++++++++++- .../multiblock/ui/UISyncer.java | 10 +- .../gregtech/api/mui/GTByteBufAdapters.java | 54 ++++ .../api/mui/drawable/GTObjectDrawable.java | 91 +++++++ .../output/impl/ChancedFluidOutput.java | 15 ++ .../chance/output/impl/ChancedItemOutput.java | 12 + .../api/util/FluidStackHashStrategy.java | 68 ++++++ .../electric/MetaTileEntityCleanroom.java | 2 +- .../electric/MetaTileEntityCrackingUnit.java | 3 +- .../MetaTileEntityElectricBlastFurnace.java | 3 +- .../electric/MetaTileEntityFluidDrill.java | 2 +- .../electric/MetaTileEntityMultiSmelter.java | 3 +- .../MetaTileEntityProcessingArray.java | 3 +- .../electric/MetaTileEntityPyrolyseOven.java | 3 +- .../MetaTileEntityResearchStation.java | 2 +- .../mui/widget/ScrollableTextWidget.java | 21 +- .../gregtech/mixins/mui2/IconAccessor.java | 13 + .../mixins/mui2/RichTextCompilerMixin.java | 41 ++++ .../resources/assets/gregtech/lang/en_us.lang | 1 + src/main/resources/mixins.gregtech.mui2.json | 4 +- 24 files changed, 570 insertions(+), 26 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/GTByteBufAdapters.java create mode 100644 src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java create mode 100644 src/main/java/gregtech/api/util/FluidStackHashStrategy.java create mode 100644 src/main/java/gregtech/mixins/mui2/IconAccessor.java create mode 100644 src/main/java/gregtech/mixins/mui2/RichTextCompilerMixin.java diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index 1c810716695..339b11381c7 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -187,6 +187,12 @@ protected IMultipleTankHandler getOutputTank() { return metaTileEntity.getExportFluids(); } + public Recipe getParallelRecipe() { + if (previousRecipe == null) return null; + return findParallelRecipe(previousRecipe, getInputInventory(), getInputTank(), + getOutputInventory(), getOutputTank(), getMaxParallelVoltage(), getParallelLimit()); + } + /** * @return true if energy is consumed by this Recipe Logic, otherwise false */ diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 1fccce2d897..1e581113c0d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -166,7 +166,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 661bda3ee38..ea31b62df41 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -176,7 +176,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } protected void configureWarningText(MultiblockUIBuilder builder) { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 0ccda35523e..53cf2b3f0ac 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -118,7 +118,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 08304c4db60..73903a160f8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -2,23 +2,38 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; +import gregtech.api.capability.impl.AbstractRecipeLogic; +import gregtech.api.mui.GTByteBufAdapters; +import gregtech.api.mui.drawable.GTObjectDrawable; +import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.chance.boost.ChanceBoostFunction; +import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; +import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; +import gregtech.api.util.FluidStackHashStrategy; +import gregtech.api.util.GTUtility; +import gregtech.api.util.ItemStackHashStrategy; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; +import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.FluidStack; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenCustomHashMap; +import it.unimi.dsi.fastutil.objects.Object2LongMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -46,6 +61,8 @@ public class MultiblockUIBuilder { private final InternalSyncHandler syncHandler = new InternalSyncHandler(); private final KeyManager manager = new InternalKeyManager(); + private static final int DEFAULT_MAX_RECIPE_LINES = 25; + @Nullable private InternalSyncer syncer; @@ -313,17 +330,23 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { } /** - * Adds a simple progress line that displays progress as a percentage. + * Adds a progress line that displays recipe progress as "time / total time (percentage)". *
* Added if structure is formed and the machine is active. * - * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. + * @param progress current progress. + * @param maxProgress total progress to be made. */ - public MultiblockUIBuilder addProgressLine(double progressPercent) { + public MultiblockUIBuilder addProgressLine(int progress, int maxProgress) { if (!isStructureFormed || !isActive) return this; - addKey(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.progress", - (int) (getSyncer().syncDouble(progressPercent) * 100))); + + progress = getSyncer().syncInt(progress); + maxProgress = getSyncer().syncInt(maxProgress); + + addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress", + String.format("%,3.2f", (float) progress / 20), + String.format("%,3.2f", (float) maxProgress / 20), + String.format("%,3.1f", (float) progress / maxProgress * 100f))); return this; } @@ -484,6 +507,201 @@ public MultiblockUIBuilder addRecipeMapLine(RecipeMap map) { return this; } + /** + * Adds the current outputs of a recipe from recipe logic. Items then fluids. + * + * @param arl an instance of an {@link AbstractRecipeLogic} to gather the outputs from. + */ + public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) { + return addRecipeOutputLine(arl, DEFAULT_MAX_RECIPE_LINES); + } + + /** + * Adds the current outputs of a recipe from recipe logic. Items then fluids. + * + * @param arl an instance of an {@link AbstractRecipeLogic} to gather the outputs from. + * @param maxLines the maximum number of lines to print until truncating with {@code ...} + */ + public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxLines) { + // todo doing this every tick on the server is probably not good + Recipe recipe = arl.getParallelRecipe(); + + if (getSyncer().syncBoolean(recipe == null)) return this; + if (getSyncer().syncBoolean(arl.getRecipeMap() == null)) return this; + + // noinspection DataFlowIssue + long eut = getSyncer().syncLong(() -> recipe.getEUt()); + long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); + + List itemOutputs = new ArrayList<>(); + List chancedItemOutputs = new ArrayList<>(); + List fluidOutputs = new ArrayList<>(); + List chancedFluidOutputs = new ArrayList<>(); + + if (isServer()) { + // recipe is checked indirectly for null + // noinspection DataFlowIssue + itemOutputs.addAll(recipe.getOutputs()); + chancedItemOutputs.addAll(recipe.getChancedOutputs().getChancedEntries()); + fluidOutputs.addAll(recipe.getFluidOutputs()); + chancedFluidOutputs.addAll(recipe.getChancedFluidOutputs().getChancedEntries()); + } + + itemOutputs = getSyncer().syncCollection(itemOutputs, ByteBufAdapters.ITEM_STACK); + fluidOutputs = getSyncer().syncCollection(fluidOutputs, ByteBufAdapters.FLUID_STACK); + chancedItemOutputs = getSyncer().syncCollection(chancedItemOutputs, GTByteBufAdapters.CHANCED_ITEM_OUTPUT); + chancedFluidOutputs = getSyncer().syncCollection(chancedFluidOutputs, GTByteBufAdapters.CHANCED_FLUID_OUTPUT); + + addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation.NEW_LINE); + + var chanceFunction = arl.getRecipeMap().getChanceFunction(); + int recipeTier = GTUtility.getTierByVoltage(eut); + int machineTier = GTUtility.getOCTierByVoltage(maxVoltage); + + // items + + Object2LongMap itemMap = new Object2LongLinkedOpenCustomHashMap<>( + ItemStackHashStrategy.comparingAllButCount()); + + for (ItemStack stack : itemOutputs) { + itemMap.merge(stack, (long) stack.getCount(), Long::sum); + } + + for (var stack : itemMap.keySet()) { + addItemOutputLine(stack, itemMap.getLong(stack), arl.getMaxProgress()); + } + + for (var chancedItemOutput : chancedItemOutputs) { + addChancedItemOutputLine(chancedItemOutput, chanceFunction, recipeTier, machineTier, arl.getMaxProgress()); + } + + // fluids + + Object2LongMap fluidMap = new Object2LongLinkedOpenCustomHashMap<>( + FluidStackHashStrategy.comparingAllButAmount); + + for (FluidStack stack : fluidOutputs) { + fluidMap.merge(stack, (long) stack.amount, Long::sum); + } + + for (var stack : fluidMap.keySet()) { + addFluidOutputLine(stack, fluidMap.getLong(stack), arl.getMaxProgress()); + } + + for (var chancedFluidOutput : chancedFluidOutputs) { + addChancedFluidOutputLine(chancedFluidOutput, chanceFunction, recipeTier, machineTier, + arl.getMaxProgress()); + } + return this; + } + + /** + * Add an item output of a recipe to the display. + * + * @param stack the {@link ItemStack} to display. + * @param recipeLength the recipe length, in ticks. + */ + private void addItemOutputLine(@NotNull ItemStack stack, long count, int recipeLength) { + IKey name = KeyUtil.string(TextFormatting.AQUA, stack.getDisplayName()); + IKey amount = KeyUtil.number(TextFormatting.GOLD, count); + IKey rate = KeyUtil.string(TextFormatting.WHITE, + formatRecipeRate(getSyncer().syncInt(recipeLength), count)); + + addKey(new GTObjectDrawable(stack, count) + .asIcon() + .asHoverable() + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + // addKey(IKey.SPACE, Operation.ADD); + } + + /** + * Add the fluid outputs of a recipe to the display. + * + * @param stack a {@link FluidStack}s to display. + * @param recipeLength the recipe length, in ticks. + */ + private void addFluidOutputLine(@NotNull FluidStack stack, long count, int recipeLength) { + IKey name = KeyUtil.fluid(TextFormatting.AQUA, stack); + IKey amount = KeyUtil.number(TextFormatting.GOLD, count); + IKey rate = KeyUtil.string(TextFormatting.WHITE, + formatRecipeRate(getSyncer().syncInt(recipeLength), count)); + + addKey(new GTObjectDrawable(stack, count) + .asIcon() + .asHoverable() + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + // addKey(IKey.SPACE, Operation.ADD); + } + + /** + * Add a chanced item output of a recipe to the display. + * + * @param chancedItemOutput chanced item output + * @param boostFunction function to calculate boosted chance + * @param recipeTier voltage tier of the recipe + * @param machineTier machine tier + * @param recipeLength max duration of the recipe + */ + private void addChancedItemOutputLine(@NotNull ChancedItemOutput chancedItemOutput, + ChanceBoostFunction boostFunction, + int recipeTier, int machineTier, int recipeLength) { + var stack = chancedItemOutput.getIngredient(); + IKey name = KeyUtil.string(TextFormatting.AQUA, stack.getDisplayName()); + IKey amount = KeyUtil.number(TextFormatting.GOLD, stack.getCount()); + IKey rate = KeyUtil.string(TextFormatting.WHITE, + formatRecipeRate(getSyncer().syncInt(recipeLength), stack.getCount())); + + addKey(new GTObjectDrawable(chancedItemOutput, stack.getCount()) + .setBoostFunction(entry -> boostFunction.getBoostedChance(entry, recipeTier, machineTier)) + .asIcon() + .asHoverable() + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + // addKey(IKey.SPACE, Operation.ADD); + } + + /** + * Add a chanced fluid output of a recipe to the display. + * + * @param chancedFluidOutput chanced fluid output + * @param boostFunction function to calculate boosted chance + * @param recipeTier voltage tier of the recipe + * @param machineTier machine tier + * @param recipeLength max duration of the recipe + */ + private void addChancedFluidOutputLine(@NotNull ChancedFluidOutput chancedFluidOutput, + ChanceBoostFunction boostFunction, + int recipeTier, int machineTier, int recipeLength) { + var stack = chancedFluidOutput.getIngredient(); + IKey name = KeyUtil.fluid(TextFormatting.AQUA, stack); + IKey amount = KeyUtil.number(TextFormatting.GOLD, stack.amount); + IKey rate = KeyUtil.string(TextFormatting.WHITE, + formatRecipeRate(getSyncer().syncInt(recipeLength), stack.amount)); + + addKey(new GTObjectDrawable(chancedFluidOutput, stack.amount) + .setBoostFunction(entry -> boostFunction.getBoostedChance(entry, recipeTier, machineTier)) + .asIcon() + .asHoverable() + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + // addKey(IKey.SPACE, Operation.ADD); + } + + private static String formatRecipeRate(int recipeLength, long amount) { + float perSecond = ((float) amount / recipeLength) * 20f; + + String rate; + if (perSecond > 1) { + rate = "(" + String.format("%,.2f", perSecond).replaceAll("\\.?0+$", "") + "/s)"; + } else { + rate = "(" + String.format("%,.2f", 1 / (perSecond)).replaceAll("\\.?0+$", "") + "s/ea)"; + } + + return rate; + } + + private static IKey formatRecipeData(IKey name, IKey amount, IKey rate) { + return IKey.comp(name, KeyUtil.string(TextFormatting.WHITE, " x "), amount, IKey.SPACE, rate); + } + /** Insert an empty line into the text list. */ public MultiblockUIBuilder addEmptyLine() { addKey(IKey.LINE_FEED); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index cc96b789138..58cb0eee1bf 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -1,10 +1,11 @@ package gregtech.api.metatileentity.multiblock.ui; +import gregtech.api.mui.GTByteBufAdapters; + import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; -import com.cleanroommc.modularui.utils.serialization.IEquals; import org.jetbrains.annotations.NotNull; import java.math.BigInteger; @@ -16,11 +17,6 @@ public interface UISyncer { - IByteBufAdapter BIG_INT = ByteBufAdapters.makeAdapter( - buffer -> new BigInteger(buffer.readByteArray()), - (buffer, value) -> buffer.writeByteArray(value.toByteArray()), - IEquals.defaultTester()); - /** * Calls the supplier server side only so there's no potential NPEs for the client * @@ -98,7 +94,7 @@ default float syncFloat(float initial) { } default BigInteger syncBigInt(BigInteger initial) { - return syncObject(initial, BIG_INT); + return syncObject(initial, GTByteBufAdapters.BIG_INT); } T syncObject(T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java new file mode 100644 index 00000000000..86757aae225 --- /dev/null +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -0,0 +1,54 @@ +package gregtech.api.mui; + +import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; +import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; + +import net.minecraft.network.PacketBuffer; + +import com.cleanroommc.modularui.utils.serialization.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.math.BigInteger; + +public class GTByteBufAdapters { + + public static final IByteBufAdapter CHANCED_ITEM_OUTPUT = makeAdapter( + ChancedItemOutput::fromBuffer, ChancedItemOutput::toBuffer); + + public static final IByteBufAdapter CHANCED_FLUID_OUTPUT = makeAdapter( + ChancedFluidOutput::fromBuffer, ChancedFluidOutput::toBuffer); + + public static final IByteBufAdapter BIG_INT = makeAdapter( + buffer -> new BigInteger(buffer.readByteArray()), + (buffer, value) -> buffer.writeByteArray(value.toByteArray())); + + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, + @NotNull IByteBufSerializer serializer) { + return makeAdapter(deserializer, serializer, IEquals.defaultTester()); + } + + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, + @NotNull IByteBufSerializer serializer, + @Nullable IEquals equals) { + final IEquals tester = equals != null ? equals : IEquals.defaultTester(); + return new IByteBufAdapter<>() { + + @Override + public T deserialize(PacketBuffer buffer) throws IOException { + return deserializer.deserialize(buffer); + } + + @Override + public void serialize(PacketBuffer buffer, T u) throws IOException { + serializer.serialize(buffer, u); + } + + @Override + public boolean areEqual(@NotNull T t1, @NotNull T t2) { + return tester.areEqual(t1, t2); + } + }; + } +} diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java new file mode 100644 index 00000000000..775c1b2cd24 --- /dev/null +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -0,0 +1,91 @@ +package gregtech.api.mui.drawable; + +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.recipes.chance.boost.BoostableChanceEntry; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.drawable.GuiDraw; +import com.cleanroommc.modularui.drawable.Icon; +import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; +import com.cleanroommc.modularui.utils.NumberFormat; +import com.cleanroommc.modularui.widget.Widget; + +import java.util.function.Function; + +public class GTObjectDrawable implements IDrawable { + + private static final TextRenderer renderer = new TextRenderer(); + + private final Object object; + private final long amount; + private Function, Integer> boostFunction; + + public GTObjectDrawable(Object object, long amount) { + this.object = object; + this.amount = amount; + } + + public GTObjectDrawable setBoostFunction(Function, Integer> boostFunction) { + this.boostFunction = boostFunction; + return this; + } + + static { + renderer.setScale(0.5f); + renderer.setShadow(true); + renderer.setColor(Color.WHITE.main); + } + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + renderer.setAlignment(Alignment.BottomRight, width - 1, height - 1); + drawObject(object, context, x, y, width, height, widgetTheme); + if (amount > 1) { + renderer.setPos(x + 1, y + 1); + String amount = NumberFormat.formatWithMaxDigits(this.amount, 3); + if (object instanceof FluidStack) amount += "L"; + renderer.draw(amount); + } + } + + private void drawObject(Object object, GuiContext context, int x, int y, int width, int height, + WidgetTheme widgetTheme) { + if (object instanceof ItemStack stack) { + GTGuiTextures.SLOT.draw(context, x, y, width, height, widgetTheme); + GuiDraw.drawItem(stack, x + 1, y + 1, width - 2, height - 2); + } else if (object instanceof FluidStack stack) { + GTGuiTextures.FLUID_SLOT.draw(context, x, y, width, height, widgetTheme); + GuiDraw.drawFluidTexture(stack, x + 1, y + 1, width - 2, height - 2, 0); + } else if (object instanceof BoostableChanceEntryentry) { + drawObject(entry.getIngredient(), context, x, y, width, height, widgetTheme); + String chance = "~" + this.boostFunction.apply(entry) / 100 + "%"; + if (amount > 1) y -= 4; + renderer.setPos(x + 1, y + 1); + renderer.draw(chance); + } + } + + @Override + public Icon asIcon() { + return IDrawable.super.asIcon().size(18); + } + + @Override + public Widget asWidget() { + return IDrawable.super.asWidget().size(18); + } + + public Object getObject() { + if (object instanceof BoostableChanceEntryentry) { + return entry.getIngredient(); + } + return object; + } +} diff --git a/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedFluidOutput.java b/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedFluidOutput.java index 81a145fe1c8..5d59e6cebfa 100644 --- a/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedFluidOutput.java +++ b/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedFluidOutput.java @@ -2,10 +2,14 @@ import gregtech.api.recipes.chance.output.BoostableChanceOutput; +import net.minecraft.network.PacketBuffer; import net.minecraftforge.fluids.FluidStack; +import com.cleanroommc.modularui.network.NetworkUtils; import org.jetbrains.annotations.NotNull; +import java.util.Objects; + /** * Implementation for a chanced fluid output */ @@ -29,4 +33,15 @@ public String toString() { ", chanceBoost=" + getChanceBoost() + '}'; } + + public static ChancedFluidOutput fromBuffer(PacketBuffer buffer) { + return new ChancedFluidOutput(Objects.requireNonNull(NetworkUtils.readFluidStack(buffer)), buffer.readVarInt(), + buffer.readVarInt()); + } + + public static void toBuffer(PacketBuffer buffer, ChancedFluidOutput value) { + NetworkUtils.writeFluidStack(buffer, value.getIngredient()); + buffer.writeVarInt(value.getChance()); + buffer.writeVarInt(value.getChanceBoost()); + } } diff --git a/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedItemOutput.java b/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedItemOutput.java index b49e640d942..a186a01b392 100644 --- a/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedItemOutput.java +++ b/src/main/java/gregtech/api/recipes/chance/output/impl/ChancedItemOutput.java @@ -4,7 +4,9 @@ import gregtech.api.util.GTStringUtils; import net.minecraft.item.ItemStack; +import net.minecraft.network.PacketBuffer; +import com.cleanroommc.modularui.network.NetworkUtils; import org.jetbrains.annotations.NotNull; /** @@ -29,4 +31,14 @@ public String toString() { ", chanceBoost=" + getChanceBoost() + '}'; } + + public static ChancedItemOutput fromBuffer(PacketBuffer buffer) { + return new ChancedItemOutput(NetworkUtils.readItemStack(buffer), buffer.readVarInt(), buffer.readVarInt()); + } + + public static void toBuffer(PacketBuffer buffer, ChancedItemOutput value) { + NetworkUtils.writeItemStack(buffer, value.getIngredient()); + buffer.writeVarInt(value.getChance()); + buffer.writeVarInt(value.getChanceBoost()); + } } diff --git a/src/main/java/gregtech/api/util/FluidStackHashStrategy.java b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java new file mode 100644 index 00000000000..8aacb2d39d5 --- /dev/null +++ b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java @@ -0,0 +1,68 @@ +package gregtech.api.util; + +import net.minecraftforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.Hash; + +import java.util.Objects; + +public interface FluidStackHashStrategy extends Hash.Strategy { + + static FluidStackHashStrategyBuilder builder() { + return new FluidStackHashStrategyBuilder(); + } + + FluidStackHashStrategy comparingAll = builder() + .compareFluid() + .compareAmount() + .compareNBT() + .build(); + + FluidStackHashStrategy comparingAllButAmount = builder() + .compareFluid() + .compareNBT() + .build(); + + class FluidStackHashStrategyBuilder { + + private boolean fluid, amount, nbt = false; + + public FluidStackHashStrategyBuilder compareFluid() { + this.fluid = true; + return this; + } + + public FluidStackHashStrategyBuilder compareAmount() { + this.amount = true; + return this; + } + + public FluidStackHashStrategyBuilder compareNBT() { + this.nbt = true; + return this; + } + + public FluidStackHashStrategy build() { + return new FluidStackHashStrategy() { + + @Override + public int hashCode(FluidStack other) { + return other == null ? 0 : Objects.hash( + fluid ? other.getFluid() : null, + amount ? other.amount : null, + nbt ? other.tag : null); + } + + @Override + public boolean equals(FluidStack a, FluidStack b) { + if (a == null) return b == null; + if (b == null) return false; + + return (!fluid || a.getFluid() == b.getFluid()) && + (!amount || a.amount == b.amount) && + (!nbt || Objects.equals(a.tag, b.tag)); + } + }; + } + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 0b1edad8de7..f4584488be9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -504,7 +504,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { cleanState)); } }) - .addProgressLine(getProgressPercent() / 100.0) + .addProgressLine(getProgress(), getMaxProgress()) .addWorkingStatusLine(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 62d05fd2aa2..a20c11176c1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -102,7 +102,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index d57007262aa..b70680943f2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -78,7 +78,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addCustom(this::addHeatCapacity) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } private void addHeatCapacity(KeyManager keyManager, UISyncer syncer) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index b0ac1aa59ec..d6ce9f408e1 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -195,7 +195,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { } } }) - .addProgressLine(minerLogic.getProgressPercent()) + .addProgressLine(minerLogic.getProgressTime(), FluidDrillLogic.MAX_PROGRESS) .addWorkingStatusLine(); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 41ebaeb15a6..382a54719b5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -91,7 +91,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { } }) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 7355e0c91eb..fbb5d7faeab 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -170,7 +170,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @SideOnly(Side.CLIENT) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 8734ee35a67..6213867dd68 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -128,7 +128,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { }) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()) + .addRecipeOutputLine(recipeMapWorkable); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index db325ef9524..5e2bed97a52 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -233,7 +233,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() - .addProgressLine(recipeMapWorkable.getProgressPercent()); + .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()); } @Override diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index 55e82d4f2b0..12ee6435302 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -1,5 +1,8 @@ package gregtech.common.mui.widget; +import gregtech.api.mui.drawable.GTObjectDrawable; +import gregtech.mixins.mui2.IconAccessor; + import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.drawable.IHoverable; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; @@ -7,9 +10,11 @@ import com.cleanroommc.modularui.api.layout.IViewportStack; import com.cleanroommc.modularui.api.widget.IGuiAction; import com.cleanroommc.modularui.api.widget.Interactable; +import com.cleanroommc.modularui.drawable.DelegateIcon; import com.cleanroommc.modularui.drawable.Stencil; import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.ModularScreen; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; @@ -24,12 +29,14 @@ import java.util.function.Consumer; public class ScrollableTextWidget extends Widget - implements IRichTextBuilder, Interactable, IViewport { + implements IRichTextBuilder, Interactable, IViewport, + JeiIngredientProvider { private final RichText text = new RichText(); private Consumer builder; private boolean dirty = false; private boolean autoUpdate = false; + private Object lastIngredient; private final ScrollArea scroll = new ScrollArea(); private final TextRenderer renderer = new TextRenderer(); @@ -66,6 +73,13 @@ public void drawForeground(ModularGuiContext context) { tooltip.draw(context); } } + if (getHoveredElement() instanceof DelegateIcon delegateIcon && + delegateIcon.findRootDelegate() instanceof IconAccessor accessor && + accessor.getDrawable() instanceof GTObjectDrawable objectDrawable) { + lastIngredient = objectDrawable.getObject(); + } else { + lastIngredient = null; + } } @Override @@ -207,4 +221,9 @@ public ScrollableTextWidget textBuilder(Consumer builder) { markDirty(); return this; } + + @Override + public @Nullable Object getIngredient() { + return this.lastIngredient; + } } diff --git a/src/main/java/gregtech/mixins/mui2/IconAccessor.java b/src/main/java/gregtech/mixins/mui2/IconAccessor.java new file mode 100644 index 00000000000..59e2ba009e4 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/IconAccessor.java @@ -0,0 +1,13 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.drawable.Icon; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = Icon.class, remap = false) +public interface IconAccessor { + + @Accessor() + IDrawable getDrawable(); +} diff --git a/src/main/java/gregtech/mixins/mui2/RichTextCompilerMixin.java b/src/main/java/gregtech/mixins/mui2/RichTextCompilerMixin.java new file mode 100644 index 00000000000..79c44c7d20b --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/RichTextCompilerMixin.java @@ -0,0 +1,41 @@ +package gregtech.mixins.mui2; + +import net.minecraft.client.gui.FontRenderer; + +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.text.RichTextCompiler; +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.List; + +@Mixin(value = RichTextCompiler.class, remap = false) +public class RichTextCompilerMixin { + + @Shadow + private int x; + + @Shadow + private FontRenderer fr; + + @ModifyArg(method = "trimRight", + at = @At(value = "INVOKE", + target = "Ljava/lang/String;substring(II)Ljava/lang/String;"), + index = 1) + private static int fixTrim(int beginIndex) { + return beginIndex + 1; + } + + @Inject(method = "compile", + at = @At(value = "INVOKE", + target = "Lcom/cleanroommc/modularui/drawable/text/RichTextCompiler;addLineElement(Ljava/lang/Object;)V", + ordinal = 0)) + private void moveXString(List raw, CallbackInfo ci, @Local IKey key) { + x += fr.getStringWidth(key.get()); + } +} diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index edd26fb7efd..d506f36e405 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5795,6 +5795,7 @@ gregtech.multiblock.idling=Idling. gregtech.multiblock.not_enough_energy=Machine needs more energy! gregtech.multiblock.not_enough_energy_output=Energy Dynamo Tier Too Low! gregtech.multiblock.progress=Progress: %s%% +gregtech.multiblock.recipe_progress=Progress: %ss / %ss (%s%%) gregtech.multiblock.invalid_structure=§cInvalid structure. gregtech.multiblock.invalid_structure.tooltip=This block is a controller of the multiblock structure. For building help, see structure template in JEI. gregtech.multiblock.validation_failed=Invalid amount of inputs/outputs. diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index f313fa2b32d..dc9772d257f 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,7 +8,9 @@ "maxShiftBy": 10 }, "mixins": [ - "ModularPanelMixin" + "IconAccessor", + "ModularPanelMixin", + "RichTextCompilerMixin" ], "client": [ "LangKeyMixin" From 8e346b6ac1fc8e5d46620a94c9df2cc79dd8ce67 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:16:48 -0700 Subject: [PATCH 168/264] simplify internal syncer add javadocs to collection/array sync methods --- .../multiblock/ui/MultiblockUIBuilder.java | 7 +-- .../multiblock/ui/UISyncer.java | 48 +++++++++++++++++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 73903a160f8..906768fccc5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -38,7 +38,6 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -920,7 +919,6 @@ public > C syncCollection(C initial, IByteBufSerializ if (isServer()) { internal.writeVarInt(initial.size()); initial.forEach(t -> serializer.serializeSafe(internal, t)); - return initial; } else { int size = internal.readVarInt(); try { @@ -930,12 +928,11 @@ public > C syncCollection(C initial, IByteBufSerializ } catch (IOException e) { throw new IllegalStateException(e); } - return initial; } + return initial; } @Override - @SuppressWarnings("unchecked") public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { if (isServer()) { internal.writeVarInt(initial.length); @@ -943,7 +940,7 @@ public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBuf serializer.serializeSafe(internal, t); } } else { - initial = (T[]) Array.newInstance(initial.getClass().getComponentType(), internal.readVarInt()); + initial = Arrays.copyOf(initial, internal.readVarInt()); Arrays.setAll(initial, i -> deserializer.deserializeSafe(internal)); } return initial; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 58cb0eee1bf..6aa6d439591 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -103,16 +103,64 @@ default T syncObject(T initial, IByteBufAdapter adapter) { return syncObject(initial, adapter, adapter); } + /** + * Syncs the elements of the collection to the internal buffer.
+ * On the server, elements are serialized in the order of iteration.
+ * On the client, elements are deserialized in the same order and re-added to the collection. + * The list will be modified on the client + * + * @param initial collection whose elements should be synced + * @param serializer serializer to write an element to the buffer + * @param deserializer deserializer to read the elements to add them back to the collection + * @param collection element's type + * @param the collection type itself + * @return the synced collection + */ > C syncCollection(C initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + /** + * Syncs the elements of the collection to the internal buffer.
+ * On the server, elements are serialized in the order of iteration.
+ * On the client, elements are deserialized in the same order and re-added to the collection. + * The list will be modified on the client + * + * @param initial collection whose elements should be synced + * @param adapter adapter for serialization/deserialization + * @param collection element's type + * @param the collection type itself + * @return the synced collection + */ default > C syncCollection(C initial, IByteBufAdapter adapter) { return syncCollection(initial, adapter, adapter); } + /** + * Syncs the elements of the collection to the internal buffer.
+ * On the server, elements are serialized in the order of iteration.
+ * On the client, elements are deserialized in the same order.
+ * The array will not be modified, instead copied + * + * @param initial collection whose elements should be synced + * @param serializer serializer to write an element to the buffer + * @param deserializer deserializer to read the elements to add them back to the collection + * @param element type + * @return for server, the initial array, otherwise the synced array copy + */ T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + /** + * Syncs the elements of the array to the internal buffer.
+ * On the server, elements are serialized in the order of iteration.
+ * On the client, elements are deserialized in the same order.
+ * The array will not be modified, instead copied + * + * @param initial collection whose elements should be synced + * @param adapter adapter for serialization/deserialization + * @param element type + * @return for server, the initial array, otherwise the synced array copy + */ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); } From 4b7a5b332b459052d908942ea0378d66152ad1d0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 3 Mar 2025 22:46:45 -0700 Subject: [PATCH 169/264] move IconAcessor out of mixin mixin to both Icon and DelegateIcon simplify getting ingredient --- .../multiblock/ui/UISyncer.java | 20 +++++----- .../java/gregtech/api/mui/IconAcessor.java | 8 ++++ .../api/mui/drawable/GTObjectDrawable.java | 7 +++- .../mui/widget/ScrollableTextWidget.java | 11 ++---- .../gregtech/mixins/mui2/IconAccessor.java | 13 ------- .../java/gregtech/mixins/mui2/IconMixin.java | 38 +++++++++++++++++++ src/main/resources/mixins.gregtech.mui2.json | 3 +- 7 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 src/main/java/gregtech/api/mui/IconAcessor.java delete mode 100644 src/main/java/gregtech/mixins/mui2/IconAccessor.java create mode 100644 src/main/java/gregtech/mixins/mui2/IconMixin.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 6aa6d439591..73608c79a41 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -109,11 +109,11 @@ default T syncObject(T initial, IByteBufAdapter adapter) { * On the client, elements are deserialized in the same order and re-added to the collection. * The list will be modified on the client * - * @param initial collection whose elements should be synced - * @param serializer serializer to write an element to the buffer + * @param initial collection whose elements should be synced + * @param serializer serializer to write an element to the buffer * @param deserializer deserializer to read the elements to add them back to the collection - * @param collection element's type - * @param the collection type itself + * @param collection element's type + * @param the collection type itself * @return the synced collection */ > C syncCollection(C initial, @@ -128,8 +128,8 @@ > C syncCollection(C initial, * * @param initial collection whose elements should be synced * @param adapter adapter for serialization/deserialization - * @param collection element's type - * @param the collection type itself + * @param collection element's type + * @param the collection type itself * @return the synced collection */ default > C syncCollection(C initial, IByteBufAdapter adapter) { @@ -142,10 +142,10 @@ default > C syncCollection(C initial, IByteBufAdapter * On the client, elements are deserialized in the same order.
* The array will not be modified, instead copied * - * @param initial collection whose elements should be synced - * @param serializer serializer to write an element to the buffer + * @param initial collection whose elements should be synced + * @param serializer serializer to write an element to the buffer * @param deserializer deserializer to read the elements to add them back to the collection - * @param element type + * @param element type * @return for server, the initial array, otherwise the synced array copy */ T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); @@ -158,7 +158,7 @@ default > C syncCollection(C initial, IByteBufAdapter * * @param initial collection whose elements should be synced * @param adapter adapter for serialization/deserialization - * @param element type + * @param element type * @return for server, the initial array, otherwise the synced array copy */ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { diff --git a/src/main/java/gregtech/api/mui/IconAcessor.java b/src/main/java/gregtech/api/mui/IconAcessor.java new file mode 100644 index 00000000000..2bf4218904f --- /dev/null +++ b/src/main/java/gregtech/api/mui/IconAcessor.java @@ -0,0 +1,8 @@ +package gregtech.api.mui; + +import com.cleanroommc.modularui.api.drawable.IDrawable; + +public interface IconAcessor { + + IDrawable gregTech$getDrawable(); +} diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java index 775c1b2cd24..df8b9171f78 100644 --- a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -10,16 +10,18 @@ import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.drawable.Icon; import com.cleanroommc.modularui.drawable.text.TextRenderer; +import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.viewport.GuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.utils.NumberFormat; import com.cleanroommc.modularui.widget.Widget; +import org.jetbrains.annotations.Nullable; import java.util.function.Function; -public class GTObjectDrawable implements IDrawable { +public class GTObjectDrawable implements IDrawable, JeiIngredientProvider { private static final TextRenderer renderer = new TextRenderer(); @@ -82,7 +84,8 @@ public Widget asWidget() { return IDrawable.super.asWidget().size(18); } - public Object getObject() { + @Override + public @Nullable Object getIngredient() { if (object instanceof BoostableChanceEntryentry) { return entry.getIngredient(); } diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index 12ee6435302..db416533bf2 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -1,7 +1,6 @@ package gregtech.common.mui.widget; -import gregtech.api.mui.drawable.GTObjectDrawable; -import gregtech.mixins.mui2.IconAccessor; +import gregtech.api.mui.IconAcessor; import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.drawable.IHoverable; @@ -10,7 +9,6 @@ import com.cleanroommc.modularui.api.layout.IViewportStack; import com.cleanroommc.modularui.api.widget.IGuiAction; import com.cleanroommc.modularui.api.widget.Interactable; -import com.cleanroommc.modularui.drawable.DelegateIcon; import com.cleanroommc.modularui.drawable.Stencil; import com.cleanroommc.modularui.drawable.text.RichText; import com.cleanroommc.modularui.drawable.text.TextRenderer; @@ -73,10 +71,9 @@ public void drawForeground(ModularGuiContext context) { tooltip.draw(context); } } - if (getHoveredElement() instanceof DelegateIcon delegateIcon && - delegateIcon.findRootDelegate() instanceof IconAccessor accessor && - accessor.getDrawable() instanceof GTObjectDrawable objectDrawable) { - lastIngredient = objectDrawable.getObject(); + if (getHoveredElement() instanceof IconAcessor accessor && + accessor.gregTech$getDrawable() instanceof JeiIngredientProvider provider) { + lastIngredient = provider.getIngredient(); } else { lastIngredient = null; } diff --git a/src/main/java/gregtech/mixins/mui2/IconAccessor.java b/src/main/java/gregtech/mixins/mui2/IconAccessor.java deleted file mode 100644 index 59e2ba009e4..00000000000 --- a/src/main/java/gregtech/mixins/mui2/IconAccessor.java +++ /dev/null @@ -1,13 +0,0 @@ -package gregtech.mixins.mui2; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.drawable.Icon; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -@Mixin(value = Icon.class, remap = false) -public interface IconAccessor { - - @Accessor() - IDrawable getDrawable(); -} diff --git a/src/main/java/gregtech/mixins/mui2/IconMixin.java b/src/main/java/gregtech/mixins/mui2/IconMixin.java new file mode 100644 index 00000000000..faaafe69d34 --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/IconMixin.java @@ -0,0 +1,38 @@ +package gregtech.mixins.mui2; + +import gregtech.api.mui.IconAcessor; + +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IIcon; +import com.cleanroommc.modularui.drawable.DelegateIcon; +import com.cleanroommc.modularui.drawable.Icon; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(value = Icon.class, remap = false) +public class IconMixin implements IconAcessor { + + @Shadow + @Final + private IDrawable drawable; + + public IDrawable gregTech$getDrawable() { + return this.drawable; + } + + @Mixin(value = DelegateIcon.class, remap = false) + public static abstract class DelegateMixin implements IconAcessor { + + @Shadow + public abstract IIcon getDelegate(); + + @Override + public IDrawable gregTech$getDrawable() { + if (getDelegate() instanceof IconAcessor acessor) { + return acessor.gregTech$getDrawable(); + } + return null; + } + } +} diff --git a/src/main/resources/mixins.gregtech.mui2.json b/src/main/resources/mixins.gregtech.mui2.json index dc9772d257f..f331f9aff5f 100644 --- a/src/main/resources/mixins.gregtech.mui2.json +++ b/src/main/resources/mixins.gregtech.mui2.json @@ -8,7 +8,8 @@ "maxShiftBy": 10 }, "mixins": [ - "IconAccessor", + "IconMixin", + "IconMixin$DelegateMixin", "ModularPanelMixin", "RichTextCompilerMixin" ], From 39e65bab46243776a62b6d8853385b38836e0294 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 4 Mar 2025 01:14:45 -0700 Subject: [PATCH 170/264] fix javadoc comments --- .../api/metatileentity/multiblock/ui/UISyncer.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 73608c79a41..7757f1e9d37 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -137,16 +137,16 @@ default > C syncCollection(C initial, IByteBufAdapter } /** - * Syncs the elements of the collection to the internal buffer.
+ * Syncs the elements of the array to the internal buffer.
* On the server, elements are serialized in the order of iteration.
* On the client, elements are deserialized in the same order.
* The array will not be modified, instead copied * - * @param initial collection whose elements should be synced + * @param initial array whose elements should be synced * @param serializer serializer to write an element to the buffer * @param deserializer deserializer to read the elements to add them back to the collection * @param element type - * @return for server, the initial array, otherwise the synced array copy + * @return on the server, the initial array, otherwise the synced array copy */ T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); @@ -156,10 +156,10 @@ default > C syncCollection(C initial, IByteBufAdapter * On the client, elements are deserialized in the same order.
* The array will not be modified, instead copied * - * @param initial collection whose elements should be synced + * @param initial array whose elements should be synced * @param adapter adapter for serialization/deserialization * @param element type - * @return for server, the initial array, otherwise the synced array copy + * @return on the server, the initial array, otherwise the synced array copy */ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); From 08a3933379201295043742d10547b4d6430006a4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 5 Mar 2025 20:46:48 -0700 Subject: [PATCH 171/264] fix getting the hovered element when scrolling fix scroll cutting off bottom drawable --- .../gregtech/common/mui/widget/ScrollableTextWidget.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java index db416533bf2..a20bfc92a41 100644 --- a/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java +++ b/src/main/java/gregtech/common/mui/widget/ScrollableTextWidget.java @@ -2,6 +2,8 @@ import gregtech.api.mui.IconAcessor; +import net.minecraft.client.gui.FontRenderer; + import com.cleanroommc.modularui.api.GuiAxis; import com.cleanroommc.modularui.api.drawable.IHoverable; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; @@ -114,7 +116,9 @@ public boolean onMouseRelease(int mouseButton) { @Nullable public Object getHoveredElement() { if (!isHovering()) return null; - return this.text.getHoveringElement(getContext()); + FontRenderer fr = getContext().getFontRenderer(); + int x = getContext().getMouseX(), y = getContext().getMouseY(); + return this.text.getHoveringElement(fr, x, y + getScrollY()); // undo scrolling } @Override @@ -174,7 +178,8 @@ private void drawText(ModularGuiContext context) { getWidgetTheme(context.getTheme()).getTextColor(), getWidgetTheme(context.getTheme()).getTextShadow()); this.text.compileAndDraw(this.renderer, context, false); - int diff = ((int) this.renderer.getLastHeight() - getArea().h()) / 2; + // this isn't perfect, but i hope it's good enough + int diff = (int) Math.ceil((this.renderer.getLastHeight() - getArea().h()) / 2); this.scroll.getScrollY().setScrollSize(getArea().h() + Math.max(0, diff)); } From 548f44013842b35c334845cb9ac61fdf17992cb7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:27:10 -0700 Subject: [PATCH 172/264] make FluidStackHashStrategy mimic ItemStackHashStrategy better --- .../multiblock/ui/MultiblockUIBuilder.java | 2 +- .../api/util/FluidStackHashStrategy.java | 34 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 906768fccc5..78aa577b1e3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -577,7 +577,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL // fluids Object2LongMap fluidMap = new Object2LongLinkedOpenCustomHashMap<>( - FluidStackHashStrategy.comparingAllButAmount); + FluidStackHashStrategy.comparingAllButAmount()); for (FluidStack stack : fluidOutputs) { fluidMap.merge(stack, (long) stack.amount, Long::sum); diff --git a/src/main/java/gregtech/api/util/FluidStackHashStrategy.java b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java index 8aacb2d39d5..68014a33d76 100644 --- a/src/main/java/gregtech/api/util/FluidStackHashStrategy.java +++ b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java @@ -12,33 +12,35 @@ static FluidStackHashStrategyBuilder builder() { return new FluidStackHashStrategyBuilder(); } - FluidStackHashStrategy comparingAll = builder() - .compareFluid() - .compareAmount() - .compareNBT() - .build(); + static FluidStackHashStrategy comparingAll() { + return builder().compareFluid(true) + .compareAmount(true) + .compareNBT(true) + .build(); + } - FluidStackHashStrategy comparingAllButAmount = builder() - .compareFluid() - .compareNBT() - .build(); + static FluidStackHashStrategy comparingAllButAmount() { + return builder().compareFluid(true) + .compareNBT(true) + .build(); + } class FluidStackHashStrategyBuilder { - private boolean fluid, amount, nbt = false; + private boolean fluid, amount, nbt; - public FluidStackHashStrategyBuilder compareFluid() { - this.fluid = true; + public FluidStackHashStrategyBuilder compareFluid(boolean choice) { + this.fluid = choice; return this; } - public FluidStackHashStrategyBuilder compareAmount() { - this.amount = true; + public FluidStackHashStrategyBuilder compareAmount(boolean choice) { + this.amount = choice; return this; } - public FluidStackHashStrategyBuilder compareNBT() { - this.nbt = true; + public FluidStackHashStrategyBuilder compareNBT(boolean choice) { + this.nbt = choice; return this; } From 7e23b44413a990f47a9826ebc3557e789861e1f7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 7 Mar 2025 22:55:02 -0700 Subject: [PATCH 173/264] simplify hash builder names utilize FluidStackHashStrategy in GTHashMaps rework ParallelLogic with new maps --- .../multiblock/ui/MultiblockUIBuilder.java | 24 ++----- .../api/recipes/logic/ParallelLogic.java | 47 ++++++------- .../api/util/FluidStackHashStrategy.java | 12 ++-- .../java/gregtech/api/util/GTHashMaps.java | 68 +++++++++++++++---- .../api/util/ItemStackHashStrategy.java | 16 ++--- 5 files changed, 96 insertions(+), 71 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 78aa577b1e3..e2816ad5723 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -10,9 +10,8 @@ import gregtech.api.recipes.chance.boost.ChanceBoostFunction; import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; -import gregtech.api.util.FluidStackHashStrategy; +import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; -import gregtech.api.util.ItemStackHashStrategy; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; @@ -32,8 +31,7 @@ import com.cleanroommc.modularui.value.sync.SyncHandler; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import it.unimi.dsi.fastutil.objects.Object2LongLinkedOpenCustomHashMap; -import it.unimi.dsi.fastutil.objects.Object2LongMap; +import it.unimi.dsi.fastutil.objects.Object2IntMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -559,15 +557,10 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL // items - Object2LongMap itemMap = new Object2LongLinkedOpenCustomHashMap<>( - ItemStackHashStrategy.comparingAllButCount()); - - for (ItemStack stack : itemOutputs) { - itemMap.merge(stack, (long) stack.getCount(), Long::sum); - } + Object2IntMap itemMap = GTHashMaps.fromItemStackCollection(itemOutputs); for (var stack : itemMap.keySet()) { - addItemOutputLine(stack, itemMap.getLong(stack), arl.getMaxProgress()); + addItemOutputLine(stack, itemMap.getInt(stack), arl.getMaxProgress()); } for (var chancedItemOutput : chancedItemOutputs) { @@ -576,15 +569,10 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL // fluids - Object2LongMap fluidMap = new Object2LongLinkedOpenCustomHashMap<>( - FluidStackHashStrategy.comparingAllButAmount()); - - for (FluidStack stack : fluidOutputs) { - fluidMap.merge(stack, (long) stack.amount, Long::sum); - } + Object2IntMap fluidMap = GTHashMaps.fromFluidCollection(fluidOutputs); for (var stack : fluidMap.keySet()) { - addFluidOutputLine(stack, fluidMap.getLong(stack), arl.getMaxProgress()); + addFluidOutputLine(stack, fluidMap.getInt(stack), arl.getMaxProgress()); } for (var chancedFluidOutput : chancedFluidOutputs) { diff --git a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java index c056890d086..e70974cbad8 100644 --- a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java +++ b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java @@ -2,11 +2,11 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.metatileentity.IVoidable; -import gregtech.api.recipes.FluidKey; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeBuilder; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.ingredients.GTRecipeInput; +import gregtech.api.util.FluidStackHashStrategy; import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; @@ -25,7 +25,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -46,7 +45,7 @@ public static int getMaxRecipeMultiplier(@NotNull Recipe recipe, @NotNull IItemH Object2IntMap ingredientStacks = GTHashMaps.fromItemHandler(inputs); // Find all the fluids in the combined Fluid Input inventories and create oversized FluidStacks - Map fluidStacks = GTHashMaps.fromFluidHandler(fluidInputs); + Object2IntMap fluidStacks = GTHashMaps.fromFluidHandler(fluidInputs); // Find the maximum number of recipes that can be performed from the items in the item input inventories int itemMultiplier = getMaxRatioItem(ingredientStacks, recipe, parallelAmount); @@ -390,44 +389,42 @@ protected static int getMaxRatioItem(@NotNull Object2IntMap countIngr * @param parallelAmount The limit on the amount of recipes that can be performed at one time * @return The Maximum number of Recipes that can be performed at a single time based on the available Fluids */ - protected static int getMaxRatioFluid(@NotNull Map countFluid, @NotNull Recipe recipe, + protected static int getMaxRatioFluid(@NotNull Object2IntMap countFluid, @NotNull Recipe recipe, int parallelAmount) { int minMultiplier = Integer.MAX_VALUE; // map the recipe input fluids to account for duplicated fluids, // so their sum is counted against the total of fluids available in the input - Map fluidCountMap = new HashMap<>(); - Map notConsumableMap = new HashMap<>(); + Object2IntMap fluidCountMap = GTHashMaps.createFluidStackMap(true); + Object2IntMap notConsumableMap = GTHashMaps.createFluidStackMap(true); for (GTRecipeInput fluidInput : recipe.getFluidInputs()) { int fluidAmount = fluidInput.getAmount(); if (fluidInput.isNonConsumable()) { - notConsumableMap.computeIfPresent(new FluidKey(fluidInput.getInputFluidStack()), - (k, v) -> v + fluidAmount); - notConsumableMap.putIfAbsent(new FluidKey(fluidInput.getInputFluidStack()), fluidAmount); + notConsumableMap.merge(fluidInput.getInputFluidStack(), fluidAmount, Integer::sum); } else { - fluidCountMap.computeIfPresent(new FluidKey(fluidInput.getInputFluidStack()), - (k, v) -> v + fluidAmount); - fluidCountMap.putIfAbsent(new FluidKey(fluidInput.getInputFluidStack()), fluidAmount); + fluidCountMap.merge(fluidInput.getInputFluidStack(), fluidAmount, Integer::sum); } } + FluidStackHashStrategy fluidStrategy = FluidStackHashStrategy.comparingAllButAmount(); + // Iterate through the recipe inputs, excluding the not consumable fluids from the fluid inventory map - for (Map.Entry notConsumableFluid : notConsumableMap.entrySet()) { - int needed = notConsumableFluid.getValue(); + for (FluidStack notConsumableFluid : notConsumableMap.keySet()) { + int needed = notConsumableMap.getInt(notConsumableFluid); int available = 0; // For every fluid gathered from the fluid inputs. - for (Map.Entry inputFluid : countFluid.entrySet()) { + for (FluidStack inputFluid : countFluid.keySet()) { // Strip the Non-consumable tags here, as FluidKey compares the tags, which causes finding matching // fluids // in the input tanks to fail, because there is nothing in those hatches with a non-consumable tag - if (notConsumableFluid.getKey().equals(inputFluid.getKey())) { - available = inputFluid.getValue(); + if (fluidStrategy.equals(notConsumableFluid, inputFluid)) { + available = countFluid.getInt(inputFluid); if (available > needed) { - inputFluid.setValue(available - needed); + fluidCountMap.replace(inputFluid, available - needed); needed -= available; break; } else { - inputFluid.setValue(0); - notConsumableFluid.setValue(needed - available); + fluidCountMap.replace(inputFluid, 0); + notConsumableMap.replace(notConsumableFluid, needed - available); needed -= available; } } @@ -451,13 +448,13 @@ protected static int getMaxRatioFluid(@NotNull Map countFluid } // Iterate through the fluid inputs in the recipe - for (Map.Entry fs : fluidCountMap.entrySet()) { - int needed = fs.getValue(); + for (FluidStack stack : fluidCountMap.keySet()) { + int needed = fluidCountMap.getInt(stack); int available = 0; // For every fluid gathered from the fluid inputs. - for (Map.Entry inputFluid : countFluid.entrySet()) { - if (fs.getKey().equals(inputFluid.getKey())) { - available += inputFluid.getValue(); + for (FluidStack inputFluid : countFluid.keySet()) { + if (fluidStrategy.equals(stack, inputFluid)) { + available += countFluid.getInt(inputFluid); } } if (available >= needed) { diff --git a/src/main/java/gregtech/api/util/FluidStackHashStrategy.java b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java index 68014a33d76..e3cc94ac6fe 100644 --- a/src/main/java/gregtech/api/util/FluidStackHashStrategy.java +++ b/src/main/java/gregtech/api/util/FluidStackHashStrategy.java @@ -8,8 +8,8 @@ public interface FluidStackHashStrategy extends Hash.Strategy { - static FluidStackHashStrategyBuilder builder() { - return new FluidStackHashStrategyBuilder(); + static Builder builder() { + return new Builder(); } static FluidStackHashStrategy comparingAll() { @@ -25,21 +25,21 @@ static FluidStackHashStrategy comparingAllButAmount() { .build(); } - class FluidStackHashStrategyBuilder { + class Builder { private boolean fluid, amount, nbt; - public FluidStackHashStrategyBuilder compareFluid(boolean choice) { + public Builder compareFluid(boolean choice) { this.fluid = choice; return this; } - public FluidStackHashStrategyBuilder compareAmount(boolean choice) { + public Builder compareAmount(boolean choice) { this.amount = choice; return this; } - public FluidStackHashStrategyBuilder compareNBT(boolean choice) { + public Builder compareNBT(boolean choice) { this.nbt = choice; return this; } diff --git a/src/main/java/gregtech/api/util/GTHashMaps.java b/src/main/java/gregtech/api/util/GTHashMaps.java index 9df09cd6368..1945e6025f6 100644 --- a/src/main/java/gregtech/api/util/GTHashMaps.java +++ b/src/main/java/gregtech/api/util/GTHashMaps.java @@ -8,7 +8,6 @@ import net.minecraftforge.items.IItemHandler; import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenCustomHashMap; -import it.unimi.dsi.fastutil.objects.Object2IntLinkedOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; import org.jetbrains.annotations.NotNull; @@ -92,11 +91,17 @@ public static Object2IntMap fromItemStackCollection(@NotNull Iterable } @NotNull - private static Object2IntMap createItemStackMap(boolean linked) { + public static Object2IntMap createItemStackMap(boolean linked) { ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAllButCount(); return linked ? new Object2IntLinkedOpenCustomHashMap<>(strategy) : new Object2IntOpenCustomHashMap<>(strategy); } + @NotNull + public static Object2IntMap createFluidStackMap(boolean linked) { + var strategy = FluidStackHashStrategy.comparingAllButAmount(); + return linked ? new Object2IntLinkedOpenCustomHashMap<>(strategy) : new Object2IntOpenCustomHashMap<>(strategy); + } + /** * Maps all fluids in the {@link IFluidHandler} into a {@link FluidKey}, {@link Integer} value as amount * @@ -104,16 +109,33 @@ private static Object2IntMap createItemStackMap(boolean linked) { * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if * required */ - public static Map fromFluidHandler(IFluidHandler fluidInputs) { - final Object2IntMap map = new Object2IntLinkedOpenHashMap<>(); + public static Object2IntMap fromFluidHandler(IFluidHandler fluidInputs) { + return fromFluidHandler(fluidInputs, true); + } + + /** + * Maps all fluids in the {@link IFluidHandler} into a {@link FluidKey}, {@link Integer} value as amount + * + * @param fluidInputs The combined fluid input inventory handler, in the form of an {@link IFluidHandler} + * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if + * required + */ + public static Object2IntMap fromFluidHandler(IFluidHandler fluidInputs, boolean linked) { + final Object2IntMap map = createFluidStackMap(linked); // Create a single stack of the combined count for each item - for (int i = 0; i < fluidInputs.getTankProperties().length; i++) { - FluidStack fluidStack = fluidInputs.getTankProperties()[i].getContents(); - if (fluidStack != null && fluidStack.amount > 0) { - FluidKey key = new FluidKey(fluidStack); - map.put(key, map.getInt(key) + fluidStack.amount); + for (var prop : fluidInputs.getTankProperties()) { + FluidStack fluidStack = prop.getContents(); + if (fluidStack == null || fluidStack.amount <= 0) + continue; + + if (map.containsKey(fluidStack)) { + map.merge(fluidStack, fluidStack.amount, Integer::sum); + } else { + FluidStack key = fluidStack.copy(); + key.amount = 1; + map.put(key, fluidStack.amount); } } @@ -128,15 +150,33 @@ public static Map fromFluidHandler(IFluidHandler fluidInputs) * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if * required */ - public static Map fromFluidCollection(Collection fluidInputs) { - final Object2IntMap map = new Object2IntLinkedOpenHashMap<>(); + public static Object2IntMap fromFluidCollection(Collection fluidInputs) { + return fromFluidCollection(fluidInputs, true); + } + + /** + * Maps all fluids in the {@link FluidStack} {@link Collection} into a {@link FluidKey}, {@link Integer} value as + * amount + * + * @param fluidInputs The combined fluid input inventory handler, in the form of an {@link IFluidHandler} + * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if + * required + */ + public static Object2IntMap fromFluidCollection(Collection fluidInputs, boolean linked) { + final Object2IntMap map = createFluidStackMap(linked); // Create a single stack of the combined count for each item for (FluidStack fluidStack : fluidInputs) { - if (fluidStack != null && fluidStack.amount > 0) { - FluidKey key = new FluidKey(fluidStack); - map.put(key, map.getInt(key) + fluidStack.amount); + if (fluidStack == null || fluidStack.amount <= 0) + continue; + + if (map.containsKey(fluidStack)) { + map.merge(fluidStack, fluidStack.amount, Integer::sum); + } else { + FluidStack key = fluidStack.copy(); + key.amount = 1; + map.put(key, fluidStack.amount); } } diff --git a/src/main/java/gregtech/api/util/ItemStackHashStrategy.java b/src/main/java/gregtech/api/util/ItemStackHashStrategy.java index 405bcaf842e..20e12330ea9 100644 --- a/src/main/java/gregtech/api/util/ItemStackHashStrategy.java +++ b/src/main/java/gregtech/api/util/ItemStackHashStrategy.java @@ -16,8 +16,8 @@ public interface ItemStackHashStrategy extends Hash.Strategy { /** * @return a builder object for producing a custom ItemStackHashStrategy. */ - static ItemStackHashStrategyBuilder builder() { - return new ItemStackHashStrategyBuilder(); + static Builder builder() { + return new Builder(); } /** @@ -56,7 +56,7 @@ static ItemStackHashStrategy comparingItemDamageCount() { /** * Builder pattern class for generating customized ItemStackHashStrategy */ - class ItemStackHashStrategyBuilder { + class Builder { private boolean item, count, damage, tag, meta; @@ -66,7 +66,7 @@ class ItemStackHashStrategyBuilder { * @param choice {@code true} to consider this property, {@code false} to ignore it. * @return {@code this} */ - public ItemStackHashStrategyBuilder compareItem(boolean choice) { + public Builder compareItem(boolean choice) { item = choice; return this; } @@ -77,7 +77,7 @@ public ItemStackHashStrategyBuilder compareItem(boolean choice) { * @param choice {@code true} to consider this property, {@code false} to ignore it. * @return {@code this} */ - public ItemStackHashStrategyBuilder compareCount(boolean choice) { + public Builder compareCount(boolean choice) { count = choice; return this; } @@ -88,7 +88,7 @@ public ItemStackHashStrategyBuilder compareCount(boolean choice) { * @param choice {@code true} to consider this property, {@code false} to ignore it. * @return {@code this} */ - public ItemStackHashStrategyBuilder compareDamage(boolean choice) { + public Builder compareDamage(boolean choice) { damage = choice; return this; } @@ -99,7 +99,7 @@ public ItemStackHashStrategyBuilder compareDamage(boolean choice) { * @param choice {@code true} to consider this property, {@code false} to ignore it. * @return {@code this} */ - public ItemStackHashStrategyBuilder compareMetadata(boolean choice) { + public Builder compareMetadata(boolean choice) { meta = choice; return this; } @@ -110,7 +110,7 @@ public ItemStackHashStrategyBuilder compareMetadata(boolean choice) { * @param choice {@code true} to consider this property, {@code false} to ignore it. * @return {@code this} */ - public ItemStackHashStrategyBuilder compareTag(boolean choice) { + public Builder compareTag(boolean choice) { tag = choice; return this; } From 40827a18dd079b57971605587aa47349fbba885c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 9 Mar 2025 16:20:25 -0700 Subject: [PATCH 174/264] optimize copy for new map keys add FluidStack copy methods to GTUtility --- .../java/gregtech/api/util/GTHashMaps.java | 23 +++++++------ .../java/gregtech/api/util/GTUtility.java | 34 +++++++++++++++++++ 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTHashMaps.java b/src/main/java/gregtech/api/util/GTHashMaps.java index 1945e6025f6..be5ff82aaff 100644 --- a/src/main/java/gregtech/api/util/GTHashMaps.java +++ b/src/main/java/gregtech/api/util/GTHashMaps.java @@ -46,8 +46,12 @@ public static Object2IntMap fromItemHandler(@NotNull IItemHandler inp for (int i = 0; i < inputs.getSlots(); i++) { ItemStack stack = inputs.getStackInSlot(i); - if (!stack.isEmpty()) { - map.put(stack.copy(), map.getInt(stack) + stack.getCount()); + if (stack.isEmpty()) continue; + if (map.containsKey(stack)) { + map.merge(stack, stack.getCount(), Integer::sum); + } else { + ItemStack key = GTUtility.copy(1, stack); + map.put(key, stack.getCount()); } } @@ -82,8 +86,11 @@ public static Object2IntMap fromItemStackCollection(@NotNull Iterable // Create a single stack of the combined count for each item for (ItemStack stack : inputs) { - if (!stack.isEmpty()) { - map.put(stack.copy(), map.getInt(stack) + stack.getCount()); + if (stack.isEmpty()) continue; + if (map.containsKey(stack)) { + map.merge(stack, stack.getCount(), Integer::sum); + } else { + map.put(GTUtility.copy(1, stack), stack.getCount()); } } @@ -133,9 +140,7 @@ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInpu if (map.containsKey(fluidStack)) { map.merge(fluidStack, fluidStack.amount, Integer::sum); } else { - FluidStack key = fluidStack.copy(); - key.amount = 1; - map.put(key, fluidStack.amount); + map.put(GTUtility.copy(1, fluidStack), fluidStack.amount); } } @@ -174,9 +179,7 @@ public static Object2IntMap fromFluidCollection(Collection Date: Sun, 9 Mar 2025 16:35:34 -0700 Subject: [PATCH 175/264] utilize new empty method replace fluidkey with fluidstack in javadocs --- .../java/gregtech/api/util/GTHashMaps.java | 30 +++++++++++-------- .../gregtech/api/util/GTTransferUtils.java | 8 ++--- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/util/GTHashMaps.java b/src/main/java/gregtech/api/util/GTHashMaps.java index be5ff82aaff..ce10d6b2a33 100644 --- a/src/main/java/gregtech/api/util/GTHashMaps.java +++ b/src/main/java/gregtech/api/util/GTHashMaps.java @@ -1,7 +1,5 @@ package gregtech.api.util; -import gregtech.api.recipes.FluidKey; - import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -97,12 +95,20 @@ public static Object2IntMap fromItemStackCollection(@NotNull Iterable return map; } + /** + * @param linked if the map should respect the order that keys are added + * @return an Object2IntMap + */ @NotNull public static Object2IntMap createItemStackMap(boolean linked) { ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAllButCount(); return linked ? new Object2IntLinkedOpenCustomHashMap<>(strategy) : new Object2IntOpenCustomHashMap<>(strategy); } + /** + * @param linked if the map should respect the order that keys are added + * @return an Object2IntMap + */ @NotNull public static Object2IntMap createFluidStackMap(boolean linked) { var strategy = FluidStackHashStrategy.comparingAllButAmount(); @@ -110,10 +116,10 @@ public static Object2IntMap createFluidStackMap(boolean linked) { } /** - * Maps all fluids in the {@link IFluidHandler} into a {@link FluidKey}, {@link Integer} value as amount + * Maps all fluids in the {@link IFluidHandler} into a {@link FluidStack}, {@link Integer} value as amount * * @param fluidInputs The combined fluid input inventory handler, in the form of an {@link IFluidHandler} - * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if + * @return a {@link Set} of unique {@link FluidStack}s for each fluid in the handler. Will be oversized stacks if * required */ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInputs) { @@ -121,10 +127,10 @@ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInpu } /** - * Maps all fluids in the {@link IFluidHandler} into a {@link FluidKey}, {@link Integer} value as amount + * Maps all fluids in the {@link IFluidHandler} into a {@link FluidStack}, {@link Integer} value as amount * * @param fluidInputs The combined fluid input inventory handler, in the form of an {@link IFluidHandler} - * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if + * @return a {@link Set} of unique {@link FluidStack}s for each fluid in the handler. Will be oversized stacks if * required */ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInputs, boolean linked) { @@ -134,7 +140,7 @@ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInpu for (var prop : fluidInputs.getTankProperties()) { FluidStack fluidStack = prop.getContents(); - if (fluidStack == null || fluidStack.amount <= 0) + if (GTUtility.isEmpty(fluidStack)) continue; if (map.containsKey(fluidStack)) { @@ -148,11 +154,11 @@ public static Object2IntMap fromFluidHandler(IFluidHandler fluidInpu } /** - * Maps all fluids in the {@link FluidStack} {@link Collection} into a {@link FluidKey}, {@link Integer} value as + * Maps all fluids in the {@link FluidStack} {@link Collection} into a {@link FluidStack}, {@link Integer} value as * amount * * @param fluidInputs The combined fluid input inventory handler, in the form of an {@link IFluidHandler} - * @return a {@link Set} of unique {@link FluidKey}s for each fluid in the handler. Will be oversized stacks if + * @return a {@link Set} of unique {@link FluidStack}s for each fluid in the handler. Will be oversized stacks if * required */ public static Object2IntMap fromFluidCollection(Collection fluidInputs) { @@ -160,11 +166,11 @@ public static Object2IntMap fromFluidCollection(Collection fromFluidCollection(Collection fluidInputs, boolean linked) { @@ -173,7 +179,7 @@ public static Object2IntMap fromFluidCollection(Collection 0) { fluidStack.amount = canInsertAmount; fluidStack = sourceHandler.drain(fluidStack, true); - if (fluidStack != null && fluidStack.amount > 0) { + if (!GTUtility.isEmpty(fluidStack)) { destHandler.fill(fluidStack, true); fluidLeftToTransfer -= fluidStack.amount; @@ -68,13 +68,13 @@ public static boolean transferExactFluidStack(@NotNull IFluidHandler sourceHandl @NotNull IFluidHandler destHandler, FluidStack fluidStack) { int amount = fluidStack.amount; FluidStack sourceFluid = sourceHandler.drain(fluidStack, false); - if (sourceFluid == null || sourceFluid.amount != amount) { + if (GTUtility.isEmpty(sourceFluid) || sourceFluid.amount != amount) { return false; } int canInsertAmount = destHandler.fill(sourceFluid, false); if (canInsertAmount == amount) { sourceFluid = sourceHandler.drain(sourceFluid, true); - if (sourceFluid != null && sourceFluid.amount > 0) { + if (!GTUtility.isEmpty(sourceFluid)) { destHandler.fill(sourceFluid, true); return true; } From 87a0f90259ac31ff5972e0ec48a8272d0a5c08f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:13:01 -0700 Subject: [PATCH 176/264] fix tests --- src/main/java/gregtech/api/recipes/logic/ParallelLogic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java index e70974cbad8..0ac8e6f4a5e 100644 --- a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java +++ b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java @@ -419,7 +419,7 @@ protected static int getMaxRatioFluid(@NotNull Object2IntMap countFl if (fluidStrategy.equals(notConsumableFluid, inputFluid)) { available = countFluid.getInt(inputFluid); if (available > needed) { - fluidCountMap.replace(inputFluid, available - needed); + countFluid.replace(inputFluid, available - needed); needed -= available; break; } else { From 69a6a6d9eb780091c5aa8157479cb00800a1457b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 10 Mar 2025 13:27:48 -0700 Subject: [PATCH 177/264] i need to replace this too --- src/main/java/gregtech/api/recipes/logic/ParallelLogic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java index 0ac8e6f4a5e..9d853cc19be 100644 --- a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java +++ b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java @@ -423,7 +423,7 @@ protected static int getMaxRatioFluid(@NotNull Object2IntMap countFl needed -= available; break; } else { - fluidCountMap.replace(inputFluid, 0); + countFluid.replace(inputFluid, 0); notConsumableMap.replace(notConsumableFluid, needed - available); needed -= available; } From d9e2595a0da56e1487810eeafe3e7d1e5e57924c Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 10 Mar 2025 20:57:20 -0700 Subject: [PATCH 178/264] add builder overload for sync add line for stored / cap for fusion --- .../multiblock/ui/MultiblockUIFactory.java | 6 ++++++ .../multi/electric/MetaTileEntityFusionReactor.java | 12 ++++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index b436f4970f6..2d53126f632 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -428,4 +428,10 @@ public interface ScreenFunction { public static MultiblockUIBuilder builder() { return new MultiblockUIBuilder(); } + + public static MultiblockUIBuilder builder(String key, PanelSyncManager syncManager) { + var b = builder(); + b.sync(key, syncManager); + return b; + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 98646128b13..33985796133 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -19,7 +19,6 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -31,6 +30,7 @@ import gregtech.api.recipes.logic.OCParams; import gregtech.api.recipes.properties.RecipePropertyStorage; import gregtech.api.recipes.properties.impl.FusionEUToStartProperty; +import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; @@ -451,11 +451,15 @@ protected MultiblockUIFactory createUIFactory() { .setScreenHeight(138) .disableDisplayText() .addScreenChildren((parent, syncManager) -> { - MultiblockUIBuilder status = MultiblockUIFactory.builder(); + var status = MultiblockUIFactory.builder("status", syncManager); status.setAction(b -> b.structureFormed(true) .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addWorkingStatusLine()); - status.sync("status", syncManager); + .addWorkingStatusLine() + .addCustom((keyManager, uiSyncer) -> { + long stored = uiSyncer.syncLong(energyContainer.getEnergyStored()); + long cap = uiSyncer.syncLong(energyContainer.getEnergyCapacity()); + keyManager.add(KeyUtil.string(TextFormatting.WHITE, "%,d / %,d EU", stored, cap)); + })); parent.child(new Column() .padding(4) .expanded() From e71d50e086bd8040e87f9529dc7f121f0def5d63 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 15:43:31 -0700 Subject: [PATCH 179/264] add display to theme add themes to multitanks port pbf to mui2 add disable display address some todos and comments --- .../multiblock/ui/MultiblockUIBuilder.java | 3 +- .../multiblock/ui/MultiblockUIFactory.java | 29 +++++++----- .../java/gregtech/api/mui/GTGuiTextures.java | 33 ++++++++----- .../java/gregtech/api/mui/GTGuiTheme.java | 28 +++++++++-- .../multi/MetaTileEntityMultiblockTank.java | 7 +++ .../MetaTileEntityPrimitiveBlastFurnace.java | 47 +++++++++++++++++++ .../common/mui/widget/GTFluidSlot.java | 3 +- 7 files changed, 120 insertions(+), 30 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index e2816ad5723..e544982bbb4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -201,8 +201,7 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE if (!isStructureFormed) return this; maxVoltage = getSyncer().syncLong(maxVoltage); recipeEUt = getSyncer().syncLong(recipeEUt); - // todo this recipe eut should always be positive - if (maxVoltage != 0 && maxVoltage >= Math.abs(recipeEUt)) { + if (maxVoltage != 0 && maxVoltage >= recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 2d53126f632..9ee438f4d30 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -6,7 +6,6 @@ import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; -import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; @@ -47,6 +46,7 @@ public class MultiblockUIFactory { private int screenHeight = 109; private ScreenFunction screenFunction; private static final Consumer NO_OP = b -> {}; + private boolean disableDisplay = false; static { // register operations @@ -72,7 +72,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { var panel = GTGuis.createPanel(mte, width, height) - .child(createScreen(panelSyncManager)); + .childIf(!disableDisplay, createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? if (mte instanceof ProgressBarMultiblock progressBarMultiblock && @@ -81,6 +81,10 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { panel.child(createBars(progressBarMultiblock, panelSyncManager)); } + if (disableDisplay && screenFunction != null) { + this.screenFunction.addWidgets(panel, panelSyncManager); + } + return panel.child(Flow.row() .bottom(7) .height(77) @@ -95,7 +99,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { return new Widget<>() .size(18) .pos(174 - 5, screenHeight - 18 - 3) - .overlay(GTGuiTextures.getLogo(mte.getUITheme())); + .overlay(GTGuiTextures.GREGTECH_LOGO_DARK); } MultiblockUIBuilder error = builder(); @@ -114,7 +118,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { } else if (!warning.isEmpty()) { return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } else { - return GTGuiTextures.getLogo(mte.getUITheme()); + return GTGuiTextures.GREGTECH_LOGO_DARK; } }); @@ -206,6 +210,14 @@ public MultiblockUIFactory disableDisplayText() { return this; } + public MultiblockUIFactory disableDisplay() { + disableDisplayText(); + disableWarningText(); + disableErrorText(); + this.disableDisplay = true; + return this; + } + /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no * additional functionality for this Multiblock. @@ -304,14 +316,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { // todo this should be part of the theme instead private UITexture getDisplayBackground() { - var theme = mte.getUITheme(); - if (theme == GTGuiTheme.BRONZE) { - return GTGuiTextures.DISPLAY_BRONZE; - } else if (theme == GTGuiTheme.STEEL) { - return GTGuiTextures.DISPLAY_STEEL; - } else { - return GTGuiTextures.DISPLAY; - } + return mte.getUITheme().getDisplayBackground(); } @NotNull diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index e082b6800ad..63972a51936 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -23,20 +23,28 @@ public class GTGuiTextures { /** Keys used for GT assets registered for use in Themes */ public static class IDs { - public static final String STANDARD_BACKGROUND = "gregtech_standard_bg"; - public static final String COVER_BACKGROUND = "gregtech_cover_bg"; - public static final String BRONZE_BACKGROUND = "gregtech_bronze_bg"; - public static final String STEEL_BACKGROUND = "gregtech_steel_bg"; - public static final String PRIMITIVE_BACKGROUND = "gregtech_primitive_bg"; + public static final String STANDARD_BACKGROUND = id("standard_bg"); + public static final String COVER_BACKGROUND = id("cover_bg"); + public static final String BRONZE_BACKGROUND = id("bronze_bg"); + public static final String STEEL_BACKGROUND = id("steel_bg"); + public static final String PRIMITIVE_BACKGROUND = id("primitive_bg"); - public static final String STANDARD_SLOT = "gregtech_standard_slot"; - public static final String BRONZE_SLOT = "gregtech_bronze_slot"; - public static final String STEEL_SLOT = "gregtech_steel_slot"; - public static final String PRIMITIVE_SLOT = "gregtech_primitive_slot"; + public static final String STANDARD_SLOT = id("standard_slot"); + public static final String BRONZE_SLOT = id("bronze_slot"); + public static final String STEEL_SLOT = id("steel_slot"); + public static final String PRIMITIVE_SLOT = id("primitive_slot"); - public static final String STANDARD_FLUID_SLOT = "gregtech_standard_fluid_slot"; + public static final String STANDARD_FLUID_SLOT = id("standard_fluid_slot"); - public static final String STANDARD_BUTTON = "gregtech_standard_button"; + public static final String STANDARD_BUTTON = id("standard_button"); + + public static final String DISPLAY = id("display"); + public static final String DISPLAY_BRONZE = id("display_bronze"); + public static final String DISPLAY_STEEL = id("display_steel"); + + private static String id(String path) { + return "gregtech:" + path; + } } // ICONS @@ -105,6 +113,7 @@ public static class IDs { // DISPLAYS public static final UITexture DISPLAY = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/base/display.png") + .name(IDs.DISPLAY) .imageSize(143, 75) .adaptable(2) .canApplyTheme() @@ -112,12 +121,14 @@ public static class IDs { public static final UITexture DISPLAY_BRONZE = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/base/display_bronze.png") + .name(IDs.DISPLAY_BRONZE) .imageSize(143, 75) .adaptable(2) .build(); public static final UITexture DISPLAY_STEEL = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/base/display_steel.png") + .name(IDs.DISPLAY_STEEL) .imageSize(143, 75) .adaptable(2) .build(); diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index 4a6c2c2d4dd..4ccfc5c753e 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -8,9 +8,11 @@ import com.cleanroommc.modularui.api.ITheme; import com.cleanroommc.modularui.api.IThemeApi; +import com.cleanroommc.modularui.drawable.DrawableSerialization; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.theme.ReloadThemeEvent; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.utils.JsonBuilder; import org.jetbrains.annotations.Nullable; @@ -32,6 +34,7 @@ public class GTGuiTheme { .simpleToggleButton(GTGuiTextures.IDs.STANDARD_BUTTON, GTGuiTextures.IDs.STANDARD_SLOT, ConfigHolder.client.defaultUIColor) + .displayBackground(GTGuiTextures.IDs.DISPLAY) .build(); public static final GTGuiTheme COVER = templateBuilder("gregtech_cover") @@ -47,26 +50,31 @@ public class GTGuiTheme { public static final GTGuiTheme BRONZE = templateBuilder("gregtech_bronze") .panel(GTGuiTextures.IDs.BRONZE_BACKGROUND) .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) + .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) .build(); public static final GTGuiTheme STEEL = templateBuilder("gregtech_steel") .panel(GTGuiTextures.IDs.STEEL_BACKGROUND) + .textColor(Color.WHITE.darker(1)) .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) + .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) .build(); public static final GTGuiTheme PRIMITIVE = templateBuilder("gregtech_primitive") .panel(GTGuiTextures.IDs.PRIMITIVE_BACKGROUND) + .textColor(Color.WHITE.darker(1)) .itemSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) .build(); - private final String themeId; + protected final String themeId; - private final List> elementBuilder; - private final JsonBuilder jsonBuilder; + protected final List> elementBuilder; + protected final JsonBuilder jsonBuilder; private Supplier logo; + private String displayBackground = GTGuiTextures.IDs.DISPLAY; - private GTGuiTheme(String themeId) { + protected GTGuiTheme(String themeId) { this.themeId = themeId; this.jsonBuilder = new JsonBuilder(); this.elementBuilder = new ArrayList<>(); @@ -86,6 +94,10 @@ public ITheme getMuiTheme() { return logo.get(); } + public @Nullable UITexture getDisplayBackground() { + return DrawableSerialization.getTexture(this.displayBackground); + } + private void register() { buildJson(); IThemeApi.get().registerTheme(themeId, jsonBuilder); @@ -391,6 +403,14 @@ public Builder logo(Supplier logo) { return this; } + /** + * Sets the display background for this theme. + */ + public Builder displayBackground(String displayBackground) { + theme.displayBackground = displayBackground; + return this; + } + public GTGuiTheme build() { return theme; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java index 93070c1d27c..e5574afd82a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java @@ -9,6 +9,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -115,6 +116,12 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { return Textures.WOOD_WALL; } + @Override + public GTGuiTheme getUITheme() { + if (isMetal) return GTGuiTheme.STEEL; + else return GTGuiTheme.PRIMITIVE; + } + @Override public boolean hasMaintenanceMechanics() { return false; diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java index 90078eaf604..a91ed02bed7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java @@ -11,6 +11,8 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.TraceabilityPredicate; @@ -42,6 +44,13 @@ import codechicken.lib.texture.TextureUtils; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.widgets.ItemSlot; +import com.cleanroommc.modularui.widgets.layout.Flow; +import com.cleanroommc.modularui.widgets.layout.Grid; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; @@ -80,6 +89,44 @@ public ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) { return Textures.PRIMITIVE_BRICKS; } + @Override + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory(this) + .setSize(176, 166) + .disableDisplay() + .addScreenChildren((parent, syncManager) -> parent + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(Flow.row() + .top(20) + .alignX(0.5f) + // .pos(52, 20) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .coverChildren() + .child(new Grid() + .coverChildren() + .mapTo(1, 3, value -> new ItemSlot() + .slot(importItems, value)) + .marginRight(6)) + .child(new com.cleanroommc.modularui.widgets.ProgressWidget() + // .pos(77, 39) + .size(20, 15) + .marginRight(6) + // .texture() todo primitive progress texture + .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) + .child(new Grid() + .coverChildren() + // .pos(104, 38) + .mapTo(3, 3, value -> new ItemSlot() + .slot(new ModularSlot(exportItems, value) + // todo brick overlay + .accessibility(false, true)))))); + } + + @Override + public GTGuiTheme getUITheme() { + return GTGuiTheme.PRIMITIVE; + } + @Override protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { return ModularUI.builder(GuiTextures.PRIMITIVE_BACKGROUND, 176, 166) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index ba17b952e24..307f89b2d30 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -128,7 +128,8 @@ public void draw(ModularGuiContext context, WidgetSlotTheme widgetTheme) { int y = 1; if (!this.syncHandler.drawAlwaysFull()) { - float newHeight = height * ((float) content.amount / this.syncHandler.getCapacity()); + float amt = content == null ? 0f : content.amount; + float newHeight = height * (amt / this.syncHandler.getCapacity()); y += (int) (height - newHeight); height = newHeight; } From d051496cbc3cac1d8b22571ab80ff504c127ec66 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:39:00 -0700 Subject: [PATCH 180/264] fix small issue with GTFluidSyncHandler move and use primitive overlays add disable indicator and buttons fix player inventory alignment --- .../multiblock/ui/MultiblockUIFactory.java | 36 ++++++--- .../java/gregtech/api/mui/GTGuiTextures.java | 12 +++ .../api/mui/sync/GTFluidSyncHandler.java | 2 +- .../MetaTileEntityPrimitiveBlastFurnace.java | 73 ++++++++++++------- 4 files changed, 87 insertions(+), 36 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 9ee438f4d30..0a69f13e00f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -47,6 +47,8 @@ public class MultiblockUIFactory { private ScreenFunction screenFunction; private static final Consumer NO_OP = b -> {}; private boolean disableDisplay = false; + private boolean disableIndicator = false; + private boolean disableButtons = false; static { // register operations @@ -85,13 +87,20 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.screenFunction.addWidgets(panel, panelSyncManager); } + var playerInv = SlotGroupWidget.playerInventory(0); + if (disableButtons) { + playerInv.alignX(0.5f); + } else { + playerInv.left(4); + } + return panel.child(Flow.row() .bottom(7) - .height(77) - .margin(4, 0) - .child(SlotGroupWidget.playerInventory(0) - .left(2)) - .child(createButtons(panel, panelSyncManager, guiData))); + .coverChildrenHeight() + .left(4).right(4) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .child(playerInv) + .childIf(!disableButtons, createButtons(panel, panelSyncManager, guiData))); } private Widget createIndicator(PanelSyncManager syncManager) { @@ -212,9 +221,19 @@ public MultiblockUIFactory disableDisplayText() { public MultiblockUIFactory disableDisplay() { disableDisplayText(); + this.disableDisplay = true; + return disableIndicator(); + } + + public MultiblockUIFactory disableIndicator() { disableWarningText(); disableErrorText(); - this.disableDisplay = true; + this.disableIndicator = true; + return this; + } + + public MultiblockUIFactory disableButtons() { + this.disableButtons = true; return this; } @@ -308,7 +327,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { this.screenFunction.addWidgets(parent, syncManager); } - return parent.child(createIndicator(syncManager)) + return parent.childIf(!disableIndicator, createIndicator(syncManager)) .background(getDisplayBackground()) .size(190, screenHeight) .pos(4, 4); @@ -331,7 +350,6 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync var powerButton = createPowerButton(mainPanel, panelSyncManager); return Flow.column() - .alignX(1f) .right(4) .size(18, 77) .child(createDistinctButton(mainPanel, panelSyncManager)) @@ -404,7 +422,7 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull .disableHoverBackground() .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) .value(new BooleanSyncValue(controllable::isWorkingEnabled, controllable::setWorkingEnabled)) - .marginTop(5); + .marginTop(4); } public static final class Screen { diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 63972a51936..8208bf18aa1 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -263,6 +263,18 @@ private static String id(String path) { public static final UITexture MENU_OVERLAY = fullImage("textures/gui/overlay/menu_overlay.png"); public static final UITexture RECIPE_LOCK = fullImage("textures/gui/widget/lock.png"); + public static final UITexture PRIMITIVE_FURNACE_OVERLAY = fullImage( + "textures/gui/primitive/overlay_primitive_furnace.png"); + public static final UITexture PRIMITIVE_DUST_OVERLAY = fullImage( + "textures/gui/primitive/overlay_primitive_dust.png"); + public static final UITexture PRIMITIVE_INGOT_OVERLAY = fullImage( + "textures/gui/primitive/overlay_primitive_ingot.png"); + public static final UITexture PRIMITIVE_LARGE_FLUID_TANK = fullImage( + "textures/gui/primitive/primitive_large_fluid_tank.png"); + public static final UITexture PRIMITIVE_LARGE_FLUID_TANK_OVERLAY = fullImage( + "textures/gui/primitive/primitive_large_fluid_tank_overlay.png"); + public static final UITexture PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR = fullImage( + "textures/gui/primitive/progress_bar_primitive_blast_furnace.png"); // todo bronze/steel/primitive fluid slots? diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1b667ffc6bf..1cb27e4db30 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -97,7 +97,7 @@ public void setFluid(FluidStack fluid) { fluidTank.setFluid(fluid); } else { tank.drain(Integer.MAX_VALUE, true); - tank.fill(fluid, true); + if (fluid != null) tank.fill(fluid, true); } if (!isPhantom() || fluid == null) return; if (this.phantomFluid == null || this.phantomFluid.getFluid() != fluid.getFluid()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java index a91ed02bed7..10cc9b911fc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -45,12 +46,14 @@ import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; import com.cleanroommc.modularui.widgets.ItemSlot; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.layout.Grid; import com.cleanroommc.modularui.widgets.slot.ModularSlot; +import com.cleanroommc.modularui.widgets.slot.SlotGroup; import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; @@ -94,32 +97,50 @@ protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) .setSize(176, 166) .disableDisplay() - .addScreenChildren((parent, syncManager) -> parent - .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) - .child(Flow.row() - .top(20) - .alignX(0.5f) - // .pos(52, 20) - .crossAxisAlignment(Alignment.CrossAxis.CENTER) - .coverChildren() - .child(new Grid() - .coverChildren() - .mapTo(1, 3, value -> new ItemSlot() - .slot(importItems, value)) - .marginRight(6)) - .child(new com.cleanroommc.modularui.widgets.ProgressWidget() - // .pos(77, 39) - .size(20, 15) - .marginRight(6) - // .texture() todo primitive progress texture - .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) - .child(new Grid() - .coverChildren() - // .pos(104, 38) - .mapTo(3, 3, value -> new ItemSlot() - .slot(new ModularSlot(exportItems, value) - // todo brick overlay - .accessibility(false, true)))))); + .disableButtons() + .addScreenChildren((parent, syncManager) -> { + UITexture[] importOverlays = { + GTGuiTextures.PRIMITIVE_INGOT_OVERLAY, + GTGuiTextures.PRIMITIVE_DUST_OVERLAY, + GTGuiTextures.PRIMITIVE_FURNACE_OVERLAY + }; + + UITexture[] exportOverlays = { + GTGuiTextures.PRIMITIVE_INGOT_OVERLAY, + GTGuiTextures.PRIMITIVE_DUST_OVERLAY, + GTGuiTextures.PRIMITIVE_DUST_OVERLAY + }; + + SlotGroup importGroup = new SlotGroup("import", 1, true); + + parent.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(Flow.row() + .top(20) + .alignX(0.5f) + // .pos(52, 20) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .coverChildren() + .child(new Grid() + .coverChildren() + .mapTo(1, 3, value -> new ItemSlot() + .background(GTGuiTextures.SLOT_PRIMITIVE, importOverlays[value]) + .slot(new ModularSlot(importItems, value) + .slotGroup(importGroup))) + .marginRight(6)) + .child(new com.cleanroommc.modularui.widgets.ProgressWidget() + // .pos(77, 39) + .size(20, 15) + .marginRight(6) + .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, 20) + .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) + .child(new Grid() + .coverChildren() + // .pos(104, 38) + .mapTo(3, 3, value -> new ItemSlot() + .background(GTGuiTextures.SLOT_PRIMITIVE, exportOverlays[value]) + .slot(new ModularSlot(exportItems, value) + .accessibility(false, true))))); + }); } @Override From f9006bbbf58f6fab17ec4e7e01630079cd655814 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 16:39:44 -0700 Subject: [PATCH 181/264] move build ui method down closer to other ui methods --- .../multiblock/ui/MultiblockUIFactory.java | 81 +++++++++---------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 0a69f13e00f..d9aaaad05a7 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -68,41 +68,6 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } - /** - * Constructs the multiblock ui panel
- * It is not recommended to override this method - */ - public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - var panel = GTGuis.createPanel(mte, width, height) - .childIf(!disableDisplay, createScreen(panelSyncManager)); - - // TODO createExtras() hook for overrides? - if (mte instanceof ProgressBarMultiblock progressBarMultiblock && - progressBarMultiblock.getProgressBarCount() > 0) { - panel.height(height + (Bars.HEIGHT * 2) - 2); - panel.child(createBars(progressBarMultiblock, panelSyncManager)); - } - - if (disableDisplay && screenFunction != null) { - this.screenFunction.addWidgets(panel, panelSyncManager); - } - - var playerInv = SlotGroupWidget.playerInventory(0); - if (disableButtons) { - playerInv.alignX(0.5f); - } else { - playerInv.left(4); - } - - return panel.child(Flow.row() - .bottom(7) - .coverChildrenHeight() - .left(4).right(4) - .crossAxisAlignment(Alignment.CrossAxis.CENTER) - .child(playerInv) - .childIf(!disableButtons, createButtons(panel, panelSyncManager, guiData))); - } - private Widget createIndicator(PanelSyncManager syncManager) { if (warningText == NO_OP && errorText == NO_OP) { return new Widget<>() @@ -259,6 +224,46 @@ public MultiblockUIFactory setScreenHeight(int height) { return this; } + public MultiblockUIFactory addScreenChildren(ScreenFunction function) { + this.screenFunction = function; + return this; + } + + /** + * Constructs the multiblock ui panel
+ * It is not recommended to override this method + */ + public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { + var panel = GTGuis.createPanel(mte, width, height) + .childIf(!disableDisplay, createScreen(panelSyncManager)); + + // TODO createExtras() hook for overrides? + if (mte instanceof ProgressBarMultiblock progressBarMultiblock && + progressBarMultiblock.getProgressBarCount() > 0) { + panel.height(height + (Bars.HEIGHT * 2) - 2); + panel.child(createBars(progressBarMultiblock, panelSyncManager)); + } + + if (disableDisplay && screenFunction != null) { + this.screenFunction.addWidgets(panel, panelSyncManager); + } + + var playerInv = SlotGroupWidget.playerInventory(0); + if (disableButtons) { + playerInv.alignX(0.5f); + } else { + playerInv.left(4); + } + + return panel.child(Flow.row() + .bottom(7) + .coverChildrenHeight() + .left(4).right(4) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) + .child(playerInv) + .childIf(!disableButtons, createButtons(panel, panelSyncManager, guiData))); + } + /** * @param progressMulti the multiblock with progress bars * @param panelSyncManager the sync manager for synchronizing widgets @@ -302,11 +307,6 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, return column; } - public MultiblockUIFactory addScreenChildren(ScreenFunction function) { - this.screenFunction = function; - return this; - } - protected Widget createScreen(PanelSyncManager syncManager) { var parent = new ParentWidget<>(); @@ -333,7 +333,6 @@ protected Widget createScreen(PanelSyncManager syncManager) { .pos(4, 4); } - // todo this should be part of the theme instead private UITexture getDisplayBackground() { return mte.getUITheme().getDisplayBackground(); } From 6835465414c02edc20ecebe1b2e69a9c01893dc8 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 17:13:04 -0700 Subject: [PATCH 182/264] rebuild instead of mark dirty --- .../api/metatileentity/multiblock/ui/MultiblockUIBuilder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index e544982bbb4..b6303c9a660 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -971,7 +971,8 @@ public void detectAndSendChanges(boolean init) { public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { getSyncer().readBuffer(buf); - markDirty(); + onRebuild(); + runAction(); } } From 7fbb12f23e5ec8f10a836dc12699ce02a9932cbe Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 17:26:31 -0700 Subject: [PATCH 183/264] remove unnecessary KeyUtil methods --- .../multiblock/ui/MultiblockUIBuilder.java | 12 ++++++---- src/main/java/gregtech/api/util/KeyUtil.java | 22 ------------------- 2 files changed, 8 insertions(+), 26 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index b6303c9a660..a3fc6f6c13d 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -142,11 +142,12 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); maxVoltage = getSyncer().syncLong(maxVoltage); + int tier = GTUtility.getFloorTierByVoltage(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", KeyUtil.number(maxVoltage), - KeyUtil.voltage(GTValues.VOCNF, maxVoltage)); + KeyUtil.string(GTValues.VOCNF[tier])); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); @@ -184,7 +185,8 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.overclock(GTValues.VOCNF, energyUsage); + int tier = GTUtility.getOCTierByVoltage(energyUsage); + var voltageName = KeyUtil.string(GTValues.VOCNF[tier]); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.energy_consumption", energyFormatted, voltageName)); @@ -204,7 +206,8 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE if (maxVoltage != 0 && maxVoltage >= recipeEUt) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); + int tier = GTUtility.getFloorTierByVoltage(maxVoltage); + var voltageName = KeyUtil.string(GTValues.VOCNF[tier]); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", energyFormatted, voltageName)); @@ -226,7 +229,8 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted - var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); + int tier = GTUtility.getFloorTierByVoltage(maxVoltage); + var voltageName = KeyUtil.string(GTValues.VOCNF[tier]); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_amps", diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 902424ca274..9fce930fcb6 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -106,28 +106,6 @@ public static IKey number(Supplier formatting, LongSupplier supp return string(formatting, () -> TextFormattingUtil.formatNumbers(supplier.getAsLong()) + suffix); } - /** - * Calls {@link GTUtility#getFloorTierByVoltage(long)} to get the voltage tier - * - * @param array Array of voltage names - * @param voltage The max voltage - * @return the voltage name for the given voltage tier - */ - public static IKey voltage(String[] array, long voltage) { - return string(array[GTUtility.getFloorTierByVoltage(voltage)]); - } - - /** - * Calls {@link GTUtility#getFloorTierByVoltage(long)} to get the voltage tier - * - * @param array Array of voltage names - * @param voltage The max voltage - * @return the voltage name for the given voltage tier - */ - public static IKey overclock(String[] array, long voltage) { - return string(array[GTUtility.getOCTierByVoltage(voltage)]); - } - public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; return body.asTextIcon() From c19529257ab9fdff1b021aa84d6ea48f527ed390 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 17:34:09 -0700 Subject: [PATCH 184/264] address lang todo --- .../metatileentities/multi/MetaTileEntityLargeBoiler.java | 2 +- src/main/resources/assets/gregtech/lang/en_us.lang | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 73604802ff7..e891c1023de 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -149,7 +149,7 @@ protected MultiblockUIFactory createUIFactory() { .width(18) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) // todo lang - .addTooltipLine("Configure Boiler Throttle") + .addTooltipLine(IKey.lang("gregtech.multiblock.large_boiler.throttle_button.tooltip")) .background(GTGuiTextures.BUTTON) .onMousePressed(i -> { if (throttle.isPanelOpen()) { diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index d506f36e405..f27ba093f21 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5887,6 +5887,7 @@ gregtech.multiblock.turbine.efficiency_tooltip=Each Rotor Holder above %s§7 add gregtech.multiblock.large_boiler.efficiency=Efficiency: %s gregtech.multiblock.large_boiler.steam_output=Steam Output: %s +gregtech.multiblock.large_boiler.throttle_button.tooltip=Configure Boiler Throttle gregtech.multiblock.large_boiler.throttle=Throttle: %s gregtech.multiblock.large_boiler.throttle.title=Boiler Throttle gregtech.multiblock.large_boiler.throttle.tooltip=Boiler can output less Steam and consume less fuel (efficiency is not lost, does not affect heat-up time) From 36253f5776cbd09bb85971826d33d99090b4add7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 27 Mar 2025 17:49:13 -0700 Subject: [PATCH 185/264] delete old ui code --- .../multiblock/MultiblockWithDisplayBase.java | 189 ------------------ .../RecipeMapSteamMultiblockController.java | 23 --- .../multi/MetaTileEntityCokeOven.java | 22 -- .../MetaTileEntityPrimitiveBlastFurnace.java | 30 --- .../electric/MetaTileEntityFusionReactor.java | 77 ------- 5 files changed, 341 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 637134efb90..4b3b68fbc10 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -3,15 +3,6 @@ import gregtech.api.GTValues; import gregtech.api.block.VariantActiveBlock; import gregtech.api.capability.*; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.Widget.ClickData; -import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.AdvancedTextWidget; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.IndicatorImageWidget; -import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.pattern.PatternMatchContext; @@ -21,13 +12,11 @@ import gregtech.api.unification.ore.OrePrefix; import gregtech.common.ConfigHolder; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.*; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.ITextComponent; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -40,7 +29,6 @@ import org.jetbrains.annotations.NotNull; import java.util.*; -import java.util.function.BiFunction; import static gregtech.api.capability.GregtechDataCodes.IS_WORKING; import static gregtech.api.capability.GregtechDataCodes.STORE_TAPED; @@ -348,178 +336,6 @@ protected TraceabilityPredicate maintenancePredicate() { return new TraceabilityPredicate(); } - /** - * Called serverside to obtain text displayed in GUI - * each element of list is displayed on new line - * to use translation, use TextComponentTranslation - */ - @Deprecated - protected void addDisplayText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()); - } - - /** - * Called on serverside when client is clicked on the specific text component - * with special click event handler - * Data is the data specified in the component - */ - @Deprecated - protected void handleDisplayClick(String componentData, ClickData clickData) {} - - @Deprecated - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 198, 208); - - // Display - if (this instanceof IProgressBarMultiblock progressMulti && progressMulti.showProgressBar()) { - builder.image(4, 4, 190, 109, GuiTextures.DISPLAY); - - if (progressMulti.getNumProgressBars() == 3) { - // triple bar - ProgressWidget progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(0), - 4, 115, 62, 7, - progressMulti.getProgressBarTexture(0), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 0)); - builder.widget(progressBar); - - progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(1), - 68, 115, 62, 7, - progressMulti.getProgressBarTexture(1), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 1)); - builder.widget(progressBar); - - progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(2), - 132, 115, 62, 7, - progressMulti.getProgressBarTexture(2), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 2)); - builder.widget(progressBar); - } else if (progressMulti.getNumProgressBars() == 2) { - // double bar - ProgressWidget progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(0), - 4, 115, 94, 7, - progressMulti.getProgressBarTexture(0), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 0)); - builder.widget(progressBar); - - progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(1), - 100, 115, 94, 7, - progressMulti.getProgressBarTexture(1), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 1)); - builder.widget(progressBar); - } else { - // single bar - ProgressWidget progressBar = new ProgressWidget( - () -> progressMulti.getFillPercentage(0), - 4, 115, 190, 7, - progressMulti.getProgressBarTexture(0), ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(list -> progressMulti.addBarHoverText(list, 0)); - builder.widget(progressBar); - } - builder.widget(new IndicatorImageWidget(174, 93, 17, 17, getLogo()) - .setWarningStatus(getWarningLogo(), this::addWarningText) - .setErrorStatus(getErrorLogo(), this::addErrorText)); - } else { - builder.image(4, 4, 190, 117, GuiTextures.DISPLAY); - builder.widget(new IndicatorImageWidget(174, 101, 17, 17, getLogo()) - .setWarningStatus(getWarningLogo(), this::addWarningText) - .setErrorStatus(getErrorLogo(), this::addErrorText)); - } - - builder.label(9, 9, getMetaFullName(), 0xFFFFFF); - builder.widget(new AdvancedTextWidget(9, 20, this::addDisplayText, 0xFFFFFF) - .setMaxWidthLimit(181) - .setClickHandler(this::handleDisplayClick)); - - // Power Button - // todo in the future, refactor so that this class is instanceof IControllable. - IControllable controllable = getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); - if (controllable != null) { - builder.widget(new ImageCycleButtonWidget(173, 183, 18, 18, GuiTextures.BUTTON_POWER, - controllable::isWorkingEnabled, controllable::setWorkingEnabled)); - builder.widget(new ImageWidget(173, 201, 18, 6, GuiTextures.BUTTON_POWER_DETAIL)); - } - - // Voiding Mode Button - if (shouldShowVoidingModeButton()) { - builder.widget(new ImageCycleButtonWidget(173, 161, 18, 18, GuiTextures.BUTTON_VOID_MULTIBLOCK, - 4, this::getVoidingMode, this::setVoidingMode) - .setTooltipHoverString(this::getVoidingModeTooltip)); - } else { - builder.widget(new ImageWidget(173, 161, 18, 18, GuiTextures.BUTTON_VOID_NONE) - .setTooltip("gregtech.gui.multiblock_voiding_not_supported")); - } - - // Distinct Buses Button - if (this instanceof IDistinctBusController distinct && distinct.canBeDistinct()) { - builder.widget(new ImageCycleButtonWidget(173, 143, 18, 18, GuiTextures.BUTTON_DISTINCT_BUSES, - distinct::isDistinct, distinct::setDistinct) - .setTooltipHoverString(i -> "gregtech.multiblock.universal.distinct_" + - (i == 0 ? "disabled" : "enabled"))); - } else { - builder.widget(new ImageWidget(173, 143, 18, 18, GuiTextures.BUTTON_NO_DISTINCT_BUSES) - .setTooltip("gregtech.multiblock.universal.distinct_not_supported")); - } - - // Flex Button - builder.widget(getFlexButton(173, 125, 18, 18)); - - builder.bindPlayerInventory(entityPlayer.inventory, 125); - return builder; - } - - /** - * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no - * additional functionality for this Multiblock. - *
- *
- * Parameters should be passed directly to the created widget. Size will be 18x18. - * - * @deprecated override {@link MultiblockUIFactory#createFlexButton(BiFunction)} - */ - @Deprecated - @SuppressWarnings("SameParameterValue") - protected gregtech.api.gui.@NotNull Widget getFlexButton(int x, int y, int width, int height) { - return new ImageWidget(x, y, width, height, GuiTextures.BUTTON_NO_FLEX) - .setTooltip("gregtech.multiblock.universal.no_flex_button"); - } - - protected @NotNull TextureArea getLogo() { - return GuiTextures.GREGTECH_LOGO_DARK; - } - - protected @NotNull TextureArea getWarningLogo() { - return GuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; - } - - protected @NotNull TextureArea getErrorLogo() { - return GuiTextures.GREGTECH_LOGO_BLINKING_RED; - } - - /** - * Returns a list of text indicating any current warnings in this Multiblock. - * Recommended to only display warnings if the structure is already formed. - */ - @Deprecated - protected void addWarningText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed(), false) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - - /** - * Returns a list of translation keys indicating any current errors in this Multiblock. - * Prioritized over any warnings provided by {@link MultiblockWithDisplayBase#addWarningText}. - */ - @Deprecated - protected void addErrorText(List textList) { - MultiblockDisplayText.builder(textList, isStructureFormed()) - .addMufflerObstructedLine(hasMufflerMechanics() && !isMufflerFaceFree()); - } - public boolean shouldShowVoidingModeButton() { return true; } @@ -574,11 +390,6 @@ public final ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSync return this.uiFactory.buildUI(guiData, panelSyncManager); } - @Override - protected ModularUI createUI(EntityPlayer entityPlayer) { - return createUITemplate(entityPlayer).build(getHolder(), entityPlayer); - } - @Override public NBTTagCompound writeToNBT(NBTTagCompound data) { super.writeToNBT(data); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 53cf2b3f0ac..88e33eba6db 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -4,10 +4,6 @@ import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.SteamMultiblockRecipeLogic; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.AdvancedTextWidget; -import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MTETrait; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; @@ -19,7 +15,6 @@ import gregtech.api.util.KeyUtil; import gregtech.common.ConfigHolder; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundEvent; import net.minecraft.util.text.TextFormatting; @@ -184,22 +179,4 @@ public SoundEvent getSound() { public boolean isActive() { return super.isActive() && recipeMapWorkable.isActive() && recipeMapWorkable.isWorkingEnabled(); } - - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - ModularUI.Builder builder = ModularUI - .builder(GuiTextures.BACKGROUND_STEAM.get(ConfigHolder.machines.steelSteamMultiblocks), 176, 208); - builder.shouldColor(false); - builder.image(4, 4, 168, 117, GuiTextures.DISPLAY_STEAM.get(ConfigHolder.machines.steelSteamMultiblocks)); - builder.label(9, 9, getMetaFullName(), 0xFFFFFF); - builder.widget(new AdvancedTextWidget(9, 20, this::addDisplayText, 0xFFFFFF) - .setMaxWidthLimit(162) - .setClickHandler(this::handleDisplayClick)); - builder.widget(new IndicatorImageWidget(152, 101, 17, 17, getLogo()) - .setWarningStatus(getWarningLogo(), this::addWarningText) - .setErrorStatus(getErrorLogo(), this::addErrorText)); - builder.bindPlayerInventory(entityPlayer.inventory, - GuiTextures.SLOT_STEAM.get(ConfigHolder.machines.steelSteamMultiblocks), 7, 125); - return builder; - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java index 781ae14b7e3..607ed500ca2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java @@ -1,9 +1,6 @@ package gregtech.common.metatileentities.multi; import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.*; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityUIFactory; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -92,25 +89,6 @@ public boolean hasMaintenanceMechanics() { return false; } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - return ModularUI.builder(GuiTextures.PRIMITIVE_BACKGROUND, 176, 166) - .shouldColor(false) - .widget(new LabelWidget(5, 5, getMetaFullName())) - .widget(new SlotWidget(importItems, 0, 52, 30, true, true) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_FURNACE_OVERLAY)) - .widget(new RecipeProgressWidget(recipeMapWorkable::getProgressPercent, 76, 32, 20, 15, - GuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, ProgressWidget.MoveType.HORIZONTAL, - RecipeMaps.COKE_OVEN_RECIPES)) - .widget(new SlotWidget(exportItems, 0, 103, 30, true, false) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_FURNACE_OVERLAY)) - .widget(new TankWidget(exportFluids.getTankAt(0), 134, 13, 20, 58) - .setBackgroundTexture(GuiTextures.PRIMITIVE_LARGE_FLUID_TANK) - .setOverlayTexture(GuiTextures.PRIMITIVE_LARGE_FLUID_TANK_OVERLAY) - .setContainerClicking(true, false)) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.PRIMITIVE_SLOT, 0); - } - @Override public void randomDisplayTick() { if (this.isActive()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java index 10cc9b911fc..b7dd899205f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPrimitiveBlastFurnace.java @@ -1,12 +1,6 @@ package gregtech.common.metatileentities.multi; import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; -import gregtech.api.gui.widgets.LabelWidget; -import gregtech.api.gui.widgets.ProgressWidget; -import gregtech.api.gui.widgets.RecipeProgressWidget; -import gregtech.api.gui.widgets.SlotWidget; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; @@ -32,7 +26,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.entity.EntityLivingBase; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.SoundEvents; import net.minecraft.util.*; import net.minecraft.util.math.AxisAlignedBB; @@ -148,29 +141,6 @@ public GTGuiTheme getUITheme() { return GTGuiTheme.PRIMITIVE; } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - return ModularUI.builder(GuiTextures.PRIMITIVE_BACKGROUND, 176, 166) - .shouldColor(false) - .widget(new LabelWidget(5, 5, getMetaFullName())) - .widget(new SlotWidget(importItems, 0, 52, 20, true, true) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_INGOT_OVERLAY)) - .widget(new SlotWidget(importItems, 1, 52, 38, true, true) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_DUST_OVERLAY)) - .widget(new SlotWidget(importItems, 2, 52, 56, true, true) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_FURNACE_OVERLAY)) - .widget(new RecipeProgressWidget(recipeMapWorkable::getProgressPercent, 77, 39, 20, 15, - GuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, ProgressWidget.MoveType.HORIZONTAL, - RecipeMaps.PRIMITIVE_BLAST_FURNACE_RECIPES)) - .widget(new SlotWidget(exportItems, 0, 104, 38, true, false) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_INGOT_OVERLAY)) - .widget(new SlotWidget(exportItems, 1, 122, 38, true, false) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_DUST_OVERLAY)) - .widget(new SlotWidget(exportItems, 2, 140, 38, true, false) - .setBackgroundTexture(GuiTextures.PRIMITIVE_SLOT, GuiTextures.PRIMITIVE_DUST_OVERLAY)) - .bindPlayerInventory(entityPlayer.inventory, GuiTextures.PRIMITIVE_SLOT, 0); - } - @Override public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 33985796133..e50e46ac44b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -7,11 +7,7 @@ import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.gui.widgets.ImageCycleButtonWidget; -import gregtech.api.gui.widgets.ImageWidget; -import gregtech.api.gui.widgets.IndicatorImageWidget; import gregtech.api.metatileentity.IFastRenderMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; @@ -58,7 +54,6 @@ import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -359,78 +354,6 @@ public long getHeat() { return heat; } - @Override - protected ModularUI.Builder createUITemplate(EntityPlayer entityPlayer) { - // Background - ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 198, 236); - - // Display - builder.image(4, 4, 190, 138, GuiTextures.DISPLAY); - - // Energy Bar - builder.widget(new gregtech.api.gui.widgets.ProgressWidget( - () -> energyContainer.getEnergyCapacity() > 0 ? - 1.0 * energyContainer.getEnergyStored() / energyContainer.getEnergyCapacity() : 0, - 4, 144, 94, 7, - GuiTextures.PROGRESS_BAR_FUSION_ENERGY, gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(this::addEnergyBarHoverText)); - - // Heat Bar - builder.widget(new gregtech.api.gui.widgets.ProgressWidget( - () -> energyContainer.getEnergyCapacity() > 0 ? 1.0 * heat / energyContainer.getEnergyCapacity() : 0, - 100, 144, 94, 7, - GuiTextures.PROGRESS_BAR_FUSION_HEAT, gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL) - .setHoverTextConsumer(this::addHeatBarHoverText)); - - // Indicator Widget - builder.widget(new IndicatorImageWidget(174, 122, 17, 17, getLogo()) - .setWarningStatus(getWarningLogo(), this::addWarningText) - .setErrorStatus(getErrorLogo(), this::addErrorText)); - - // Title - if (tier == GTValues.LuV) { - // MK1 - builder.widget(new ImageWidget(66, 9, 67, 12, GuiTextures.FUSION_REACTOR_MK1_TITLE).setIgnoreColor(true)); - } else if (tier == GTValues.ZPM) { - // MK2 - builder.widget(new ImageWidget(65, 9, 69, 12, GuiTextures.FUSION_REACTOR_MK2_TITLE).setIgnoreColor(true)); - } else { - // MK3 - builder.widget(new ImageWidget(64, 9, 71, 12, GuiTextures.FUSION_REACTOR_MK3_TITLE).setIgnoreColor(true)); - } - - // Fusion Diagram + Progress Bar - builder.widget(new ImageWidget(55, 24, 89, 101, GuiTextures.FUSION_REACTOR_DIAGRAM).setIgnoreColor(true)); - builder.widget(FusionProgressSupplier.Type.BOTTOM_LEFT.getWidget(this)); - builder.widget(FusionProgressSupplier.Type.TOP_LEFT.getWidget(this)); - builder.widget(FusionProgressSupplier.Type.TOP_RIGHT.getWidget(this)); - builder.widget(FusionProgressSupplier.Type.BOTTOM_RIGHT.getWidget(this)); - - // Fusion Legend - builder.widget(new ImageWidget(7, 98, 108, 41, GuiTextures.FUSION_REACTOR_LEGEND).setIgnoreColor(true)); - - // Power Button + Detail - builder.widget(new ImageCycleButtonWidget(173, 211, 18, 18, GuiTextures.BUTTON_POWER, - recipeMapWorkable::isWorkingEnabled, recipeMapWorkable::setWorkingEnabled)); - builder.widget(new ImageWidget(173, 229, 18, 6, GuiTextures.BUTTON_POWER_DETAIL)); - - // Voiding Mode Button - builder.widget(new ImageCycleButtonWidget(173, 189, 18, 18, GuiTextures.BUTTON_VOID_MULTIBLOCK, - 4, this::getVoidingMode, this::setVoidingMode) - .setTooltipHoverString(this::getVoidingModeTooltip)); - - // Distinct Buses Unavailable Image - builder.widget(new ImageWidget(173, 171, 18, 18, GuiTextures.BUTTON_NO_DISTINCT_BUSES) - .setTooltip("gregtech.multiblock.universal.distinct_not_supported")); - - // Flex Unavailable Image - builder.widget(getFlexButton(173, 153, 18, 18)); - - // Player Inventory - builder.bindPlayerInventory(entityPlayer.inventory, 153); - return builder; - } - @Override protected MultiblockUIFactory createUIFactory() { IDrawable title; From 512657982ea43b676fcb24fc35cc514cce494c17 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Mar 2025 16:35:26 -0700 Subject: [PATCH 186/264] mixin to fix backgrounds and overlays for cycle widgets add buttons to bronze/steel themes update distinct button to be theme-able bronze/steel large boilers are themed --- .../multiblock/ui/MultiblockUIFactory.java | 37 +++++++------ .../java/gregtech/api/mui/GTGuiTextures.java | 44 ++++++++++++++- .../java/gregtech/api/mui/GTGuiTheme.java | 5 +- .../multi/MetaTileEntityLargeBoiler.java | 10 ++++ .../mui2/AbstractCycleButtonWidgetMixin.java | 52 ++++++++++++++++++ .../gui/widget/button_distinct_buses.png | Bin 2344 -> 525 bytes .../gui/widget/button_no_distinct_buses.png | Bin 333 -> 0 bytes .../gregtech/textures/gui/widget/buttons.png | Bin 0 -> 680 bytes src/main/resources/mixins.gregtech.mui2.json | 1 + 9 files changed, 129 insertions(+), 20 deletions(-) create mode 100644 src/main/java/gregtech/mixins/mui2/AbstractCycleButtonWidgetMixin.java delete mode 100644 src/main/resources/assets/gregtech/textures/gui/widget/button_no_distinct_buses.png create mode 100644 src/main/resources/assets/gregtech/textures/gui/widget/buttons.png diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index d9aaaad05a7..4c854f4f9c5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -22,6 +22,7 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -30,6 +31,7 @@ import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; +import com.cleanroommc.modularui.widgets.ToggleButton; import com.cleanroommc.modularui.widgets.layout.Flow; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -360,23 +362,23 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!(mte instanceof IDistinctBusController distinct) || !distinct.canBeDistinct()) { - return GTGuiTextures.BUTTON_NO_DISTINCT_BUSES.asWidget() - .size(18, 18) + return new ToggleButton() + .size(18) + .disableHoverOverlay() + .disableHoverBackground() + .value(new BoolValue.Dynamic(() -> false, b -> {})) + .overlay(GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } - BooleanSyncValue distinctValue = new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct); - - return new CycleButtonWidget() + return new ToggleButton() .size(18, 18) - .value(distinctValue) - .stateBackground(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) - .stateBackground(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) - .background(GTGuiTextures.BUTTON) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> t.addLine(distinctValue.getBoolValue() ? - IKey.lang("gregtech.multiblock.universal.distinct_enabled") : - IKey.lang("gregtech.multiblock.universal.distinct_disabled"))); + .value(new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct)) + .disableHoverBackground() + .overlay(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) + .overlay(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) + .addTooltip(true, IKey.lang("gregtech.multiblock.universal.distinct_enabled")) + .addTooltip(false, IKey.lang("gregtech.multiblock.universal.distinct_disabled")); } protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { @@ -414,12 +416,13 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull controllable = (IControllable) mte; } - return new CycleButtonWidget() + var detail = GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24); + + return new ToggleButton() .size(18) - .stateOverlay(true, GTGuiTextures.BUTTON_POWER[1]) - .stateOverlay(false, GTGuiTextures.BUTTON_POWER[0]) .disableHoverBackground() - .background(GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24), GTGuiTextures.BUTTON) + .overlay(true, detail, GTGuiTextures.BUTTON_POWER[1]) + .overlay(false, detail, GTGuiTextures.BUTTON_POWER[0]) .value(new BooleanSyncValue(controllable::isWorkingEnabled, controllable::setWorkingEnabled)) .marginTop(4); } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 8208bf18aa1..9b3a7edfdbf 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -37,6 +37,10 @@ public static class IDs { public static final String STANDARD_FLUID_SLOT = id("standard_fluid_slot"); public static final String STANDARD_BUTTON = id("standard_button"); + public static final String BRONZE_BUTTON = id("bronze_button"); + public static final String STEEL_BUTTON = id("steel_button"); + public static final String BRONZE_BUTTON_SELECTED = id("bronze_button_sel"); + public static final String STEEL_BUTTON_SELECTED = id("steel_button_sel"); public static final String DISPLAY = id("display"); public static final String DISPLAY_BRONZE = id("display_bronze"); @@ -396,6 +400,42 @@ private static String id(String path) { .canApplyTheme() .build(); + public static final UITexture BUTTON_BRONZE = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/widget/buttons.png") + .imageSize(54, 36) + .uv(18, 0, 18, 18) + .adaptable(2) + .name(IDs.BRONZE_BUTTON) + .canApplyTheme() + .build(); + + public static final UITexture BUTTON_BRONZE_SELECTED = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/widget/buttons.png") + .imageSize(54, 36) + .uv(18, 18, 18, 18) + .adaptable(2) + .name(IDs.BRONZE_BUTTON_SELECTED) + .canApplyTheme() + .build(); + + public static final UITexture BUTTON_STEEL = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/widget/buttons.png") + .imageSize(54, 36) + .uv(36, 0, 18, 18) + .adaptable(2) + .name(IDs.STEEL_BUTTON) + .canApplyTheme() + .build(); + + public static final UITexture BUTTON_STEEL_SELECTED = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/widget/buttons.png") + .imageSize(54, 36) + .uv(36, 18, 18, 18) + .adaptable(2) + .name(IDs.STEEL_BUTTON_SELECTED) + .canApplyTheme() + .build(); + public static final UITexture MC_BUTTON = new UITexture.Builder() .location("modularui", "gui/widgets/mc_button.png") // todo .imageSize(16, 32) @@ -449,8 +489,8 @@ private static String id(String path) { */ public static final UITexture[] BUTTON_DISTINCT_BUSES = slice("textures/gui/widget/button_distinct_buses.png", 18, 36, 18, 18, true); - public static final UITexture BUTTON_NO_DISTINCT_BUSES = fullImage( - "textures/gui/widget/button_no_distinct_buses.png", true); + // public static final UITexture BUTTON_NO_DISTINCT_BUSES = fullImage( + // "textures/gui/widget/button_no_distinct_buses.png", true); public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index 4ccfc5c753e..a4830e67d28 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -34,7 +34,6 @@ public class GTGuiTheme { .simpleToggleButton(GTGuiTextures.IDs.STANDARD_BUTTON, GTGuiTextures.IDs.STANDARD_SLOT, ConfigHolder.client.defaultUIColor) - .displayBackground(GTGuiTextures.IDs.DISPLAY) .build(); public static final GTGuiTheme COVER = templateBuilder("gregtech_cover") @@ -51,6 +50,8 @@ public class GTGuiTheme { .panel(GTGuiTextures.IDs.BRONZE_BACKGROUND) .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) + .simpleToggleButton(GTGuiTextures.IDs.BRONZE_BUTTON, GTGuiTextures.IDs.BRONZE_BUTTON_SELECTED, + ConfigHolder.client.defaultUIColor) .build(); public static final GTGuiTheme STEEL = templateBuilder("gregtech_steel") @@ -58,6 +59,8 @@ public class GTGuiTheme { .textColor(Color.WHITE.darker(1)) .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) + .simpleToggleButton(GTGuiTextures.IDs.STEEL_BUTTON, GTGuiTextures.IDs.STEEL_BUTTON_SELECTED, + ConfigHolder.client.defaultUIColor) .build(); public static final GTGuiTheme PRIMITIVE = templateBuilder("gregtech_primitive") diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index e891c1023de..f8a27b16284 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -13,6 +13,7 @@ import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -139,6 +140,15 @@ protected void configureWarningText(MultiblockUIBuilder builder) { }); } + @Override + public GTGuiTheme getUITheme() { + return switch (this.boilerType) { + case BRONZE -> GTGuiTheme.BRONZE; + case STEEL -> GTGuiTheme.STEEL; + default -> super.getUITheme(); + }; + } + @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() diff --git a/src/main/java/gregtech/mixins/mui2/AbstractCycleButtonWidgetMixin.java b/src/main/java/gregtech/mixins/mui2/AbstractCycleButtonWidgetMixin.java new file mode 100644 index 00000000000..5f72806e42e --- /dev/null +++ b/src/main/java/gregtech/mixins/mui2/AbstractCycleButtonWidgetMixin.java @@ -0,0 +1,52 @@ +package gregtech.mixins.mui2; + +import com.cleanroommc.modularui.api.ITheme; +import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.theme.WidgetTheme; +import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.AbstractCycleButtonWidget; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Arrays; + +@Mixin(value = AbstractCycleButtonWidget.class, remap = false) +public class AbstractCycleButtonWidgetMixin> extends Widget { + + @Shadow + protected IDrawable[] hoverBackground; + + @Shadow + protected IDrawable[] hoverOverlay; + + @ModifyReturnValue(method = "getCurrentOverlay", at = @At(value = "RETURN", ordinal = 0)) + public IDrawable fixOverlay(IDrawable original, + @Local(argsOnly = true) ITheme theme, + @Local(argsOnly = true) WidgetTheme widgetTheme) { + return original != IDrawable.NONE ? original : super.getCurrentOverlay(theme, widgetTheme); + } + + @ModifyReturnValue(method = "getCurrentBackground", at = @At(value = "RETURN", ordinal = 0)) + public IDrawable fixBackground(IDrawable original, + @Local(argsOnly = true) ITheme theme, + @Local(argsOnly = true) WidgetTheme widgetTheme) { + return original != IDrawable.NONE ? original : super.getCurrentBackground(theme, widgetTheme); + } + + @Override + public W disableHoverBackground() { + if (this.hoverBackground != null) + Arrays.fill(this.hoverBackground, IDrawable.NONE); + return getThis(); + } + + @Override + public W disableHoverOverlay() { + if (this.hoverOverlay != null) + Arrays.fill(this.hoverOverlay, IDrawable.NONE); + return getThis(); + } +} diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/button_distinct_buses.png b/src/main/resources/assets/gregtech/textures/gui/widget/button_distinct_buses.png index 9db435b36bc3fc34fc0b6ed081225f8621b22e28..4ab3c6f5c9acd65d8d609f7485314b84197c51b5 100644 GIT binary patch delta 290 zcmZ1>)XOr#aH8X}db^S!zhH*{lz@xgzv>tm7`A)5IEH9UOioZ>HQ2milVah`n~f~& z(mkw#N$$x9W_lVqV+^0qIR{b}`42i&?~$ zJH2`2{!M^`qu}!=!wY;1TD2q!5;_u?6cYsl4GTF{1U)q~B_k~>StaBpR&{wf2&RgL zE(r)_?p%?bq13u+#hN+Owzc)?1+C~h`Eq6U3uy_U;KYr)I#mdKI;Vst0Q|a;>;M1& literal 2344 zcmc&#eP|PB7(bb!wySPcMBHGsYsC+w9ncDRX~}{W0es4rER?)WJ{?6gIo}^0f$^$`~wg zxqI(^&+qwof6x2u3b!>^RV=H(Fsv%j;%`UyYIHq6?+NsO+Hv3_y3I1$n;Wqc-#&XC zEoR5PAuon~_(tU);vBU8EF6q9O;1nn-o4x9a^3HnbsJ*WdaxflvDVhsYcFH>`>^xt zu&EICOAmG`fE{VVrrNNt+p)uk-<_PCoS2vx-#0!sHnwx;&XJLkty_l=O-`;0hl6X^ zHa9o>e7^endLV%GK>DqTiC}Q800fTXRZSZoALn_Vrs=-^J^=up<88IIP?iA@Y_+zU zniV}gJ)%l zYZi9k;8F~myF`g}nw_B_kkq7Il+`G-XOkL2V_027RuiRuXyQ>AS5hA0_cLD*xFUOq zjeLj>X+GGiv<&I6W2h}64fRWcOf=M2Rn%nxVn{+$#Iwmn$^cmpks}7^*?LV8cn)Ir zdkC-P5$_Czai6L~+-avtiKbcHCD<7!$2n;m&eAMR(LBYlB;y1$2N)M#_z}n*j@RjO z47B^#6x^Yehv+p;4Nz1jld)$Uc2$p4j35XU%~C8&A_Qp+rc5zQri|rzk^+q%8j`MP zrlO{Bi&l)PY12cXi1Vo=wGwyADAWs8j>?J}#n@>pwH#2EN;oa8Cvp+U5(N`52~(zl zuuKW7^{S?7^s4_rUHbfh161NrsN`eDSdz(-3&U(0Kxq`JG9%iE3~G>ShlZNgCD=58 z!dz};qXC}|MN`!ys+uTnShyH6&N6luU%639$!f+}Rb~MFq6s|&+C7G(T_j6K7#?su za5zb{hcumshE!RJ4bBJ^0Lwi9MbeQ)Q+y;?mOxC^lOjr3Ns4huX{k7Ym&yoyYC_eK zV-%gE{C&XZ3+rl3NuUqS0VK(2T1l9slESUCAs25b1Oh3;6jKrm_&o%wj$Kh?5ak7# zm7NS3lVdJYkT{MMCBZ>LfpJQ*?4%`uFWUQ6DQ#)Mvd_1LtV)RE@A#seLymE7fpoHx zND2~dHO>+_{LPW;9 zS&rwp7|XbsqWF>gbBY2jih=feFxOc5F3Yu72i#Kjs?aP61k=|dEh_im^$Gb8HI8%Je*v_h%JNW>5a9-amxasnqsX;S1xhD6(i zo*Zb~X_s4)p%V%Y-c>BajA@js`(LGzHZJg`qHV-lka%{JUc(2HjIBPe6#VXd+gcKienq(MQ@(ichtYV z?ckA-dDZ8ays{*5cVR1x1)s#%|Gehh>|-a-ycVo%nb&#e%B>4K$ki|1{c=}gY+2{+ z$hI5ruZJCt%E?j9In}yK=-$5iIM<-g?&CHkFJCubxN&E$@6t14bM|hi=^#$uYwSx0 z&Mj;_y8iN=4L3KR-rt>`I`rIc3-^A1Px$21!IgR5(v#G&eW@&p;sv2?=3f1Q`TkPy$LyO7I(0e7}t0%kTdTpMEhgeEP}2 zu+_L5t9=*-?ccv2tkBWX5w0Qfaw*s#WJA!^;WP-{Fl1-I3_(_d)oa)k!VJPChck?@ zX~1Uzib2KqOBs3<5rK)U5!q|V;b(oUl;NmVHv@`6>9-((x?BghVd#c@`@_I+-VV*6 z=qsfRAJC#0-Brj286GNS02y@C3C$qyv!z(07(L-28z#G}l;N=(nn8r3nCQSJ6vZHU zqN5+5t@tb=DvN-k_}gCwhV!4s=xJ63o1tQKl)Zt3iU>qXO#}nBT zLJtK1ZQGJW-h0$5z&)NM&wZLHMUn>qGP2=EkuYvZ7&j!08xqD13FC%@aYMqmp`3H@ z-jhY+5WoKvg%J7~EI`(E9a&&~6abWENs?G=acLSHwri4Sw^;&1L{aQX z9kJCNEkOHj2p@r18Xf=RAKt3W Date: Sat, 29 Mar 2025 16:53:16 -0700 Subject: [PATCH 187/264] convert flex and void into overlays flex and void buttons are now theme-able --- .../multiblock/ui/MultiblockUIFactory.java | 28 ++++++++++-------- .../java/gregtech/api/mui/GTGuiTextures.java | 9 +++--- .../java/gregtech/api/mui/GTGuiTheme.java | 2 ++ .../multi/MetaTileEntityLargeBoiler.java | 4 +-- .../textures/gui/widget/button_no_flex.png | Bin 1843 -> 547 bytes .../gui/widget/button_void_multiblock.png | Bin 368 -> 330 bytes .../textures/gui/widget/button_void_none.png | Bin 221 -> 186 bytes 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 4c854f4f9c5..dea182463d7 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -10,6 +10,7 @@ import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; +import gregtech.common.ConfigHolder; import gregtech.common.mui.widget.ScrollableTextWidget; import net.minecraft.util.text.TextFormatting; @@ -28,6 +29,7 @@ import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widget.ParentWidget; import com.cleanroommc.modularui.widget.Widget; +import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; @@ -344,7 +346,8 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync PosGuiData guiData) { IWidget flexButton = this.flexButton.apply(guiData, panelSyncManager); if (flexButton == null) { - flexButton = GTGuiTextures.BUTTON_NO_FLEX.asWidget() + flexButton = new ButtonWidget<>() + .overlay(GTGuiTextures.OVERLAY_NO_FLEX) .size(18) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")); } @@ -367,7 +370,7 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, .disableHoverOverlay() .disableHoverBackground() .value(new BoolValue.Dynamic(() -> false, b -> {})) - .overlay(GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) + .overlay(GTGuiTextures.OVERLAY_DISTINCT_BUSES[0]) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } @@ -375,31 +378,30 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, .size(18, 18) .value(new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct)) .disableHoverBackground() - .overlay(true, GTGuiTextures.BUTTON_DISTINCT_BUSES[1]) - .overlay(false, GTGuiTextures.BUTTON_DISTINCT_BUSES[0]) + .overlay(true, GTGuiTextures.OVERLAY_DISTINCT_BUSES[1]) + .overlay(false, GTGuiTextures.OVERLAY_DISTINCT_BUSES[0]) .addTooltip(true, IKey.lang("gregtech.multiblock.universal.distinct_enabled")) .addTooltip(false, IKey.lang("gregtech.multiblock.universal.distinct_disabled")); } protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!mte.shouldShowVoidingModeButton()) { - return GTGuiTextures.BUTTON_VOID_NONE.asWidget() - .size(18, 18) + return new ButtonWidget<>() + .size(18) + .overlay(GTGuiTextures.OVERLAY_VOID_NONE) .addTooltipLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported")); } IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); return new CycleButtonWidget() - .size(18, 18) + .size(18) + .value(voidingValue) + .length(4) .stateOverlay(0, GTGuiTextures.MULTIBLOCK_VOID[0]) .stateOverlay(1, GTGuiTextures.MULTIBLOCK_VOID[1]) .stateOverlay(2, GTGuiTextures.MULTIBLOCK_VOID[2]) .stateOverlay(3, GTGuiTextures.MULTIBLOCK_VOID[3]) - .background(GTGuiTextures.BUTTON) - .value(voidingValue) - .length(4) - .tooltipAutoUpdate(true) .tooltipBuilder(t -> t.addLine(IKey.lang(mte.getVoidingModeTooltip(voidingValue.getIntValue())))); } @@ -411,7 +413,9 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull // todo in the future, refactor so that this multis are instanceof IControllable. controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); if (controllable == null) return null; - GTLog.logger.warn("MTE [{}] does not extend IControllable when it should!", mte.getClass().getSimpleName()); + if (ConfigHolder.misc.debug) + GTLog.logger.warn("MTE [{}] does not extend IControllable when it should!", + mte.getClass().getSimpleName()); } else { controllable = (IControllable) mte; } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 9b3a7edfdbf..f3362f683db 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -481,17 +481,16 @@ private static String id(String path) { public static final UITexture[] MULTIBLOCK_VOID = slice("textures/gui/widget/button_void_multiblock.png", 18, 72, 18, 18, true); - public static final UITexture BUTTON_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); + public static final UITexture OVERLAY_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); /** * 0 = DISABLED
* 1 = ENABLED
*/ - public static final UITexture[] BUTTON_DISTINCT_BUSES = slice("textures/gui/widget/button_distinct_buses.png", + public static final UITexture[] OVERLAY_DISTINCT_BUSES = slice("textures/gui/widget/button_distinct_buses.png", 18, 36, 18, 18, true); - // public static final UITexture BUTTON_NO_DISTINCT_BUSES = fullImage( - // "textures/gui/widget/button_no_distinct_buses.png", true); - public static final UITexture BUTTON_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); + + public static final UITexture OVERLAY_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png", diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index a4830e67d28..aaed3534456 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -50,6 +50,7 @@ public class GTGuiTheme { .panel(GTGuiTextures.IDs.BRONZE_BACKGROUND) .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) + .button(GTGuiTextures.IDs.BRONZE_BUTTON) .simpleToggleButton(GTGuiTextures.IDs.BRONZE_BUTTON, GTGuiTextures.IDs.BRONZE_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) .build(); @@ -59,6 +60,7 @@ public class GTGuiTheme { .textColor(Color.WHITE.darker(1)) .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) + .button(GTGuiTextures.IDs.STEEL_BUTTON) .simpleToggleButton(GTGuiTextures.IDs.STEEL_BUTTON, GTGuiTextures.IDs.STEEL_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) .build(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index f8a27b16284..f46a183fc60 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -156,11 +156,9 @@ protected MultiblockUIFactory createUIFactory() { var throttle = syncManager.panel("throttle_panel", this::makeThrottlePanel, true); return new ButtonWidget<>() - .width(18) + .size(18) .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) - // todo lang .addTooltipLine(IKey.lang("gregtech.multiblock.large_boiler.throttle_button.tooltip")) - .background(GTGuiTextures.BUTTON) .onMousePressed(i -> { if (throttle.isPanelOpen()) { throttle.closePanel(); diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/button_no_flex.png b/src/main/resources/assets/gregtech/textures/gui/widget/button_no_flex.png index b2c4bcbcd86a6c8fabf43686c10995429dacdc5b..fd1ae436da99b8fbbb207d17e3e671fdbc762954 100644 GIT binary patch delta 497 zcmVKgX;p(iP|mut)&sLt)*H|6|(0OBHYZPyA#2><{93{aD_0Tx*V zbW%=J0RR90vn@b~0000qNkl6onvP@JJW8V-Q9K<*t%^uwo)X_@pe1zG0W_< zyG4yqiJ{g~KtVhR5K$4iY(f-4rG-ReIZO;%4^n7|ggclRP{8_TyIV`bBy+qs-~YYu z|K9)pPH$~ZUha%slgX6lb~)27Zuh$FcEqcxekBAok8d{) zHU)#i{Opd|`DJDEoilT;z1O`FaYR>cJF)#p&z+l#E)c~NIw!Y4un!}f_zd!w@ zIgZSXogVi5eb<6g_qo5?Yr1*0Xz%oqX3r;ce_l7klNdZz_Si+|#lFK;D{dc%4le(x zp+C@X+dvoJ->H9a^5E;1ich!Zly%#zAfYy z=tDjKygKyDmskG%y8c6N!POnMTVFli@tgPeKaU+OIy--s{l>KAzk*k8=D$|q7@8N{ zp7q1AjLVJS^x)bqPs_`vu5GxvQilc{`RA}UBhpd%s(C=nZa z>*zNqqR2M1k?|0os2#K@uGJc7SY7LrRtF_cMi*A(<(4OS$Pfm)fF#19NQ_U|&?GSr zzl~`eMUoIbXhWMkUc|0y0HMvanZTS0rHw)%34)YsvY)SaRHsPb$cDD)dX&fUcsy>7 zTg<8!z)6ndaDu`q3WEqN)*jJ?1Qv-Ejgq8j93UoXN>o?W2x8C*qS~t4P^e>6U^wdW zjIl>zDIcICctVKcq?y3OVMBEi9n+m{FgT^Z75|XQbTV@(ESi3P#bv&}2fqT?2xyYCcsB*-%3RV#K6t6;|u0`z|F0QSHfd zfF!TvX=nhe#!aPaJES1VisS`pbg7uo24plfDYXcZ0DwmpR?8?%dBl#;gvg2&|oxp!#u7<+e8t<#jc$d+YcjcaCZO(~~DoXk9eVXqawit>Zw|%8vg4 D6S#8= diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/button_void_multiblock.png b/src/main/resources/assets/gregtech/textures/gui/widget/button_void_multiblock.png index f2133f16ec8dd49e1e1b0b0ac46bad6ab3e1367c..3b8353e371d799fadfc492c8da0f8e8d6e1177d3 100644 GIT binary patch delta 275 zcmV+u0qp+p0?GoA7#0Wv0002Y1y%F_0004VQb$4nuFf3kkv=PbbW%=J0RR90|NsC0 z|2G1g)Bpeg$Vo&&R5*>Tl2H!8AP7U3iO&0m(@&CPmy6 z&aTOj2OgV385NlKDQ5%;9nH5n2?{hWjfNsLg6 zH^Nld0>LP5VjD1WUE-T(5PGvNl9Fsv#69`ynhc4ceojJ#WJV~(8(}JJfnXFju??6m z@y#;`y;=3ac!0hwZNWXdYP6pGB774UsQy)VtNK^Hv3|@oO8!>sUv;-ST;g4|MeIWV Z(G7mu5AC6l8>j#P002ovPDHLkV1k07dI$gj delta 314 zcmV-A0mc5x0`LNm7$yV*00009^|t?HuYV95)DX(g)~?ak&H&98;wRLuoi^8bxz1R zuUiYylJj0K@MQ18&e!^lvuvpbqxzHi!9qHJClZm2W~3*LW+q4pgr*duP>hpq6F^IG zn)Cus_Acyvuip-3ezA})g+wHy73oc*l?h4#p-^%b$~ow^0JM}t&izSw^e0p_#EE{f0ejX6#urQ@bri&5S*3<}Vj^Uh21BnT`1XiI$dPSA-vs00009 M07*qoM6N<$f)ty8egFUf diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/button_void_none.png b/src/main/resources/assets/gregtech/textures/gui/widget/button_void_none.png index c4c436aa1a85264554190d18086158c3457b97af..cf30bdd5357f163726b75c3156670187698e772f 100644 GIT binary patch delta 140 zcmcc1xQlUugct`i0|P^%KwT=3Vk{1FcVbv~PUhuAJH>3ak|4iehW{W?Rr%l_P~OGU z#W6%;YI1^tlz}qi3Jz`=ht>&KHy9*qG;wd-)bzta$dg0oP?HYJqfLvlSUMZ03JEY} prnqhtOk<35U+|l~dwC}#!_7*j(|ayW`T#VK!PC{xWt~$(696^wGF|`x delta 175 zcmdnRc$aa4gc=Jo0|Ud72a{8P6k~CayA#8@b22Z19F}xPUq=Rpjs4tz5?LqeDb{fo zctjR6Fz_7&Va6R3v)=+$g?PF+hDcmaZeVm{b93YnVA|Akkl}<-86%?rx6%`yl$i}J za}KTv5T72vp?&1&RnbF5rM!)&cD3wC+7#pLw7{w%>Vhxh>>Q5myl=#2tZtcdz`>J~ YK`B_ewAy+8BcS;Vp00i_>zopr0LlS6@Bjb+ From bb5f7a5d1b00f8909ebe1afc0e623f22162161f0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:01:27 -0700 Subject: [PATCH 188/264] improve getting parallel recipe improve chance calculation slightly --- .../capability/impl/AbstractRecipeLogic.java | 10 +- .../multiblock/ui/MultiblockUIBuilder.java | 91 +++++++++---------- 2 files changed, 48 insertions(+), 53 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index 339b11381c7..e92b3b13295 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -187,12 +187,6 @@ protected IMultipleTankHandler getOutputTank() { return metaTileEntity.getExportFluids(); } - public Recipe getParallelRecipe() { - if (previousRecipe == null) return null; - return findParallelRecipe(previousRecipe, getInputInventory(), getInputTank(), - getOutputInventory(), getOutputTank(), getMaxParallelVoltage(), getParallelLimit()); - } - /** * @return true if energy is consumed by this Recipe Logic, otherwise false */ @@ -347,6 +341,10 @@ public void setParallelRecipesPerformed(int amount) { this.parallelRecipesPerformed = amount; } + public int getParallelRecipesPerformed() { + return parallelRecipesPerformed; + } + /** * Update the current running recipe's progress *

diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index a3fc6f6c13d..36e818d6933 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -7,7 +7,6 @@ import gregtech.api.mui.drawable.GTObjectDrawable; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; -import gregtech.api.recipes.chance.boost.ChanceBoostFunction; import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; import gregtech.api.util.GTHashMaps; @@ -516,6 +515,8 @@ public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) return addRecipeOutputLine(arl, DEFAULT_MAX_RECIPE_LINES); } + private Recipe cachedRecipe = null; + /** * Adds the current outputs of a recipe from recipe logic. Items then fluids. * @@ -523,15 +524,24 @@ public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) * @param maxLines the maximum number of lines to print until truncating with {@code ...} */ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxLines) { - // todo doing this every tick on the server is probably not good - Recipe recipe = arl.getParallelRecipe(); + Recipe recipe = arl.getPreviousRecipe(); + if (cachedRecipe == null && recipe != null) { + cachedRecipe = recipe; + } else if (cachedRecipe == null) { + // find new recipe + } else if (arl.getMaxProgress() == 0) { + cachedRecipe = null; + } - if (getSyncer().syncBoolean(recipe == null)) return this; + if (getSyncer().syncBoolean(cachedRecipe == null)) return this; if (getSyncer().syncBoolean(arl.getRecipeMap() == null)) return this; - // noinspection DataFlowIssue - long eut = getSyncer().syncLong(() -> recipe.getEUt()); + int p = arl.getParallelRecipesPerformed(); + if (p == 0) p = 1; + + long eut = getSyncer().syncLong(() -> cachedRecipe.getEUt()); long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); + int maxProgress = arl.getMaxProgress(); List itemOutputs = new ArrayList<>(); List chancedItemOutputs = new ArrayList<>(); @@ -539,12 +549,10 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL List chancedFluidOutputs = new ArrayList<>(); if (isServer()) { - // recipe is checked indirectly for null - // noinspection DataFlowIssue - itemOutputs.addAll(recipe.getOutputs()); - chancedItemOutputs.addAll(recipe.getChancedOutputs().getChancedEntries()); - fluidOutputs.addAll(recipe.getFluidOutputs()); - chancedFluidOutputs.addAll(recipe.getChancedFluidOutputs().getChancedEntries()); + itemOutputs.addAll(cachedRecipe.getOutputs()); + chancedItemOutputs.addAll(cachedRecipe.getChancedOutputs().getChancedEntries()); + fluidOutputs.addAll(cachedRecipe.getFluidOutputs()); + chancedFluidOutputs.addAll(cachedRecipe.getChancedFluidOutputs().getChancedEntries()); } itemOutputs = getSyncer().syncCollection(itemOutputs, ByteBufAdapters.ITEM_STACK); @@ -563,11 +571,13 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL Object2IntMap itemMap = GTHashMaps.fromItemStackCollection(itemOutputs); for (var stack : itemMap.keySet()) { - addItemOutputLine(stack, itemMap.getInt(stack), arl.getMaxProgress()); + addItemOutputLine(stack, (long) itemMap.getInt(stack) * p, maxProgress); } for (var chancedItemOutput : chancedItemOutputs) { - addChancedItemOutputLine(chancedItemOutput, chanceFunction, recipeTier, machineTier, arl.getMaxProgress()); + int chance = chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier); + int count = chancedItemOutput.getIngredient().getCount() * p; + addChancedItemOutputLine(chancedItemOutput.getIngredient(), count, chance, maxProgress); } // fluids @@ -575,12 +585,13 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL Object2IntMap fluidMap = GTHashMaps.fromFluidCollection(fluidOutputs); for (var stack : fluidMap.keySet()) { - addFluidOutputLine(stack, fluidMap.getInt(stack), arl.getMaxProgress()); + addFluidOutputLine(stack, fluidMap.getInt(stack), maxProgress); } for (var chancedFluidOutput : chancedFluidOutputs) { - addChancedFluidOutputLine(chancedFluidOutput, chanceFunction, recipeTier, machineTier, - arl.getMaxProgress()); + int chance = chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier); + int count = chancedFluidOutput.getIngredient().amount * p; + addChancedFluidOutputLine(chancedFluidOutput.getIngredient(), count, chance, maxProgress); } return this; } @@ -626,49 +637,35 @@ private void addFluidOutputLine(@NotNull FluidStack stack, long count, int recip /** * Add a chanced item output of a recipe to the display. * - * @param chancedItemOutput chanced item output - * @param boostFunction function to calculate boosted chance - * @param recipeTier voltage tier of the recipe - * @param machineTier machine tier - * @param recipeLength max duration of the recipe - */ - private void addChancedItemOutputLine(@NotNull ChancedItemOutput chancedItemOutput, - ChanceBoostFunction boostFunction, - int recipeTier, int machineTier, int recipeLength) { - var stack = chancedItemOutput.getIngredient(); + * @param recipeLength max duration of the recipe + */ + private void addChancedItemOutputLine(@NotNull ItemStack stack, + int chance, int count, int recipeLength) { IKey name = KeyUtil.string(TextFormatting.AQUA, stack.getDisplayName()); - IKey amount = KeyUtil.number(TextFormatting.GOLD, stack.getCount()); - IKey rate = KeyUtil.string(TextFormatting.WHITE, - formatRecipeRate(getSyncer().syncInt(recipeLength), stack.getCount())); + IKey amount = KeyUtil.number(TextFormatting.GOLD, count); + IKey rate = KeyUtil.string(TextFormatting.WHITE, formatRecipeRate(getSyncer().syncInt(recipeLength), count)); - addKey(new GTObjectDrawable(chancedItemOutput, stack.getCount()) - .setBoostFunction(entry -> boostFunction.getBoostedChance(entry, recipeTier, machineTier)) + addKey(new GTObjectDrawable(stack, count) + .setBoostFunction(entry -> chance) .asIcon() .asHoverable() .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); - // addKey(IKey.SPACE, Operation.ADD); } /** * Add a chanced fluid output of a recipe to the display. * - * @param chancedFluidOutput chanced fluid output - * @param boostFunction function to calculate boosted chance - * @param recipeTier voltage tier of the recipe - * @param machineTier machine tier - * @param recipeLength max duration of the recipe - */ - private void addChancedFluidOutputLine(@NotNull ChancedFluidOutput chancedFluidOutput, - ChanceBoostFunction boostFunction, - int recipeTier, int machineTier, int recipeLength) { - var stack = chancedFluidOutput.getIngredient(); + * @param recipeLength max duration of the recipe + */ + private void addChancedFluidOutputLine(@NotNull FluidStack stack, + int count, int chance, int recipeLength) { IKey name = KeyUtil.fluid(TextFormatting.AQUA, stack); - IKey amount = KeyUtil.number(TextFormatting.GOLD, stack.amount); + IKey amount = KeyUtil.number(TextFormatting.GOLD, count); IKey rate = KeyUtil.string(TextFormatting.WHITE, - formatRecipeRate(getSyncer().syncInt(recipeLength), stack.amount)); + formatRecipeRate(getSyncer().syncInt(recipeLength), count)); - addKey(new GTObjectDrawable(chancedFluidOutput, stack.amount) - .setBoostFunction(entry -> boostFunction.getBoostedChance(entry, recipeTier, machineTier)) + addKey(new GTObjectDrawable(stack, count) + .setBoostFunction(entry -> chance) .asIcon() .asHoverable() .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); From 7898f35e30c97638c0ec9e5124e41b397e4db80b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 29 Mar 2025 22:31:05 -0700 Subject: [PATCH 189/264] make power into overlay title margin for GTFluidSlot work on multiblock tank slot --- .../multiblock/ui/MultiblockUIFactory.java | 6 +-- .../java/gregtech/api/mui/GTGuiTextures.java | 7 ++- .../multi/MetaTileEntityMultiblockTank.java | 43 ++++++++---------- .../common/mui/widget/GTFluidSlot.java | 3 +- .../textures/gui/widget/button_power.png | Bin 2180 -> 926 bytes 5 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index dea182463d7..56f48742d12 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -23,7 +23,6 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; -import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; @@ -365,11 +364,8 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!(mte instanceof IDistinctBusController distinct) || !distinct.canBeDistinct()) { - return new ToggleButton() + return new ButtonWidget<>() .size(18) - .disableHoverOverlay() - .disableHoverBackground() - .value(new BoolValue.Dynamic(() -> false, b -> {})) .overlay(GTGuiTextures.OVERLAY_DISTINCT_BUSES[0]) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index f3362f683db..d7e69356db9 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -273,8 +273,11 @@ private static String id(String path) { "textures/gui/primitive/overlay_primitive_dust.png"); public static final UITexture PRIMITIVE_INGOT_OVERLAY = fullImage( "textures/gui/primitive/overlay_primitive_ingot.png"); - public static final UITexture PRIMITIVE_LARGE_FLUID_TANK = fullImage( - "textures/gui/primitive/primitive_large_fluid_tank.png"); + public static final UITexture PRIMITIVE_LARGE_FLUID_TANK = new UITexture.Builder() + .location(GTValues.MODID, "textures/gui/primitive/primitive_large_fluid_tank.png") + .fullImage() + .adaptable(2) + .build(); public static final UITexture PRIMITIVE_LARGE_FLUID_TANK_OVERLAY = fullImage( "textures/gui/primitive/primitive_large_fluid_tank_overlay.png"); public static final UITexture PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR = fullImage( diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java index e5574afd82a..d717903228e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityMultiblockTank.java @@ -10,7 +10,6 @@ import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; -import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.client.renderer.ICubeRenderer; @@ -39,9 +38,7 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.factory.PosGuiData; -import com.cleanroommc.modularui.screen.ModularPanel; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.widgets.TextWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -142,26 +139,24 @@ protected boolean openGUIOnRightClick() { @Override protected MultiblockUIFactory createUIFactory() { - return new MultiblockUIFactory(this) { - - @Override - public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - var panel = GTGuis.createPanel(MetaTileEntityMultiblockTank.this, 176, 166); - - panel.child(new TextWidget(IKey.lang(getMetaFullName())) - .pos(5, 5)); - panel.child(new GTFluidSlot() - .pos(52, 18) - .size(72, 61) - .background(GTGuiTextures.SLOT) - .syncHandler(GTFluidSlot.sync(importFluids.getTankAt(0)) - .showAmountOnSlot(false) - .drawAlwaysFull(false))); - panel.bindPlayerInventory(); - - return panel; - } - }; + return new MultiblockUIFactory(this) + .setSize(176, 166) + .disableDisplay() + .disableButtons() + .addScreenChildren((parent, syncManager) -> { + parent.child(new TextWidget(IKey.lang(getMetaFullName())) + .pos(5, 5)); + parent.child(new GTFluidSlot() + .pos(52, 18) + .size(72, 61) + // todo this looks ugly + .overlay(GTGuiTextures.PRIMITIVE_LARGE_FLUID_TANK_OVERLAY.asIcon() + .alignment(Alignment.CenterLeft) + .size(30, 58)) + .syncHandler(GTFluidSlot.sync(importFluids.getTankAt(0)) + .showAmountOnSlot(false) + .drawAlwaysFull(false))); + }); } @Override diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 307f89b2d30..d59aa3778c4 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -45,8 +45,7 @@ public final class GTFluidSlot extends Widget implements Interactab private boolean disableBackground = false; public GTFluidSlot() { - tooltip().setAutoUpdate(true); - // .setHasTitleMargin(true); + tooltip().setAutoUpdate(true).titleMargin(); tooltipBuilder(tooltip -> { if (!isSynced()) return; var fluid = this.syncHandler.getFluid(); diff --git a/src/main/resources/assets/gregtech/textures/gui/widget/button_power.png b/src/main/resources/assets/gregtech/textures/gui/widget/button_power.png index 325c064669fe86bfaf609a0d789f1b49831ef201..64d71a2ee0000b72a825527bdb8ce2b8866cbeb4 100644 GIT binary patch delta 664 zcmZn>oX0-FynbTsL~9RbM-kWlK+g#st(qY^+XA#%0|mW%odiUjLOz7=*lj3(BJWUM zQ}5CQ?T8P@*L}^+#d`e$i)-%%E&f%ej0Je z`A}@(>1n_A{S-Pbx?X#m5$onV%V!zv$U1*kBeqOkP;I7KSDRy_iR7m*Co{Vr2~GZ8 zz+3NrQC@Vq;yROM7HTJw>KBUtU19%Y?%LTBG8&;=Z3{o%{Cscs!Tr4Vqvw4ueNuV< zc))*_>19Xf+qO*Pzqnm1>N?|=oC7~YU5(2gBnjV=E8ewOd}-CqeJ)J*{GQGhTkw@_ z)-zyd^-Aj7w}tAOTc>BAkzH}_?S1p7f9e<>DHY{j=W^v_U|_f!FnJ5( z{d)J3AirRS|5O1=Eze?rCNK7MaSYLzxV8T(-(dqDSKZ1pXLw|djo<&b&lIT6o!q|i zQrT1u_2WS$%n6$H9r0H`>rFd2!D%t$#=y#F;#{gf6uge!GrT_i?EmD=+NU0x+>g!s zP;v12bzcRErUI5l8!cwL7_m+`$BFU3ksU z!sDJS=eKP0b;Ed_uSu)FrtQ8h-*@cS^3PAJc5Cn7GL3!TC$2^7Pge5k0v*iY>FVdQ I&MBb@0PM6{lmGw# literal 2180 zcmZux4Nwzj8V*NQpknzurS@#s1y2w*`;!gHE(9eBkO;v5QBXK_lih?ZNjBXq5Uh?< z&hrEgL2rs^wbWLu{juI*o&IQhgZAcbPC51FXrXFR#yiK~UT@k%uZ6vD1L5e5nb~B& zFVFLQ@B4i3`?lK4isR!J$Ej4Rc&o)+0e+LflO7WdzE5fn45?I6ExgHOx0+0lT@>8B zms6=SF21}c*AiWjQrKDEYWeJJ%8G?G$6k&qPb}$ZiHTcUw5#{*wT@O}V{&6!PIt@k z%{SisrfRslzMjd7X?ZRoH#e*Bnb^CpbaX-Hz~-KFhd$~Yf3WI0R=>gj3$(g%ptZC3 z)XjSb7j9i@j*fcGrn~loB|FDD^j&jt2Q8$%y-=>Py|wI%9gA(D;S0HQZWP`aIAz@U z&3l32+RrP`dd?bllNmp}CcW|5i8f9CJKeFltq+d{s;kdCepf#5&wf|zQ!!0Pvup0m z+qqa4AFfQb(aI%kAy$I-PFy>eUID zFPUyxuwv6wgvcD0eQ(S2e_kD*?RNLc{F}0EkG!@=_P!;@r8{CXYCL^%?Lm3%0lBDM zF71-byXBal8Do}~RqdB6_sJz)vT^5xxpi`Nr)>F+Ol=!qwPVuw>q+CzNuu#zWawee z)`z-nk5KV$wr@-={3E;mMy6*N+Blfbj;!#0mF2sh?)v+Zs!yJ-`292MK1^pWXVhI? zRB~jI^>9i-PhwtsVqV)%joqmwN1)ns3Ar6f`CSQAYa-Q_Z1`=`s-C!4Gq-{SV*{4; zL6vI3fbv9rxTpTUO7+A&-cc=8+e&Gd;8QcK;N;XHUjU$0s=Sq<0OP9XB*@8mc)tPu z`t%=Qh-VFOmDYyY0w%7Gw`>u)$}MFM*Oq!0#lkD|21gs2jog@Wl6m4p1 zQa5STg6KhUilR`AKnVf?2qf6-mzWUZ52j6tOv{+LpiATf5-<26MV4_24Uz!{aZCm1 z3)pNk>i*!g55N&L!~{@WjiElD5_K3IlnNUGc{-NIqJxg+0Ebp^L7_o(afOYXUrLM6 zS=S6V&>(ulS+FjY^Kw1_3xd<|nWKuWHv0@($=bvF0$~Plcm^f$?*Du9qj;2m!r?~_ z2ecWzA0Z=oDnMWcZ5CV&N<3Dx0agyBS;57#bof>4)UZ0ztw)@c)`^f>;63AJ^@tuP zSvR56X!ROxM91n6N{rvdDLOz|%>xmgn`B8WM~7%|ErF0aEraNtY!0HKIGn_F6t36k zBm6ZY4@!^m&W=aXVS$bl*XZ?HH;K448Wtg)ZUUk7loruyU3v^Bb&TGb14FEfE)ql^ z1FnqsF&+*L_&qSBI7=7Utp=D-W7A8!myz56YJf|5e?w?`*TMU^N{La7!*euxiqKO! zg2XT_MNT8uabgfumLi2?Y68Tr_)de+fq{%tbbuO8h&G8FBMG8I5WEIhi2+hLky-`S zI_18F4+2zkxDTN4C)^E{+zYd|rfb{FL*a^~8Q0WNL8g&o;pt6R9pm?Kpk+a|Ou_ia z+z5#|bxsP`Ah;HH0Vka};v^^n(d%#)cau&oN9T<2gMwRXVnnXM1F{22fZ_-z0cC_; z%Z%Wf>Nv#`jKC3`Kro$yz-f%2!Hr{D8UvoAvvSEpmA0InUmp56E2eO>+IebJgxO$L zfED0H#*ea^8DX3sm>_}yrM0{?28P>3tGU3DQF;7=uO_M>b@^?qk1gMFPApF-+kx_LDTkPN=E1Sxno@m7OaQc{ Date: Sun, 30 Mar 2025 15:38:34 -0700 Subject: [PATCH 190/264] rework gear texture + correct size sync rotor free for large turbine sync parallel amount --- .../multiblock/ui/MultiblockUIBuilder.java | 2 +- .../multi/MetaTileEntityLargeBoiler.java | 2 +- .../generator/MetaTileEntityLargeTurbine.java | 2 +- .../gui/overlay/filter_settings_overlay.png | Bin 333 -> 287 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 36e818d6933..c514a2d627b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -536,7 +536,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL if (getSyncer().syncBoolean(cachedRecipe == null)) return this; if (getSyncer().syncBoolean(arl.getRecipeMap() == null)) return this; - int p = arl.getParallelRecipesPerformed(); + int p = getSyncer().syncInt(arl.getParallelRecipesPerformed()); if (p == 0) p = 1; long eut = getSyncer().syncLong(() -> cachedRecipe.getEUt()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index f46a183fc60..7de017d2fc3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -157,7 +157,7 @@ protected MultiblockUIFactory createUIFactory() { return new ButtonWidget<>() .size(18) - .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY) + .overlay(GTGuiTextures.FILTER_SETTINGS_OVERLAY.asIcon().size(16)) .addTooltipLine(IKey.lang("gregtech.multiblock.large_boiler.throttle_button.tooltip")) .onMousePressed(i -> { if (throttle.isPanelOpen()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 7f927b5a71b..1b325daeef4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -165,7 +165,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { if (!isStructureFormed() || syncer.syncBoolean(() -> getRotorHolder() == null)) return; - if (!isRotorFaceFree()) { + if (syncer.syncBoolean(!isRotorFaceFree())) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.turbine.obstructed")); keyList.add(KeyUtil.lang(TextFormatting.GRAY, diff --git a/src/main/resources/assets/gregtech/textures/gui/overlay/filter_settings_overlay.png b/src/main/resources/assets/gregtech/textures/gui/overlay/filter_settings_overlay.png index 31b8cdb6ce84e4eeb964aef86192ec577b9edb54..8ce5b77a856c62f9cbcbb1964f4d8a108310c022 100644 GIT binary patch delta 247 zcmVS8mT5DP+ zFp+Bn0LVF`_da=#%?_%XN-5LP7y3!A>w>x88u+kGAR-WvDR4Fr(X35zKQA_?Cw@af zbc^{!e(qu`_y9{Oh;JeS0CT!qh~CMB{tFoXhG@lp%y>VJ;}+ubA6P(E?C0onea0?h)DFn<9DNkl#CwV~LkTPAw z3+VGAP~H))IGKg4vRADugFW_m48S*yh!PQ{PdPt#004v#8X`*5G;t{L9mn4a5K$V( zF$37?`##65wJ^qD-}l5tDh6!anZedtXsscHfRwVzZOTJQn}5Lopta7vbFLae+~+UB zF-F7~A;e!=*L82X%~R(XBaY)}0AQZyGz>##p_Ib1EC?YqnZcd*lPRUDbDo81m4cn; z2>{^k+!=VSGH-$R%z|Clg*)vsm;FjaYweq0CAe){Y};0eSZQF4fs_)?Ijrki(Pru& st$h1Ll)U%Jdmmrj{r5K>3x3Uh0YT4h0M=%`sQ>@~07*qoM6N<$f=Bd<6#xJL From 141355a82d30f927f9521e8c52d82d885dad28ef Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 31 Mar 2025 00:39:39 -0700 Subject: [PATCH 191/264] fix bars for fusion reactor fix large boiler throttle panel quick fix for recipe output line "disabled" buttons are now always pressed --- .../multiblock/ui/MultiblockUIBuilder.java | 30 +++---- .../multiblock/ui/MultiblockUIFactory.java | 22 +++-- .../multi/MetaTileEntityLargeBoiler.java | 17 +++- .../electric/MetaTileEntityFusionReactor.java | 80 ++++++++++++------- 4 files changed, 90 insertions(+), 59 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index c514a2d627b..a8160cff33f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -515,8 +515,6 @@ public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) return addRecipeOutputLine(arl, DEFAULT_MAX_RECIPE_LINES); } - private Recipe cachedRecipe = null; - /** * Adds the current outputs of a recipe from recipe logic. Items then fluids. * @@ -524,22 +522,18 @@ public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) * @param maxLines the maximum number of lines to print until truncating with {@code ...} */ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxLines) { + // todo recipe is null on first load, fix Recipe recipe = arl.getPreviousRecipe(); - if (cachedRecipe == null && recipe != null) { - cachedRecipe = recipe; - } else if (cachedRecipe == null) { - // find new recipe - } else if (arl.getMaxProgress() == 0) { - cachedRecipe = null; - } - if (getSyncer().syncBoolean(cachedRecipe == null)) return this; - if (getSyncer().syncBoolean(arl.getRecipeMap() == null)) return this; + if (getSyncer().syncBoolean(recipe == null)) return this; + RecipeMap map = arl.getRecipeMap(); + if (getSyncer().syncBoolean(map == null)) return this; int p = getSyncer().syncInt(arl.getParallelRecipesPerformed()); if (p == 0) p = 1; - long eut = getSyncer().syncLong(() -> cachedRecipe.getEUt()); + // noinspection DataFlowIssue + long eut = getSyncer().syncLong(() -> recipe.getEUt()); long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); int maxProgress = arl.getMaxProgress(); @@ -549,10 +543,11 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL List chancedFluidOutputs = new ArrayList<>(); if (isServer()) { - itemOutputs.addAll(cachedRecipe.getOutputs()); - chancedItemOutputs.addAll(cachedRecipe.getChancedOutputs().getChancedEntries()); - fluidOutputs.addAll(cachedRecipe.getFluidOutputs()); - chancedFluidOutputs.addAll(cachedRecipe.getChancedFluidOutputs().getChancedEntries()); + // noinspection DataFlowIssue + itemOutputs.addAll(recipe.getOutputs()); + chancedItemOutputs.addAll(recipe.getChancedOutputs().getChancedEntries()); + fluidOutputs.addAll(recipe.getFluidOutputs()); + chancedFluidOutputs.addAll(recipe.getChancedFluidOutputs().getChancedEntries()); } itemOutputs = getSyncer().syncCollection(itemOutputs, ByteBufAdapters.ITEM_STACK); @@ -562,7 +557,8 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation.NEW_LINE); - var chanceFunction = arl.getRecipeMap().getChanceFunction(); + // noinspection DataFlowIssue + var chanceFunction = map.getChanceFunction(); int recipeTier = GTUtility.getTierByVoltage(eut); int machineTier = GTUtility.getOCTierByVoltage(maxVoltage); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 56f48742d12..7972068a17e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -17,18 +17,19 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; 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.UITexture; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; 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.ButtonWidget; import com.cleanroommc.modularui.widgets.CycleButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SlotGroupWidget; @@ -42,13 +43,15 @@ public class MultiblockUIFactory { + private static final Consumer NO_OP = b -> {}; + private static final IBoolValue ALWAYS_ON = new BoolValue.Dynamic(() -> true, b -> {}); + private final MultiblockWithDisplayBase mte; protected Consumer displayText, warningText, errorText; protected BiFunction flexButton = (guiData, syncManager) -> null; private int width = 198, height = 202; private int screenHeight = 109; private ScreenFunction screenFunction; - private static final Consumer NO_OP = b -> {}; private boolean disableDisplay = false; private boolean disableIndicator = false; private boolean disableButtons = false; @@ -279,7 +282,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, Flow column = Flow.column() .margin(4, 0) - .top(114) + .top(5 + screenHeight) .widthRel(1f) .height(Bars.HEIGHT * 2); @@ -345,7 +348,8 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync PosGuiData guiData) { IWidget flexButton = this.flexButton.apply(guiData, panelSyncManager); if (flexButton == null) { - flexButton = new ButtonWidget<>() + flexButton = new ToggleButton() + .value(ALWAYS_ON) .overlay(GTGuiTextures.OVERLAY_NO_FLEX) .size(18) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.no_flex_button")); @@ -354,7 +358,7 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync return Flow.column() .right(4) - .size(18, 77) + .coverChildren() .child(createDistinctButton(mainPanel, panelSyncManager)) .child(createVoidingButton(mainPanel, panelSyncManager)) .child(flexButton) @@ -364,14 +368,15 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!(mte instanceof IDistinctBusController distinct) || !distinct.canBeDistinct()) { - return new ButtonWidget<>() + return new ToggleButton() + .value(ALWAYS_ON) .size(18) .overlay(GTGuiTextures.OVERLAY_DISTINCT_BUSES[0]) .addTooltipLine(IKey.lang("gregtech.multiblock.universal.distinct_not_supported")); } return new ToggleButton() - .size(18, 18) + .size(18) .value(new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct)) .disableHoverBackground() .overlay(true, GTGuiTextures.OVERLAY_DISTINCT_BUSES[1]) @@ -382,7 +387,8 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!mte.shouldShowVoidingModeButton()) { - return new ButtonWidget<>() + return new ToggleButton() + .value(ALWAYS_ON) .size(18) .overlay(GTGuiTextures.OVERLAY_VOID_NONE) .addTooltipLine(IKey.lang("gregtech.gui.multiblock_voiding_not_supported")); diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 7de017d2fc3..0a9f345ab87 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -52,7 +52,7 @@ import com.cleanroommc.modularui.widgets.ButtonWidget; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.SliderWidget; -import com.cleanroommc.modularui.widgets.layout.Row; +import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -205,7 +205,7 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandl d -> setThrottlePercentage((int) (d * 100))); return GTGuis.createPopupPanel("boiler_throttle", 116, 53) - .child(new Row() + .child(Flow.row() .pos(4, 4) .height(16) .coverChildrenWidth() @@ -216,7 +216,7 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandl .child(IKey.lang("gregtech.multiblock.large_boiler.throttle.title") .asWidget() .heightRel(1.0f))) - .child(new Row() + .child(Flow.row() .top(20) .margin(4, 0) .coverChildrenHeight() @@ -234,7 +234,16 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandl .height(20) // TODO proper color .setTextColor(Color.WHITE.darker(1)) - .setNumbers(0, 100) + .setValidator(s -> { + try { + long l = Long.parseLong(s); + if (l < 0) l = 0; + else if (l > 100) l = 100; + return String.valueOf(l); + } catch (NumberFormatException ignored) { + return throttleValue.getStringValue(); + } + }) // TODO show % sign .value(throttleValue) .background(GTGuiTextures.DISPLAY))); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index e50e46ac44b..91f904649cb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -14,6 +14,7 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; +import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; @@ -28,8 +29,6 @@ import gregtech.api.recipes.properties.impl.FusionEUToStartProperty; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; -import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.api.util.interpolate.Eases; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.IRenderSetup; @@ -61,14 +60,16 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.AxisAlignedBB; -import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.cleanroommc.modularui.api.drawable.IDrawable; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.value.sync.LongSyncValue; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.google.common.collect.Lists; @@ -87,7 +88,7 @@ import static gregtech.api.util.RelativeDirection.*; public class MetaTileEntityFusionReactor extends RecipeMapMultiblockController - implements IFastRenderMetaTileEntity, IBloomEffect { + implements IFastRenderMetaTileEntity, IBloomEffect, ProgressBarMultiblock { protected static final int NO_COLOR = 0; @@ -377,12 +378,7 @@ protected MultiblockUIFactory createUIFactory() { var status = MultiblockUIFactory.builder("status", syncManager); status.setAction(b -> b.structureFormed(true) .setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addWorkingStatusLine() - .addCustom((keyManager, uiSyncer) -> { - long stored = uiSyncer.syncLong(energyContainer.getEnergyStored()); - long cap = uiSyncer.syncLong(energyContainer.getEnergyCapacity()); - keyManager.add(KeyUtil.string(TextFormatting.WHITE, "%,d / %,d EU", stored, cap)); - })); + .addWorkingStatusLine()); parent.child(new Column() .padding(4) .expanded() @@ -406,26 +402,50 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addEnergyBarHoverText(List hoverList) { - ITextComponent energyInfo = TextComponentUtil.stringWithColor( - TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(energyContainer.getEnergyStored()) + " / " + - TextFormattingUtil.formatNumbers(energyContainer.getEnergyCapacity()) + " EU"); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.energy_stored", - energyInfo)); - } - - private void addHeatBarHoverText(List hoverList) { - ITextComponent heatInfo = TextComponentUtil.stringWithColor( - TextFormatting.RED, - TextFormattingUtil.formatNumbers(heat) + " / " + - TextFormattingUtil.formatNumbers(energyContainer.getEnergyCapacity())); - hoverList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.fusion_reactor.heat", - heatInfo)); + @Override + public int getProgressBarCount() { + return 2; + } + + @Override + public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + LongSyncValue heat = new LongSyncValue(this::getHeat); + panelSyncManager.syncValue("heat", heat); + LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); + panelSyncManager.syncValue("capacity", capacity); + LongSyncValue stored = new LongSyncValue(energyContainer::getEnergyStored); + panelSyncManager.syncValue("stored", stored); + return switch (index) { + case 0 -> new ProgressWidget() + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, -1) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + IKey energyInfo = KeyUtil.string(TextFormatting.AQUA, + "%,d / %,d EU", + stored.getLongValue(), capacity.getLongValue()); + // todo this isn't formatting correctly for some reason? + // values are also wrong for heat and energy + tooltip.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.energy_stored", + energyInfo)); + }) + .value(new DoubleSyncValue(() -> capacity.getLongValue() > 0 ? + 1.0 * stored.getLongValue() / capacity.getLongValue() : 0)); + case 1 -> new ProgressWidget() + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, -1) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, + "%,d / %,d EU", + heat.getLongValue(), capacity.getLongValue()); + tooltip.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fusion_reactor.heat", + heatInfo)); + }) + .value(new DoubleSyncValue(() -> capacity.getLongValue() > 0 ? + 1.0 * heat.getLongValue() / capacity.getLongValue() : 0)); + default -> throw new IllegalStateException(); + }; } private static class FusionProgressSupplier { From 04b9506a8caa5cfad0203a755b94450f3d5e2ca7 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 31 Mar 2025 01:12:11 -0700 Subject: [PATCH 192/264] sync coil tier for pyrolyse stop displaying outputs if max progress is 0 port coke oven --- .../multiblock/ui/MultiblockUIBuilder.java | 22 ++++----- .../multi/MetaTileEntityCokeOven.java | 45 +++++++++++++++++++ .../electric/MetaTileEntityPyrolyseOven.java | 3 +- 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index a8160cff33f..4df070b2479 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -537,6 +537,8 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); int maxProgress = arl.getMaxProgress(); + if (getSyncer().syncBoolean(maxProgress == 0)) return this; + List itemOutputs = new ArrayList<>(); List chancedItemOutputs = new ArrayList<>(); List fluidOutputs = new ArrayList<>(); @@ -573,7 +575,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL for (var chancedItemOutput : chancedItemOutputs) { int chance = chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier); int count = chancedItemOutput.getIngredient().getCount() * p; - addChancedItemOutputLine(chancedItemOutput.getIngredient(), count, chance, maxProgress); + addChancedItemOutputLine(chancedItemOutput, count, chance, maxProgress); } // fluids @@ -587,7 +589,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL for (var chancedFluidOutput : chancedFluidOutputs) { int chance = chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier); int count = chancedFluidOutput.getIngredient().amount * p; - addChancedFluidOutputLine(chancedFluidOutput.getIngredient(), count, chance, maxProgress); + addChancedFluidOutputLine(chancedFluidOutput, count, chance, maxProgress); } return this; } @@ -627,7 +629,6 @@ private void addFluidOutputLine(@NotNull FluidStack stack, long count, int recip .asIcon() .asHoverable() .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); - // addKey(IKey.SPACE, Operation.ADD); } /** @@ -635,13 +636,13 @@ private void addFluidOutputLine(@NotNull FluidStack stack, long count, int recip * * @param recipeLength max duration of the recipe */ - private void addChancedItemOutputLine(@NotNull ItemStack stack, - int chance, int count, int recipeLength) { - IKey name = KeyUtil.string(TextFormatting.AQUA, stack.getDisplayName()); + private void addChancedItemOutputLine(@NotNull ChancedItemOutput output, + int count, int chance, int recipeLength) { + IKey name = KeyUtil.string(TextFormatting.AQUA, output.getIngredient().getDisplayName()); IKey amount = KeyUtil.number(TextFormatting.GOLD, count); IKey rate = KeyUtil.string(TextFormatting.WHITE, formatRecipeRate(getSyncer().syncInt(recipeLength), count)); - addKey(new GTObjectDrawable(stack, count) + addKey(new GTObjectDrawable(output, count) .setBoostFunction(entry -> chance) .asIcon() .asHoverable() @@ -653,19 +654,18 @@ private void addChancedItemOutputLine(@NotNull ItemStack stack, * * @param recipeLength max duration of the recipe */ - private void addChancedFluidOutputLine(@NotNull FluidStack stack, + private void addChancedFluidOutputLine(ChancedFluidOutput output, int count, int chance, int recipeLength) { - IKey name = KeyUtil.fluid(TextFormatting.AQUA, stack); + IKey name = KeyUtil.fluid(TextFormatting.AQUA, output.getIngredient()); IKey amount = KeyUtil.number(TextFormatting.GOLD, count); IKey rate = KeyUtil.string(TextFormatting.WHITE, formatRecipeRate(getSyncer().syncInt(recipeLength), count)); - addKey(new GTObjectDrawable(stack, count) + addKey(new GTObjectDrawable(output, count) .setBoostFunction(entry -> chance) .asIcon() .asHoverable() .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); - // addKey(IKey.SPACE, Operation.ADD); } private static String formatRecipeRate(int recipeLength, long amount) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java index 607ed500ca2..772991803b5 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java @@ -6,6 +6,9 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.RecipeMapPrimitiveMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.mui.GTGuiTextures; +import gregtech.api.mui.GTGuiTheme; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.recipes.RecipeMaps; @@ -16,6 +19,7 @@ import gregtech.common.blocks.BlockMetalCasing; import gregtech.common.blocks.MetaBlocks; import gregtech.common.metatileentities.MetaTileEntities; +import gregtech.common.mui.widget.GTFluidSlot; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -32,6 +36,12 @@ import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.value.sync.DoubleSyncValue; +import com.cleanroommc.modularui.widgets.ItemSlot; +import com.cleanroommc.modularui.widgets.ProgressWidget; +import com.cleanroommc.modularui.widgets.slot.ModularSlot; import org.jetbrains.annotations.NotNull; public class MetaTileEntityCokeOven extends RecipeMapPrimitiveMultiblockController { @@ -89,6 +99,41 @@ public boolean hasMaintenanceMechanics() { return false; } + @Override + protected MultiblockUIFactory createUIFactory() { + return new MultiblockUIFactory(this) + .disableButtons() + .disableDisplay() + .setSize(176, 166) + .addScreenChildren((parent, syncManager) -> parent + .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(new ItemSlot().slot(importItems, 0) + .pos(52, 30)) + .child(new ProgressWidget() + .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, -1) + .size(20, 15) + .pos(76, 32) + .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) + .child(new ItemSlot() + .slot(new ModularSlot(exportItems, 0) + .accessibility(false, true)) + .pos(103, 30)) + .child(new GTFluidSlot() + .overlay(GTGuiTextures.PRIMITIVE_LARGE_FLUID_TANK_OVERLAY.asIcon() + .alignment(Alignment.CenterLeft) + .marginLeft(1)) + .syncHandler(GTFluidSlot.sync(exportFluids.getTankAt(0)) + .drawAlwaysFull(false) + .accessibility(true, false)) + .pos(134, 13) + .size(20, 58))); + } + + @Override + public GTGuiTheme getUITheme() { + return GTGuiTheme.PRIMITIVE; + } + @Override public void randomDisplayTick() { if (this.isActive()) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index 6213867dd68..5e225eca35e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -116,8 +116,9 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addCustom((textList, syncer) -> { if (!isStructureFormed()) return; + int tier = syncer.syncInt(coilTier); - int processingSpeed = coilTier == 0 ? 75 : 50 * (coilTier + 1); + int processingSpeed = tier == 0 ? 75 : 50 * (tier + 1); IKey speed = KeyUtil.number(() -> getSpeedColor(processingSpeed), processingSpeed, "%"); IKey body = KeyUtil.lang(TextFormatting.GRAY, From f8386b7836ad5b081fd545fb4a0ff301355d9662 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 31 Mar 2025 01:27:27 -0700 Subject: [PATCH 193/264] actually use the tank capacity for LCE sync coil discount and parallel limit --- .../multi/electric/MetaTileEntityMultiSmelter.java | 11 ++++++----- .../MetaTileEntityLargeCombustionEngine.java | 4 ++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 382a54719b5..e7d8dd7a045 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -62,9 +62,10 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addCustom((richText, syncer) -> { if (!isStructureFormed()) return; - if (heatingCoilDiscount > 1) { + int discount = syncer.syncInt(heatingCoilDiscount); + if (discount > 1) { IKey coilDiscount = KeyUtil.number(TextFormatting.AQUA, - (long) (100.0 / heatingCoilDiscount), "%"); + (long) (100.0 / discount), "%"); IKey base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.multi_furnace.heating_coil_discount", @@ -76,9 +77,9 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { richText.add(KeyUtil.setHover(base, hoverText)); } - if (recipeMapWorkable.getParallelLimit() > 0) { - IKey parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, - recipeMapWorkable.getParallelLimit()); + int pLimit = syncer.syncInt(recipeMapWorkable.getParallelLimit()); + if (pLimit > 0) { + IKey parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, pLimit); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.parallel", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 8dcd2bd032a..d079fa7788a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -277,7 +277,7 @@ yield new ProgressWidget() t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); } else { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.lubricant_amount", - lubricantValue.getValue(0), lubricantValue.getValue(0))); + lubricantValue.getValue(0), lubricantValue.getValue(1))); } } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); @@ -303,7 +303,7 @@ yield new ProgressWidget() } else if (isExtreme) { t.addLine(IKey.lang( "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount", - oxygenValue.getValue(0), oxygenValue.getValue(0))); + oxygenValue.getValue(0), oxygenValue.getValue(1))); } else { t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_amount", oxygenValue.getValue(0), oxygenValue.getValue(1))); From 5fdf7d03714795ae63eb23f1f75ef8099e737d44 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 31 Mar 2025 16:23:09 -0700 Subject: [PATCH 194/264] update panel height on screen height change --- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 8 +++++--- .../multi/electric/MetaTileEntityFusionReactor.java | 1 - 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7972068a17e..215d8e043c0 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -226,7 +226,9 @@ public MultiblockUIFactory setSize(int width, int height) { } public MultiblockUIFactory setScreenHeight(int height) { - this.screenHeight = height; + int diff = height - this.screenHeight; + this.height += diff; + this.screenHeight += diff; return this; } @@ -246,7 +248,7 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { // TODO createExtras() hook for overrides? if (mte instanceof ProgressBarMultiblock progressBarMultiblock && progressBarMultiblock.getProgressBarCount() > 0) { - panel.height(height + (Bars.HEIGHT * 2) - 2); + panel.height(height + (Bars.HEIGHT * progressBarMultiblock.getProgressBarRows()) - 2); panel.child(createBars(progressBarMultiblock, panelSyncManager)); } @@ -284,7 +286,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, .margin(4, 0) .top(5 + screenHeight) .widthRel(1f) - .height(Bars.HEIGHT * 2); + .height(Bars.HEIGHT * rows ); for (int r = 0; r < rows; r++) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 91f904649cb..34145f6ea19 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -371,7 +371,6 @@ protected MultiblockUIFactory createUIFactory() { DoubleSyncValue progress = new DoubleSyncValue(recipeMapWorkable::getProgressPercent); return new MultiblockUIFactory(this) - .setSize(198, 236) .setScreenHeight(138) .disableDisplayText() .addScreenChildren((parent, syncManager) -> { From d0b75822d2fc09c1a6ff3438a0fa8927503fd0f2 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 31 Mar 2025 17:18:54 -0700 Subject: [PATCH 195/264] fix format error for fusion energy info fusion continues to be a problem --- .../multiblock/ui/MultiblockUIFactory.java | 2 +- .../electric/MetaTileEntityFusionReactor.java | 19 ++++++++----------- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 215d8e043c0..56a00d61556 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -286,7 +286,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, .margin(4, 0) .top(5 + screenHeight) .widthRel(1f) - .height(Bars.HEIGHT * rows ); + .height(Bars.HEIGHT * rows); for (int r = 0; r < rows; r++) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 34145f6ea19..9cc79b86f54 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -416,22 +416,19 @@ public int getProgressBarCount() { panelSyncManager.syncValue("stored", stored); return switch (index) { case 0 -> new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, -1) + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, MultiblockUIFactory.Bars.HALF_WIDTH) .tooltipAutoUpdate(true) .tooltipBuilder(tooltip -> { - IKey energyInfo = KeyUtil.string(TextFormatting.AQUA, - "%,d / %,d EU", - stored.getLongValue(), capacity.getLongValue()); - // todo this isn't formatting correctly for some reason? // values are also wrong for heat and energy + // yet correct for the double sync value tooltip.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.energy_stored", - energyInfo)); + stored.getLongValue(), capacity.getLongValue())); }) - .value(new DoubleSyncValue(() -> capacity.getLongValue() > 0 ? - 1.0 * stored.getLongValue() / capacity.getLongValue() : 0)); + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * stored.getLongValue() / capacity.getLongValue() : 0); case 1 -> new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, -1) + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) .tooltipAutoUpdate(true) .tooltipBuilder(tooltip -> { IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, @@ -441,8 +438,8 @@ public int getProgressBarCount() { "gregtech.multiblock.fusion_reactor.heat", heatInfo)); }) - .value(new DoubleSyncValue(() -> capacity.getLongValue() > 0 ? - 1.0 * heat.getLongValue() / capacity.getLongValue() : 0)); + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * heat.getLongValue() / capacity.getLongValue() : 0); default -> throw new IllegalStateException(); }; } From bcdf203f0ceeba57880a9c5e9bdbacb8aa4ad229 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 1 Apr 2025 09:17:32 -0700 Subject: [PATCH 196/264] with four hours of sleep, i fixed fusion tooltips --- .../electric/MetaTileEntityFusionReactor.java | 66 ++++++++++--------- 1 file changed, 35 insertions(+), 31 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 9cc79b86f54..04b0d4e3a04 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -408,38 +408,42 @@ public int getProgressBarCount() { @Override public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { - LongSyncValue heat = new LongSyncValue(this::getHeat); - panelSyncManager.syncValue("heat", heat); - LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); - panelSyncManager.syncValue("capacity", capacity); - LongSyncValue stored = new LongSyncValue(energyContainer::getEnergyStored); - panelSyncManager.syncValue("stored", stored); return switch (index) { - case 0 -> new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - // values are also wrong for heat and energy - // yet correct for the double sync value - tooltip.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.energy_stored", - stored.getLongValue(), capacity.getLongValue())); - }) - .progress(() -> capacity.getLongValue() > 0 ? - 1.0 * stored.getLongValue() / capacity.getLongValue() : 0); - case 1 -> new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, - "%,d / %,d EU", - heat.getLongValue(), capacity.getLongValue()); - tooltip.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.fusion_reactor.heat", - heatInfo)); - }) - .progress(() -> capacity.getLongValue() > 0 ? - 1.0 * heat.getLongValue() / capacity.getLongValue() : 0); + case 0 -> { + LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); + panelSyncManager.syncValue("capacity", index, capacity); + LongSyncValue stored = new LongSyncValue(energyContainer::getEnergyStored); + panelSyncManager.syncValue("stored", index, stored); + yield new ProgressWidget() + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + tooltip.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.energy_stored", + stored.getLongValue(), capacity.getLongValue())); + }) + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * stored.getLongValue() / capacity.getLongValue() : 0); + } + case 1 -> { + LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); + panelSyncManager.syncValue("capacity", index, capacity); + LongSyncValue heat = new LongSyncValue(this::getHeat); + panelSyncManager.syncValue("heat", index, heat); + yield new ProgressWidget() + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, + "%,d / %,d EU", + heat.getLongValue(), capacity.getLongValue()); + tooltip.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fusion_reactor.heat", + heatInfo)); + }) + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * heat.getLongValue() / capacity.getLongValue() : 0); + } default -> throw new IllegalStateException(); }; } From edfcecb39203761b718ba14bd7d73c6143488e73 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:01:05 -0700 Subject: [PATCH 197/264] show invalid structure on error indicator --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 56a00d61556..8f51b2f0277 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -64,6 +64,7 @@ public class MultiblockUIFactory { public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; configureErrorText(builder -> { + builder.structureFormed(mte.isStructureFormed()); if (mte.hasMufflerMechanics()) builder.addMufflerObstructedLine(!mte.isMufflerFaceFree()); }); From debdacea736a98d53d82b85b59e4f40e82fe9529 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 1 Apr 2025 10:10:54 -0700 Subject: [PATCH 198/264] add color to theme --- src/main/java/gregtech/api/mui/GTGuiTheme.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index aaed3534456..b0dc215a62f 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -51,6 +51,7 @@ public class GTGuiTheme { .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) .button(GTGuiTextures.IDs.BRONZE_BUTTON) + .color(0xFF7706) .simpleToggleButton(GTGuiTextures.IDs.BRONZE_BUTTON, GTGuiTextures.IDs.BRONZE_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) .build(); @@ -61,6 +62,7 @@ public class GTGuiTheme { .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) .button(GTGuiTextures.IDs.STEEL_BUTTON) + .color(0x57576a) .simpleToggleButton(GTGuiTextures.IDs.STEEL_BUTTON, GTGuiTextures.IDs.STEEL_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) .build(); @@ -68,6 +70,7 @@ public class GTGuiTheme { public static final GTGuiTheme PRIMITIVE = templateBuilder("gregtech_primitive") .panel(GTGuiTextures.IDs.PRIMITIVE_BACKGROUND) .textColor(Color.WHITE.darker(1)) + .color(0x826B51) .itemSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) .build(); From a680fc4af044a178b96bdd52c2e2b662933cfc77 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:00:43 -0700 Subject: [PATCH 199/264] add themed fluid slot make certain textures un-themeable --- .../java/gregtech/api/mui/GTGuiTextures.java | 48 +++++++++---------- .../java/gregtech/api/mui/GTGuiTheme.java | 3 ++ 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index d7e69356db9..e72b06932e3 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -336,8 +336,7 @@ private static String id(String path) { "textures/gui/overlay/extractor_overlay_steel.png"); public static final UITexture FILTER_SLOT_OVERLAY = fullImage("textures/gui/overlay/filter_slot_overlay.png", true); public static final UITexture FILTER_SETTINGS_OVERLAY = fullImage( - "textures/gui/overlay/filter_settings_overlay.png", - true); + "textures/gui/overlay/filter_settings_overlay.png"); public static final UITexture FURNACE_OVERLAY_1 = fullImage("textures/gui/overlay/furnace_overlay_1.png", true); public static final UITexture FURNACE_OVERLAY_2 = fullImage("textures/gui/overlay/furnace_overlay_2.png", true); public static final UITexture FURNACE_OVERLAY_BRONZE = fullImage("textures/gui/overlay/furnace_overlay_bronze.png"); @@ -590,6 +589,7 @@ private static String id(String path) { "textures/gui/progress_bar/progress_bar_wiremill.png", true); // more custom progress bars + // MULTIBLOCK BARS // todo these boiler empty bars can probably be replaced by using a resized steam slot texture public static final UITexture PROGRESS_BAR_BOILER_EMPTY_BRONZE = new UITexture.Builder() .location(GTValues.MODID, "textures/gui/progress_bar/progress_bar_boiler_empty_bronze.png") @@ -602,49 +602,49 @@ private static String id(String path) { .adaptable(1) .build(); public static final UITexture PROGRESS_BAR_BOILER_FUEL_BRONZE = progressBar( - "textures/gui/progress_bar/progress_bar_boiler_fuel_bronze.png", 18, 36, true); + "textures/gui/progress_bar/progress_bar_boiler_fuel_bronze.png", 18, 36); public static final UITexture PROGRESS_BAR_BOILER_FUEL_STEEL = progressBar( - "textures/gui/progress_bar/progress_bar_boiler_fuel_steel.png", 18, 36, true); + "textures/gui/progress_bar/progress_bar_boiler_fuel_steel.png", 18, 36); public static final UITexture PROGRESS_BAR_BOILER_HEAT = progressBar( - "textures/gui/progress_bar/progress_bar_boiler_heat.png", true); + "textures/gui/progress_bar/progress_bar_boiler_heat.png"); public static final UITexture PROGRESS_BAR_ASSEMBLY_LINE = progressBar( - "textures/gui/progress_bar/progress_bar_assembly_line.png", 54, 144, true); + "textures/gui/progress_bar/progress_bar_assembly_line.png", 54, 144); public static final UITexture PROGRESS_BAR_ASSEMBLY_LINE_ARROW = progressBar( - "textures/gui/progress_bar/progress_bar_assembly_line_arrow.png", 10, 36, true); + "textures/gui/progress_bar/progress_bar_assembly_line_arrow.png", 10, 36); public static final UITexture PROGRESS_BAR_COKE_OVEN = progressBar( - "textures/gui/progress_bar/progress_bar_coke_oven.png", 36, 36, true); + "textures/gui/progress_bar/progress_bar_coke_oven.png", 36, 36); public static final UITexture PROGRESS_BAR_DISTILLATION_TOWER = progressBar( - "textures/gui/progress_bar/progress_bar_distillation_tower.png", 66, 116, true); + "textures/gui/progress_bar/progress_bar_distillation_tower.png", 66, 116); public static final UITexture PROGRESS_BAR_SOLAR_BRONZE = progressBar( - "textures/gui/progress_bar/progress_bar_solar_bronze.png", 10, 20, true); + "textures/gui/progress_bar/progress_bar_solar_bronze.png", 10, 20); public static final UITexture PROGRESS_BAR_SOLAR_STEEL = progressBar( - "textures/gui/progress_bar/progress_bar_solar_steel.png", 10, 20, true); + "textures/gui/progress_bar/progress_bar_solar_steel.png", 10, 20); public static final UITexture PROGRESS_BAR_RESEARCH_STATION_1 = progressBar( - "textures/gui/progress_bar/progress_bar_research_station_1.png", 54, 10, true); + "textures/gui/progress_bar/progress_bar_research_station_1.png", 54, 10); public static final UITexture PROGRESS_BAR_RESEARCH_STATION_2 = progressBar( - "textures/gui/progress_bar/progress_bar_research_station_2.png", 10, 36, true); + "textures/gui/progress_bar/progress_bar_research_station_2.png", 10, 36); public static final UITexture PROGRESS_BAR_RESEARCH_STATION_BASE = fullImage( - "textures/gui/progress_bar/progress_bar_research_station_base.png", true); + "textures/gui/progress_bar/progress_bar_research_station_base.png"); public static final UITexture PROGRESS_BAR_FUSION_ENERGY = progressBar( - "textures/gui/progress_bar/progress_bar_fusion_energy.png", 94, 14, true); + "textures/gui/progress_bar/progress_bar_fusion_energy.png", 94, 14); public static final UITexture PROGRESS_BAR_FUSION_HEAT = progressBar( - "textures/gui/progress_bar/progress_bar_fusion_heat.png", 94, 14, true); + "textures/gui/progress_bar/progress_bar_fusion_heat.png", 94, 14); public static final UITexture PROGRESS_BAR_MULTI_ENERGY_YELLOW = progressBar( - "textures/gui/progress_bar/progress_bar_multi_energy_yellow.png", 190, 14, true); + "textures/gui/progress_bar/progress_bar_multi_energy_yellow.png", 190, 14); public static final UITexture PROGRESS_BAR_HPCA_COMPUTATION = progressBar( - "textures/gui/progress_bar/progress_bar_hpca_computation.png", 94, 14, true); + "textures/gui/progress_bar/progress_bar_hpca_computation.png", 94, 14); public static final UITexture PROGRESS_BAR_LCE_FUEL = progressBar( - "textures/gui/progress_bar/progress_bar_lce_fuel.png", 62, 14, true); + "textures/gui/progress_bar/progress_bar_lce_fuel.png", 62, 14); public static final UITexture PROGRESS_BAR_LCE_LUBRICANT = progressBar( - "textures/gui/progress_bar/progress_bar_lce_lubricant.png", 62, 14, true); + "textures/gui/progress_bar/progress_bar_lce_lubricant.png", 62, 14); public static final UITexture PROGRESS_BAR_LCE_OXYGEN = progressBar( - "textures/gui/progress_bar/progress_bar_lce_oxygen.png", 62, 14, true); + "textures/gui/progress_bar/progress_bar_lce_oxygen.png", 62, 14); public static final UITexture PROGRESS_BAR_TURBINE_ROTOR_SPEED = progressBar( - "textures/gui/progress_bar/progress_bar_turbine_rotor_speed.png", 62, 14, true); + "textures/gui/progress_bar/progress_bar_turbine_rotor_speed.png", 62, 14); public static final UITexture PROGRESS_BAR_TURBINE_ROTOR_DURABILITY = progressBar( - "textures/gui/progress_bar/progress_bar_turbine_rotor_durability.png", 62, 14, true); + "textures/gui/progress_bar/progress_bar_turbine_rotor_durability.png", 62, 14); public static final UITexture PROGRESS_BAR_FLUID_RIG_DEPLETION = progressBar( - "textures/gui/progress_bar/progress_bar_fluid_rig_depletion.png", 190, 14, true); + "textures/gui/progress_bar/progress_bar_fluid_rig_depletion.png", 190, 14); // MISC diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index b0dc215a62f..c33cbbe2a46 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -49,6 +49,7 @@ public class GTGuiTheme { public static final GTGuiTheme BRONZE = templateBuilder("gregtech_bronze") .panel(GTGuiTextures.IDs.BRONZE_BACKGROUND) .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) + .fluidSlot(GTGuiTextures.IDs.BRONZE_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) .button(GTGuiTextures.IDs.BRONZE_BUTTON) .color(0xFF7706) @@ -60,6 +61,7 @@ public class GTGuiTheme { .panel(GTGuiTextures.IDs.STEEL_BACKGROUND) .textColor(Color.WHITE.darker(1)) .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) + .fluidSlot(GTGuiTextures.IDs.STEEL_SLOT) .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) .button(GTGuiTextures.IDs.STEEL_BUTTON) .color(0x57576a) @@ -72,6 +74,7 @@ public class GTGuiTheme { .textColor(Color.WHITE.darker(1)) .color(0x826B51) .itemSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) + .fluidSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) .build(); protected final String themeId; From adbc94b1e925529f212004a958515096644d131f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 2 Apr 2025 14:50:28 -0700 Subject: [PATCH 200/264] make more textures un-theme-able move colors to inner class move theme names to inner class fix npe issue for recipe output with PAs --- .../multiblock/ui/MultiblockUIBuilder.java | 14 +-- .../java/gregtech/api/mui/GTGuiTextures.java | 12 +-- .../java/gregtech/api/mui/GTGuiTheme.java | 91 ++++++++++++------- 3 files changed, 72 insertions(+), 45 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 4df070b2479..a13a26d2256 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -535,9 +535,9 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL // noinspection DataFlowIssue long eut = getSyncer().syncLong(() -> recipe.getEUt()); long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); - int maxProgress = arl.getMaxProgress(); + int maxProgress = getSyncer().syncInt(arl.getMaxProgress()); - if (getSyncer().syncBoolean(maxProgress == 0)) return this; + if (maxProgress == 0) return this; List itemOutputs = new ArrayList<>(); List chancedItemOutputs = new ArrayList<>(); @@ -545,6 +545,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL List chancedFluidOutputs = new ArrayList<>(); if (isServer()) { + // recipe searching has to be done server only // noinspection DataFlowIssue itemOutputs.addAll(recipe.getOutputs()); chancedItemOutputs.addAll(recipe.getChancedOutputs().getChancedEntries()); @@ -559,8 +560,6 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation.NEW_LINE); - // noinspection DataFlowIssue - var chanceFunction = map.getChanceFunction(); int recipeTier = GTUtility.getTierByVoltage(eut); int machineTier = GTUtility.getOCTierByVoltage(maxVoltage); @@ -573,7 +572,8 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL } for (var chancedItemOutput : chancedItemOutputs) { - int chance = chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier); + //noinspection DataFlowIssue + int chance = getSyncer().syncInt(() -> map.chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier)); int count = chancedItemOutput.getIngredient().getCount() * p; addChancedItemOutputLine(chancedItemOutput, count, chance, maxProgress); } @@ -587,7 +587,8 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL } for (var chancedFluidOutput : chancedFluidOutputs) { - int chance = chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier); + //noinspection DataFlowIssue + int chance = getSyncer().syncInt(() -> map.chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier)); int count = chancedFluidOutput.getIngredient().amount * p; addChancedFluidOutputLine(chancedFluidOutput, count, chance, maxProgress); } @@ -932,6 +933,7 @@ public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBuf public void readBuffer(ByteBuf buf) { clear(); + internal.clear(); internal.writeBytes(buf); } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index e72b06932e3..d8e00d61641 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -470,9 +470,9 @@ private static String id(String path) { * 1 = ON
*/ public static final UITexture[] BUTTON_POWER = slice("textures/gui/widget/button_power.png", - 18, 36, 18, 18, true); + 18, 36, 18, 18, false); - public static final UITexture BUTTON_POWER_DETAIL = fullImage("textures/gui/widget/button_power_detail.png", true); + public static final UITexture BUTTON_POWER_DETAIL = fullImage("textures/gui/widget/button_power_detail.png"); /** * 0 = DISABLED
@@ -481,18 +481,18 @@ private static String id(String path) { * 3 = VOID BOTH
**/ public static final UITexture[] MULTIBLOCK_VOID = slice("textures/gui/widget/button_void_multiblock.png", - 18, 72, 18, 18, true); + 18, 72, 18, 18, false); - public static final UITexture OVERLAY_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png", true); + public static final UITexture OVERLAY_VOID_NONE = fullImage("textures/gui/widget/button_void_none.png"); /** * 0 = DISABLED
* 1 = ENABLED
*/ public static final UITexture[] OVERLAY_DISTINCT_BUSES = slice("textures/gui/widget/button_distinct_buses.png", - 18, 36, 18, 18, true); + 18, 36, 18, 18, false); - public static final UITexture OVERLAY_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", true); + public static final UITexture OVERLAY_NO_FLEX = fullImage("textures/gui/widget/button_no_flex.png", false); public static final UITexture BUTTON_MULTI_MAP = fullImage("textures/gui/widget/button_multi_map.png", true); public static final UITexture BUTTON_MINER_MODES = fullImage("textures/gui/widget/button_miner_modes.png", true); public static final UITexture BUTTON_THROTTLE_MINUS = fullImage("textures/gui/widget/button_throttle_minus.png", diff --git a/src/main/java/gregtech/api/mui/GTGuiTheme.java b/src/main/java/gregtech/api/mui/GTGuiTheme.java index c33cbbe2a46..aa7b579797f 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTheme.java +++ b/src/main/java/gregtech/api/mui/GTGuiTheme.java @@ -21,60 +21,85 @@ import java.util.function.Consumer; import java.util.function.Supplier; +import static gregtech.api.mui.GTGuiTextures.*; + public class GTGuiTheme { + public static class Colors { + + public static final int BRONZE = 0xFF7706; + public static final int STEEL = 0x57576A; + public static final int PRIMITIVE = 0x826B51; + } + + public static class Names { + + public static final String STANDARD = gregtech("standard"); + public static final String COVER = gregtech("cover"); + public static final String BRONZE = gregtech("bronze"); + public static final String STEEL = gregtech("steel"); + public static final String PRIMITIVE = gregtech("primitive"); + + private static String gregtech(String s) { + return "gregtech:" + s; + } + } + private static final List THEMES = new ArrayList<>(); - public static final GTGuiTheme STANDARD = templateBuilder("gregtech_standard") - .panel(GTGuiTextures.IDs.STANDARD_BACKGROUND) - .itemSlot(GTGuiTextures.IDs.STANDARD_SLOT) - .fluidSlot(GTGuiTextures.IDs.STANDARD_FLUID_SLOT) + public static final GTGuiTheme STANDARD = templateBuilder(Names.STANDARD) + .panel(IDs.STANDARD_BACKGROUND) + .itemSlot(IDs.STANDARD_SLOT) + .fluidSlot(IDs.STANDARD_FLUID_SLOT) .color(ConfigHolder.client.defaultUIColor) - .button(GTGuiTextures.IDs.STANDARD_BUTTON) - .simpleToggleButton(GTGuiTextures.IDs.STANDARD_BUTTON, - GTGuiTextures.IDs.STANDARD_SLOT, + .button(IDs.STANDARD_BUTTON) + .simpleToggleButton(IDs.STANDARD_BUTTON, + IDs.STANDARD_SLOT, ConfigHolder.client.defaultUIColor) .build(); - public static final GTGuiTheme COVER = templateBuilder("gregtech_cover") - .panel(GTGuiTextures.IDs.COVER_BACKGROUND) - .itemSlot(GTGuiTextures.IDs.STANDARD_SLOT) - .fluidSlot(GTGuiTextures.IDs.STANDARD_FLUID_SLOT) + public static final GTGuiTheme COVER = templateBuilder(Names.COVER) + .panel(IDs.COVER_BACKGROUND) + .itemSlot(IDs.STANDARD_SLOT) + .fluidSlot(IDs.STANDARD_FLUID_SLOT) .color(ConfigHolder.client.defaultUIColor) .textColor(CoverWithUI.UI_TEXT_COLOR) .build(); // TODO Multiblock theme for display texture, logo changes - public static final GTGuiTheme BRONZE = templateBuilder("gregtech_bronze") - .panel(GTGuiTextures.IDs.BRONZE_BACKGROUND) - .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) - .fluidSlot(GTGuiTextures.IDs.BRONZE_SLOT) - .displayBackground(GTGuiTextures.IDs.DISPLAY_BRONZE) - .button(GTGuiTextures.IDs.BRONZE_BUTTON) - .color(0xFF7706) - .simpleToggleButton(GTGuiTextures.IDs.BRONZE_BUTTON, GTGuiTextures.IDs.BRONZE_BUTTON_SELECTED, + public static final GTGuiTheme BRONZE = templateBuilder(Names.BRONZE) + .parent(Names.STANDARD) + .panel(IDs.BRONZE_BACKGROUND) + // .itemSlot(GTGuiTextures.IDs.BRONZE_SLOT) + // .fluidSlot(GTGuiTextures.IDs.BRONZE_SLOT) + .displayBackground(IDs.DISPLAY_BRONZE) + .button(IDs.BRONZE_BUTTON) + .color(Colors.BRONZE) + .simpleToggleButton(IDs.BRONZE_BUTTON, IDs.BRONZE_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) .build(); - public static final GTGuiTheme STEEL = templateBuilder("gregtech_steel") - .panel(GTGuiTextures.IDs.STEEL_BACKGROUND) + public static final GTGuiTheme STEEL = templateBuilder(Names.STEEL) + .parent(Names.STANDARD) + .panel(IDs.STEEL_BACKGROUND) .textColor(Color.WHITE.darker(1)) - .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) - .fluidSlot(GTGuiTextures.IDs.STEEL_SLOT) - .displayBackground(GTGuiTextures.IDs.DISPLAY_STEEL) - .button(GTGuiTextures.IDs.STEEL_BUTTON) - .color(0x57576a) - .simpleToggleButton(GTGuiTextures.IDs.STEEL_BUTTON, GTGuiTextures.IDs.STEEL_BUTTON_SELECTED, + // .itemSlot(GTGuiTextures.IDs.STEEL_SLOT) + // .fluidSlot(GTGuiTextures.IDs.STEEL_SLOT) + .displayBackground(IDs.DISPLAY_STEEL) + .button(IDs.STEEL_BUTTON) + .simpleToggleButton(IDs.STEEL_BUTTON, IDs.STEEL_BUTTON_SELECTED, ConfigHolder.client.defaultUIColor) + .color(Colors.STEEL) .build(); - public static final GTGuiTheme PRIMITIVE = templateBuilder("gregtech_primitive") - .panel(GTGuiTextures.IDs.PRIMITIVE_BACKGROUND) + public static final GTGuiTheme PRIMITIVE = templateBuilder(Names.PRIMITIVE) + .parent(Names.STANDARD) + .panel(IDs.PRIMITIVE_BACKGROUND) .textColor(Color.WHITE.darker(1)) - .color(0x826B51) - .itemSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) - .fluidSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) + .color(Colors.PRIMITIVE) + // .itemSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) + // .fluidSlot(GTGuiTextures.IDs.PRIMITIVE_SLOT) .build(); protected final String themeId; @@ -83,7 +108,7 @@ public class GTGuiTheme { protected final JsonBuilder jsonBuilder; private Supplier logo; - private String displayBackground = GTGuiTextures.IDs.DISPLAY; + private String displayBackground = IDs.DISPLAY; protected GTGuiTheme(String themeId) { this.themeId = themeId; From 50f65e7343ef310e3ab308c358d0abd19a1a31dc Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 2 Apr 2025 20:48:10 -0700 Subject: [PATCH 201/264] make GTObjectDrawable prefer slot from theme don't color theme'd buttons spotless --- .../multiblock/ui/MultiblockUIBuilder.java | 10 ++++++---- src/main/java/gregtech/api/mui/GTGuiTextures.java | 4 ---- .../gregtech/api/mui/drawable/GTObjectDrawable.java | 9 +++++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index a13a26d2256..866ad8e191b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -572,8 +572,9 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL } for (var chancedItemOutput : chancedItemOutputs) { - //noinspection DataFlowIssue - int chance = getSyncer().syncInt(() -> map.chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier)); + // noinspection DataFlowIssue + int chance = getSyncer() + .syncInt(() -> map.chanceFunction.getBoostedChance(chancedItemOutput, recipeTier, machineTier)); int count = chancedItemOutput.getIngredient().getCount() * p; addChancedItemOutputLine(chancedItemOutput, count, chance, maxProgress); } @@ -587,8 +588,9 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL } for (var chancedFluidOutput : chancedFluidOutputs) { - //noinspection DataFlowIssue - int chance = getSyncer().syncInt(() -> map.chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier)); + // noinspection DataFlowIssue + int chance = getSyncer() + .syncInt(() -> map.chanceFunction.getBoostedChance(chancedFluidOutput, recipeTier, machineTier)); int count = chancedFluidOutput.getIngredient().amount * p; addChancedFluidOutputLine(chancedFluidOutput, count, chance, maxProgress); } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index d8e00d61641..8fb80ec4d3d 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -408,7 +408,6 @@ private static String id(String path) { .uv(18, 0, 18, 18) .adaptable(2) .name(IDs.BRONZE_BUTTON) - .canApplyTheme() .build(); public static final UITexture BUTTON_BRONZE_SELECTED = new UITexture.Builder() @@ -417,7 +416,6 @@ private static String id(String path) { .uv(18, 18, 18, 18) .adaptable(2) .name(IDs.BRONZE_BUTTON_SELECTED) - .canApplyTheme() .build(); public static final UITexture BUTTON_STEEL = new UITexture.Builder() @@ -426,7 +424,6 @@ private static String id(String path) { .uv(36, 0, 18, 18) .adaptable(2) .name(IDs.STEEL_BUTTON) - .canApplyTheme() .build(); public static final UITexture BUTTON_STEEL_SELECTED = new UITexture.Builder() @@ -435,7 +432,6 @@ private static String id(String path) { .uv(36, 18, 18, 18) .adaptable(2) .name(IDs.STEEL_BUTTON_SELECTED) - .canApplyTheme() .build(); public static final UITexture MC_BUTTON = new UITexture.Builder() diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java index df8b9171f78..561d489bd29 100644 --- a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -12,6 +12,7 @@ import com.cleanroommc.modularui.drawable.text.TextRenderer; import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; @@ -60,10 +61,14 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget private void drawObject(Object object, GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { if (object instanceof ItemStack stack) { - GTGuiTextures.SLOT.draw(context, x, y, width, height, widgetTheme); + IDrawable slot = ((ModularGuiContext) context).getTheme().getItemSlotTheme().getBackground(); + if (slot == null) slot = GTGuiTextures.SLOT; + slot.draw(context, x, y, width, height, widgetTheme); GuiDraw.drawItem(stack, x + 1, y + 1, width - 2, height - 2); } else if (object instanceof FluidStack stack) { - GTGuiTextures.FLUID_SLOT.draw(context, x, y, width, height, widgetTheme); + IDrawable slot = ((ModularGuiContext) context).getTheme().getFluidSlotTheme().getBackground(); + if (slot == null) slot = GTGuiTextures.FLUID_SLOT; + slot.draw(context, x, y, width, height, widgetTheme); GuiDraw.drawFluidTexture(stack, x + 1, y + 1, width - 2, height - 2, 0); } else if (object instanceof BoostableChanceEntryentry) { drawObject(entry.getIngredient(), context, x, y, width, height, widgetTheme); From 2a229d7eb13e00aacf46befad97ca575c0d23447 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:25:07 -0700 Subject: [PATCH 202/264] rework ProgressBarMultiblock interface and bar registration use widget supplier for childif --- .../multiblock/ProgressBarMultiblock.java | 12 +- .../multiblock/ui/MultiblockUIFactory.java | 66 ++++-- .../multiblock/ui/TemplateBarBuilder.java | 35 +++ .../multi/MetaTileEntityLargeBoiler.java | 24 +-- .../electric/MetaTileEntityFluidDrill.java | 15 +- .../electric/MetaTileEntityFusionReactor.java | 70 +++--- .../multi/electric/MetaTileEntityHPCA.java | 92 ++++---- .../MetaTileEntityPowerSubstation.java | 17 +- .../MetaTileEntityLargeCombustionEngine.java | 154 ++++++------- .../generator/MetaTileEntityLargeTurbine.java | 202 ++++++++---------- 10 files changed, 363 insertions(+), 324 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java index 8f5813018ea..13ace7a5e6f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java @@ -1,15 +1,19 @@ package gregtech.api.metatileentity.multiblock; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.ProgressWidget; -import org.jetbrains.annotations.NotNull; + +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; + +import java.util.List; +import java.util.function.UnaryOperator; public interface ProgressBarMultiblock { int getProgressBarCount(); - @NotNull - ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index); + // the bar only needs three things + // progress, texture, and tooltip + void registerBars(List> bars, PanelSyncManager syncManager); /** * @return the amount of columns in the progress bar grid diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 8f51b2f0277..24b4472f103 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -38,8 +38,11 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; +import java.util.List; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.UnaryOperator; public class MultiblockUIFactory { @@ -244,7 +247,7 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { var panel = GTGuis.createPanel(mte, width, height) - .childIf(!disableDisplay, createScreen(panelSyncManager)); + .childIf(!disableDisplay, () -> createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? if (mte instanceof ProgressBarMultiblock progressBarMultiblock && @@ -270,7 +273,31 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { .left(4).right(4) .crossAxisAlignment(Alignment.CrossAxis.CENTER) .child(playerInv) - .childIf(!disableButtons, createButtons(panel, panelSyncManager, guiData))); + .childIf(!disableButtons, () -> createButtons(panel, panelSyncManager, guiData))); + } + + private static int calculateRows(int count) { + if (count <= 3) { + return 1; + } + + if (count <= 8) { + return 2; + } + + throw new UnsupportedOperationException("Cannot compute progress bar rows for count " + count); + } + + private static int calculateCols(int count, int row) { + return switch (count) { + case 0, 1, 2, 3 -> count; + case 4 -> 2; + case 5 -> row == 0 ? 3 : 2; + case 6 -> 3; + case 7 -> row == 0 ? 4 : 3; + case 8 -> 4; + default -> throw new UnsupportedOperationException("Cannot compute progress bar cols for count " + count); + }; } /** @@ -280,16 +307,23 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { @Nullable protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, @NotNull PanelSyncManager panelSyncManager) { - final int rows = progressMulti.getProgressBarRows(); - final int cols = progressMulti.getProgressBarCols(); + final int count = progressMulti.getProgressBarCount(); +// final int calculatedRows = calculateRows(count); + final int calculatedRows = progressMulti.getProgressBarRows(); + final int calculatedCols = progressMulti.getProgressBarCols(); Flow column = Flow.column() .margin(4, 0) .top(5 + screenHeight) .widthRel(1f) - .height(Bars.HEIGHT * rows); + .height(Bars.HEIGHT * calculatedRows); + + List> map = new ArrayList<>(progressMulti.getProgressBarCount()); + progressMulti.registerBars(map, panelSyncManager); + + for (int r = 0; r < calculatedRows; r++) { - for (int r = 0; r < rows; r++) { +// final int cols = calculateCols(count, r); Flow row = Flow.row() .widthRel(1f) @@ -297,17 +331,25 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, .height(Bars.HEIGHT); // the numbers for the given row of bars - int from = r * cols; - int to = Math.min(from + cols, progressMulti.getProgressBarCount()); + int from = r * calculatedCols; + int to = Math.min(from + calculatedCols, count); // calculate bar width int barCount = Math.max(1, to - from); int barWidth = (Bars.FULL_WIDTH / barCount) - (barCount - 1); for (int i = from; i < to; i++) { - row.child(progressMulti.createProgressBar(panelSyncManager, i) - .height(Bars.HEIGHT) - .width(barWidth) + ProgressWidget widget; + if (i < map.size()) { + widget = map.get(i) + .apply(new TemplateBarBuilder()) + .build(); + } else { + // error widget? + widget = new ProgressWidget(); + } + + row.child(widget.size(barWidth, Bars.HEIGHT) .direction(ProgressWidget.Direction.RIGHT)); } @@ -336,7 +378,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { this.screenFunction.addWidgets(parent, syncManager); } - return parent.childIf(!disableIndicator, createIndicator(syncManager)) + return parent.childIf(!disableIndicator, () -> createIndicator(syncManager)) .background(getDisplayBackground()) .size(190, screenHeight) .pos(4, 4); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java new file mode 100644 index 00000000000..1b075ef4703 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java @@ -0,0 +1,35 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.widgets.ProgressWidget; + +import java.util.function.Consumer; +import java.util.function.DoubleSupplier; + +public final class TemplateBarBuilder { + + ProgressWidget widget = new ProgressWidget(); + + TemplateBarBuilder() {} + + public TemplateBarBuilder progress(DoubleSupplier supplier) { + this.widget.progress(supplier); + return this; + } + + public TemplateBarBuilder texture(UITexture texture) { + this.widget.texture(texture, -1); + return this; + } + + public TemplateBarBuilder tooltipBuilder(Consumer consumer) { + this.widget.tooltipAutoUpdate(true); + this.widget.tooltipBuilder(consumer); + return this; + } + + ProgressWidget build() { + return this.widget; + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 0a9f345ab87..dec7866dc80 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -11,6 +11,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuiTheme; @@ -50,7 +51,6 @@ 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.ProgressWidget; import com.cleanroommc.modularui.widgets.SliderWidget; import com.cleanroommc.modularui.widgets.layout.Flow; import com.cleanroommc.modularui.widgets.textfield.TextFieldWidget; @@ -59,6 +59,7 @@ import java.util.Collections; import java.util.List; +import java.util.function.UnaryOperator; public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase implements ProgressBarMultiblock { @@ -397,29 +398,28 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + public void registerBars(List> bars, PanelSyncManager syncManager) { IntSyncValue waterFilledValue = new IntSyncValue(this::getWaterFilled); IntSyncValue waterCapacityValue = new IntSyncValue(this::getWaterCapacity); - panelSyncManager.syncValue("water_filled", waterFilledValue); - panelSyncManager.syncValue("water_capacity", waterCapacityValue); + syncManager.syncValue("water_filled", waterFilledValue); + syncManager.syncValue("water_capacity", waterCapacityValue); - return new ProgressWidget() + bars.add(barTest -> barTest .progress(() -> waterCapacityValue.getIntValue() == 0 ? 0 : waterFilledValue.getIntValue() * 1.0 / waterCapacityValue.getIntValue()) - .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { + .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION) + .tooltipBuilder(tooltip -> { if (isStructureFormed()) { if (waterFilledValue.getIntValue() == 0) { - t.addLine(IKey.lang("gregtech.multiblock.large_boiler.no_water")); + tooltip.addLine(IKey.lang("gregtech.multiblock.large_boiler.no_water")); } else { - t.addLine(IKey.lang("gregtech.multiblock.large_boiler.water_bar_hover", + tooltip.addLine(IKey.lang("gregtech.multiblock.large_boiler.water_bar_hover", waterFilledValue.getIntValue(), waterCapacityValue.getIntValue())); } } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + tooltip.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } - }); + })); } /** diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index d6ce9f408e1..526f8e6a746 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -13,7 +13,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -51,13 +51,13 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.ProgressWidget; import com.google.common.collect.Lists; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; +import java.util.function.UnaryOperator; public class MetaTileEntityFluidDrill extends MultiblockWithDisplayBase implements ITieredMetaTileEntity, IWorkable, ProgressBarMultiblock { @@ -375,15 +375,14 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { + public void registerBars(List> bars, PanelSyncManager syncManager) { IntSyncValue operationsValue = new IntSyncValue(() -> BedrockFluidVeinHandler.getOperationsRemaining(getWorld(), minerLogic.getChunkX(), minerLogic.getChunkZ())); - panelSyncManager.syncValue("operations_remaining", operationsValue); + syncManager.syncValue("operations_remaining", operationsValue); - return new ProgressWidget() + bars.add(bar -> bar .progress(() -> operationsValue.getIntValue() * 1.0 / BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS) - .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION, MultiblockUIFactory.Bars.FULL_WIDTH) - .tooltipAutoUpdate(true) + .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION) .tooltipBuilder(t -> { if (isStructureFormed()) { if (operationsValue.getIntValue() == 0) { @@ -407,6 +406,6 @@ public int getProgressBarCount() { } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } - }); + })); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 04b0d4e3a04..81663f976ab 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -16,6 +16,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -82,6 +83,7 @@ import java.util.Arrays; import java.util.List; import java.util.function.DoubleSupplier; +import java.util.function.UnaryOperator; import static gregtech.api.recipes.logic.OverclockingLogic.PERFECT_HALF_DURATION_FACTOR; import static gregtech.api.recipes.logic.OverclockingLogic.PERFECT_HALF_VOLTAGE_FACTOR; @@ -407,45 +409,35 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { - return switch (index) { - case 0 -> { - LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); - panelSyncManager.syncValue("capacity", index, capacity); - LongSyncValue stored = new LongSyncValue(energyContainer::getEnergyStored); - panelSyncManager.syncValue("stored", index, stored); - yield new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - tooltip.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.energy_stored", - stored.getLongValue(), capacity.getLongValue())); - }) - .progress(() -> capacity.getLongValue() > 0 ? - 1.0 * stored.getLongValue() / capacity.getLongValue() : 0); - } - case 1 -> { - LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); - panelSyncManager.syncValue("capacity", index, capacity); - LongSyncValue heat = new LongSyncValue(this::getHeat); - panelSyncManager.syncValue("heat", index, heat); - yield new ProgressWidget() - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, - "%,d / %,d EU", - heat.getLongValue(), capacity.getLongValue()); - tooltip.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.fusion_reactor.heat", - heatInfo)); - }) - .progress(() -> capacity.getLongValue() > 0 ? - 1.0 * heat.getLongValue() / capacity.getLongValue() : 0); - } - default -> throw new IllegalStateException(); - }; + public void registerBars(List> bars, PanelSyncManager syncManager) { + LongSyncValue capacity = new LongSyncValue(energyContainer::getEnergyCapacity); + syncManager.syncValue("capacity", capacity); + LongSyncValue stored = new LongSyncValue(energyContainer::getEnergyStored); + syncManager.syncValue("stored", stored); + LongSyncValue heat = new LongSyncValue(this::getHeat); + syncManager.syncValue("heat", heat); + + bars.add(barTest -> barTest + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * stored.getLongValue() / capacity.getLongValue() : 0) + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_ENERGY) + .tooltipBuilder(tooltip -> tooltip + .add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.energy_stored", + stored.getLongValue(), capacity.getLongValue())))); + + bars.add(barTest -> barTest + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT) + .tooltipBuilder(tooltip -> { + IKey heatInfo = KeyUtil.string(TextFormatting.AQUA, + "%,d / %,d EU", + heat.getLongValue(), capacity.getLongValue()); + tooltip.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fusion_reactor.heat", + heatInfo)); + }) + .progress(() -> capacity.getLongValue() > 0 ? + 1.0 * heat.getLongValue() / capacity.getLongValue() : 0)); } private static class FusionProgressSupplier { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index c0f828a8a7a..fbf147f8b0a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; @@ -72,6 +73,7 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import java.util.function.UnaryOperator; import static gregtech.api.util.RelativeDirection.*; @@ -533,56 +535,46 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, - int index) { - return switch (index) { - case 0 -> { - IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt); - IntSyncValue maxCWUtValue = new IntSyncValue(hpcaHandler::getMaxCWUt); - panelSyncManager.syncValue("current_cwut", currentCWUtValue); - panelSyncManager.syncValue("max_cwut", maxCWUtValue); - - yield new ProgressWidget() - .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) - .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - t.addLine(IKey.lang("gregtech.multiblock.hpca.computation", - currentCWUtValue.getIntValue(), maxCWUtValue.getIntValue())); - } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); - } - }); - } - case 1 -> { - DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature); - panelSyncManager.syncValue("temperature", temperatureValue); - - yield new ProgressWidget() - .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) - .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT, MultiblockUIFactory.Bars.HALF_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - double temp = temperatureValue.getDoubleValue(); - int degrees = (int) Math.round(temp / 10.0); - - // TODO working dynamic color substitutions into IKey.lang - if (temp < 500) { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.low", degrees)); - } else if (temp < 750) { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.medium", degrees)); - } else { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.high", degrees)); - } - } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); - } - }); - } - default -> throw new IllegalStateException("Invalid index received " + index); - }; + public void registerBars(List> bars, PanelSyncManager syncManager) { + IntSyncValue currentCWUtValue = new IntSyncValue(() -> hpcaHandler.cachedCWUt); + IntSyncValue maxCWUtValue = new IntSyncValue(hpcaHandler::getMaxCWUt); + syncManager.syncValue("current_cwut", currentCWUtValue); + syncManager.syncValue("max_cwut", maxCWUtValue); + DoubleSyncValue temperatureValue = new DoubleSyncValue(() -> temperature); + syncManager.syncValue("temperature", temperatureValue); + + bars.add(barTest -> barTest + .progress(() -> 1.0 * currentCWUtValue.getIntValue() / maxCWUtValue.getIntValue()) + .texture(GTGuiTextures.PROGRESS_BAR_HPCA_COMPUTATION) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.computation", + currentCWUtValue.getIntValue(), maxCWUtValue.getIntValue())); + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + })); + + bars.add(barTest -> barTest + .progress(() -> Math.min(1.0, temperatureValue.getDoubleValue() / DAMAGE_TEMPERATURE)) + .texture(GTGuiTextures.PROGRESS_BAR_FUSION_HEAT) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + double temp = temperatureValue.getDoubleValue(); + int degrees = (int) Math.round(temp / 10.0); + + // TODO working dynamic color substitutions into IKey.lang + if (temp < 500) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.low", degrees)); + } else if (temp < 750) { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.medium", degrees)); + } else { + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.high", degrees)); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + })); } // Handles the logic of this structure's specific HPCA component grid diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index d529c02d7db..d9f4f85d715 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -14,8 +14,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.BigIntegerSyncValue; import gregtech.api.pattern.BlockPattern; @@ -55,7 +55,6 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import com.cleanroommc.modularui.widgets.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; @@ -68,6 +67,7 @@ import java.util.List; import java.util.Map; import java.util.function.Supplier; +import java.util.function.UnaryOperator; import static gregtech.api.util.RelativeDirection.*; @@ -578,19 +578,18 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(@NotNull PanelSyncManager panelSyncManager, int index) { + public void registerBars(List> bars, PanelSyncManager syncManager) { BigIntegerSyncValue energyStoredValue = new BigIntegerSyncValue( () -> energyBank == null ? BigInteger.ZERO : energyBank.getStored(), null); BigIntegerSyncValue energyCapacityValue = new BigIntegerSyncValue( () -> energyBank == null ? BigInteger.ZERO : energyBank.getCapacity(), null); - panelSyncManager.syncValue("energy_stored", energyStoredValue); - panelSyncManager.syncValue("energy_capacity", energyCapacityValue); + syncManager.syncValue("energy_stored", energyStoredValue); + syncManager.syncValue("energy_capacity", energyCapacityValue); - return new ProgressWidget() + bars.add(b -> b .progress( () -> energyStoredValue.getValue().doubleValue() / energyCapacityValue.getValue().doubleValue()) - .texture(GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW, MultiblockUIFactory.Bars.FULL_WIDTH) - .tooltipAutoUpdate(true) + .texture(GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW) .tooltipBuilder(t -> { if (isStructureFormed()) { t.addLine(IKey.lang("gregtech.multiblock.energy_stored", energyStoredValue.getValue(), @@ -598,7 +597,7 @@ public int getProgressBarCount() { } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } - }); + })); } public static class PowerStationEnergyBank { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index d079fa7788a..585219b400c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -14,7 +14,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.pattern.BlockPattern; @@ -47,11 +47,11 @@ 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.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.function.UnaryOperator; public class MetaTileEntityLargeCombustionEngine extends FuelMultiblockController implements ProgressBarMultiblock { @@ -237,91 +237,79 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { - return switch (index) { - case 0 -> { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); - StringSyncValue fuelNameValue = new StringSyncValue(() -> { - FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); - if (stack == null) { - return null; - } - Fluid fluid = stack.getFluid(); - if (fluid == null) { - return null; - } - return fluid.getName(); - }); - panelSyncManager.syncValue("fuel_amount", fuelValue); - panelSyncManager.syncValue("fuel_name", fuelNameValue); - - yield new ProgressWidget() - .progress(() -> fuelValue.getValue(1) == 0 ? 0 : - 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) - .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); + public void registerBars(List> bars, PanelSyncManager syncManager) { + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); + syncManager.syncValue("fuel_amount", fuelValue); + StringSyncValue fuelNameValue = new StringSyncValue(() -> { + FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); + if (stack == null) { + return null; } - case 1 -> { - FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null); - panelSyncManager.syncValue("lubricant_amount", lubricantValue); - - yield new ProgressWidget() - .progress(() -> lubricantValue.getValue(1) == 0 ? 0 : - 1.0 * lubricantValue.getValue(0) / lubricantValue.getValue(1)) - .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - if (lubricantValue.getValue(0) == 0) { - t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); - } else { - t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.lubricant_amount", - lubricantValue.getValue(0), lubricantValue.getValue(1))); - } - } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); - } - }); + Fluid fluid = stack.getFluid(); + if (fluid == null) { + return null; } - case 2 -> { - FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null); - BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed); - panelSyncManager.syncValue("oxygen_amount", oxygenValue); - panelSyncManager.syncValue("boost_allowed", boostValue); - - yield new ProgressWidget() - .progress(() -> oxygenValue.getValue(1) == 0 ? 0 : - 1.0 * oxygenValue.getValue(0) / oxygenValue.getValue(1)) - .texture(GTGuiTextures.PROGRESS_BAR_LCE_OXYGEN, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - if (boostValue.getBoolValue()) { - if (oxygenValue.getValue(0) == 0) { - t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_none")); - } else if (isExtreme) { - t.addLine(IKey.lang( - "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount", - oxygenValue.getValue(0), oxygenValue.getValue(1))); - } else { - t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_amount", - oxygenValue.getValue(0), oxygenValue.getValue(1))); - } - } else if (isExtreme) { - t.addLine(IKey.lang( - "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed")); - } else { - t.addLine(IKey.lang( - "gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed")); - } + return fluid.getName(); + }); + syncManager.syncValue("fuel_name", fuelNameValue); + FixedIntArraySyncValue lubricantValue = new FixedIntArraySyncValue(this::getLubricantAmount, null); + syncManager.syncValue("lubricant_amount", lubricantValue); + FixedIntArraySyncValue oxygenValue = new FixedIntArraySyncValue(this::getOxygenAmount, null); + syncManager.syncValue("oxygen_amount", oxygenValue); + BooleanSyncValue boostValue = new BooleanSyncValue(this::isBoostAllowed); + syncManager.syncValue("boost_allowed", boostValue); + + bars.add(barTest -> barTest + .progress(() -> fuelValue.getValue(1) == 0 ? 0 : + 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL) + .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue))); + + bars.add(barTest -> barTest + .progress(() -> lubricantValue.getValue(1) == 0 ? 0 : + 1.0 * lubricantValue.getValue(0) / lubricantValue.getValue(1)) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_LUBRICANT) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + if (lubricantValue.getValue(0) == 0) { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.no_lubricant")); + } else { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.lubricant_amount", + lubricantValue.getValue(0), lubricantValue.getValue(1))); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + })); + + bars.add(barTest -> barTest + .progress(() -> oxygenValue.getValue(1) == 0 ? 0 : + 1.0 * oxygenValue.getValue(0) / oxygenValue.getValue(1)) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_OXYGEN) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + if (boostValue.getBoolValue()) { + if (oxygenValue.getValue(0) == 0) { + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_none")); + } else if (isExtreme) { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_amount", + oxygenValue.getValue(0), oxygenValue.getValue(1))); } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + t.addLine(IKey.lang("gregtech.multiblock.large_combustion_engine.oxygen_amount", + oxygenValue.getValue(0), oxygenValue.getValue(1))); } - }); - } - default -> throw new IllegalStateException("Invalid index received " + index); - }; + } else if (isExtreme) { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed")); + } else { + t.addLine(IKey.lang( + "gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed")); + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + })); } /** diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 1b325daeef4..74cba563123 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -9,7 +9,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; -import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.FixedIntArraySyncValue; import gregtech.api.pattern.BlockPattern; @@ -35,11 +35,11 @@ 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.ProgressWidget; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.function.UnaryOperator; public class MetaTileEntityLargeTurbine extends FuelMultiblockController implements ITieredMetaTileEntity, ProgressBarMultiblock { @@ -270,117 +270,105 @@ public int getProgressBarCount() { } @Override - public @NotNull ProgressWidget createProgressBar(PanelSyncManager panelSyncManager, int index) { - return switch (index) { - case 0 -> { - FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); - StringSyncValue fuelNameValue = new StringSyncValue(() -> { - FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); - if (stack == null) { - return null; - } - Fluid fluid = stack.getFluid(); - if (fluid == null) { - return null; - } - return fluid.getName(); - }); - panelSyncManager.syncValue("fuel_amount", fuelValue); - panelSyncManager.syncValue("fuel_name", fuelNameValue); - - yield new ProgressWidget() - .progress(() -> fuelValue.getValue(1) == 0 ? 0 : - 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) - .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue)); + public void registerBars(List> bars, PanelSyncManager syncManager) { + FixedIntArraySyncValue fuelValue = new FixedIntArraySyncValue(this::getFuelAmount, null); + StringSyncValue fuelNameValue = new StringSyncValue(() -> { + FluidStack stack = ((MultiblockFuelRecipeLogic) recipeMapWorkable).getInputFluidStack(); + if (stack == null) { + return null; } - case 1 -> { - IntSyncValue rotorSpeedValue = new IntSyncValue(() -> { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null) { - return 0; - } - return rotorHolder.getRotorSpeed(); - }); + Fluid fluid = stack.getFluid(); + if (fluid == null) { + return null; + } + return fluid.getName(); + }); + syncManager.syncValue("fuel_amount", fuelValue); + syncManager.syncValue("fuel_name", fuelNameValue); - IntSyncValue rotorMaxSpeedValue = new IntSyncValue(() -> { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null) { - return 0; - } - return rotorHolder.getMaxRotorHolderSpeed(); - }); - - panelSyncManager.syncValue("rotor_speed", rotorSpeedValue); - panelSyncManager.syncValue("rotor_max_speed", rotorMaxSpeedValue); - - yield new ProgressWidget() - .progress(() -> rotorMaxSpeedValue.getIntValue() == 0 ? 0 : - 1.0 * rotorSpeedValue.getIntValue() / rotorMaxSpeedValue.getIntValue()) - .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED, MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - int speed = rotorSpeedValue.getIntValue(); - int maxSpeed = rotorMaxSpeedValue.getIntValue(); - - t.addLine(KeyUtil.lang("gregtech.multiblock.turbine.rotor_speed", - getSpeedFormat(maxSpeed, speed), speed, maxSpeed)); - } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); - } - }); + IntSyncValue rotorSpeedValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; } - case 2 -> { - IntSyncValue durabilityValue = new IntSyncValue(() -> { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null) { - return 0; - } - return rotorHolder.getRotorDurabilityPercent(); - }); - IntSyncValue efficiencyValue = new IntSyncValue(() -> { - IRotorHolder rotorHolder = getRotorHolder(); - if (rotorHolder == null) { - return 0; + return rotorHolder.getRotorSpeed(); + }); + + IntSyncValue rotorMaxSpeedValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getMaxRotorHolderSpeed(); + }); + + syncManager.syncValue("rotor_speed", rotorSpeedValue); + syncManager.syncValue("rotor_max_speed", rotorMaxSpeedValue); + IntSyncValue durabilityValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getRotorDurabilityPercent(); + }); + IntSyncValue efficiencyValue = new IntSyncValue(() -> { + IRotorHolder rotorHolder = getRotorHolder(); + if (rotorHolder == null) { + return 0; + } + return rotorHolder.getRotorEfficiency(); + }); + + syncManager.syncValue("rotor_durability", durabilityValue); + syncManager.syncValue("rotor_efficiency", efficiencyValue); + + bars.add(barTest -> barTest + .progress(() -> fuelValue.getValue(1) == 0 ? 0 : + 1.0 * fuelValue.getValue(0) / fuelValue.getValue(1)) + .texture(GTGuiTextures.PROGRESS_BAR_LCE_FUEL) + .tooltipBuilder(t -> createFuelTooltip(t, fuelValue, fuelNameValue))); + + bars.add(barTest -> barTest + .progress(() -> rotorMaxSpeedValue.getIntValue() == 0 ? 0 : + 1.0 * rotorSpeedValue.getIntValue() / rotorMaxSpeedValue.getIntValue()) + .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_SPEED) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + int speed = rotorSpeedValue.getIntValue(); + int maxSpeed = rotorMaxSpeedValue.getIntValue(); + + t.addLine(KeyUtil.lang("gregtech.multiblock.turbine.rotor_speed", + getSpeedFormat(maxSpeed, speed), speed, maxSpeed)); + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } - return rotorHolder.getRotorEfficiency(); - }); - - panelSyncManager.syncValue("rotor_durability", durabilityValue); - panelSyncManager.syncValue("rotor_efficiency", efficiencyValue); - - yield new ProgressWidget() - .progress(() -> durabilityValue.getIntValue() / 100.0) - .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY, - MultiblockUIFactory.Bars.THIRD_WIDTH) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> { - if (isStructureFormed()) { - if (efficiencyValue.getIntValue() <= 0) { - t.addLine(IKey.lang("gregtech.multiblock.turbine.no_rotor")); - } else { - int durability = durabilityValue.getIntValue(); - // TODO working dynamic color substitutions into IKey.lang - if (durability > 40) { - t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.high", - durability)); - } else if (durability > MIN_DURABILITY_TO_WARN) { - t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.medium", - durability)); - } else { - t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.low", - durability)); - } - } + })); + + bars.add(barTest -> barTest + .progress(() -> durabilityValue.getIntValue() / 100.0) + .texture(GTGuiTextures.PROGRESS_BAR_TURBINE_ROTOR_DURABILITY) + .tooltipBuilder(t -> { + if (isStructureFormed()) { + if (efficiencyValue.getIntValue() <= 0) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.no_rotor")); + } else { + int durability = durabilityValue.getIntValue(); + // TODO working dynamic color substitutions into IKey.lang + if (durability > 40) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.high", + durability)); + } else if (durability > MIN_DURABILITY_TO_WARN) { + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.medium", + durability)); } else { - t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + t.addLine(IKey.lang("gregtech.multiblock.turbine.rotor_durability.low", + durability)); } - }); - } - default -> throw new IllegalStateException("Invalid index received " + index); - }; + } + } else { + t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + } + })); } private @NotNull TextFormatting getSpeedFormat(int maxSpeed, int speed) { From 721892ee4f11295bc9c3d7847c6f59ea17c6a347 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 4 Apr 2025 17:49:05 -0700 Subject: [PATCH 203/264] remove unused default methods improve error bar --- .../multiblock/ProgressBarMultiblock.java | 34 ++----------------- .../multiblock/ui/MultiblockUIFactory.java | 27 ++++++++------- .../electric/MetaTileEntityFusionReactor.java | 2 +- .../MetaTileEntityPowerSubstation.java | 2 +- 4 files changed, 18 insertions(+), 47 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java index 13ace7a5e6f..fdd1e2568dc 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java @@ -1,9 +1,9 @@ package gregtech.api.metatileentity.multiblock; -import com.cleanroommc.modularui.value.sync.PanelSyncManager; - import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; +import com.cleanroommc.modularui.value.sync.PanelSyncManager; + import java.util.List; import java.util.function.UnaryOperator; @@ -14,34 +14,4 @@ public interface ProgressBarMultiblock { // the bar only needs three things // progress, texture, and tooltip void registerBars(List> bars, PanelSyncManager syncManager); - - /** - * @return the amount of columns in the progress bar grid - */ - default int getProgressBarCols() { - int count = getProgressBarCount(); - return switch (count) { - case 0, 1, 2, 3 -> count; - case 4 -> 2; - case 5, 6 -> 3; - case 7, 8 -> 4; - default -> throw new UnsupportedOperationException("Cannot compute progress bar cols for count " + count); - }; - } - - /** - * @return the amount of rows in the progress bar grid - */ - default int getProgressBarRows() { - int count = getProgressBarCount(); - if (count <= 3) { - return 1; - } - - if (count <= 8) { - return 2; - } - - throw new UnsupportedOperationException("Cannot compute progress bar rows for count " + count); - } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 24b4472f103..00958ab6222 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -20,10 +20,12 @@ 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.Rectangle; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.utils.Alignment; +import com.cleanroommc.modularui.utils.Color; import com.cleanroommc.modularui.value.BoolValue; import com.cleanroommc.modularui.value.sync.BooleanSyncValue; import com.cleanroommc.modularui.value.sync.IntSyncValue; @@ -252,7 +254,7 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { // TODO createExtras() hook for overrides? if (mte instanceof ProgressBarMultiblock progressBarMultiblock && progressBarMultiblock.getProgressBarCount() > 0) { - panel.height(height + (Bars.HEIGHT * progressBarMultiblock.getProgressBarRows()) - 2); + panel.height(height + (Bars.HEIGHT * calculateRows(progressBarMultiblock.getProgressBarCount())) - 2); panel.child(createBars(progressBarMultiblock, panelSyncManager)); } @@ -308,9 +310,7 @@ private static int calculateCols(int count, int row) { protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, @NotNull PanelSyncManager panelSyncManager) { final int count = progressMulti.getProgressBarCount(); -// final int calculatedRows = calculateRows(count); - final int calculatedRows = progressMulti.getProgressBarRows(); - final int calculatedCols = progressMulti.getProgressBarCols(); + final int calculatedRows = calculateRows(count); Flow column = Flow.column() .margin(4, 0) @@ -318,12 +318,12 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, .widthRel(1f) .height(Bars.HEIGHT * calculatedRows); - List> map = new ArrayList<>(progressMulti.getProgressBarCount()); - progressMulti.registerBars(map, panelSyncManager); + List> barBuilders = new ArrayList<>(progressMulti.getProgressBarCount()); + progressMulti.registerBars(barBuilders, panelSyncManager); for (int r = 0; r < calculatedRows; r++) { -// final int cols = calculateCols(count, r); + final int calculatedCols = calculateCols(count, r); Flow row = Flow.row() .widthRel(1f) @@ -331,8 +331,8 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, .height(Bars.HEIGHT); // the numbers for the given row of bars - int from = r * calculatedCols; - int to = Math.min(from + calculatedCols, count); + int from = r * (count - calculatedCols); + int to = from + calculatedCols; // calculate bar width int barCount = Math.max(1, to - from); @@ -340,13 +340,14 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, for (int i = from; i < to; i++) { ProgressWidget widget; - if (i < map.size()) { - widget = map.get(i) + if (i < barBuilders.size()) { + widget = barBuilders.get(i) .apply(new TemplateBarBuilder()) .build(); } else { - // error widget? - widget = new ProgressWidget(); + widget = new ProgressWidget() + .addTooltipLine("Error! no bar for index: " + i) + .background(new Rectangle().setColor(Color.RED.main)); } row.child(widget.size(barWidth, Bars.HEIGHT) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 81663f976ab..04b81df43ce 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -16,8 +16,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; -import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index d9f4f85d715..87ca99dae6b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -14,8 +14,8 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; -import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.sync.BigIntegerSyncValue; import gregtech.api.pattern.BlockPattern; From 5bddfaeb1eac38311b62ca88ac5656894f91b54e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 9 Apr 2025 16:45:08 -0700 Subject: [PATCH 204/264] actually theme object drawawble + misc fixes fix server crash --- .../multiblock/ui/MultiblockUIBuilder.java | 1 + .../api/mui/drawable/GTObjectDrawable.java | 26 +++++++++++-------- src/main/java/gregtech/api/util/KeyUtil.java | 3 +++ 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 866ad8e191b..f98eff891c1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -778,6 +778,7 @@ public void onRebuild(Runnable onRebuild) { } private void addKey(IKey key, IDrawable... hover) { + if (isServer()) return; addKey(KeyUtil.setHover(key, hover)); } diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java index 561d489bd29..c93ec28c6bf 100644 --- a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -1,5 +1,7 @@ package gregtech.api.mui.drawable; +import com.cleanroommc.modularui.theme.WidgetSlotTheme; + import gregtech.api.mui.GTGuiTextures; import gregtech.api.recipes.chance.boost.BoostableChanceEntry; @@ -48,9 +50,10 @@ public GTObjectDrawable setBoostFunction(Function, Integ @Override public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + if (!(context instanceof ModularGuiContext modularGuiContext)) return; renderer.setAlignment(Alignment.BottomRight, width - 1, height - 1); - drawObject(object, context, x, y, width, height, widgetTheme); - if (amount > 1) { + drawObject(object, modularGuiContext, x, y, width, height); + if (amount > 0) { renderer.setPos(x + 1, y + 1); String amount = NumberFormat.formatWithMaxDigits(this.amount, 3); if (object instanceof FluidStack) amount += "L"; @@ -58,22 +61,23 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget } } - private void drawObject(Object object, GuiContext context, int x, int y, int width, int height, - WidgetTheme widgetTheme) { + private void drawObject(Object object, ModularGuiContext context, int x, int y, int width, int height) { if (object instanceof ItemStack stack) { - IDrawable slot = ((ModularGuiContext) context).getTheme().getItemSlotTheme().getBackground(); - if (slot == null) slot = GTGuiTextures.SLOT; - slot.draw(context, x, y, width, height, widgetTheme); + WidgetSlotTheme theme = context.getTheme().getItemSlotTheme(); + IDrawable background = theme.getBackground(); + if (background == null) background = GTGuiTextures.SLOT; + background.draw(context, x, y, width, height, theme); GuiDraw.drawItem(stack, x + 1, y + 1, width - 2, height - 2); } else if (object instanceof FluidStack stack) { - IDrawable slot = ((ModularGuiContext) context).getTheme().getFluidSlotTheme().getBackground(); + WidgetSlotTheme theme = context.getTheme().getFluidSlotTheme(); + IDrawable slot = theme.getBackground(); if (slot == null) slot = GTGuiTextures.FLUID_SLOT; - slot.draw(context, x, y, width, height, widgetTheme); + slot.draw(context, x, y, width, height, theme); GuiDraw.drawFluidTexture(stack, x + 1, y + 1, width - 2, height - 2, 0); } else if (object instanceof BoostableChanceEntryentry) { - drawObject(entry.getIngredient(), context, x, y, width, height, widgetTheme); + drawObject(entry.getIngredient(), context, x, y, width, height); String chance = "~" + this.boostFunction.apply(entry) / 100 + "%"; - if (amount > 1) y -= 4; + if (amount > 0) y -= 4; renderer.setPos(x + 1, y + 1); renderer.draw(chance); } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 9fce930fcb6..5a8d80d4da8 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,10 +1,12 @@ package gregtech.api.util; +import gregtech.api.GTValues; import gregtech.api.fluids.GTFluid; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.common.FMLCommonHandler; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; @@ -108,6 +110,7 @@ public static IKey number(Supplier formatting, LongSupplier supp public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; + if (!GTValues.isClientSide()) return IDrawable.NONE; return body.asTextIcon() .asHoverable() .addTooltipDrawableLines(Arrays.asList(hover)); From 491e872750e72de9077c1d1b30eba589370de67e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 9 Apr 2025 17:37:51 -0700 Subject: [PATCH 205/264] show fluid amount when no fluid shift-click coke oven input fix HPCA show research id in ResearchStation --- .../api/mui/drawable/GTObjectDrawable.java | 3 +- src/main/java/gregtech/api/util/KeyUtil.java | 1 - .../multi/MetaTileEntityCokeOven.java | 48 +++++----- .../multi/electric/MetaTileEntityHPCA.java | 93 ++++++++++--------- .../MetaTileEntityResearchStation.java | 18 ++++ .../common/mui/widget/GTFluidSlot.java | 12 ++- 6 files changed, 102 insertions(+), 73 deletions(-) diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java index c93ec28c6bf..9475127fa7c 100644 --- a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -1,7 +1,5 @@ package gregtech.api.mui.drawable; -import com.cleanroommc.modularui.theme.WidgetSlotTheme; - import gregtech.api.mui.GTGuiTextures; import gregtech.api.recipes.chance.boost.BoostableChanceEntry; @@ -15,6 +13,7 @@ import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.screen.viewport.GuiContext; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; +import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 5a8d80d4da8..307bd40c649 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -6,7 +6,6 @@ import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fml.common.FMLCommonHandler; import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java index 772991803b5..72021b7cf61 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityCokeOven.java @@ -105,28 +105,32 @@ protected MultiblockUIFactory createUIFactory() { .disableButtons() .disableDisplay() .setSize(176, 166) - .addScreenChildren((parent, syncManager) -> parent - .child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) - .child(new ItemSlot().slot(importItems, 0) - .pos(52, 30)) - .child(new ProgressWidget() - .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, -1) - .size(20, 15) - .pos(76, 32) - .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) - .child(new ItemSlot() - .slot(new ModularSlot(exportItems, 0) - .accessibility(false, true)) - .pos(103, 30)) - .child(new GTFluidSlot() - .overlay(GTGuiTextures.PRIMITIVE_LARGE_FLUID_TANK_OVERLAY.asIcon() - .alignment(Alignment.CenterLeft) - .marginLeft(1)) - .syncHandler(GTFluidSlot.sync(exportFluids.getTankAt(0)) - .drawAlwaysFull(false) - .accessibility(true, false)) - .pos(134, 13) - .size(20, 58))); + .addScreenChildren((parent, syncManager) -> { + parent.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5)) + .child(new ItemSlot() + .slot(new ModularSlot(importItems, 0) + .singletonSlotGroup()) + .pos(52, 30)) + .child(new ProgressWidget() + .texture(GTGuiTextures.PRIMITIVE_BLAST_FURNACE_PROGRESS_BAR, -1) + .size(20, 15) + .pos(76, 32) + .value(new DoubleSyncValue(recipeMapWorkable::getProgressPercent))) + .child(new ItemSlot() + .slot(new ModularSlot(exportItems, 0) + .accessibility(false, true)) + .pos(103, 30)) + .child(new GTFluidSlot() + .overlay(GTGuiTextures.PRIMITIVE_LARGE_FLUID_TANK_OVERLAY.asIcon() + .alignment(Alignment.CenterLeft) + .marginLeft(1)) + .syncHandler(GTFluidSlot.sync(exportFluids.getTankAt(0)) + .drawAlwaysFull(false) + .showAmountOnSlot(false) + .accessibility(true, false)) + .pos(134, 13) + .size(20, 58)); + }); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index fbf147f8b0a..5a7b89f635d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -54,7 +54,6 @@ import codechicken.lib.render.pipeline.IVertexOperation; import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; import com.cleanroommc.modularui.drawable.DynamicDrawable; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.value.sync.DoubleSyncValue; @@ -366,32 +365,37 @@ public void setWorkingEnabled(boolean isWorkingAllowed) { @Override protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() - .addScreenChildren((parent, syncManager) -> parent.child(new ParentWidget<>() - .leftRel(0.5f) - .bottom(5) - .size(16 * 3 + 2) - .child(new ProgressWidget() - .sizeRel(1f) - .value(new DoubleSyncValue(progressSupplier)) - .texture(GTGuiTextures.HPCA_COMPONENT_OUTLINE, 47) - .direction(ProgressWidget.Direction.LEFT) - .tooltipAutoUpdate(true)) - .child(new Grid() - .sizeRel(1f) - .padding(1) - .mapTo(3, 9, value -> new Widget<>() - .overlay(new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) - .asIcon().size(14).marginLeft(2).marginTop(2)) - .tooltipAutoUpdate(true) - .tooltipBuilder(tooltip -> { - if (isStructureFormed()) { - tooltip.addLine(hpcaHandler.getComponentKey(value)); - tooltip.spaceLine(2); - } - hpcaHandler.addInfo(tooltip); - }) - .size(16) - .padding(1))))); + .addScreenChildren((parent, syncManager) -> { + MultiblockUIBuilder builder = MultiblockUIFactory.builder("hpca_tooltip", syncManager); + builder.setAction(b -> b.addCustom(hpcaHandler::addInfo)); + + parent.child(new ParentWidget<>() + .leftRel(0.5f) + .bottom(5) + .size(16 * 3 + 2) + .child(new ProgressWidget() + .sizeRel(1f) + .value(new DoubleSyncValue(progressSupplier)) + .texture(GTGuiTextures.HPCA_COMPONENT_OUTLINE, 47) + .direction(ProgressWidget.Direction.LEFT) + .tooltipAutoUpdate(true)) + .child(new Grid() + .sizeRel(1f) + .padding(1) + .mapTo(3, 9, value -> new Widget<>() + .overlay(new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) + .asIcon().size(14).marginLeft(2).marginTop(2)) + .tooltipAutoUpdate(true) + .tooltipBuilder(tooltip -> { + if (isStructureFormed()) { + tooltip.addLine(hpcaHandler.getComponentKey(value)); + tooltip.spaceLine(2); + } + builder.build(tooltip); + }) + .size(16) + .padding(1)))); + }); } @Override @@ -846,44 +850,45 @@ public int getMaxCoolantDemand() { return maxCoolant; } - public void addInfo(IRichTextBuilder textList) { + public void addInfo(KeyManager manager, UISyncer syncer) { // Max Computation - IKey data = KeyUtil.number(TextFormatting.AQUA, getMaxCWUt()); - textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + IKey data = KeyUtil.number(TextFormatting.AQUA, syncer.syncInt(getMaxCWUt())); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.info_max_computation", data)); + int coolingAmt = syncer.syncInt(getMaxCoolingAmount()); + int coolingDemand = syncer.syncInt(getMaxCoolingDemand()); + // Cooling - TextFormatting coolingColor = getMaxCoolingAmount() < getMaxCoolingDemand() ? TextFormatting.RED : + TextFormatting coolingColor = coolingAmt < coolingDemand ? TextFormatting.RED : TextFormatting.GREEN; - data = KeyUtil.number(coolingColor, getMaxCoolingDemand()); - textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + data = KeyUtil.number(coolingColor, coolingDemand); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.info_max_cooling_demand", data)); - data = KeyUtil.number(coolingColor, getMaxCoolingAmount()); - textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + data = KeyUtil.number(coolingColor, coolingAmt); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.info_max_cooling_available", data)); // Coolant Required - if (getMaxCoolantDemand() > 0) { - data = KeyUtil.number( - TextFormatting.YELLOW, - getMaxCoolantDemand(), "L "); + if (coolingDemand > 0) { + data = KeyUtil.number(TextFormatting.YELLOW, coolingDemand, "L "); IKey coolantName = KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.info_coolant_name"); - // data.appendSibling(coolantName); data = IKey.comp(data, coolantName); } else { data = KeyUtil.string(TextFormatting.GREEN, "0"); } - textList.addLine(KeyUtil.lang(TextFormatting.GRAY, + + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.info_max_coolant_required", data)); // Bridging - if (numBridges > 0) { - textList.addLine(KeyUtil.lang(TextFormatting.GREEN, + if (syncer.syncInt(numBridges) > 0) { + manager.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.hpca.info_bridging_enabled")); } else { - textList.addLine(KeyUtil.lang(TextFormatting.RED, + manager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.info_bridging_disabled")); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 5e2bed97a52..abf3fa8e5f2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -13,13 +13,16 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.metatileentity.multiblock.ui.Operation; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; import gregtech.api.pattern.PatternMatchContext; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMaps; +import gregtech.api.util.AssemblyLineManager; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; @@ -33,11 +36,13 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -233,6 +238,19 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() + .addCustom((manager, syncer) -> { + manager.add(KeyUtil.string(TextFormatting.GRAY, "Researching: "), Operation.ADD); + Recipe previousRecipe = getRecipeMapWorkable().getPreviousRecipe(); + if (syncer.syncBoolean(previousRecipe == null)) return; + ItemStack stack = ItemStack.EMPTY; + if (!getWorld().isRemote) { + stack = previousRecipe.getOutputs().get(0); + } + stack = syncer.syncObject(stack, ByteBufAdapters.ITEM_STACK); + String id = AssemblyLineManager.readResearchId(stack); + if (id == null) return; + manager.add(KeyUtil.string(id)); + }) .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()); } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index d59aa3778c4..1f9fcc91897 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -53,15 +53,19 @@ public GTFluidSlot() { if (fluid == null) fluid = this.syncHandler.getLockedFluid(); - if (fluid == null) return; + if (fluid != null) + tooltip.addLine(IKey.str(fluid.getLocalizedName())); - tooltip.addLine(IKey.str(fluid.getLocalizedName())); - if (this.syncHandler.showAmountInTooltip()) - tooltip.addLine(IKey.lang("gregtech.fluid.amount", fluid.amount, this.syncHandler.getCapacity())); + if (this.syncHandler.showAmountInTooltip()) { + int amt = fluid == null ? 0 : fluid.amount; + tooltip.addLine(IKey.lang("gregtech.fluid.amount", amt, this.syncHandler.getCapacity())); + } if (this.syncHandler.isPhantom() && this.syncHandler.showAmountInTooltip()) tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); + if (fluid == null) return; + // Add various tooltips from the material for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { if (s.isEmpty()) continue; From d8e9c6c9a61934dde2db054fd5e6bb9e9d46f808 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 9 Apr 2025 19:03:44 -0700 Subject: [PATCH 206/264] add researching line modify lang slightly --- .../electric/MetaTileEntityResearchStation.java | 14 ++++++++------ src/main/resources/assets/gregtech/lang/en_us.lang | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index abf3fa8e5f2..f0f478f032b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -42,6 +42,7 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -229,17 +230,12 @@ public void addInformation(ItemStack stack, @Nullable World world, @NotNull List @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .setWorkingStatusKeys( - "gregtech.multiblock.idling", - "gregtech.multiblock.work_paused", - "gregtech.machine.research_station.researching") .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() .addCustom((manager, syncer) -> { - manager.add(KeyUtil.string(TextFormatting.GRAY, "Researching: "), Operation.ADD); Recipe previousRecipe = getRecipeMapWorkable().getPreviousRecipe(); if (syncer.syncBoolean(previousRecipe == null)) return; ItemStack stack = ItemStack.EMPTY; @@ -249,7 +245,13 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { stack = syncer.syncObject(stack, ByteBufAdapters.ITEM_STACK); String id = AssemblyLineManager.readResearchId(stack); if (id == null) return; - manager.add(KeyUtil.string(id)); + id = id.substring(id.indexOf('x') + 1); + id = id.substring(0, id.lastIndexOf('@')); + id += ".name"; + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.research_station.researching"), + Operation.ADD); + manager.add(IKey.SPACE, Operation.ADD); + manager.add(KeyUtil.lang(TextFormatting.AQUA, id)); }) .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()); } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index f27ba093f21..df90875c956 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -4963,7 +4963,7 @@ gregtech.machine.research_station.tooltip.2=Used to scan onto §fData Orbs§7 an gregtech.machine.research_station.tooltip.3=Requires §fComputation§7 to work. gregtech.machine.research_station.tooltip.4=Providing more Computation allows the recipe to run faster. gregtech.multiblock.research_station.description=The Research Station is a multiblock structure used for researching much more complex Assembly Line Research Data. Any Research requiring a Data Orb or Data Module must be scanned in the Research Station. Requires Compute Work Units (CWU/t) to research recipes, which is supplied by High Performance Computing Arrays (HPCAs). -gregtech.machine.research_station.researching=Researching. +gregtech.machine.research_station.researching=Researching: gregtech.machine.network_switch.name=Network Switch gregtech.machine.network_switch.tooltip.1=Ethernet Hub From b1d77a0d004fc18b64ba926dbc82d8f472cf13aa Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 10 Apr 2025 20:58:07 -0700 Subject: [PATCH 207/264] try caching data about recipes 2.0 --- .../capability/impl/AbstractRecipeLogic.java | 173 +++++++++++++++++- .../recipes/ingredients/GTRecipeInput.java | 40 ++++ 2 files changed, 212 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index e92b3b13295..cea28b84c5e 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -16,6 +16,10 @@ import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeBuilder; import gregtech.api.recipes.RecipeMap; +import gregtech.api.recipes.chance.boost.ChanceBoostFunction; +import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; +import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; +import gregtech.api.recipes.ingredients.GTRecipeInput; import gregtech.api.recipes.logic.IParallelableRecipeLogic; import gregtech.api.recipes.logic.OCParams; import gregtech.api.recipes.logic.OCResult; @@ -28,16 +32,20 @@ import gregtech.common.ConfigHolder; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.PacketBuffer; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; +import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.items.IItemHandlerModifiable; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -45,6 +53,8 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.function.Function; import static gregtech.api.GTValues.ULV; import static gregtech.api.recipes.logic.OverclockingLogic.*; @@ -59,6 +69,7 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, private double euDiscount = -1; private double speedBonus = -1; + protected final CachedRecipeData cachedRecipeData = new CachedRecipeData(); protected Recipe previousRecipe; private boolean allowOverclocking = true; protected int parallelRecipesPerformed; @@ -84,6 +95,7 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, protected boolean invalidInputsForRecipes; protected boolean hasPerfectOC; + private boolean simulate = false; /** * DO NOT use the parallelLimit field directly, EVER @@ -260,6 +272,11 @@ public Recipe getPreviousRecipe() { return previousRecipe; } + @NotNull + public CachedRecipeData getCachedRecipeData() { + return this.cachedRecipeData; + } + /** * @return true if recipes should be searched for */ @@ -419,6 +436,7 @@ protected void trySearchNewRecipe() { // If a recipe was found, then inputs were valid. Cache found recipe. if (currentRecipe != null) { this.previousRecipe = currentRecipe; + this.cachedRecipeData.serialize(currentRecipe, this); } this.invalidInputsForRecipes = (currentRecipe == null); @@ -729,7 +747,7 @@ protected static boolean areItemStacksEqual(@NotNull ItemStack stackA, @NotNull if (checkOutputSpaceItems(recipe, getOutputInventory()) && checkOutputSpaceFluids(recipe, getOutputTank())) { this.isOutputsFull = false; - if (recipe.matches(true, importInventory, importFluids)) { + if (recipe.matches(!simulate, importInventory, importFluids)) { this.metaTileEntity.addNotifiedInput(importInventory); return recipe; } @@ -1197,6 +1215,9 @@ public NBTTagCompound serializeNBT() { compound.setTag("ItemOutputs", itemOutputsList); compound.setTag("FluidOutputs", fluidOutputsList); } + NBTTagCompound cache = this.cachedRecipeData.serializeNBT(); + if (!cache.isEmpty()) + compound.setTag("cache", cache); return compound; } @@ -1223,5 +1244,155 @@ public void deserializeNBT(@NotNull NBTTagCompound compound) { this.fluidOutputs.add(FluidStack.loadFluidStackFromNBT(fluidOutputsList.getCompoundTagAt(i))); } } + if (compound.hasKey("cache") && !compound.getCompoundTag("cache").isEmpty()) { + this.cachedRecipeData.deserializeNBT(compound.getCompoundTag("cache")); + } else { + simulate = true; + trySearchNewRecipe(); + simulate = false; + if (previousRecipe != null) { + this.cachedRecipeData.serialize(this.previousRecipe, this); + } else { + this.cachedRecipeData.serialize(this); + } + // mark to find new recipe to set cached data + } + } + + public static class CachedRecipeData implements INBTSerializable { + + private final NBTTagCompound root = new NBTTagCompound(); + private final Map cache = new Object2ObjectOpenHashMap<>(); + + private CachedRecipeData() {} + + public void serialize(AbstractRecipeLogic arl) { + NBTTagList itemOutputs = new NBTTagList(); + for (ItemStack output : arl.itemOutputs) { + itemOutputs.appendTag(output.serializeNBT()); + } + root.setTag("arl_item_outputs", itemOutputs); + + NBTTagList fluidOutputs = new NBTTagList(); + for (FluidStack output : arl.fluidOutputs) { + fluidOutputs.appendTag(output.writeToNBT(new NBTTagCompound())); + } + root.setTag("arl_fluid_outputs", fluidOutputs); + } + + public void serialize(Recipe recipe, AbstractRecipeLogic arl) { + root.tagMap.clear(); + serialize(arl); + NBTTagList itemInputs = new NBTTagList(); + for (GTRecipeInput input : recipe.getInputs()) { + itemInputs.appendTag(GTRecipeInput.writeToNBT(input)); + } + root.setTag("item_inputs", itemInputs); + + NBTTagList fluidInputs = new NBTTagList(); + for (GTRecipeInput input : recipe.getFluidInputs()) { + fluidInputs.appendTag(GTRecipeInput.writeToNBT(input)); + } + root.setTag("fluid_inputs", fluidInputs); + + NBTTagList itemOutputs = new NBTTagList(); + for (ItemStack output : recipe.getOutputs()) { + itemOutputs.appendTag(output.serializeNBT()); + } + root.setTag("item_outputs", itemOutputs); + + NBTTagList fluidOutputs = new NBTTagList(); + for (FluidStack output : recipe.getFluidOutputs()) { + fluidOutputs.appendTag(output.writeToNBT(new NBTTagCompound())); + } + root.setTag("fluid_outputs", fluidOutputs); + + root.setInteger("duration", recipe.getDuration()); + root.setLong("eut", recipe.getEUt()); + root.setInteger("recipe_tier", GTUtility.getTierByVoltage(recipe.getEUt())); + root.setInteger("machine_tier", arl.getOverclockForTier(arl.getMaximumOverclockVoltage())); + + root.setString("item_logic", recipe.getChancedOutputs().getChancedOutputLogic().toString()); + root.setString("fluid_logic", recipe.getChancedFluidOutputs().getChancedOutputLogic().toString()); + + RecipeMap map = arl.getRecipeMap(); + ChanceBoostFunction chanceFunction = null; + if (map != null) { + chanceFunction = map.getChanceFunction(); + root.setString("map", map.getUnlocalizedName()); + } + + NBTTagList chancedInputs = new NBTTagList(); + for (ChancedItemOutput entry : recipe.getChancedOutputs().getChancedEntries()) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag("ingredient", entry.getIngredient().serializeNBT()); + tag.setInteger("chance", entry.getChance()); + tag.setInteger("chance_boost", entry.getChanceBoost()); + if (chanceFunction != null) { + tag.setInteger("calculated_chance", chanceFunction.getBoostedChance(entry, + root.getInteger("recipe_tier"), + root.getInteger("machine_tier"))); + } + chancedInputs.appendTag(tag); + } + root.setTag("chanced_inputs", chancedInputs); + + NBTTagList chancedFluidOutputs = new NBTTagList(); + for (ChancedFluidOutput entry : recipe.getChancedFluidOutputs().getChancedEntries()) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setTag("ingredient", entry.getIngredient().writeToNBT(new NBTTagCompound())); + tag.setInteger("chance", entry.getChance()); + tag.setInteger("chance_boost", entry.getChanceBoost()); + if (chanceFunction != null) { + tag.setInteger("calculated_chance", chanceFunction.getBoostedChance(entry, + root.getInteger("recipe_tier"), + root.getInteger("machine_tier"))); + } + chancedFluidOutputs.appendTag(tag); + } + root.setTag("chanced_fluid_outputs", chancedFluidOutputs); + } + + public ObjectArrayList getOutputs() { + if (!root.hasKey("item_outputs")) return compute("arl_item_outputs", this::deserializeItemStacks); + else return compute("item_outputs", this::deserializeItemStacks); + } + + public ObjectArrayList getFluidOutputs() { + if (!root.hasKey("fluid_outputs")) return compute("arl_fluid_outputs", this::deserializeFluidStacks); + else return compute("fluid_outputs", this::deserializeFluidStacks); + } + + private ObjectArrayList deserializeItemStacks(String k) { + ObjectArrayList list = new ObjectArrayList<>(); + for (NBTBase tag : root.getTagList(k, Constants.NBT.TAG_COMPOUND)) { + list.add(new ItemStack((NBTTagCompound) tag)); + } + return list; + } + + private ObjectArrayList deserializeFluidStacks(String k) { + ObjectArrayList list = new ObjectArrayList<>(); + for (NBTBase tag : root.getTagList(k, Constants.NBT.TAG_COMPOUND)) { + list.add(FluidStack.loadFluidStackFromNBT((NBTTagCompound) tag)); + } + return list; + } + + @SuppressWarnings("unchecked") + private T compute(String key, Function function) { + return (T) cache.computeIfAbsent(key, function); + } + + @Override + public NBTTagCompound serializeNBT() { + return root; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + root.merge(nbt); + cache.clear(); + } } } diff --git a/src/main/java/gregtech/api/recipes/ingredients/GTRecipeInput.java b/src/main/java/gregtech/api/recipes/ingredients/GTRecipeInput.java index 66eb370b53e..28e53ece72f 100644 --- a/src/main/java/gregtech/api/recipes/ingredients/GTRecipeInput.java +++ b/src/main/java/gregtech/api/recipes/ingredients/GTRecipeInput.java @@ -2,10 +2,13 @@ import gregtech.api.recipes.ingredients.nbtmatch.NBTCondition; import gregtech.api.recipes.ingredients.nbtmatch.NBTMatcher; +import gregtech.api.util.GTLog; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; @@ -14,9 +17,11 @@ import it.unimi.dsi.fastutil.objects.ObjectLists; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.List; +import java.util.Objects; /** * Definition of ItemStacks, Ore dicts, of ingredients for @@ -202,6 +207,41 @@ public int getSortingOrder() { return this.isNonConsumable() ? SORTING_ORDER_NC : SORTING_ORDER_COMMON; } + public static NBTTagCompound writeToNBT(GTRecipeInput input) { + NBTTagCompound tag = new NBTTagCompound(); + if (input instanceof GTRecipeItemInput) { + NBTTagList stackList = new NBTTagList(); + for (ItemStack stack : input.getInputStacks()) { + stackList.appendTag(stack.serializeNBT()); + } + tag.setTag("stacks", stackList); + } else if (input instanceof GTRecipeOreInput) { + tag.setInteger("ore", input.getOreDict()); + } else if (input instanceof GTRecipeFluidInput) { + tag.setTag("fluid", input.getInputFluidStack().writeToNBT(new NBTTagCompound())); + } + tag.setInteger("amount", input.getAmount()); + return tag; + } + + public static GTRecipeInput readFromNBT(NBTTagCompound tag) { + int amount = tag.getInteger("amount"); + if (tag.hasKey("stacks")) { + NBTTagList list = tag.getTagList("stacks", Constants.NBT.TAG_COMPOUND); + ItemStack[] stacks = new ItemStack[list.tagCount()]; + Arrays.setAll(stacks, i -> new ItemStack(list.getCompoundTagAt(i))); + return new GTRecipeItemInput(stacks, amount); + + } else if (tag.hasKey("ore")) { + return new GTRecipeOreInput(tag.getInteger("ore"), amount); + } else if (tag.hasKey("fluid")) { + FluidStack stack = FluidStack.loadFluidStackFromNBT(tag.getCompoundTag("fluid")); + return new GTRecipeFluidInput(Objects.requireNonNull(stack), amount); + } + GTLog.logger.warn("unable to read tag!: " + tag); + return null; + } + protected static class ItemToMetaList implements Object2ObjectMap.Entry> { protected Item item; From c1012d7c8d1631c609beea7ae14a8230d80ae1f5 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 10 Apr 2025 20:58:57 -0700 Subject: [PATCH 208/264] improve research line switch progress to cwu --- .../multiblock/ui/MultiblockUIBuilder.java | 25 ++++++++++++++ .../items/behaviors/DataItemBehavior.java | 6 +++- .../MetaTileEntityResearchStation.java | 33 +++++++++---------- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index f98eff891c1..e88c9d59573 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -3,6 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.impl.AbstractRecipeLogic; +import gregtech.api.capability.impl.ComputationRecipeLogic; import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.mui.drawable.GTObjectDrawable; import gregtech.api.recipes.Recipe; @@ -349,6 +350,30 @@ public MultiblockUIBuilder addProgressLine(int progress, int maxProgress) { return this; } + /** + * Adds a progress line that displays recipe progress as "time / total time (percentage)". + *
+ * Added if structure is formed and the machine is active. + * + */ + public MultiblockUIBuilder addComputationProgressLine(ComputationRecipeLogic crl) { + if (!isStructureFormed || !isActive) return this; + + int progress = getSyncer().syncInt(crl.getProgress()); + int maxProgress = getSyncer().syncInt(crl.getMaxProgress()); + int maxCwu = getSyncer().syncInt(() -> crl.getComputationProvider().getMaxCWUt()); + + if (crl.shouldShowDuration()) { + addKey(IKey.str("%s / %s CWU", KeyUtil.number(progress), KeyUtil.number(maxProgress)) + .style(TextFormatting.GRAY)); + } else { + // do fancy things + int cwuRate = getSyncer().syncInt(crl.getCurrentDrawnCWUt()); + int currentCwu = progress * cwuRate; + } + return this; + } + /** * Adds a line indicating how many parallels this multi can potentially perform. *
diff --git a/src/main/java/gregtech/common/items/behaviors/DataItemBehavior.java b/src/main/java/gregtech/common/items/behaviors/DataItemBehavior.java index 116dca7ee5d..6930abe4f28 100644 --- a/src/main/java/gregtech/common/items/behaviors/DataItemBehavior.java +++ b/src/main/java/gregtech/common/items/behaviors/DataItemBehavior.java @@ -38,8 +38,12 @@ public boolean requireDataBank() { public void addInformation(@NotNull ItemStack itemStack, List lines) { String researchId = AssemblyLineManager.readResearchId(itemStack); if (researchId == null) return; + collectResearchItems(researchId, lines); + } + + public static void collectResearchItems(String id, List lines) { Collection recipes = ((IResearchRecipeMap) RecipeMaps.ASSEMBLY_LINE_RECIPES) - .getDataStickEntry(researchId); + .getDataStickEntry(id); if (recipes != null && !recipes.isEmpty()) { lines.add(I18n.format("behavior.data_item.assemblyline.title")); Collection added = new ObjectOpenCustomHashSet<>(ItemStackHashStrategy.comparingAllButCount()); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index f0f478f032b..49ebcf14e38 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -13,7 +13,6 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; -import gregtech.api.metatileentity.multiblock.ui.Operation; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -28,6 +27,7 @@ import gregtech.common.ConfigHolder; import gregtech.common.blocks.BlockComputerCasing; import gregtech.common.blocks.MetaBlocks; +import gregtech.common.items.behaviors.DataItemBehavior; import gregtech.common.metatileentities.MetaTileEntities; import net.minecraft.block.state.IBlockState; @@ -42,11 +42,12 @@ import net.minecraftforge.fml.relauncher.SideOnly; import net.minecraftforge.items.IItemHandlerModifiable; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -236,24 +237,22 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addParallelsLine(recipeMapWorkable.getParallelLimit()) .addWorkingStatusLine() .addCustom((manager, syncer) -> { - Recipe previousRecipe = getRecipeMapWorkable().getPreviousRecipe(); - if (syncer.syncBoolean(previousRecipe == null)) return; - ItemStack stack = ItemStack.EMPTY; - if (!getWorld().isRemote) { - stack = previousRecipe.getOutputs().get(0); - } - stack = syncer.syncObject(stack, ByteBufAdapters.ITEM_STACK); + var data = getRecipeMapWorkable().getCachedRecipeData(); + ObjectArrayList outputs = syncer.syncCollection(data.getOutputs(), + ByteBufAdapters.ITEM_STACK); + if (outputs.isEmpty()) return; + ItemStack stack = outputs.top(); String id = AssemblyLineManager.readResearchId(stack); if (id == null) return; - id = id.substring(id.indexOf('x') + 1); - id = id.substring(0, id.lastIndexOf('@')); - id += ".name"; - manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.research_station.researching"), - Operation.ADD); - manager.add(IKey.SPACE, Operation.ADD); - manager.add(KeyUtil.lang(TextFormatting.AQUA, id)); + List stacks = new ArrayList<>(); + DataItemBehavior.collectResearchItems(id, stacks); + stacks.remove(0); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.research_station.researching")); + for (String line : stacks) { + manager.add(KeyUtil.string(line)); + } }) - .addProgressLine(recipeMapWorkable.getProgress(), recipeMapWorkable.getMaxProgress()); + .addComputationProgressLine(getRecipeMapWorkable()); } @Override From 5e2d17b2b854d68a79eb3fbebb8cf5d141c656e4 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 12 Apr 2025 12:32:53 -0700 Subject: [PATCH 209/264] add coolant needed for hpca make researching line replace running status line --- .../multi/electric/MetaTileEntityHPCA.java | 5 +- .../MetaTileEntityResearchStation.java | 49 ++++++++++++------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 5a7b89f635d..7f20a7d5a9c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -858,6 +858,7 @@ public void addInfo(KeyManager manager, UISyncer syncer) { int coolingAmt = syncer.syncInt(getMaxCoolingAmount()); int coolingDemand = syncer.syncInt(getMaxCoolingDemand()); + int coolantNeeded = syncer.syncInt(getMaxCoolantDemand()); // Cooling TextFormatting coolingColor = coolingAmt < coolingDemand ? TextFormatting.RED : @@ -871,8 +872,8 @@ public void addInfo(KeyManager manager, UISyncer syncer) { "gregtech.multiblock.hpca.info_max_cooling_available", data)); // Coolant Required - if (coolingDemand > 0) { - data = KeyUtil.number(TextFormatting.YELLOW, coolingDemand, "L "); + if (coolantNeeded > 0) { + data = KeyUtil.number(TextFormatting.YELLOW, coolantNeeded, "L "); IKey coolantName = KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.info_coolant_name"); data = IKey.comp(data, coolantName); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 49ebcf14e38..63ed7e86eb3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -12,7 +12,9 @@ import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; +import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -234,25 +236,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) .addComputationUsageExactLine(getRecipeMapWorkable().getCurrentDrawnCWUt()) - .addParallelsLine(recipeMapWorkable.getParallelLimit()) - .addWorkingStatusLine() - .addCustom((manager, syncer) -> { - var data = getRecipeMapWorkable().getCachedRecipeData(); - ObjectArrayList outputs = syncer.syncCollection(data.getOutputs(), - ByteBufAdapters.ITEM_STACK); - if (outputs.isEmpty()) return; - ItemStack stack = outputs.top(); - String id = AssemblyLineManager.readResearchId(stack); - if (id == null) return; - List stacks = new ArrayList<>(); - DataItemBehavior.collectResearchItems(id, stacks); - stacks.remove(0); - manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.research_station.researching")); - for (String line : stacks) { - manager.add(KeyUtil.string(line)); - } - }) - .addComputationProgressLine(getRecipeMapWorkable()); + .addParallelsLine(recipeMapWorkable.getParallelLimit()); + + if (!recipeMapWorkable.isWorkingEnabled()) + builder.addWorkPausedLine(false); + else if (recipeMapWorkable.isWorking()) { + builder.addCustom(this::researchingLine); + } else { + builder.addIdlingLine(false); + } + + builder.addComputationProgressLine(getRecipeMapWorkable()); } @Override @@ -262,6 +256,23 @@ protected void configureWarningText(MultiblockUIBuilder builder) { .addMaintenanceProblemLines(getMaintenanceProblems()); } + private void researchingLine(KeyManager manager, UISyncer syncer) { + var data = getRecipeMapWorkable().getCachedRecipeData(); + ObjectArrayList outputs = syncer.syncCollection(data.getOutputs(), + ByteBufAdapters.ITEM_STACK); + if (outputs.isEmpty()) return; + ItemStack stack = outputs.top(); + String id = AssemblyLineManager.readResearchId(stack); + if (id == null) return; + List stacks = new ArrayList<>(); + DataItemBehavior.collectResearchItems(id, stacks); + stacks.remove(0); + manager.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.machine.research_station.researching")); + for (String line : stacks) { + manager.add(KeyUtil.string(line)); + } + } + private static class ResearchStationRecipeLogic extends ComputationRecipeLogic { public ResearchStationRecipeLogic(MetaTileEntityResearchStation metaTileEntity) { From 245397c871531b99b1d3db4a2cc704e846ba3f3b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 12 Apr 2025 12:52:20 -0700 Subject: [PATCH 210/264] rename paramater clarify javadoc allow energy tier up to `MAX_TRUE` --- .../multiblock/ui/MultiblockUIBuilder.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index e88c9d59573..25a862da325 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -164,10 +164,10 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; tier = getSyncer().syncInt(tier); - if (tier < GTValues.ULV || tier > GTValues.MAX) return this; + if (tier < GTValues.ULV || tier > GTValues.MAX_TRUE) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier", GTValues.VNF[tier]); + "gregtech.multiblock.max_recipe_tier", GTValues.VOCNF[tier]); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier_hover"); addKey(bodyText, hoverText); @@ -197,7 +197,7 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { /** * Adds the max EU/t that this multiblock can produce. *
- * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. + * Added if the structure is formed and if the max voltage is not zero and greater than the recipe EU/t. */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; @@ -506,13 +506,13 @@ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { *
* Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ - public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { + public MultiblockUIBuilder addFuelNeededLine(String fuelAmount, int previousRecipeDuration) { if (!isStructureFormed || !isActive) return this; - fuelName = getSyncer().syncString(fuelName); + fuelAmount = getSyncer().syncString(fuelAmount); previousRecipeDuration = getSyncer().syncInt(previousRecipeDuration); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", - KeyUtil.string(TextFormatting.RED, fuelName), + KeyUtil.string(TextFormatting.RED, fuelAmount), KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); return this; } From 6dde3cdab49947efe49113a463f02364f9f64652 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 12 Apr 2025 13:54:55 -0700 Subject: [PATCH 211/264] add dynamo full to warning --- .../MetaTileEntityLargeCombustionEngine.java | 12 ++++++++++++ src/main/resources/assets/gregtech/lang/en_us.lang | 1 + 2 files changed, 13 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 585219b400c..21c7d602e0b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -118,6 +118,18 @@ protected void configureErrorText(MultiblockUIBuilder builder) { }); } + @Override + protected void configureWarningText(MultiblockUIBuilder builder) { + super.configureWarningText(builder); + builder.addCustom((manager, syncer) -> { + long canInsert = syncer.syncLong(getEnergyContainer().getEnergyCanBeInserted()); + if (canInsert < syncer.syncLong(recipeMapWorkable.getRecipeEUt())) { + manager.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.large_combustion_engine.dynamo_hatch_full")); + } + }); + } + @Override public void addInformation(ItemStack stack, @Nullable World player, List tooltip, boolean advanced) { super.addInformation(stack, player, tooltip, advanced); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index df90875c956..47995759299 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5869,6 +5869,7 @@ gregtech.multiblock.large_combustion_engine.oxygen_boost_disallowed=§eUpgrade t gregtech.multiblock.large_combustion_engine.liquid_oxygen_boost_disallowed=§eUpgrade the Dynamo Hatch to enable Liquid Oxygen Boosting. gregtech.multiblock.large_combustion_engine.supply_oxygen_to_boost=Supply Oxygen to boost. gregtech.multiblock.large_combustion_engine.supply_liquid_oxygen_to_boost=Supply Liquid Oxygen to boost. +gregtech.multiblock.large_combustion_engine.dynamo_hatch_full=Dynamo Hatch is Full! gregtech.multiblock.large_combustion_engine.obstructed=Engine Intakes Obstructed! gregtech.multiblock.large_combustion_engine.obstructed.desc=Engine Intakes must have a block of airspace in front of them. From 2b57c9affe7f0671d778e3b31feaf71862ac265f Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 13 Apr 2025 15:01:27 -0700 Subject: [PATCH 212/264] add default impl for `getTileName()` to use mte's `getMetaFullName()` with instanceof error does not need onRebuild --- .../java/gregtech/api/capability/IHPCAComponentHatch.java | 8 +++++++- .../metatileentity/multiblock/ui/MultiblockUIFactory.java | 1 - .../multiblockpart/hpca/MetaTileEntityHPCABridge.java | 5 ----- .../hpca/MetaTileEntityHPCAComputation.java | 5 ----- .../multiblockpart/hpca/MetaTileEntityHPCACooler.java | 5 ----- .../multiblockpart/hpca/MetaTileEntityHPCAEmpty.java | 5 ----- .../hpca/helper/HPCAComponentHatchTestImpl.java | 6 ------ 7 files changed, 7 insertions(+), 28 deletions(-) diff --git a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java index 3118b2164b7..319c0ac1ab0 100644 --- a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java +++ b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java @@ -1,6 +1,7 @@ package gregtech.api.capability; import gregtech.api.gui.resources.TextureArea; +import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; import com.cleanroommc.modularui.drawable.UITexture; @@ -62,5 +63,10 @@ default UITexture getComponentIcon2() { /** * The untranslated name of the tile implementing an HPCA component */ - String getTileName(); + default String getTileName() { + if (this instanceof MetaTileEntity mte) { + return mte.getMetaFullName(); + } + return ""; // should this throw an exception instead? + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 00958ab6222..5ae7f0b08c2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -91,7 +91,6 @@ private Widget createIndicator(PanelSyncManager syncManager) { MultiblockUIBuilder error = builder(); error.sync("error", syncManager); error.setAction(this.errorText); - error.onRebuild(() -> error.updateFormed(mte.isStructureFormed())); MultiblockUIBuilder warning = builder(); warning.sync("warning", syncManager); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java index ed6c90c2ccb..f49e6f19287 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java @@ -63,9 +63,4 @@ public int getUpkeepEUt() { public boolean canBeDamaged() { return false; } - - @Override - public String getTileName() { - return getMetaFullName(); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java index 2352d004875..2c9eadb5ff8 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java @@ -91,9 +91,4 @@ public int getCoolingPerTick() { public boolean canBeDamaged() { return true; } - - @Override - public String getTileName() { - return getMetaFullName(); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java index 464145fecd7..fe5aa72cbd9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java @@ -77,9 +77,4 @@ public boolean isActiveCooler() { public int getMaxCoolantPerTick() { return advanced ? 8 : 0; } - - @Override - public String getTileName() { - return getMetaFullName(); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java index 53228475386..9c25261401e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java @@ -44,9 +44,4 @@ public int getUpkeepEUt() { public boolean canBeDamaged() { return false; } - - @Override - public String getTileName() { - return getMetaFullName(); - } } diff --git a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java index d89e653460c..47d6dbf742a 100644 --- a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java +++ b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java @@ -40,10 +40,4 @@ public boolean isBridge() { public TextureArea getComponentIcon() { return null; } - - // not tested - @Override - public String getTileName() { - return ""; - } } From b652867a08ce39056ee4fe2aaa8ed94267914f9e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 13 Apr 2025 15:22:15 -0700 Subject: [PATCH 213/264] add debug names to several widgets fix client npe for fluid drill use margin instead of left/right --- .../multiblock/ui/MultiblockUIFactory.java | 18 +++++++++++++++++- .../electric/MetaTileEntityFluidDrill.java | 7 ++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 5ae7f0b08c2..7f95a72f7f8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -83,6 +83,7 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { private Widget createIndicator(PanelSyncManager syncManager) { if (warningText == NO_OP && errorText == NO_OP) { return new Widget<>() + .debugName("indicator_none") .size(18) .pos(174 - 5, screenHeight - 18 - 3) .overlay(GTGuiTextures.GREGTECH_LOGO_DARK); @@ -108,6 +109,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { }); return new Widget<>() + .debugName("indicator") .size(18) .pos(174 - 5, screenHeight - 18 - 3) .overlay(indicator) @@ -248,6 +250,7 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { var panel = GTGuis.createPanel(mte, width, height) + .debugName("root_panel") .childIf(!disableDisplay, () -> createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? @@ -269,9 +272,10 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { } return panel.child(Flow.row() + .debugName("bottom_row") .bottom(7) .coverChildrenHeight() - .left(4).right(4) + .margin(4, 0) .crossAxisAlignment(Alignment.CrossAxis.CENTER) .child(playerInv) .childIf(!disableButtons, () -> createButtons(panel, panelSyncManager, guiData))); @@ -312,6 +316,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, final int calculatedRows = calculateRows(count); Flow column = Flow.column() + .debugName("bar_col") .margin(4, 0) .top(5 + screenHeight) .widthRel(1f) @@ -325,6 +330,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, final int calculatedCols = calculateCols(count, r); Flow row = Flow.row() + .debugName("bar_row:" + r) .widthRel(1f) .mainAxisAlignment(Alignment.MainAxis.SPACE_BETWEEN) .height(Bars.HEIGHT); @@ -350,6 +356,7 @@ protected Flow createBars(@NotNull ProgressBarMultiblock progressMulti, } row.child(widget.size(barWidth, Bars.HEIGHT) + .debugName(mte.getClass().getSimpleName() + ":bar:" + i) .direction(ProgressWidget.Direction.RIGHT)); } @@ -367,6 +374,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { display.sync("display", syncManager); parent.child(new ScrollableTextWidget() + .debugName("display_text") .sizeRel(1f) .alignment(Alignment.TopLeft) .margin(4, 4) @@ -379,6 +387,7 @@ protected Widget createScreen(PanelSyncManager syncManager) { } return parent.childIf(!disableIndicator, () -> createIndicator(syncManager)) + .debugName("display_root") .background(getDisplayBackground()) .size(190, screenHeight) .pos(4, 4); @@ -394,6 +403,7 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync IWidget flexButton = this.flexButton.apply(guiData, panelSyncManager); if (flexButton == null) { flexButton = new ToggleButton() + .debugName("flex_none") .value(ALWAYS_ON) .overlay(GTGuiTextures.OVERLAY_NO_FLEX) .size(18) @@ -402,6 +412,7 @@ protected Flow createButtons(@NotNull ModularPanel mainPanel, @NotNull PanelSync var powerButton = createPowerButton(mainPanel, panelSyncManager); return Flow.column() + .debugName("button_col") .right(4) .coverChildren() .child(createDistinctButton(mainPanel, panelSyncManager)) @@ -414,6 +425,7 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!(mte instanceof IDistinctBusController distinct) || !distinct.canBeDistinct()) { return new ToggleButton() + .debugName("distinct_none") .value(ALWAYS_ON) .size(18) .overlay(GTGuiTextures.OVERLAY_DISTINCT_BUSES[0]) @@ -421,6 +433,7 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, } return new ToggleButton() + .debugName("distinct_button") .size(18) .value(new BooleanSyncValue(distinct::isDistinct, distinct::setDistinct)) .disableHoverBackground() @@ -433,6 +446,7 @@ protected IWidget createDistinctButton(@NotNull ModularPanel mainPanel, protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { if (!mte.shouldShowVoidingModeButton()) { return new ToggleButton() + .debugName("voiding_none") .value(ALWAYS_ON) .size(18) .overlay(GTGuiTextures.OVERLAY_VOID_NONE) @@ -442,6 +456,7 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull IntSyncValue voidingValue = new IntSyncValue(mte::getVoidingMode, mte::setVoidingMode); return new CycleButtonWidget() + .debugName("voiding_button") .size(18) .value(voidingValue) .length(4) @@ -470,6 +485,7 @@ protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull var detail = GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24); return new ToggleButton() + .debugName("power_button") .size(18) .disableHoverBackground() .overlay(true, detail, GTGuiTextures.BUTTON_POWER[1]) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 526f8e6a746..55885a8e533 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -201,7 +201,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) + boolean lowPower = false; + if (!getWorld().isRemote) { + // drain energy causes NPE on client + lowPower = isStructureFormed() && !drainEnergy(true); + } + builder.addLowPowerLine(lowPower) .addCustom((list, syncer) -> { if (isStructureFormed() && syncer.syncBoolean(minerLogic.isInventoryFull())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); From e31e018c2f86ffe9fa1835bf0d548da4aff355a9 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sun, 13 Apr 2025 15:33:34 -0700 Subject: [PATCH 214/264] rename key method and simplify slightly --- src/main/java/gregtech/api/fluids/GTFluid.java | 17 ++--------------- src/main/java/gregtech/api/util/KeyUtil.java | 2 +- 2 files changed, 3 insertions(+), 16 deletions(-) diff --git a/src/main/java/gregtech/api/fluids/GTFluid.java b/src/main/java/gregtech/api/fluids/GTFluid.java index c864caaee8d..f06fafaf21d 100644 --- a/src/main/java/gregtech/api/fluids/GTFluid.java +++ b/src/main/java/gregtech/api/fluids/GTFluid.java @@ -4,7 +4,6 @@ import gregtech.api.fluids.attribute.FluidAttribute; import gregtech.api.unification.material.Material; -import net.minecraft.client.resources.I18n; import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextComponentTranslation; import net.minecraftforge.fluids.Fluid; @@ -82,7 +81,7 @@ public GTMaterialFluid(@NotNull String fluidName, ResourceLocation still, Resour return localizedName; } - public @NotNull IKey toIKey() { + public @NotNull IKey getLocalizedKey() { IKey localizedName; String customMaterialTranslation = "fluid." + material.getUnlocalizedName(); @@ -102,19 +101,7 @@ public GTMaterialFluid(@NotNull String fluidName, ResourceLocation still, Resour @Override @SideOnly(Side.CLIENT) public String getLocalizedName(FluidStack stack) { - String localizedName; - String customMaterialTranslation = "fluid." + material.getUnlocalizedName(); - - if (I18n.hasKey(customMaterialTranslation)) { - localizedName = I18n.format(customMaterialTranslation); - } else { - localizedName = I18n.format(material.getUnlocalizedName()); - } - - if (translationKey != null) { - return I18n.format(translationKey, localizedName); - } - return localizedName; + return getLocalizedKey().get(); } } } diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index 307bd40c649..1b547e2fa69 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -140,7 +140,7 @@ public static IKey fluid(@Nullable Fluid fluid) { public static IKey fluid(@Nullable Fluid fluid, @Nullable FluidStack stack) { if (fluid == null) return IKey.EMPTY; if (fluid instanceof GTFluid.GTMaterialFluid gtFluid) { - return gtFluid.toIKey(); + return gtFluid.getLocalizedKey(); } if (stack == null) return IKey.lang(fluid.getUnlocalizedName()); else return IKey.lang(fluid.getUnlocalizedName(stack)); From bc41c2790c46be73157925dbded466be66989bdb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 16 Apr 2025 14:12:11 -0700 Subject: [PATCH 215/264] sync height, width, and drain energy --- .../centralmonitor/MetaTileEntityCentralMonitor.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 596e7e217a9..222907d0e08 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -310,10 +310,12 @@ protected MultiblockUIFactory createUIFactory() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.addCustom((list, syncer) -> { - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", this.height)); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", + syncer.syncInt(this.height))); if (isStructureFormed()) { - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.width", this.width)); + list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.width", + syncer.syncInt(this.width))); } }); } @@ -321,7 +323,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addCustom((list, syncer) -> { - if (isStructureFormed() && !drainEnergy(true)) { + if (isStructureFormed() && syncer.syncBoolean(() -> !drainEnergy(true))) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.low_power")); } }); From a680c70b70f76f0315efd27f1434a09e9d6d7480 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 17 Apr 2025 15:42:50 -0700 Subject: [PATCH 216/264] fix cleanroom sync fix energy usage sync add supplier object sync methods --- .../multiblock/ui/MultiblockUIBuilder.java | 23 ++++++++++++------- .../multiblock/ui/UISyncer.java | 12 +++++++++- .../electric/MetaTileEntityCleanroom.java | 9 ++++---- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 25a862da325..2c1b4cdac6a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -47,6 +47,7 @@ import java.util.function.DoubleSupplier; import java.util.function.IntSupplier; import java.util.function.LongSupplier; +import java.util.function.Supplier; @SuppressWarnings({ "UnusedReturnValue", "unused" }) public class MultiblockUIBuilder { @@ -135,13 +136,18 @@ public MultiblockUIBuilder setWorkingStatusKeys(String idlingKey, String pausedK *
* Added if the structure is formed and if the passed energy container has greater than zero capacity. */ + @SuppressWarnings("Convert2MethodRef") public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!isStructureFormed || energyContainer == null) return this; - boolean hasEnergy = getSyncer().syncBoolean(energyContainer.getEnergyCapacity() > 0); - if (!hasEnergy) return this; + if (!isStructureFormed) return this; - long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - maxVoltage = getSyncer().syncLong(maxVoltage); + // cannot use method reference since energy container can be null on client + long capacity = getSyncer().syncLong(() -> energyContainer.getEnergyCapacity()); + long inV = getSyncer().syncLong(() -> energyContainer.getInputVoltage()); + long outV = getSyncer().syncLong(() -> energyContainer.getOutputVoltage()); + + if (capacity <= 0) return this; + + long maxVoltage = Math.max(inV, outV); int tier = GTUtility.getFloorTierByVoltage(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -912,11 +918,12 @@ public float syncFloat(@NotNull FloatSupplier initial) { @Override @NotNull - public T syncObject(@NotNull T initial, IByteBufSerializer serializer, + public T syncObject(@NotNull Supplier initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { if (isServer()) { - serializer.serializeSafe(internal, Objects.requireNonNull(initial)); - return initial; + T val = initial.get(); + serializer.serializeSafe(internal, Objects.requireNonNull(val)); + return val; } else { try { return deserializer.deserialize(internal); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index 7757f1e9d37..c78975c7aa5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -14,6 +14,7 @@ import java.util.function.DoubleSupplier; import java.util.function.IntSupplier; import java.util.function.LongSupplier; +import java.util.function.Supplier; public interface UISyncer { @@ -97,12 +98,21 @@ default BigInteger syncBigInt(BigInteger initial) { return syncObject(initial, GTByteBufAdapters.BIG_INT); } - T syncObject(T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer); + default T syncObject(T initial, IByteBufSerializer serializer, IByteBufDeserializer deserializer) { + return syncObject((Supplier) () -> initial, serializer, deserializer); + } default T syncObject(T initial, IByteBufAdapter adapter) { return syncObject(initial, adapter, adapter); } + T syncObject(@NotNull Supplier<@NotNull T> initial, IByteBufSerializer serializer, + IByteBufDeserializer deserializer); + + default T syncObject(@NotNull Supplier<@NotNull T> initial, IByteBufAdapter adapter) { + return syncObject(initial, adapter, adapter); + } + /** * Syncs the elements of the collection to the internal buffer.
* On the server, elements are serialized in the order of iteration.
diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index f4584488be9..e42e89d05df 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -492,12 +492,13 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { // Cleanliness status line if (isStructureFormed()) { IKey cleanState; - if (syncer.syncBoolean(isClean())) { // is this method actually synced? - cleanState = KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.cleanroom.clean_state", - cleanAmount); + int amount = syncer.syncInt(cleanAmount); + if (amount >= CLEAN_AMOUNT_THRESHOLD) { + cleanState = KeyUtil.lang(TextFormatting.GREEN, + "gregtech.multiblock.cleanroom.clean_state", amount); } else { cleanState = KeyUtil.lang(TextFormatting.DARK_RED, - "gregtech.multiblock.cleanroom.dirty_state", cleanAmount); + "gregtech.multiblock.cleanroom.dirty_state", amount); } list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.cleanroom.clean_status", From b8e4b92d02744b2178fe37aa00388f2a2f1af174 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 17 Apr 2025 15:49:37 -0700 Subject: [PATCH 217/264] fix drain energy npe for low power fix drain fluid error --- .../electric/MetaTileEntityCleanroom.java | 6 +++++- .../electric/MetaTileEntityLargeMiner.java | 18 +++++++++++------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index e42e89d05df..e5275523649 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -511,7 +511,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowPowerLine(!drainEnergy(true)) + boolean lowPower = false; + if (isStructureFormed() && !getWorld().isRemote) { + lowPower = !drainEnergy(true); + } + builder.addLowPowerLine(lowPower) .addCustom((list, syncer) -> { if (isStructureFormed() && !syncer.syncBoolean(isClean())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 49ce7b689ed..73cfb028689 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -298,7 +298,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { builder.addCustom((list, syncer) -> { - if (isStructureFormed() && syncer.syncBoolean(!drainFluid(false))) { + if (isStructureFormed() && syncer.syncBoolean(() -> !drainFluid(false))) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); } }); @@ -306,12 +306,16 @@ protected void configureErrorText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowPowerLine(!drainEnergy(true)); - builder.addCustom((list, syncer) -> { - if (isStructureFormed() && syncer.syncBoolean(isInventoryFull)) { - list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); - } - }); + boolean lowPower = false; + if (isStructureFormed() && !getWorld().isRemote) { + lowPower = !drainEnergy(true); + } + builder.addLowPowerLine(lowPower) + .addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(isInventoryFull)) { + list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); + } + }); } public IBlockState getCasingState() { From a643a5be696aa3123e6d71d4b8721c9a1b7d6fde Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 18 Apr 2025 22:09:44 -0700 Subject: [PATCH 218/264] add check for if working enabled for sound --- .../java/gregtech/api/metatileentity/MetaTileEntity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 58decc88a6d..c39b082e68a 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -892,7 +892,11 @@ private void updateSound() { if (sound == null) { return; } - if (isValid() && isActive()) { + boolean canPlay = isValid() && isActive(); + if (this instanceof IControllable controllable) { + canPlay &= controllable.isWorkingEnabled(); + } + if (canPlay) { if (--playSoundCooldown > 0) { return; } From 7bb38effef651dfd182e27d375f2e8c63fafc99b Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 24 Apr 2025 23:26:32 -0700 Subject: [PATCH 219/264] switch to anonymous class for dynamic textures use TextFormattingUtil delete unused mui2 methods in deprecated interface --- .../multiblock/IProgressBarMultiblock.java | 10 ------- .../java/gregtech/api/mui/GTGuiTextures.java | 28 ++++++++++--------- .../api/mui/drawable/GTObjectDrawable.java | 4 +-- 3 files changed, 17 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java index 21258d166a5..7ebf08306a9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java @@ -2,14 +2,10 @@ import gregtech.api.gui.GuiTextures; import gregtech.api.gui.resources.TextureArea; -import gregtech.api.mui.GTGuiTextures; import net.minecraft.util.text.ITextComponent; -import com.cleanroommc.modularui.drawable.UITexture; -import com.cleanroommc.modularui.screen.Tooltip; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import java.util.List; @@ -37,10 +33,6 @@ default TextureArea getProgressBarTexture(int index) { return GuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW; } - default UITexture getProgressBarTexture2(int index) { - return GTGuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW; - } - default int getProgressBarTextureHeight(int index) { return 18; } @@ -52,6 +44,4 @@ default int getProgressBarTextureHeight(int index) { */ @Deprecated default void addBarHoverText(List hoverList, int index) {} - - default void addBarHoverText2(@NotNull Tooltip tooltip, int index) {} } diff --git a/src/main/java/gregtech/api/mui/GTGuiTextures.java b/src/main/java/gregtech/api/mui/GTGuiTextures.java index 8fb80ec4d3d..d1a46722ba4 100644 --- a/src/main/java/gregtech/api/mui/GTGuiTextures.java +++ b/src/main/java/gregtech/api/mui/GTGuiTextures.java @@ -5,11 +5,11 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.drawable.UITexture; +import com.cleanroommc.modularui.screen.viewport.GuiContext; +import com.cleanroommc.modularui.theme.WidgetTheme; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.concurrent.atomic.AtomicInteger; - /** * GT MUI textures.
* Marked experimental as some of these textures may disappear or be renamed at some point @@ -59,10 +59,10 @@ private static String id(String path) { public static final UITexture GREGTECH_LOGO_DARK = fullImage("textures/gui/icon/gregtech_logo_dark.png"); public static final IDrawable GREGTECH_LOGO_BLINKING_YELLOW = animated( "textures/gui/icon/gregtech_logo_blinking_yellow.png", - 17, 34, true, 60); + 17, 34, false, 60); public static final IDrawable GREGTECH_LOGO_BLINKING_RED = animated( "textures/gui/icon/gregtech_logo_blinking_red.png", - 17, 34, true, 36); + 17, 34, false, 36); public static final UITexture INDICATOR_NO_ENERGY = fullImage("textures/gui/base/indicator_no_energy.png"); public static final UITexture INDICATOR_NO_STEAM_BRONZE = fullImage( @@ -716,15 +716,17 @@ private static UITexture progressBar(String path, int width, int height, boolean } public static IDrawable dynamic(UITexture[] textures, int rate) { - AtomicInteger index = new AtomicInteger(); - AtomicInteger tick = new AtomicInteger(); - // todo something is wrong with this - // also this method is client only so that could cause problems too - return (context, x, y, width, height, widgetTheme) -> { - int a = tick.getAndIncrement() % rate; // this makes rate per frame ? - int i = a == 0 ? index.incrementAndGet() : index.get(); - index.set(i % textures.length); - textures[index.get()].draw(context, x, y, width, height, widgetTheme); + return new IDrawable() { + + int tick = 0; + int index = 0; + + @Override + public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { + int a = tick++ % rate; // this makes rate per frame ? + if (a == 0) index++; + textures[index % textures.length].draw(context, x, y, width, height, widgetTheme); + } }; } } diff --git a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java index 9475127fa7c..2a562ae63b0 100644 --- a/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java +++ b/src/main/java/gregtech/api/mui/drawable/GTObjectDrawable.java @@ -2,6 +2,7 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.recipes.chance.boost.BoostableChanceEntry; +import gregtech.api.util.TextFormattingUtil; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; @@ -17,7 +18,6 @@ import com.cleanroommc.modularui.theme.WidgetTheme; import com.cleanroommc.modularui.utils.Alignment; import com.cleanroommc.modularui.utils.Color; -import com.cleanroommc.modularui.utils.NumberFormat; import com.cleanroommc.modularui.widget.Widget; import org.jetbrains.annotations.Nullable; @@ -54,7 +54,7 @@ public void draw(GuiContext context, int x, int y, int width, int height, Widget drawObject(object, modularGuiContext, x, y, width, height); if (amount > 0) { renderer.setPos(x + 1, y + 1); - String amount = NumberFormat.formatWithMaxDigits(this.amount, 3); + String amount = TextFormattingUtil.formatLongToCompactString(this.amount, 3); if (object instanceof FluidStack) amount += "L"; renderer.draw(amount); } From 75bdbbd954f98b0d4a8706ae62849d0d6c91e062 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 25 Apr 2025 00:07:47 -0700 Subject: [PATCH 220/264] use ticks when max duration is small enough improve progress lang --- .../multiblock/ui/MultiblockUIBuilder.java | 14 ++++++++++---- src/main/resources/assets/gregtech/lang/en_us.lang | 3 ++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 2c1b4cdac6a..73b9f7a7865 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -349,10 +349,16 @@ public MultiblockUIBuilder addProgressLine(int progress, int maxProgress) { progress = getSyncer().syncInt(progress); maxProgress = getSyncer().syncInt(maxProgress); - addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress", - String.format("%,3.2f", (float) progress / 20), - String.format("%,3.2f", (float) maxProgress / 20), - String.format("%,3.1f", (float) progress / maxProgress * 100f))); + if (maxProgress <= 20) { + addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress.ticks", + // %02d is not supported by lang + String.format("%02d", progress), String.format("%02d", maxProgress), + (float) progress / maxProgress * 100f)); + return this; + } + + addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress.seconds", + progress / 20f, maxProgress / 20f, (float) progress / maxProgress * 100f)); return this; } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 47995759299..d404cd9863d 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5795,7 +5795,8 @@ gregtech.multiblock.idling=Idling. gregtech.multiblock.not_enough_energy=Machine needs more energy! gregtech.multiblock.not_enough_energy_output=Energy Dynamo Tier Too Low! gregtech.multiblock.progress=Progress: %s%% -gregtech.multiblock.recipe_progress=Progress: %ss / %ss (%s%%) +gregtech.multiblock.recipe_progress.seconds=Progress: %,3.2fs / %,3.2fs (%,3.1f%%) +gregtech.multiblock.recipe_progress.ticks=Progress: %st / %st (%,3.1f%%) gregtech.multiblock.invalid_structure=§cInvalid structure. gregtech.multiblock.invalid_structure.tooltip=This block is a controller of the multiblock structure. For building help, see structure template in JEI. gregtech.multiblock.validation_failed=Invalid amount of inputs/outputs. From 3caffd523c0dc13ce7f6a33e7db625a6c2f25338 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 26 Apr 2025 18:49:12 -0700 Subject: [PATCH 221/264] trim recipe output --- .../multiblock/ui/MultiblockUIBuilder.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 73b9f7a7865..6035c6f73b1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -4,6 +4,7 @@ import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.impl.AbstractRecipeLogic; import gregtech.api.capability.impl.ComputationRecipeLogic; +import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.mui.drawable.GTObjectDrawable; import gregtech.api.recipes.Recipe; @@ -566,11 +567,16 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL RecipeMap map = arl.getRecipeMap(); if (getSyncer().syncBoolean(map == null)) return this; + Recipe trimmed = null; + if (isServer()) { + MetaTileEntity mte = arl.getMetaTileEntity(); + trimmed = Recipe.trimRecipeOutputs(recipe, map, mte.getItemOutputLimit(), mte.getFluidOutputLimit()); + } + int p = getSyncer().syncInt(arl.getParallelRecipesPerformed()); if (p == 0) p = 1; - // noinspection DataFlowIssue - long eut = getSyncer().syncLong(() -> recipe.getEUt()); + long eut = getSyncer().syncLong(trimmed == null ? 0 : trimmed.getEUt()); long maxVoltage = getSyncer().syncLong(arl.getMaximumOverclockVoltage()); int maxProgress = getSyncer().syncInt(arl.getMaxProgress()); @@ -583,11 +589,10 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL if (isServer()) { // recipe searching has to be done server only - // noinspection DataFlowIssue - itemOutputs.addAll(recipe.getOutputs()); - chancedItemOutputs.addAll(recipe.getChancedOutputs().getChancedEntries()); - fluidOutputs.addAll(recipe.getFluidOutputs()); - chancedFluidOutputs.addAll(recipe.getChancedFluidOutputs().getChancedEntries()); + itemOutputs.addAll(trimmed.getOutputs()); + chancedItemOutputs.addAll(trimmed.getChancedOutputs().getChancedEntries()); + fluidOutputs.addAll(trimmed.getFluidOutputs()); + chancedFluidOutputs.addAll(trimmed.getChancedFluidOutputs().getChancedEntries()); } itemOutputs = getSyncer().syncCollection(itemOutputs, ByteBufAdapters.ITEM_STACK); From a484e58858d3f8861c75799ef25e1fbd2cf47da0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 16 May 2025 18:08:41 -0700 Subject: [PATCH 222/264] make get syncer package-private --- .../api/metatileentity/multiblock/ui/MultiblockUIBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 6035c6f73b1..9a07429eb7c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -77,7 +77,7 @@ public class MultiblockUIBuilder { private Runnable onRebuild; @NotNull - private InternalSyncer getSyncer() { + InternalSyncer getSyncer() { if (this.syncer == null) { this.syncer = new InternalSyncer(isServer()); } From 22ec7a8aae002aff97f3a555700ae1856dc1abc0 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 16 May 2025 18:12:55 -0700 Subject: [PATCH 223/264] fix duplicate warnings for FuelMultiblockController --- .../metatileentity/multiblock/FuelMultiblockController.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index f610fc5edb5..062d7489e0f 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -57,12 +57,6 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addWorkingStatusLine(); } - @Override - protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowDynamoTierLine(isDynamoTierTooLow()) - .addMaintenanceProblemLines(getMaintenanceProblems()); - } - protected long getMaxVoltage() { IEnergyContainer energyContainer = recipeMapWorkable.getEnergyContainer(); if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { From 48bae6579e1dd77ba8c165e25bee316ba2c63878 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 16 May 2025 18:30:03 -0700 Subject: [PATCH 224/264] move maint and muffler lines out of MultiblockUIFactory make sure overriders invoke super make sure there's no duplicate lines --- .../multiblock/MultiblockWithDisplayBase.java | 16 ++++++++++++++-- .../RecipeMapMultiblockController.java | 1 + .../RecipeMapSteamMultiblockController.java | 3 ++- .../multiblock/ui/MultiblockUIBuilder.java | 2 +- .../multiblock/ui/MultiblockUIFactory.java | 9 --------- .../multi/electric/MetaTileEntityCleanroom.java | 4 ++-- .../multi/electric/MetaTileEntityDataBank.java | 4 ++-- .../multi/electric/MetaTileEntityFluidDrill.java | 1 + .../multi/electric/MetaTileEntityHPCA.java | 5 +++-- .../multi/electric/MetaTileEntityLargeMiner.java | 2 ++ .../electric/MetaTileEntityPowerSubstation.java | 4 ++-- .../electric/MetaTileEntityResearchStation.java | 5 ++--- .../MetaTileEntityLargeCombustionEngine.java | 1 + .../generator/MetaTileEntityLargeTurbine.java | 1 + 14 files changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 4b3b68fbc10..5010e98cd66 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -26,6 +26,7 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -373,9 +374,20 @@ public boolean usesMui2() { protected void configureDisplayText(MultiblockUIBuilder builder) {} - protected void configureErrorText(MultiblockUIBuilder builder) {} + @MustBeInvokedByOverriders + protected void configureErrorText(MultiblockUIBuilder builder) { + builder.structureFormed(isStructureFormed()); + if (hasMufflerMechanics()) + builder.addMufflerObstructedLine(!isMufflerFaceFree()); + if (hasMaintenanceMechanics()) + builder.addMaintenanceProblemLines(getMaintenanceProblems(), false); + } - protected void configureWarningText(MultiblockUIBuilder builder) {} + @MustBeInvokedByOverriders + protected void configureWarningText(MultiblockUIBuilder builder) { + if (hasMaintenanceMechanics()) + builder.addMaintenanceProblemLines(getMaintenanceProblems(), true); + } protected MultiblockUIFactory createUIFactory() { return new MultiblockUIFactory(this) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index ea31b62df41..e68fdff9bae 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -182,6 +182,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 88e33eba6db..1f54c90cd51 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -124,7 +124,8 @@ protected void configureWarningText(MultiblockUIBuilder builder) { if (isStructureFormed() && noEnergy) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.steam.low_steam")); } - }).addMaintenanceProblemLines(getMaintenanceProblems()); + }); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 9a07429eb7c..45bd7274472 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -452,7 +452,7 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { * Will check the config * setting for if maintenance is enabled automatically. */ - public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { + public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, boolean warning) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; maintenanceProblems = getSyncer().syncByte(maintenanceProblems); if (maintenanceProblems < 63) { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 7f95a72f7f8..873be3b79d5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -68,15 +68,6 @@ public class MultiblockUIFactory { public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; - configureErrorText(builder -> { - builder.structureFormed(mte.isStructureFormed()); - if (mte.hasMufflerMechanics()) - builder.addMufflerObstructedLine(!mte.isMufflerFaceFree()); - }); - configureWarningText(builder -> { - if (mte.hasMaintenanceMechanics()) - builder.addMaintenanceProblemLines(mte.getMaintenanceProblems()); - }); configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index e5275523649..8d83c4b148e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -527,8 +527,8 @@ protected void configureWarningText(MultiblockUIBuilder builder) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.low_tier", energyNeeded)); } - }) - .addMaintenanceProblemLines(getMaintenanceProblems()); + }); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java index 07a99b9e8d2..9f8f7c9428b 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDataBank.java @@ -260,8 +260,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowPowerLine(hasNotEnoughEnergy) - .addMaintenanceProblemLines(getMaintenanceProblems()); + builder.addLowPowerLine(hasNotEnoughEnergy); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 55885a8e533..b0ad2801374 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -212,6 +212,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); + super.configureWarningText(builder); } @Override diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 7f20a7d5a9c..25779c874d0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -443,12 +443,13 @@ protected void configureWarningText(MultiblockUIBuilder builder) { // Structure warnings hpcaHandler.addWarnings(manager, syncer); - }) - .addMaintenanceProblemLines(getMaintenanceProblems()); + }); + super.configureWarningText(builder); } @Override protected void configureErrorText(MultiblockUIBuilder builder) { + super.configureErrorText(builder); builder.addCustom((manager, syncer) -> { if (!isStructureFormed()) return; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 73cfb028689..8128e1fa525 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -297,6 +297,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { + super.configureErrorText(builder); builder.addCustom((list, syncer) -> { if (isStructureFormed() && syncer.syncBoolean(() -> !drainFluid(false))) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); @@ -316,6 +317,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); + super.configureWarningText(builder); } public IBlockState getCasingState() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 87ca99dae6b..96a6121b8c9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -420,12 +420,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { timeToDrain)); } } - }); - builder.addWorkingStatusLine(); + }).addWorkingStatusLine(); } @Override protected void configureWarningText(MultiblockUIBuilder builder) { + super.configureWarningText(builder); builder.addCustom((list, syncer) -> { if (isStructureFormed() && averageInLastSec < averageOutLastSec) { BigInteger timeToDrainSeconds = energyBank.getStored() diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index 63ed7e86eb3..ebdeb5475ae 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -251,9 +251,8 @@ else if (recipeMapWorkable.isWorking()) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addLowPowerLine(recipeMapWorkable.isHasNotEnoughEnergy()) - .addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()) - .addMaintenanceProblemLines(getMaintenanceProblems()); + builder.addLowComputationLine(getRecipeMapWorkable().isHasNotEnoughComputation()); + super.configureWarningText(builder); } private void researchingLine(KeyManager manager, UISyncer syncer) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 21c7d602e0b..b192ae811d2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -99,6 +99,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { + super.configureErrorText(builder); var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; builder.addCustom((keyList, syncer) -> { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index 74cba563123..5a15302484d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -161,6 +161,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { + super.configureErrorText(builder); builder.addCustom((keyList, syncer) -> { if (!isStructureFormed() || syncer.syncBoolean(() -> getRotorHolder() == null)) return; From 3fd07f133ab30004102dc82d4e3c56715a212bac Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 16 May 2025 18:49:33 -0700 Subject: [PATCH 225/264] make full maint cause error --- .../api/metatileentity/multiblock/ui/MultiblockUIBuilder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 45bd7274472..5cf417bfbb9 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -455,7 +455,9 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, boolean warning) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; maintenanceProblems = getSyncer().syncByte(maintenanceProblems); - if (maintenanceProblems < 63) { + + if (warning && maintenanceProblems < 0b111111 && maintenanceProblems > 0b000000 || + !warning && maintenanceProblems == 0b000000) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); From 6c0af2c641ffe0340b311b7551cbd15a362bcc6e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 16 May 2025 18:52:01 -0700 Subject: [PATCH 226/264] make full maint cause error make maint lines yellow --- .../multiblock/ui/MultiblockUIBuilder.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 5cf417bfbb9..bff400afa07 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -463,37 +463,37 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Wrench if ((maintenanceProblems & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.wrench")); } // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.screwdriver")); } // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.soft_mallet")); } // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.hard_hammer")); } // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.wire_cutter")); } // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.GRAY, + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.problem.crowbar")); } } From 1dba284dff12950f8348ccfd0e32efb63982783a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 00:44:47 -0700 Subject: [PATCH 227/264] Operations are no longer checked and registered store operations instead of drawables KeyManager is actually a functional interface --- .../multiblock/ui/KeyManager.java | 7 +- .../multiblock/ui/MultiblockUIBuilder.java | 45 +++++-------- .../multiblock/ui/MultiblockUIFactory.java | 5 -- .../multiblock/ui/Operation.java | 64 ++++++------------- 4 files changed, 41 insertions(+), 80 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java index 772ad5dfb28..3ebb926f662 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/KeyManager.java @@ -2,14 +2,15 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; +@FunctionalInterface public interface KeyManager { + void add(Operation op); + default void add(IDrawable drawable) { - add(drawable, Operation.NEW_LINE_SPACE); + add(Operation.addLineSpace(drawable)); } - void add(IDrawable drawable, Operation op); - default void addAll(Iterable drawables) { drawables.forEach(this::add); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index bff400afa07..7740f82481a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -46,6 +46,7 @@ import java.util.function.BooleanSupplier; import java.util.function.Consumer; import java.util.function.DoubleSupplier; +import java.util.function.Function; import java.util.function.IntSupplier; import java.util.function.LongSupplier; import java.util.function.Supplier; @@ -53,12 +54,11 @@ @SuppressWarnings({ "UnusedReturnValue", "unused" }) public class MultiblockUIBuilder { - private final List textList = new ArrayList<>(); private final List operations = new ArrayList<>(); private Consumer action; private final InternalSyncHandler syncHandler = new InternalSyncHandler(); - private final KeyManager manager = new InternalKeyManager(); + private final KeyManager manager = this::addKey; private static final int DEFAULT_MAX_RECIPE_LINES = 25; @@ -602,7 +602,8 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL chancedItemOutputs = getSyncer().syncCollection(chancedItemOutputs, GTByteBufAdapters.CHANCED_ITEM_OUTPUT); chancedFluidOutputs = getSyncer().syncCollection(chancedFluidOutputs, GTByteBufAdapters.CHANCED_FLUID_OUTPUT); - addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation.NEW_LINE); + // todo lang + addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation::addLine); int recipeTier = GTUtility.getTierByVoltage(eut); int machineTier = GTUtility.getOCTierByVoltage(maxVoltage); @@ -656,8 +657,7 @@ private void addItemOutputLine(@NotNull ItemStack stack, long count, int recipeL addKey(new GTObjectDrawable(stack, count) .asIcon() .asHoverable() - .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); - // addKey(IKey.SPACE, Operation.ADD); + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation::add); } /** @@ -675,7 +675,7 @@ private void addFluidOutputLine(@NotNull FluidStack stack, long count, int recip addKey(new GTObjectDrawable(stack, count) .asIcon() .asHoverable() - .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation::add); } /** @@ -693,7 +693,7 @@ private void addChancedItemOutputLine(@NotNull ChancedItemOutput output, .setBoostFunction(entry -> chance) .asIcon() .asHoverable() - .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation::add); } /** @@ -712,7 +712,7 @@ private void addChancedFluidOutputLine(ChancedFluidOutput output, .setBoostFunction(entry -> chance) .asIcon() .asHoverable() - .addTooltipLine(formatRecipeData(name, amount, rate)), Operation.ADD); + .addTooltipLine(formatRecipeData(name, amount, rate)), Operation::add); } private static String formatRecipeRate(int recipeLength, long amount) { @@ -745,11 +745,10 @@ public MultiblockUIBuilder addCustom(BiConsumer customCons } public boolean isEmpty() { - return this.textList.isEmpty(); + return this.operations.isEmpty(); } public void clear() { - this.textList.clear(); this.operations.clear(); } @@ -775,8 +774,8 @@ public void build(IRichTextBuilder richText) { runAction(); dirty = false; } - for (int i = 0; i < operations.size(); i++) { - operations.get(i).apply(textList.get(i), richText); + for (Operation op : operations) { + op.accept(richText); } } @@ -827,27 +826,15 @@ private void addKey(IKey key, IDrawable... hover) { } private void addKey(IDrawable key) { - addKey(key, Operation.NEW_LINE_SPACE); + addKey(Operation.addLineSpace(key)); } - private void addKey(@NotNull IDrawable key, @NotNull Operation op) { - if (isServer()) return; - if (textList.size() != operations.size()) { - throw new IllegalStateException("textList and operations must be the same size!"); - } - this.textList.add(key); - Operation.checkOp(op); - this.operations.add(op); + private void addKey(IDrawable key, Function function) { + addKey(function.apply(key)); } - public class InternalKeyManager implements KeyManager { - - private InternalKeyManager() {} - - @Override - public void add(IDrawable drawable, Operation op) { - addKey(drawable, op); - } + private void addKey(@NotNull Operation op) { + if (!isServer()) this.operations.add(op); } public class InternalSyncer implements UISyncer { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 873be3b79d5..c6965c20b9e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -61,11 +61,6 @@ public class MultiblockUIFactory { private boolean disableIndicator = false; private boolean disableButtons = false; - static { - // register operations - Operation.init(); - } - public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { this.mte = mte; configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java index cf46b339870..48736198a35 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/Operation.java @@ -2,65 +2,43 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; -import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap; -import it.unimi.dsi.fastutil.ints.Int2ObjectMap; -import it.unimi.dsi.fastutil.objects.Object2IntArrayMap; -import it.unimi.dsi.fastutil.objects.Object2IntMap; +import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @FunctionalInterface -public interface Operation { +public interface Operation extends Consumer> { - Int2ObjectMap ID_MAP = new Int2ObjectArrayMap<>(); - Object2IntMap REVERSE_MAP = new Object2IntArrayMap<>(); + Operation NO_OP = richText -> {}; - Operation NO_OP = (drawable, richText) -> {}; - Operation NEW_LINE = (drawable, richText) -> richText.addLine(drawable); - Operation ADD = (drawable, richText) -> richText.add(drawable); - Operation NEW_LINE_SPACE = NEW_LINE.andThen(richText -> richText.spaceLine(2)); - - static void init() { - registerOp(NO_OP); - registerOp(NEW_LINE); - registerOp(ADD); - registerOp(NEW_LINE_SPACE); - } - - static Operation getById(int id) { - return ID_MAP.get(id); - } - - static int getId(Operation op) { - return REVERSE_MAP.get(op); + static Operation addLine(IDrawable drawable) { + return richText -> richText.addLine(drawable); } - static void registerOp(Operation op) { - int nextId = ID_MAP.size(); - ID_MAP.put(nextId, op); - REVERSE_MAP.put(op, nextId); + static Operation add(IDrawable drawable) { + return richText -> richText.add(drawable); } - static void checkOp(Operation op) { - if (!REVERSE_MAP.containsKey(op)) - throw new IllegalStateException("Operation is not registered!"); - Operation check = ID_MAP.get(REVERSE_MAP.getInt(op)); - if (check != op) throw new IllegalStateException("Operation is not identical!"); + static Operation addLineSpace(IDrawable drawable) { + return addLine(drawable).spaceLine(2); } - void apply(IDrawable drawable, IRichTextBuilder richText); + @Override + void accept(IRichTextBuilder richText); - default Operation andThen(Operation after) { - return (drawable, richText) -> { - this.apply(drawable, richText); - after.apply(drawable, richText); + @NotNull + default Operation spaceLine(int space) { + return richText -> { + this.accept(richText); + richText.spaceLine(space); }; } - default Operation andThen(Consumer> after) { - return (drawable, richText) -> { - this.apply(drawable, richText); - after.accept(richText); + @NotNull + default Operation newLine() { + return richText -> { + this.accept(richText); + richText.newLine(); }; } } From ea30e650e853bc187bbf6b014dfdd77aadb28c24 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 01:26:48 -0700 Subject: [PATCH 228/264] add representative item stacks for maintanence lines --- .../multiblock/ui/MultiblockUIBuilder.java | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 7740f82481a..25e621ef40b 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -11,11 +11,13 @@ import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; +import gregtech.api.unification.material.Materials; import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; +import gregtech.common.items.ToolItems; import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; @@ -25,6 +27,7 @@ import com.cleanroommc.modularui.api.drawable.IDrawable; import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.drawable.IRichTextBuilder; +import com.cleanroommc.modularui.drawable.ItemDrawable; import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; @@ -463,38 +466,62 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Wrench if ((maintenanceProblems & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.wrench")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.WRENCH.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.wrench")) + .newLine()); } // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.screwdriver")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.SCREWDRIVER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.screwdriver")) + .newLine()); } // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.soft_mallet")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.SOFT_MALLET.get(Materials.Wood))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.soft_mallet")) + .newLine()); } // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.hard_hammer")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.HARD_HAMMER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.hard_hammer")) + .newLine()); } // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.wire_cutter")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.WIRE_CUTTER.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.wire_cutter")) + .newLine()); } // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.universal.problem.crowbar")); + addKey(richText -> richText + .add(new ItemDrawable(ToolItems.CROWBAR.get(Materials.Iron))) + .add(IKey.SPACE) + .add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.universal.problem.crowbar")) + .newLine()); } } return this; From 5b00ad8482961119641849dda1565350dc55d8eb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 01:29:58 -0700 Subject: [PATCH 229/264] addKey -> addOperation remove KeyManager field --- .../multiblock/ui/MultiblockUIBuilder.java | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 25e621ef40b..fe840c113d1 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -61,7 +61,6 @@ public class MultiblockUIBuilder { private Consumer action; private final InternalSyncHandler syncHandler = new InternalSyncHandler(); - private final KeyManager manager = this::addKey; private static final int DEFAULT_MAX_RECIPE_LINES = 25; @@ -101,7 +100,7 @@ public MultiblockUIBuilder structureFormed(boolean structureFormed) { var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); - addKey(base, hover); + addHoverableKey(base, hover); } return this; } @@ -162,7 +161,7 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick_hover"); - addKey(bodyText, hoverText); + addHoverableKey(bodyText, hoverText); return this; } @@ -180,7 +179,7 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { "gregtech.multiblock.max_recipe_tier", GTValues.VOCNF[tier]); var hoverText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_recipe_tier_hover"); - addKey(bodyText, hoverText); + addHoverableKey(bodyText, hoverText); return this; } @@ -466,7 +465,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Wrench if ((maintenanceProblems & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.WRENCH.get(Materials.Iron))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -476,7 +475,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Screwdriver if (((maintenanceProblems >> 1) & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.SCREWDRIVER.get(Materials.Iron))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -486,7 +485,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Soft Mallet if (((maintenanceProblems >> 2) & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.SOFT_MALLET.get(Materials.Wood))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -496,7 +495,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Hammer if (((maintenanceProblems >> 3) & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.HARD_HAMMER.get(Materials.Iron))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -506,7 +505,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Wire Cutters if (((maintenanceProblems >> 4) & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.WIRE_CUTTER.get(Materials.Iron))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -516,7 +515,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems, // Crowbar if (((maintenanceProblems >> 5) & 1) == 0) { - addKey(richText -> richText + addOperation(richText -> richText .add(new ItemDrawable(ToolItems.CROWBAR.get(Materials.Iron))) .add(IKey.SPACE) .add(KeyUtil.lang(TextFormatting.YELLOW, @@ -767,7 +766,7 @@ public MultiblockUIBuilder addEmptyLine() { /** Add custom text dynamically, allowing for custom application logic. */ public MultiblockUIBuilder addCustom(BiConsumer customConsumer) { - customConsumer.accept(this.manager, getSyncer()); + customConsumer.accept(this::addOperation, getSyncer()); return this; } @@ -847,20 +846,20 @@ public void onRebuild(Runnable onRebuild) { this.onRebuild = onRebuild; } - private void addKey(IKey key, IDrawable... hover) { + private void addHoverableKey(IKey key, IDrawable... hover) { if (isServer()) return; addKey(KeyUtil.setHover(key, hover)); } private void addKey(IDrawable key) { - addKey(Operation.addLineSpace(key)); + addOperation(Operation.addLineSpace(key)); } private void addKey(IDrawable key, Function function) { - addKey(function.apply(key)); + addOperation(function.apply(key)); } - private void addKey(@NotNull Operation op) { + private void addOperation(@NotNull Operation op) { if (!isServer()) this.operations.add(op); } From 63e9162f001e20ee6c32e173f27dc4b032c6edf6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 14:11:02 -0700 Subject: [PATCH 230/264] make IEquals notnull --- src/main/java/gregtech/api/mui/GTByteBufAdapters.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java index 86757aae225..91f695a9afa 100644 --- a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -7,10 +7,10 @@ import com.cleanroommc.modularui.utils.serialization.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.math.BigInteger; +import java.util.Objects; public class GTByteBufAdapters { @@ -31,8 +31,8 @@ public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer, - @Nullable IEquals equals) { - final IEquals tester = equals != null ? equals : IEquals.defaultTester(); + @NotNull IEquals equals) { + final IEquals tester = Objects.requireNonNull(equals); return new IByteBufAdapter<>() { @Override From 98532aff9526f355468eb3d81b0390924a1cf524 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 16:34:16 -0700 Subject: [PATCH 231/264] clarify todo remove recipe cache --- .../capability/impl/AbstractRecipeLogic.java | 173 +----------------- .../multiblock/ui/MultiblockUIBuilder.java | 2 +- 2 files changed, 2 insertions(+), 173 deletions(-) diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index cea28b84c5e..e92b3b13295 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -16,10 +16,6 @@ import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeBuilder; import gregtech.api.recipes.RecipeMap; -import gregtech.api.recipes.chance.boost.ChanceBoostFunction; -import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; -import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; -import gregtech.api.recipes.ingredients.GTRecipeInput; import gregtech.api.recipes.logic.IParallelableRecipeLogic; import gregtech.api.recipes.logic.OCParams; import gregtech.api.recipes.logic.OCResult; @@ -32,20 +28,16 @@ import gregtech.common.ConfigHolder; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTBase; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.PacketBuffer; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.items.IItemHandlerModifiable; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -53,8 +45,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.function.Function; import static gregtech.api.GTValues.ULV; import static gregtech.api.recipes.logic.OverclockingLogic.*; @@ -69,7 +59,6 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, private double euDiscount = -1; private double speedBonus = -1; - protected final CachedRecipeData cachedRecipeData = new CachedRecipeData(); protected Recipe previousRecipe; private boolean allowOverclocking = true; protected int parallelRecipesPerformed; @@ -95,7 +84,6 @@ public abstract class AbstractRecipeLogic extends MTETrait implements IWorkable, protected boolean invalidInputsForRecipes; protected boolean hasPerfectOC; - private boolean simulate = false; /** * DO NOT use the parallelLimit field directly, EVER @@ -272,11 +260,6 @@ public Recipe getPreviousRecipe() { return previousRecipe; } - @NotNull - public CachedRecipeData getCachedRecipeData() { - return this.cachedRecipeData; - } - /** * @return true if recipes should be searched for */ @@ -436,7 +419,6 @@ protected void trySearchNewRecipe() { // If a recipe was found, then inputs were valid. Cache found recipe. if (currentRecipe != null) { this.previousRecipe = currentRecipe; - this.cachedRecipeData.serialize(currentRecipe, this); } this.invalidInputsForRecipes = (currentRecipe == null); @@ -747,7 +729,7 @@ protected static boolean areItemStacksEqual(@NotNull ItemStack stackA, @NotNull if (checkOutputSpaceItems(recipe, getOutputInventory()) && checkOutputSpaceFluids(recipe, getOutputTank())) { this.isOutputsFull = false; - if (recipe.matches(!simulate, importInventory, importFluids)) { + if (recipe.matches(true, importInventory, importFluids)) { this.metaTileEntity.addNotifiedInput(importInventory); return recipe; } @@ -1215,9 +1197,6 @@ public NBTTagCompound serializeNBT() { compound.setTag("ItemOutputs", itemOutputsList); compound.setTag("FluidOutputs", fluidOutputsList); } - NBTTagCompound cache = this.cachedRecipeData.serializeNBT(); - if (!cache.isEmpty()) - compound.setTag("cache", cache); return compound; } @@ -1244,155 +1223,5 @@ public void deserializeNBT(@NotNull NBTTagCompound compound) { this.fluidOutputs.add(FluidStack.loadFluidStackFromNBT(fluidOutputsList.getCompoundTagAt(i))); } } - if (compound.hasKey("cache") && !compound.getCompoundTag("cache").isEmpty()) { - this.cachedRecipeData.deserializeNBT(compound.getCompoundTag("cache")); - } else { - simulate = true; - trySearchNewRecipe(); - simulate = false; - if (previousRecipe != null) { - this.cachedRecipeData.serialize(this.previousRecipe, this); - } else { - this.cachedRecipeData.serialize(this); - } - // mark to find new recipe to set cached data - } - } - - public static class CachedRecipeData implements INBTSerializable { - - private final NBTTagCompound root = new NBTTagCompound(); - private final Map cache = new Object2ObjectOpenHashMap<>(); - - private CachedRecipeData() {} - - public void serialize(AbstractRecipeLogic arl) { - NBTTagList itemOutputs = new NBTTagList(); - for (ItemStack output : arl.itemOutputs) { - itemOutputs.appendTag(output.serializeNBT()); - } - root.setTag("arl_item_outputs", itemOutputs); - - NBTTagList fluidOutputs = new NBTTagList(); - for (FluidStack output : arl.fluidOutputs) { - fluidOutputs.appendTag(output.writeToNBT(new NBTTagCompound())); - } - root.setTag("arl_fluid_outputs", fluidOutputs); - } - - public void serialize(Recipe recipe, AbstractRecipeLogic arl) { - root.tagMap.clear(); - serialize(arl); - NBTTagList itemInputs = new NBTTagList(); - for (GTRecipeInput input : recipe.getInputs()) { - itemInputs.appendTag(GTRecipeInput.writeToNBT(input)); - } - root.setTag("item_inputs", itemInputs); - - NBTTagList fluidInputs = new NBTTagList(); - for (GTRecipeInput input : recipe.getFluidInputs()) { - fluidInputs.appendTag(GTRecipeInput.writeToNBT(input)); - } - root.setTag("fluid_inputs", fluidInputs); - - NBTTagList itemOutputs = new NBTTagList(); - for (ItemStack output : recipe.getOutputs()) { - itemOutputs.appendTag(output.serializeNBT()); - } - root.setTag("item_outputs", itemOutputs); - - NBTTagList fluidOutputs = new NBTTagList(); - for (FluidStack output : recipe.getFluidOutputs()) { - fluidOutputs.appendTag(output.writeToNBT(new NBTTagCompound())); - } - root.setTag("fluid_outputs", fluidOutputs); - - root.setInteger("duration", recipe.getDuration()); - root.setLong("eut", recipe.getEUt()); - root.setInteger("recipe_tier", GTUtility.getTierByVoltage(recipe.getEUt())); - root.setInteger("machine_tier", arl.getOverclockForTier(arl.getMaximumOverclockVoltage())); - - root.setString("item_logic", recipe.getChancedOutputs().getChancedOutputLogic().toString()); - root.setString("fluid_logic", recipe.getChancedFluidOutputs().getChancedOutputLogic().toString()); - - RecipeMap map = arl.getRecipeMap(); - ChanceBoostFunction chanceFunction = null; - if (map != null) { - chanceFunction = map.getChanceFunction(); - root.setString("map", map.getUnlocalizedName()); - } - - NBTTagList chancedInputs = new NBTTagList(); - for (ChancedItemOutput entry : recipe.getChancedOutputs().getChancedEntries()) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setTag("ingredient", entry.getIngredient().serializeNBT()); - tag.setInteger("chance", entry.getChance()); - tag.setInteger("chance_boost", entry.getChanceBoost()); - if (chanceFunction != null) { - tag.setInteger("calculated_chance", chanceFunction.getBoostedChance(entry, - root.getInteger("recipe_tier"), - root.getInteger("machine_tier"))); - } - chancedInputs.appendTag(tag); - } - root.setTag("chanced_inputs", chancedInputs); - - NBTTagList chancedFluidOutputs = new NBTTagList(); - for (ChancedFluidOutput entry : recipe.getChancedFluidOutputs().getChancedEntries()) { - NBTTagCompound tag = new NBTTagCompound(); - tag.setTag("ingredient", entry.getIngredient().writeToNBT(new NBTTagCompound())); - tag.setInteger("chance", entry.getChance()); - tag.setInteger("chance_boost", entry.getChanceBoost()); - if (chanceFunction != null) { - tag.setInteger("calculated_chance", chanceFunction.getBoostedChance(entry, - root.getInteger("recipe_tier"), - root.getInteger("machine_tier"))); - } - chancedFluidOutputs.appendTag(tag); - } - root.setTag("chanced_fluid_outputs", chancedFluidOutputs); - } - - public ObjectArrayList getOutputs() { - if (!root.hasKey("item_outputs")) return compute("arl_item_outputs", this::deserializeItemStacks); - else return compute("item_outputs", this::deserializeItemStacks); - } - - public ObjectArrayList getFluidOutputs() { - if (!root.hasKey("fluid_outputs")) return compute("arl_fluid_outputs", this::deserializeFluidStacks); - else return compute("fluid_outputs", this::deserializeFluidStacks); - } - - private ObjectArrayList deserializeItemStacks(String k) { - ObjectArrayList list = new ObjectArrayList<>(); - for (NBTBase tag : root.getTagList(k, Constants.NBT.TAG_COMPOUND)) { - list.add(new ItemStack((NBTTagCompound) tag)); - } - return list; - } - - private ObjectArrayList deserializeFluidStacks(String k) { - ObjectArrayList list = new ObjectArrayList<>(); - for (NBTBase tag : root.getTagList(k, Constants.NBT.TAG_COMPOUND)) { - list.add(FluidStack.loadFluidStackFromNBT((NBTTagCompound) tag)); - } - return list; - } - - @SuppressWarnings("unchecked") - private T compute(String key, Function function) { - return (T) cache.computeIfAbsent(key, function); - } - - @Override - public NBTTagCompound serializeNBT() { - return root; - } - - @Override - public void deserializeNBT(NBTTagCompound nbt) { - root.merge(nbt); - cache.clear(); - } } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index fe840c113d1..021be7ae5d6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -588,7 +588,7 @@ public MultiblockUIBuilder addRecipeOutputLine(@NotNull AbstractRecipeLogic arl) * @param maxLines the maximum number of lines to print until truncating with {@code ...} */ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxLines) { - // todo recipe is null on first load, fix + // todo recipe is null on first load, fix in the future Recipe recipe = arl.getPreviousRecipe(); if (getSyncer().syncBoolean(recipe == null)) return this; From 866b6193f0ff28e80b9e9aca6e97a5abfc2e4f20 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 16:42:21 -0700 Subject: [PATCH 232/264] fix warning icon in fuel multiblocks remove invoke super annotation --- .../multiblock/FuelMultiblockController.java | 7 +++++++ .../multiblock/MultiblockWithDisplayBase.java | 2 -- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index 062d7489e0f..2a8a632b5c5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -57,6 +57,13 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addWorkingStatusLine(); } + @Override + protected void configureWarningText(MultiblockUIBuilder builder) { + builder.addLowDynamoTierLine(isDynamoTierTooLow()); + if (hasMaintenanceMechanics()) + builder.addMaintenanceProblemLines(getMaintenanceProblems(), true); + } + protected long getMaxVoltage() { IEnergyContainer energyContainer = recipeMapWorkable.getEnergyContainer(); if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 5010e98cd66..62d4fe07e5e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -374,7 +374,6 @@ public boolean usesMui2() { protected void configureDisplayText(MultiblockUIBuilder builder) {} - @MustBeInvokedByOverriders protected void configureErrorText(MultiblockUIBuilder builder) { builder.structureFormed(isStructureFormed()); if (hasMufflerMechanics()) @@ -383,7 +382,6 @@ protected void configureErrorText(MultiblockUIBuilder builder) { builder.addMaintenanceProblemLines(getMaintenanceProblems(), false); } - @MustBeInvokedByOverriders protected void configureWarningText(MultiblockUIBuilder builder) { if (hasMaintenanceMechanics()) builder.addMaintenanceProblemLines(getMaintenanceProblems(), true); From e8ee7a3c249e68f8a8547e441cd43754a7cb2c7a Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 18:15:40 -0700 Subject: [PATCH 233/264] improve flex button javadoc various cleanups --- .../multiblock/IProgressBarMultiblock.java | 6 +-- .../MultiMapMultiblockController.java | 23 +++++----- .../multiblock/MultiblockWithDisplayBase.java | 1 - .../multiblock/ProgressBarMultiblock.java | 4 ++ .../multiblock/ui/MultiblockUIFactory.java | 11 ++--- .../electric/MetaTileEntityFluidDrill.java | 44 ++++++++++--------- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java index 7ebf08306a9..d16cc5d7c3c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/IProgressBarMultiblock.java @@ -9,7 +9,7 @@ import java.util.List; -@ApiStatus.ScheduledForRemoval +@ApiStatus.ScheduledForRemoval(inVersion = "2.10") @Deprecated public interface IProgressBarMultiblock { @@ -33,10 +33,6 @@ default TextureArea getProgressBarTexture(int index) { return GuiTextures.PROGRESS_BAR_MULTI_ENERGY_YELLOW; } - default int getProgressBarTextureHeight(int index) { - return 18; - } - /** * Add hover text to your progress bar(s). * diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index 1e581113c0d..c0b1f9fba19 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -28,6 +28,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.value.sync.IntSyncValue; import com.cleanroommc.modularui.widgets.CycleButtonWidget; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -136,25 +137,25 @@ public TraceabilityPredicate autoAbilities(boolean checkEnergyIn, boolean checkM @Override protected MultiblockUIFactory createUIFactory() { - IntSyncValue recipeMapValue = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); return super.createUIFactory() .createFlexButton((guiData, syncManager) -> { - if (getAvailableRecipeMaps() == null || getAvailableRecipeMaps().length <= 1) - return null; + RecipeMap[] recipeMaps = getAvailableRecipeMaps(); + if (ArrayUtils.isEmpty(recipeMaps)) return null; + + IntSyncValue activeMapIndex = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); return new CycleButtonWidget() - // .textureGetter(i -> GTGuiTextures.BUTTON_MULTI_MAP) .overlay(GTGuiTextures.BUTTON_MULTI_MAP) .background(GTGuiTextures.BUTTON) // TODO find out why this needs to be called .disableHoverBackground() - .value(recipeMapValue) - .length(getAvailableRecipeMaps().length) - .tooltipAutoUpdate(true) - .tooltipBuilder(t -> t.addLine(IKey.comp( - IKey.lang("gregtech.multiblock.multiple_recipemaps.value", - IKey.lang(getAvailableRecipeMaps()[recipeMapValue.getIntValue()] - .getTranslationKey()))))); + .value(activeMapIndex) + .length(recipeMaps.length) + .tooltipBuilder(t -> { + RecipeMap map = recipeMaps[activeMapIndex.getIntValue()]; + t.addLine(IKey.lang("gregtech.multiblock.multiple_recipemaps.value", + map.getTranslationKey())); + }); }); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 62d4fe07e5e..1f31dce42a0 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -26,7 +26,6 @@ import com.cleanroommc.modularui.factory.PosGuiData; import com.cleanroommc.modularui.screen.ModularPanel; import com.cleanroommc.modularui.value.sync.PanelSyncManager; -import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import java.util.*; diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java index fdd1e2568dc..e8046b903b4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ProgressBarMultiblock.java @@ -14,4 +14,8 @@ public interface ProgressBarMultiblock { // the bar only needs three things // progress, texture, and tooltip void registerBars(List> bars, PanelSyncManager syncManager); + + default boolean hasBars() { + return getProgressBarCount() > 0; + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index c6965c20b9e..38b6c6ee0ad 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -203,9 +203,9 @@ public MultiblockUIFactory disableButtons() { /** * Add a custom third button to the Multiblock UI. By default, this is a placeholder stating that there is no - * additional functionality for this Multiblock. - *
- * Size will be 18x18. + * additional functionality for this Multiblock.
+ * Size will be 18x18.
+ * Return {@code null} in the function to indicate no flex button */ public MultiblockUIFactory createFlexButton(BiFunction flexButton) { this.flexButton = flexButton; @@ -240,8 +240,7 @@ public MultiblockUIFactory addScreenChildren(ScreenFunction function) { .childIf(!disableDisplay, () -> createScreen(panelSyncManager)); // TODO createExtras() hook for overrides? - if (mte instanceof ProgressBarMultiblock progressBarMultiblock && - progressBarMultiblock.getProgressBarCount() > 0) { + if (mte instanceof ProgressBarMultiblock progressBarMultiblock && progressBarMultiblock.hasBars()) { panel.height(height + (Bars.HEIGHT * calculateRows(progressBarMultiblock.getProgressBarCount())) - 2); panel.child(createBars(progressBarMultiblock, panelSyncManager)); } @@ -490,8 +489,6 @@ private Screen() {} public static final class Bars { public static int FULL_WIDTH = Screen.WIDTH; - public static int HALF_WIDTH = 94; - public static int THIRD_WIDTH = 62; public static int HEIGHT = 7; private Bars() {} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index b0ad2801374..fbefd28394a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -390,28 +390,32 @@ public void registerBars(List> bars, PanelSync .progress(() -> operationsValue.getIntValue() * 1.0 / BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS) .texture(GTGuiTextures.PROGRESS_BAR_FLUID_RIG_DEPLETION) .tooltipBuilder(t -> { - if (isStructureFormed()) { - if (operationsValue.getIntValue() == 0) { - t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depleted")); - } else { - t.addLine(KeyUtil.string(() -> { - int percent = (int) Math.round(100.0 * operationsValue.getIntValue() / - BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS); - if (percent > 40) { - return TextFormatting.GREEN + IKey - .lang("gregtech.multiblock.fluid_rig.vein_depletion.high", percent).get(); - } else if (percent > 10) { - return TextFormatting.YELLOW + IKey - .lang("gregtech.multiblock.fluid_rig.vein_depletion.medium", percent).get(); - } else { - return TextFormatting.RED + IKey - .lang("gregtech.multiblock.fluid_rig.vein_depletion.low", percent).get(); - } - })); - } - } else { + if (!isStructureFormed()) { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); + return; + } + + if (operationsValue.getIntValue() == 0) { + t.addLine(IKey.lang("gregtech.multiblock.fluid_rig.vein_depleted")); + return; } + + t.addLine(KeyUtil.string(() -> getDepletionLang(operationsValue))); })); } + + private static @NotNull String getDepletionLang(IntSyncValue operationsValue) { + int percent = (int) Math.round(100.0 * operationsValue.getIntValue() / + BedrockFluidVeinHandler.MAXIMUM_VEIN_OPERATIONS); + if (percent > 40) { + return TextFormatting.GREEN + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.high", percent).get(); + } else if (percent > 10) { + return TextFormatting.YELLOW + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.medium", percent).get(); + } else { + return TextFormatting.RED + IKey + .lang("gregtech.multiblock.fluid_rig.vein_depletion.low", percent).get(); + } + } } From 528cdbd3d6a6712a186af4ed28059ea9bf67b277 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 18:20:16 -0700 Subject: [PATCH 234/264] fix small oopsie --- .../metatileentity/multiblock/MultiMapMultiblockController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java index c0b1f9fba19..ded9c69269c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiMapMultiblockController.java @@ -140,7 +140,7 @@ protected MultiblockUIFactory createUIFactory() { return super.createUIFactory() .createFlexButton((guiData, syncManager) -> { RecipeMap[] recipeMaps = getAvailableRecipeMaps(); - if (ArrayUtils.isEmpty(recipeMaps)) return null; + if (ArrayUtils.getLength(recipeMaps) <= 1) return null; IntSyncValue activeMapIndex = new IntSyncValue(this::getRecipeMapIndex, this::setRecipeMapIndex); From c5cf9fdfabcf8f5993d6fa395fe3dccfa8c31792 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 18:25:28 -0700 Subject: [PATCH 235/264] add value to TemplateBarBuilder --- .../metatileentity/multiblock/ui/TemplateBarBuilder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java index 1b075ef4703..e3ad7d60a67 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/TemplateBarBuilder.java @@ -1,7 +1,9 @@ package gregtech.api.metatileentity.multiblock.ui; +import com.cleanroommc.modularui.api.value.IDoubleValue; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.screen.RichTooltip; +import com.cleanroommc.modularui.value.DoubleValue; import com.cleanroommc.modularui.widgets.ProgressWidget; import java.util.function.Consumer; @@ -14,7 +16,11 @@ public final class TemplateBarBuilder { TemplateBarBuilder() {} public TemplateBarBuilder progress(DoubleSupplier supplier) { - this.widget.progress(supplier); + return value(new DoubleValue.Dynamic(supplier, d -> {})); + } + + public TemplateBarBuilder value(IDoubleValue value) { + this.widget.value(value); return this; } From 988498196503504fe8eb2a4a0442c03a65d5be07 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 23 May 2025 18:29:41 -0700 Subject: [PATCH 236/264] replace reference to deleted method --- .../multi/electric/MetaTileEntityResearchStation.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index ebdeb5475ae..c8ea3adc21d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -256,9 +256,11 @@ protected void configureWarningText(MultiblockUIBuilder builder) { } private void researchingLine(KeyManager manager, UISyncer syncer) { - var data = getRecipeMapWorkable().getCachedRecipeData(); - ObjectArrayList outputs = syncer.syncCollection(data.getOutputs(), - ByteBufAdapters.ITEM_STACK); + var recipe = getRecipeMapWorkable().getPreviousRecipe(); + // todo fix recipe null on world load at some future point + if (recipe == null) return; + ObjectArrayList outputs = new ObjectArrayList<>(recipe.getOutputs()); + outputs = syncer.syncCollection(outputs, ByteBufAdapters.ITEM_STACK); if (outputs.isEmpty()) return; ItemStack stack = outputs.top(); String id = AssemblyLineManager.readResearchId(stack); From b0320bdb85c2e8d0f2790d5c33d03d433ab4a8c6 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Sat, 24 May 2025 21:47:07 -0700 Subject: [PATCH 237/264] fix research line --- .../electric/MetaTileEntityResearchStation.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index c8ea3adc21d..fbb1d47747e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -258,11 +258,14 @@ protected void configureWarningText(MultiblockUIBuilder builder) { private void researchingLine(KeyManager manager, UISyncer syncer) { var recipe = getRecipeMapWorkable().getPreviousRecipe(); // todo fix recipe null on world load at some future point - if (recipe == null) return; - ObjectArrayList outputs = new ObjectArrayList<>(recipe.getOutputs()); - outputs = syncer.syncCollection(outputs, ByteBufAdapters.ITEM_STACK); - if (outputs.isEmpty()) return; - ItemStack stack = outputs.top(); + if (syncer.syncBoolean(recipe == null)) return; + ItemStack stack = ItemStack.EMPTY; + if (recipe != null) { + List outputs = recipe.getOutputs(); + stack = outputs.get(outputs.size() - 1); + } + stack = syncer.syncObject(stack, ByteBufAdapters.ITEM_STACK); + if (stack.isEmpty()) return; String id = AssemblyLineManager.readResearchId(stack); if (id == null) return; List stacks = new ArrayList<>(); From 5cb8e65cd866599829be6d78c5589ab8b8b6f587 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Mon, 26 May 2025 20:47:38 -0700 Subject: [PATCH 238/264] spotless --- .../multi/electric/MetaTileEntityResearchStation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java index fbb1d47747e..4f1810fefc4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityResearchStation.java @@ -45,7 +45,6 @@ import net.minecraftforge.items.IItemHandlerModifiable; import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; From 0d9516d47f16a8d8ba458541aa28a873fa4f0716 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Wed, 28 May 2025 15:14:17 -0700 Subject: [PATCH 239/264] only sync to client if front face free changes add todo --- .../multiblockpart/MetaTileEntityMufflerHatch.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java index b374156aaef..75265aa3876 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java @@ -1,6 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart; -import gregtech.api.GTValues; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IMufflerHatch; import gregtech.api.metatileentity.ITieredMetaTileEntity; @@ -15,7 +14,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.PacketBuffer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; @@ -32,6 +30,7 @@ public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart, ITieredMetaTileEntity, IMufflerHatch { + // todo move to GregtechDataCodes private static final int MUFFLER_OBSTRUCTED = GregtechDataCodes.assignId(); private boolean frontFaceFree; @@ -53,8 +52,11 @@ public void update() { VanillaParticleEffects.mufflerEffect(this, controller.getMufflerParticle()); } } else if (getOffsetTimer() % 10 == 0) { - this.frontFaceFree = checkFrontFaceFree(); - writeCustomData(MUFFLER_OBSTRUCTED, buffer -> buffer.writeBoolean(this.frontFaceFree)); + boolean frontFaceFree = checkFrontFaceFree(); + if (frontFaceFree != this.frontFaceFree) { + this.frontFaceFree = frontFaceFree; + writeCustomData(MUFFLER_OBSTRUCTED, buffer -> buffer.writeBoolean(this.frontFaceFree)); + } } } From bbc4c30f0824fe8b2ad9260ddaedac74bea815eb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 30 May 2025 13:40:27 -0700 Subject: [PATCH 240/264] address todo --- .../java/gregtech/api/capability/GregtechDataCodes.java | 1 + .../multi/multiblockpart/MetaTileEntityMufflerHatch.java | 8 +++----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/gregtech/api/capability/GregtechDataCodes.java b/src/main/java/gregtech/api/capability/GregtechDataCodes.java index b2e7077cc59..ae106662690 100644 --- a/src/main/java/gregtech/api/capability/GregtechDataCodes.java +++ b/src/main/java/gregtech/api/capability/GregtechDataCodes.java @@ -99,6 +99,7 @@ public static int assignId() { public static final int UPDATE_UPWARDS_FACING = assignId(); public static final int UPDATE_FLIP = assignId(); public static final int LOCK_FILL = assignId(); + public static final int MUFFLER_OBSTRUCTED = assignId(); // Item Bus Item Stack Auto Collapsing public static final int TOGGLE_COLLAPSE_ITEMS = assignId(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java index 75265aa3876..d6337c70ca3 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMufflerHatch.java @@ -30,9 +30,6 @@ public class MetaTileEntityMufflerHatch extends MetaTileEntityMultiblockPart implements IMultiblockAbilityPart, ITieredMetaTileEntity, IMufflerHatch { - // todo move to GregtechDataCodes - private static final int MUFFLER_OBSTRUCTED = GregtechDataCodes.assignId(); - private boolean frontFaceFree; public MetaTileEntityMufflerHatch(ResourceLocation metaTileEntityId, int tier) { @@ -55,7 +52,8 @@ public void update() { boolean frontFaceFree = checkFrontFaceFree(); if (frontFaceFree != this.frontFaceFree) { this.frontFaceFree = frontFaceFree; - writeCustomData(MUFFLER_OBSTRUCTED, buffer -> buffer.writeBoolean(this.frontFaceFree)); + writeCustomData(GregtechDataCodes.MUFFLER_OBSTRUCTED, + buffer -> buffer.writeBoolean(this.frontFaceFree)); } } } @@ -97,7 +95,7 @@ public void receiveInitialSyncData(PacketBuffer buf) { @Override public void receiveCustomData(int dataId, PacketBuffer buf) { super.receiveCustomData(dataId, buf); - if (dataId == MUFFLER_OBSTRUCTED) { + if (dataId == GregtechDataCodes.MUFFLER_OBSTRUCTED) { this.frontFaceFree = buf.readBoolean(); } } From 5dce8a19f5537c2321e1cabbc656774fff7ed96c Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 15:47:57 -0400 Subject: [PATCH 241/264] do lang TODO --- .../api/metatileentity/multiblock/ui/MultiblockUIBuilder.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 021be7ae5d6..10a4827c37c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -628,8 +628,7 @@ public MultiblockUIBuilder addRecipeOutputLine(AbstractRecipeLogic arl, int maxL chancedItemOutputs = getSyncer().syncCollection(chancedItemOutputs, GTByteBufAdapters.CHANCED_ITEM_OUTPUT); chancedFluidOutputs = getSyncer().syncCollection(chancedFluidOutputs, GTByteBufAdapters.CHANCED_FLUID_OUTPUT); - // todo lang - addKey(KeyUtil.string(TextFormatting.GRAY, "Producing: "), Operation::addLine); + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.gui.multiblock.recipe_producing"), Operation::addLine); int recipeTier = GTUtility.getTierByVoltage(eut); int machineTier = GTUtility.getOCTierByVoltage(maxVoltage); From cd440026f25e1d698847b9004fb641dd36f048c3 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:59:17 -0400 Subject: [PATCH 242/264] Do the createPowerButton TODO --- .../RecipeMapMultiblockController.java | 14 ++++++- .../RecipeMapSteamMultiblockController.java | 13 ++++++- .../multiblock/ui/MultiblockUIFactory.java | 39 +++++++------------ .../multi/MetaTileEntityLargeBoiler.java | 14 ++++++- .../resources/assets/gregtech/lang/en_us.lang | 1 + 5 files changed, 54 insertions(+), 27 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index e68fdff9bae..cebe13bc959 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity.multiblock; import gregtech.api.GTValues; +import gregtech.api.capability.IControllable; import gregtech.api.capability.IDistinctBusController; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultipleTankHandler; @@ -41,7 +42,8 @@ import java.util.List; public abstract class RecipeMapMultiblockController extends MultiblockWithDisplayBase implements IDataInfoProvider, - ICleanroomReceiver, IDistinctBusController { + ICleanroomReceiver, IDistinctBusController, + IControllable { public final RecipeMap recipeMap; protected MultiblockRecipeLogic recipeMapWorkable; @@ -355,4 +357,14 @@ public void setCleanroom(@NotNull ICleanroomProvider provider) { public void unsetCleanroom() { this.cleanroom = null; } + + @Override + public boolean isWorkingEnabled() { + return recipeMapWorkable.isWorkingEnabled(); + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + recipeMapWorkable.setWorkingEnabled(isWorkingAllowed); + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 1f54c90cd51..dd7c0b5f039 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -1,5 +1,6 @@ package gregtech.api.metatileentity.multiblock; +import gregtech.api.capability.IControllable; import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; @@ -26,7 +27,7 @@ import codechicken.lib.vec.Matrix4; import com.cleanroommc.modularui.api.drawable.IKey; -public abstract class RecipeMapSteamMultiblockController extends MultiblockWithDisplayBase { +public abstract class RecipeMapSteamMultiblockController extends MultiblockWithDisplayBase implements IControllable { protected static final double CONVERSION_RATE = ConfigHolder.machines.multiblockSteamToEU; @@ -180,4 +181,14 @@ public SoundEvent getSound() { public boolean isActive() { return super.isActive() && recipeMapWorkable.isActive() && recipeMapWorkable.isWorkingEnabled(); } + + @Override + public boolean isWorkingEnabled() { + return recipeMapWorkable.isWorkingEnabled(); + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + recipeMapWorkable.setWorkingEnabled(isWorkingAllowed); + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 38b6c6ee0ad..495a80a8aa8 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -1,6 +1,5 @@ package gregtech.api.metatileentity.multiblock.ui; -import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.IDistinctBusController; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; @@ -8,9 +7,7 @@ import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.util.GTLambdaUtils; -import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; -import gregtech.common.ConfigHolder; import gregtech.common.mui.widget.ScrollableTextWidget; import net.minecraft.util.text.TextFormatting; @@ -20,6 +17,7 @@ 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.Icon; import com.cleanroommc.modularui.drawable.Rectangle; import com.cleanroommc.modularui.drawable.UITexture; import com.cleanroommc.modularui.factory.PosGuiData; @@ -454,29 +452,22 @@ protected IWidget createVoidingButton(@NotNull ModularPanel mainPanel, @NotNull @Nullable protected Widget createPowerButton(@NotNull ModularPanel mainPanel, @NotNull PanelSyncManager panelSyncManager) { - IControllable controllable; - if (!(mte instanceof IControllable)) { - // is this actually relevant? - // todo in the future, refactor so that this multis are instanceof IControllable. - controllable = mte.getCapability(GregtechTileCapabilities.CAPABILITY_CONTROLLABLE, null); - if (controllable == null) return null; - if (ConfigHolder.misc.debug) - GTLog.logger.warn("MTE [{}] does not extend IControllable when it should!", - mte.getClass().getSimpleName()); - } else { - controllable = (IControllable) mte; - } + if (mte instanceof IControllable controllable) { + Icon detail = GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24); + BooleanSyncValue controllableSync = new BooleanSyncValue(controllable::isWorkingEnabled, + controllable::setWorkingEnabled); - var detail = GTGuiTextures.BUTTON_POWER_DETAIL.asIcon().size(18, 6).marginTop(24); + return new ToggleButton() + .debugName("power_button") + .size(18) + .disableHoverBackground() + .overlay(true, detail, GTGuiTextures.BUTTON_POWER[1]) + .overlay(false, detail, GTGuiTextures.BUTTON_POWER[0]) + .value(controllableSync) + .marginTop(4); + } - return new ToggleButton() - .debugName("power_button") - .size(18) - .disableHoverBackground() - .overlay(true, detail, GTGuiTextures.BUTTON_POWER[1]) - .overlay(false, detail, GTGuiTextures.BUTTON_POWER[0]) - .value(new BooleanSyncValue(controllable::isWorkingEnabled, controllable::setWorkingEnabled)) - .marginTop(4); + return null; } public static final class Screen { diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index dec7866dc80..8a5571463ee 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi; +import gregtech.api.capability.IControllable; import gregtech.api.capability.impl.BoilerRecipeLogic; import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FluidTankList; @@ -61,7 +62,8 @@ import java.util.List; import java.util.function.UnaryOperator; -public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase implements ProgressBarMultiblock { +public class MetaTileEntityLargeBoiler extends MultiblockWithDisplayBase implements ProgressBarMultiblock, + IControllable { public final BoilerType boilerType; protected BoilerRecipeLogic recipeLogic; @@ -453,4 +455,14 @@ private int getWaterCapacity() { } return capacity; } + + @Override + public boolean isWorkingEnabled() { + return recipeLogic.isWorkingEnabled(); + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + recipeLogic.setWorkingEnabled(isWorkingAllowed); + } } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index d404cd9863d..b35f2622164 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5661,6 +5661,7 @@ gregtech.gui.multiblock_fluid_voiding=Voiding Mode\n§7Voiding §9Fluids gregtech.gui.multiblock_item_fluid_voiding=Voiding Mode\n§7Voiding §6Items §7and §9Fluids gregtech.gui.multiblock_no_voiding=Voiding Mode\n§7Voiding Nothing gregtech.gui.multiblock_voiding_not_supported=This Multiblock does not support Voiding Mode +gregtech.gui.multiblock.recipe_producing=Producing: gregtech.gui.me_network.online=Network: §aOnline§r gregtech.gui.me_network.offline=Network: §4Offline§r gregtech.gui.waiting_list=Sending Queue: From 16484892d0e7fb3f8518b82cfb4f0d58b650cdf7 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 20:39:48 -0400 Subject: [PATCH 243/264] Do 'show % sign' TODO --- .../multi/MetaTileEntityLargeBoiler.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index 8a5571463ee..afa660d6c41 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -51,6 +51,7 @@ import com.cleanroommc.modularui.value.sync.DoubleSyncValue; 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.SliderWidget; import com.cleanroommc.modularui.widgets.layout.Flow; @@ -202,7 +203,17 @@ private void addCustomData(KeyManager keyManager, UISyncer syncer) { } private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandler syncHandler) { - IntSyncValue throttleValue = new IntSyncValue(this::getThrottlePercentage, this::setThrottlePercentage); + StringSyncValue throttleValue = new StringSyncValue(() -> throttlePercentage + "%", str -> { + try { + if (str.charAt(str.length() - 1) == '%') { + str = str.substring(0, str.length() - 1); + } + + this.throttlePercentage = Integer.parseInt(str); + } catch (NumberFormatException ignored) { + + } + }); DoubleSyncValue sliderValue = new DoubleSyncValue( () -> (double) getThrottlePercentage() / 100, d -> setThrottlePercentage((int) (d * 100))); @@ -231,23 +242,25 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandl .value(sliderValue) .widthRel(0.7f) .height(20)) - // TODO add inc/dec buttons .child(new TextFieldWidget() .widthRel(0.3f) .height(20) // TODO proper color .setTextColor(Color.WHITE.darker(1)) - .setValidator(s -> { + .setValidator(str -> { + if (str.charAt(str.length() - 1) == '%') { + str = str.substring(0, str.length() - 1); + } + try { - long l = Long.parseLong(s); + long l = Long.parseLong(str); if (l < 0) l = 0; else if (l > 100) l = 100; return String.valueOf(l); } catch (NumberFormatException ignored) { - return throttleValue.getStringValue(); + return throttleValue.getValue(); } }) - // TODO show % sign .value(throttleValue) .background(GTGuiTextures.DISPLAY))); } From dabcb3f5370f6705ccf4f2a5d7943c02d334b347 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 20:50:22 -0400 Subject: [PATCH 244/264] Wrong text color in addProgressLine --- .../metatileentity/multiblock/ui/MultiblockUIBuilder.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 10a4827c37c..55b89b39126 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -353,15 +353,15 @@ public MultiblockUIBuilder addProgressLine(int progress, int maxProgress) { maxProgress = getSyncer().syncInt(maxProgress); if (maxProgress <= 20) { - addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress.ticks", + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.recipe_progress.ticks", // %02d is not supported by lang String.format("%02d", progress), String.format("%02d", maxProgress), (float) progress / maxProgress * 100f)); - return this; + } else { + addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.recipe_progress.seconds", + progress / 20f, maxProgress / 20f, (float) progress / maxProgress * 100f)); } - addKey(KeyUtil.lang(TextFormatting.WHITE, "gregtech.multiblock.recipe_progress.seconds", - progress / 20f, maxProgress / 20f, (float) progress / maxProgress * 100f)); return this; } From d8f984593ae64cfa91fce97363dea184a22b0d0f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:30:42 -0400 Subject: [PATCH 245/264] Fix empty text in the multiblock drilling rig as the drilled fluid wasn't synced --- .../multiblock/ui/MultiblockUIBuilder.java | 35 ++++ .../multiblock/ui/UISyncer.java | 29 +++ .../java/gregtech/api/util/NetworkUtil.java | 169 ++++++++++++++++++ .../electric/MetaTileEntityFluidDrill.java | 8 +- 4 files changed, 236 insertions(+), 5 deletions(-) create mode 100644 src/main/java/gregtech/api/util/NetworkUtil.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 55b89b39126..f85f2ae25f6 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -15,6 +15,7 @@ import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; +import gregtech.api.util.NetworkUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; import gregtech.common.items.ToolItems; @@ -22,6 +23,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import com.cleanroommc.modularui.api.drawable.IDrawable; @@ -991,6 +993,39 @@ public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBuf return initial; } + @Override + public @NotNull ItemStack syncItemStack(@NotNull Supplier<@NotNull ItemStack> initial) { + if (isServer()) { + ItemStack stack = initial.get(); + NetworkUtil.writeItemStack(internal, stack); + return stack; + } else { + return NetworkUtil.readItemStack(internal); + } + } + + @Override + public @Nullable FluidStack syncFluidStack(@NotNull Supplier<@Nullable FluidStack> initial) { + if (isServer()) { + FluidStack stack = initial.get(); + NetworkUtil.writeFluidStack(internal, stack); + return stack; + } else { + return NetworkUtil.readFluidStack(internal); + } + } + + @Override + public @Nullable Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial) { + if (isServer()) { + Fluid fluid = initial.get(); + NetworkUtil.writeFluid(internal, fluid); + return fluid; + } else { + return NetworkUtil.readFluid(internal); + } + } + public void readBuffer(ByteBuf buf) { clear(); internal.clear(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index c78975c7aa5..b2fcd2c5a5c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -2,11 +2,16 @@ import gregtech.api.mui.GTByteBufAdapters; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.math.BigInteger; import java.util.Collection; @@ -175,6 +180,30 @@ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); } + @NotNull + ItemStack syncItemStack(@NotNull Supplier<@NotNull ItemStack> initial); + + @NotNull + default ItemStack syncItemStack(@NotNull ItemStack initial) { + return syncItemStack(() -> initial); + } + + @Nullable + FluidStack syncFluidStack(@NotNull Supplier<@Nullable FluidStack> initial); + + @Nullable + default FluidStack syncFluidStack(@Nullable FluidStack initial) { + return syncFluidStack(() -> initial); + } + + @Nullable + Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial); + + @Nullable + default Fluid syncFluid(@Nullable Fluid initial) { + return syncFluid(() -> initial); + } + interface ByteSupplier { byte getByte(); diff --git a/src/main/java/gregtech/api/util/NetworkUtil.java b/src/main/java/gregtech/api/util/NetworkUtil.java new file mode 100644 index 00000000000..6ee2a9230bc --- /dev/null +++ b/src/main/java/gregtech/api/util/NetworkUtil.java @@ -0,0 +1,169 @@ +package gregtech.api.util; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +import io.netty.buffer.ByteBuf; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public class NetworkUtil { + + /** + * Write a {@link FluidStack} to a {@link PacketBuffer}. + * + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeFluidStack(@NotNull PacketBuffer to, @Nullable FluidStack stack) { + NBTTagCompound tag = new NBTTagCompound(); + if (stack == null) { + to.writeBoolean(false); + } else { + to.writeBoolean(true); + stack.writeToNBT(tag); + } + to.writeCompoundTag(tag); + } + + /** + * {@link #writeFluidStack(PacketBuffer, FluidStack)} but with a netty {@link ByteBuf} + * + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeFluidStack(@NotNull ByteBuf to, @Nullable FluidStack stack) { + writeFluidStack(new PacketBuffer(to), stack); + } + + /** + * Read a {@link FluidStack} from a {@link PacketBuffer} + * + * @param from the packet buffer to read from + * @return the decoded fluid stack + */ + public static @Nullable FluidStack readFluidStack(@NotNull PacketBuffer from) { + if (from.readBoolean()) { + NBTTagCompound tag; + try { + tag = from.readCompoundTag(); + } catch (IOException e) { + GTLog.logger.error("Exception reading a FluidStack from a PacketBuffer!", e); + return null; + } + return FluidStack.loadFluidStackFromNBT(tag); + } else { + return null; + } + } + + /** + * {@link #readFluidStack(PacketBuffer)} but with a netty {@link ByteBuf} + * + * @param from the packet buffer to read from + * @return the decoded fluid stack + */ + public static @Nullable FluidStack readFluidStack(@NotNull ByteBuf from) { + return readFluidStack(new PacketBuffer(from)); + } + + /** + * Write a {@link Fluid} to a {@link PacketBuffer}. + * + * @param to the buffer to write to + * @param fluid the fluid to write + */ + public static void writeFluid(@NotNull PacketBuffer to, @Nullable Fluid fluid) { + if (fluid == null) { + to.writeBoolean(false); + } else { + to.writeBoolean(true); + to.writeString(fluid.getName()); + } + } + + /** + * {@link #writeFluid(PacketBuffer, Fluid)} but with a netty {@link ByteBuf} + * + * @param to the buffer to write to + * @param fluid the fluid to write + */ + public static void writeFluid(@NotNull ByteBuf to, @Nullable Fluid fluid) { + writeFluid(new PacketBuffer(to), fluid); + } + + /** + * Read a {@link Fluid} from a {@link PacketBuffer} + * + * @param from the packet buffer to read from + * @return the decoded fluid + */ + public static @Nullable Fluid readFluid(@NotNull PacketBuffer from) { + if (from.readBoolean()) { + return FluidRegistry.getFluid(from.readString(Short.MAX_VALUE)); + } else { + return null; + } + } + + /** + * {@link #readFluid(PacketBuffer)} but with a netty {@link ByteBuf} + * + * @param from the packet buffer to read from + * @return the decoded fluid + */ + public static @Nullable Fluid readFluid(@NotNull ByteBuf from) { + return readFluid(new PacketBuffer(from)); + } + + /** + * Write an {@link ItemStack} to a {@link PacketBuffer}. + * + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeItemStack(@NotNull PacketBuffer to, @NotNull ItemStack stack) { + to.writeItemStack(stack); + } + + /** + * {@link #writeItemStack(PacketBuffer, ItemStack)} but with a netty {@link ByteBuf} + * + * @param to the buffer to write to + * @param stack the stack to write + */ + public static void writeItemStack(@NotNull ByteBuf to, @NotNull ItemStack stack) { + writeItemStack(new PacketBuffer(to), stack); + } + + /** + * Read an {@link ItemStack} from a {@link PacketBuffer} + * + * @param from the packet buffer to read from + * @return the decoded item stack + */ + public static @NotNull ItemStack readItemStack(@NotNull PacketBuffer from) { + try { + return from.readItemStack(); + } catch (IOException e) { + GTLog.logger.error("Exception reading an ItemStack from a PacketBuffer!", e); + return ItemStack.EMPTY; + } + } + + /** + * {@link #readItemStack(PacketBuffer)} but with a netty {@link ByteBuf} + * + * @param from the buffer to read from + * @return the decoded item stack + */ + public static @NotNull ItemStack readItemStack(@NotNull ByteBuf from) { + return readItemStack(new PacketBuffer(from)); + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index fbefd28394a..6fbdc522871 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -174,17 +174,15 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { if (isStructureFormed()) { if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { // Fluid name - Fluid drilledFluid = minerLogic.getDrilledFluid(); + Fluid drilledFluid = syncer.syncFluid(minerLogic.getDrilledFluid()); IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); - // todo should this check if fluid info is empty? list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", fluidInfo)); IKey amountInfo = KeyUtil.lang(TextFormatting.BLUE, - TextFormattingUtil.formatNumbers( - minerLogic.getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + - " L/s"); + TextFormattingUtil.formatNumbers(syncer.syncInt(minerLogic.getFluidToProduce()) * + 20L / FluidDrillLogic.MAX_PROGRESS) + " L/s"); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.fluid_amount", amountInfo)); } else { From e694005faffc8f02685d5f425e825fef26d395ac Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 21:55:39 -0400 Subject: [PATCH 246/264] Do 'working dynamic color substitutions into IKey.lang' TODO --- .../multi/electric/MetaTileEntityHPCA.java | 13 ++++++++----- src/main/resources/assets/gregtech/lang/en_us.lang | 4 +--- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 25779c874d0..b166a1bf56c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -415,7 +415,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.hpca.energy", KeyUtil.number(syncer.syncLong(hpcaHandler.cachedEUt)), KeyUtil.number(syncer.syncLong(hpcaHandler.getMaxEUt())), - voltageName)); + voltageName + TextFormatting.GRAY)); // Provided Computation manager.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", @@ -568,14 +568,17 @@ public void registerBars(List> bars, PanelSync double temp = temperatureValue.getDoubleValue(); int degrees = (int) Math.round(temp / 10.0); - // TODO working dynamic color substitutions into IKey.lang + TextFormatting color; if (temp < 500) { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.low", degrees)); + color = TextFormatting.GREEN; } else if (temp < 750) { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.medium", degrees)); + color = TextFormatting.YELLOW; } else { - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature.high", degrees)); + color = TextFormatting.RED; } + + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature", + () -> new Object[] { color, degrees })); } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index b35f2622164..7ec2399e08b 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5958,9 +5958,7 @@ gregtech.multiblock.data_bank.providing=Providing data. gregtech.multiblock.hpca.computation=§7Providing: §b%,d / %,d CWU/t gregtech.multiblock.hpca.energy=Using: %s / %s EU/t (%s) -gregtech.multiblock.hpca.temperature.high=§7Temperature: §c%,d°C -gregtech.multiblock.hpca.temperature.medium=§7Temperature: §e%,d°C -gregtech.multiblock.hpca.temperature.low=§7Temperature: §a%,d°C +gregtech.multiblock.hpca.temperature=§7Temperature: %s%,d°C gregtech.multiblock.hpca.hover_for_info=Hover for details gregtech.multiblock.hpca.error_damaged=Damaged component in structure! gregtech.multiblock.hpca.error_temperature=Temperature above 100C, components may be damaged! From 58a6e402ed7264700d580f0bf0aa2088929ea312 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:12:49 -0400 Subject: [PATCH 247/264] Remove item and fluid syncers from UISyncer and use syncObject instead --- .../multiblock/ui/MultiblockUIBuilder.java | 35 ----------- .../multiblock/ui/UISyncer.java | 29 --------- .../gregtech/api/mui/GTByteBufAdapters.java | 4 ++ .../java/gregtech/api/util/NetworkUtil.java | 61 ------------------- .../electric/MetaTileEntityFluidDrill.java | 4 +- 5 files changed, 7 insertions(+), 126 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index f85f2ae25f6..55b89b39126 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -15,7 +15,6 @@ import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; -import gregtech.api.util.NetworkUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; import gregtech.common.items.ToolItems; @@ -23,7 +22,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.network.PacketBuffer; import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import com.cleanroommc.modularui.api.drawable.IDrawable; @@ -993,39 +991,6 @@ public T[] syncArray(T[] initial, IByteBufSerializer serializer, IByteBuf return initial; } - @Override - public @NotNull ItemStack syncItemStack(@NotNull Supplier<@NotNull ItemStack> initial) { - if (isServer()) { - ItemStack stack = initial.get(); - NetworkUtil.writeItemStack(internal, stack); - return stack; - } else { - return NetworkUtil.readItemStack(internal); - } - } - - @Override - public @Nullable FluidStack syncFluidStack(@NotNull Supplier<@Nullable FluidStack> initial) { - if (isServer()) { - FluidStack stack = initial.get(); - NetworkUtil.writeFluidStack(internal, stack); - return stack; - } else { - return NetworkUtil.readFluidStack(internal); - } - } - - @Override - public @Nullable Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial) { - if (isServer()) { - Fluid fluid = initial.get(); - NetworkUtil.writeFluid(internal, fluid); - return fluid; - } else { - return NetworkUtil.readFluid(internal); - } - } - public void readBuffer(ByteBuf buf) { clear(); internal.clear(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index b2fcd2c5a5c..c78975c7aa5 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -2,16 +2,11 @@ import gregtech.api.mui.GTByteBufAdapters; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidStack; - import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.math.BigInteger; import java.util.Collection; @@ -180,30 +175,6 @@ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); } - @NotNull - ItemStack syncItemStack(@NotNull Supplier<@NotNull ItemStack> initial); - - @NotNull - default ItemStack syncItemStack(@NotNull ItemStack initial) { - return syncItemStack(() -> initial); - } - - @Nullable - FluidStack syncFluidStack(@NotNull Supplier<@Nullable FluidStack> initial); - - @Nullable - default FluidStack syncFluidStack(@Nullable FluidStack initial) { - return syncFluidStack(() -> initial); - } - - @Nullable - Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial); - - @Nullable - default Fluid syncFluid(@Nullable Fluid initial) { - return syncFluid(() -> initial); - } - interface ByteSupplier { byte getByte(); diff --git a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java index 91f695a9afa..8ace8f6a5f3 100644 --- a/src/main/java/gregtech/api/mui/GTByteBufAdapters.java +++ b/src/main/java/gregtech/api/mui/GTByteBufAdapters.java @@ -2,8 +2,10 @@ import gregtech.api.recipes.chance.output.impl.ChancedFluidOutput; import gregtech.api.recipes.chance.output.impl.ChancedItemOutput; +import gregtech.api.util.NetworkUtil; import net.minecraft.network.PacketBuffer; +import net.minecraftforge.fluids.Fluid; import com.cleanroommc.modularui.utils.serialization.*; import org.jetbrains.annotations.NotNull; @@ -24,6 +26,8 @@ public class GTByteBufAdapters { buffer -> new BigInteger(buffer.readByteArray()), (buffer, value) -> buffer.writeByteArray(value.toByteArray())); + public static final IByteBufAdapter FLUID = makeAdapter(NetworkUtil::readFluid, NetworkUtil::writeFluid); + public static IByteBufAdapter makeAdapter(@NotNull IByteBufDeserializer deserializer, @NotNull IByteBufSerializer serializer) { return makeAdapter(deserializer, serializer, IEquals.defaultTester()); diff --git a/src/main/java/gregtech/api/util/NetworkUtil.java b/src/main/java/gregtech/api/util/NetworkUtil.java index 6ee2a9230bc..e85773c4d5a 100644 --- a/src/main/java/gregtech/api/util/NetworkUtil.java +++ b/src/main/java/gregtech/api/util/NetworkUtil.java @@ -7,7 +7,6 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; -import io.netty.buffer.ByteBuf; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -32,16 +31,6 @@ public static void writeFluidStack(@NotNull PacketBuffer to, @Nullable FluidStac to.writeCompoundTag(tag); } - /** - * {@link #writeFluidStack(PacketBuffer, FluidStack)} but with a netty {@link ByteBuf} - * - * @param to the buffer to write to - * @param stack the stack to write - */ - public static void writeFluidStack(@NotNull ByteBuf to, @Nullable FluidStack stack) { - writeFluidStack(new PacketBuffer(to), stack); - } - /** * Read a {@link FluidStack} from a {@link PacketBuffer} * @@ -63,16 +52,6 @@ public static void writeFluidStack(@NotNull ByteBuf to, @Nullable FluidStack sta } } - /** - * {@link #readFluidStack(PacketBuffer)} but with a netty {@link ByteBuf} - * - * @param from the packet buffer to read from - * @return the decoded fluid stack - */ - public static @Nullable FluidStack readFluidStack(@NotNull ByteBuf from) { - return readFluidStack(new PacketBuffer(from)); - } - /** * Write a {@link Fluid} to a {@link PacketBuffer}. * @@ -88,16 +67,6 @@ public static void writeFluid(@NotNull PacketBuffer to, @Nullable Fluid fluid) { } } - /** - * {@link #writeFluid(PacketBuffer, Fluid)} but with a netty {@link ByteBuf} - * - * @param to the buffer to write to - * @param fluid the fluid to write - */ - public static void writeFluid(@NotNull ByteBuf to, @Nullable Fluid fluid) { - writeFluid(new PacketBuffer(to), fluid); - } - /** * Read a {@link Fluid} from a {@link PacketBuffer} * @@ -112,16 +81,6 @@ public static void writeFluid(@NotNull ByteBuf to, @Nullable Fluid fluid) { } } - /** - * {@link #readFluid(PacketBuffer)} but with a netty {@link ByteBuf} - * - * @param from the packet buffer to read from - * @return the decoded fluid - */ - public static @Nullable Fluid readFluid(@NotNull ByteBuf from) { - return readFluid(new PacketBuffer(from)); - } - /** * Write an {@link ItemStack} to a {@link PacketBuffer}. * @@ -132,16 +91,6 @@ public static void writeItemStack(@NotNull PacketBuffer to, @NotNull ItemStack s to.writeItemStack(stack); } - /** - * {@link #writeItemStack(PacketBuffer, ItemStack)} but with a netty {@link ByteBuf} - * - * @param to the buffer to write to - * @param stack the stack to write - */ - public static void writeItemStack(@NotNull ByteBuf to, @NotNull ItemStack stack) { - writeItemStack(new PacketBuffer(to), stack); - } - /** * Read an {@link ItemStack} from a {@link PacketBuffer} * @@ -156,14 +105,4 @@ public static void writeItemStack(@NotNull ByteBuf to, @NotNull ItemStack stack) return ItemStack.EMPTY; } } - - /** - * {@link #readItemStack(PacketBuffer)} but with a netty {@link ByteBuf} - * - * @param from the buffer to read from - * @return the decoded item stack - */ - public static @NotNull ItemStack readItemStack(@NotNull ByteBuf from) { - return readItemStack(new PacketBuffer(from)); - } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 6fbdc522871..ceeaee9dea9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -14,6 +14,7 @@ import gregtech.api.metatileentity.multiblock.*; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; +import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -174,7 +175,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { if (isStructureFormed()) { if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { // Fluid name - Fluid drilledFluid = syncer.syncFluid(minerLogic.getDrilledFluid()); + Fluid drilledFluid = syncer.syncObject(minerLogic.getDrilledFluid(), + GTByteBufAdapters.FLUID); IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", From 8ccec396c9be60d6d14f9a278b91d839c8955d90 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:20:12 -0400 Subject: [PATCH 248/264] Undo the removal of the UISyncer methods but delegate to syncObject instead --- .../multiblock/ui/UISyncer.java | 35 +++++++++++++++++++ .../electric/MetaTileEntityFluidDrill.java | 4 +-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index c78975c7aa5..f0e03f25cfb 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -2,11 +2,16 @@ import gregtech.api.mui.GTByteBufAdapters; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + import com.cleanroommc.modularui.utils.serialization.ByteBufAdapters; import com.cleanroommc.modularui.utils.serialization.IByteBufAdapter; import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.math.BigInteger; import java.util.Collection; @@ -175,6 +180,36 @@ default T[] syncArray(T[] initial, IByteBufAdapter adapter) { return syncArray(initial, adapter, adapter); } + @NotNull + default ItemStack syncItemStack(@NotNull Supplier<@NotNull ItemStack> initial) { + return syncObject(initial, ByteBufAdapters.ITEM_STACK); + } + + @NotNull + default ItemStack syncItemStack(@NotNull ItemStack initial) { + return syncItemStack(() -> initial); + } + + @Nullable + default FluidStack syncFluidStack(@NotNull Supplier<@Nullable FluidStack> initial) { + return syncObject(initial, ByteBufAdapters.FLUID_STACK); + } + + @Nullable + default FluidStack syncFluidStack(@Nullable FluidStack initial) { + return syncFluidStack(() -> initial); + } + + @Nullable + default Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial) { + return syncObject(initial, GTByteBufAdapters.FLUID); + } + + @Nullable + default Fluid syncFluid(@Nullable Fluid initial) { + return syncFluid(() -> initial); + } + interface ByteSupplier { byte getByte(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index ceeaee9dea9..6fbdc522871 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -14,7 +14,6 @@ import gregtech.api.metatileentity.multiblock.*; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.TemplateBarBuilder; -import gregtech.api.mui.GTByteBufAdapters; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -175,8 +174,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { if (isStructureFormed()) { if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { // Fluid name - Fluid drilledFluid = syncer.syncObject(minerLogic.getDrilledFluid(), - GTByteBufAdapters.FLUID); + Fluid drilledFluid = syncer.syncFluid(minerLogic.getDrilledFluid()); IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", From f4a52e39ac426f0c7e701efda7b7d7ecbd125780 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Sun, 15 Jun 2025 22:16:07 -0400 Subject: [PATCH 249/264] Use `KeyUtil.fluid()` in the tooltip of `GTFluidSlot`s instead of `getLocalizedName()` --- .../api/mui/sync/GTFluidSyncHandler.java | 20 +++++++++++ .../common/mui/widget/GTFluidSlot.java | 35 +++++++++---------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1cb27e4db30..f57f6d8c0c2 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -1,6 +1,7 @@ package gregtech.api.mui.sync; import gregtech.api.util.GTUtility; +import gregtech.api.util.KeyUtil; import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; import net.minecraft.entity.item.EntityItem; @@ -15,6 +16,7 @@ import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidHandlerItem; +import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.utils.BooleanConsumer; import com.cleanroommc.modularui.utils.MouseData; @@ -195,6 +197,16 @@ public boolean drawAlwaysFull() { return String.format("%,d", tankFluid == null ? 0 : tankFluid.amount); } + public int getFluidAmount() { + FluidStack tankFluid = tank.getFluid(); + return tankFluid == null ? 0 : tankFluid.amount; + } + + public boolean hasFluid() { + FluidStack tankFluid = tank.getFluid(); + return tankFluid != null && tankFluid.amount > 0; + } + public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); if (tankFluid == null && canLockFluid()) @@ -203,6 +215,14 @@ public boolean drawAlwaysFull() { return tankFluid == null ? null : tankFluid.getLocalizedName(); } + public @NotNull IKey getFluidNameKey() { + FluidStack tankFluid = tank.getFluid(); + if (tankFluid == null && canLockFluid()) { + tankFluid = lockedFluid.get(); + } + return tankFluid == null ? IKey.EMPTY : KeyUtil.fluid(tankFluid); + } + @Override public void readOnClient(int id, PacketBuffer buf) { switch (id) { diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 1f9fcc91897..70e81061531 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -48,32 +48,29 @@ public GTFluidSlot() { tooltip().setAutoUpdate(true).titleMargin(); tooltipBuilder(tooltip -> { if (!isSynced()) return; - var fluid = this.syncHandler.getFluid(); + tooltip.addLine(syncHandler.getFluidNameKey()); - if (fluid == null) - fluid = this.syncHandler.getLockedFluid(); - - if (fluid != null) - tooltip.addLine(IKey.str(fluid.getLocalizedName())); - - if (this.syncHandler.showAmountInTooltip()) { - int amt = fluid == null ? 0 : fluid.amount; - tooltip.addLine(IKey.lang("gregtech.fluid.amount", amt, this.syncHandler.getCapacity())); + if (syncHandler.showAmountInTooltip()) { + tooltip.addLine( + IKey.lang("gregtech.fluid.amount", syncHandler.getFluidAmount(), syncHandler.getCapacity())); } - if (this.syncHandler.isPhantom() && this.syncHandler.showAmountInTooltip()) + if (syncHandler.isPhantom() && syncHandler.showAmountInTooltip()) { tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); + } - if (fluid == null) return; + if (syncHandler.hasFluid()) { + FluidStack tankFluid = syncHandler.getFluid(); + // Add various tooltips from the material + for (String s : FluidTooltipUtil.getFluidTooltip(tankFluid)) { + if (s.isEmpty()) continue; + tooltip.addLine(IKey.str(s)); + } - // Add various tooltips from the material - for (String s : FluidTooltipUtil.getFluidTooltip(fluid)) { - if (s.isEmpty()) continue; - tooltip.addLine(IKey.str(s)); + if (syncHandler.showAmountInTooltip()) { + addIngotMolFluidTooltip(tankFluid, tooltip); + } } - - if (this.syncHandler.showAmountInTooltip()) - addIngotMolFluidTooltip(fluid, tooltip); }); } From e5f5e5b6a87aa52d0451363bcdcf0eaeda33d933 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:15:45 -0400 Subject: [PATCH 250/264] Fix input hatches having locking behavior (out of scope ig, but I'm lazy :clueless:) --- .../multiblockpart/MetaTileEntityFluidHatch.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index c6bd1860bd8..892f1500f0f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -281,12 +281,15 @@ public boolean usesMui2() { public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) { var fluidSyncHandler = GTFluidSlot.sync(fluidTank) .showAmountOnSlot(false) - .accessibility(true, !isExportHatch) - .handleLocking(() -> this.lockedFluid, fluidStack -> { - setLocked(fluidStack != null); - this.lockedFluid = fluidStack; - this.fluidTank.onContentsChanged(); - }, this::setLocked); + .accessibility(true, !isExportHatch); + + if (isExportHatch) { + fluidSyncHandler.handleLocking(() -> this.lockedFluid, fluidStack -> { + setLocked(fluidStack != null); + this.lockedFluid = fluidStack; + this.fluidTank.onContentsChanged(); + }, this::setLocked); + } return GTGuis.createPanel(this, 176, 166) .child(IKey.lang(getMetaFullName()).asWidget().pos(6, 6)) From 884cf32ccf2fd7d15776618769dde501d39621d6 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:21:27 -0400 Subject: [PATCH 251/264] Don't use `getLocalizedName()` pt2 --- .../multiblockpart/MetaTileEntityFluidHatch.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 892f1500f0f..9cc8667957d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -31,6 +31,7 @@ import net.minecraft.network.PacketBuffer; import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.FluidStack; @@ -332,11 +333,16 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) .autoUpdate(true) .textBuilder(richText -> { richText.addLine(IKey.lang("gregtech.gui.fluid_amount")); - String name = fluidSyncHandler.getFluidLocalizedName(); - if (name == null) return; - if (name.length() > 25) name = name.substring(0, 25) + "..."; - richText.addLine(IKey.str(name)); + IKey nameKey = fluidSyncHandler.getFluidNameKey(); + if (nameKey == IKey.EMPTY) return; + + String formatted = nameKey.getFormatted(); + if (formatted.length() > 25) { + nameKey = IKey.str(formatted.substring(0, 25) + TextFormatting.WHITE + "..."); + } + + richText.addLine(nameKey); richText.addLine(IKey.str(fluidSyncHandler.getFormattedFluidAmount())); })) .child(new GTFluidSlot() From 6d3236c3b7a5b353ea9c141172806a64d2c3f58f Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:37:43 -0400 Subject: [PATCH 252/264] hasFluid doesn't work with locked fluids --- src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index f57f6d8c0c2..1bbef731602 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -204,7 +204,10 @@ public int getFluidAmount() { public boolean hasFluid() { FluidStack tankFluid = tank.getFluid(); - return tankFluid != null && tankFluid.amount > 0; + if (tankFluid == null) { + tankFluid = lockedFluid.get(); + } + return tankFluid != null; } public @Nullable String getFluidLocalizedName() { From 02565a60523e63bf47b154034c6bc4f5c4461234 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:42:27 -0400 Subject: [PATCH 253/264] Don't register `GTFluidSlot`s as JEI targets if it's not phantom or lockable --- src/main/java/gregtech/common/mui/widget/GTFluidSlot.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index 70e81061531..baece6234d5 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -83,7 +83,9 @@ public void onInit() { this.textRenderer.setShadow(true); this.textRenderer.setScale(0.5f); this.textRenderer.setColor(Color.WHITE.main); - getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + if (syncHandler.canLockFluid() || syncHandler.isPhantom()) { + getContext().getJeiSettings().addJeiGhostIngredientSlot(this); + } } public GTFluidSlot syncHandler(IFluidTank fluidTank) { @@ -209,6 +211,8 @@ public void setGhostIngredient(@NotNull FluidStack ingredient) { @Override public @Nullable FluidStack castGhostIngredientIfValid(@NotNull Object ingredient) { + if (!(syncHandler.canLockFluid() || syncHandler.isPhantom())) return null; + if (ingredient instanceof FluidStack stack) { return stack; } else if (ingredient instanceof ItemStack stack && From e2f6922dd2d3c3733c360c0ad7770a981216a376 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 00:58:38 -0400 Subject: [PATCH 254/264] Fix NPE I caused and clean up code --- .../api/mui/sync/GTFluidSyncHandler.java | 35 ++++++++++---- .../gregtech/api/util/FluidTooltipUtil.java | 47 ++++++++++++++++--- .../common/mui/widget/GTFluidSlot.java | 44 +---------------- 3 files changed, 69 insertions(+), 57 deletions(-) diff --git a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java index 1bbef731602..54808e28719 100644 --- a/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java +++ b/src/main/java/gregtech/api/mui/sync/GTFluidSyncHandler.java @@ -1,5 +1,6 @@ package gregtech.api.mui.sync; +import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.common.covers.filter.readers.SimpleFluidFilterReader; @@ -18,6 +19,7 @@ import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.network.NetworkUtils; +import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.utils.BooleanConsumer; import com.cleanroommc.modularui.utils.MouseData; import com.cleanroommc.modularui.value.sync.SyncHandler; @@ -202,14 +204,6 @@ public int getFluidAmount() { return tankFluid == null ? 0 : tankFluid.amount; } - public boolean hasFluid() { - FluidStack tankFluid = tank.getFluid(); - if (tankFluid == null) { - tankFluid = lockedFluid.get(); - } - return tankFluid != null; - } - public @Nullable String getFluidLocalizedName() { var tankFluid = this.tank.getFluid(); if (tankFluid == null && canLockFluid()) @@ -226,6 +220,31 @@ public boolean hasFluid() { return tankFluid == null ? IKey.EMPTY : KeyUtil.fluid(tankFluid); } + public void handleTooltip(@NotNull RichTooltip tooltip) { + tooltip.addLine(getFluidNameKey()); + + if (showAmountInTooltip()) { + tooltip.addLine(IKey.lang("gregtech.fluid.amount", getFluidAmount(), getCapacity())); + } + + if (isPhantom() && showAmountInTooltip()) { + tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); + } + + FluidStack tankFluid = getFluid(); + if (tankFluid == null) { + tankFluid = getLockedFluid(); + } + + if (tankFluid != null) { + FluidTooltipUtil.handleFluidTooltip(tooltip, tankFluid); + + if (showAmountInTooltip()) { + FluidTooltipUtil.addIngotMolFluidTooltip(tooltip, tankFluid); + } + } + } + @Override public void readOnClient(int id, PacketBuffer buf) { switch (id) { diff --git a/src/main/java/gregtech/api/util/FluidTooltipUtil.java b/src/main/java/gregtech/api/util/FluidTooltipUtil.java index 5f2ccad8ed9..a4afad4796f 100644 --- a/src/main/java/gregtech/api/util/FluidTooltipUtil.java +++ b/src/main/java/gregtech/api/util/FluidTooltipUtil.java @@ -1,8 +1,10 @@ package gregtech.api.util; +import gregtech.api.GTValues; import gregtech.api.fluids.FluidState; import gregtech.api.fluids.GTFluid; import gregtech.api.unification.material.Material; +import gregtech.client.utils.TooltipHelper; import net.minecraft.client.resources.I18n; import net.minecraft.util.text.TextFormatting; @@ -10,6 +12,8 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import com.cleanroommc.modularui.api.drawable.IKey; +import com.cleanroommc.modularui.screen.RichTooltip; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -42,9 +46,9 @@ public static void registerTooltip(@NotNull Fluid fluid, @NotNull Supplier getFluidTooltip(Fluid fluid) { + public static @NotNull List getFluidTooltip(@Nullable Fluid fluid) { if (fluid == null) { - return null; + return Collections.emptyList(); } var list = tooltips.get(fluid); @@ -56,29 +60,47 @@ public static List getFluidTooltip(Fluid fluid) { return tooltip; } + public static void handleFluidTooltip(@NotNull RichTooltip tooltip, @Nullable Fluid fluid) { + if (fluid == null) return; + + var tooltipList = tooltips.get(fluid); + if (tooltipList == null) return; + + for (var subList : tooltipList) { + for (String tooltipStr : subList.get()) { + tooltip.addLine(IKey.str(tooltipStr)); + } + } + } + /** * Used to get a Fluid's tooltip. * * @param stack A FluidStack, containing the Fluid to get the tooltip of. * @return The tooltip. */ - public static List getFluidTooltip(FluidStack stack) { + public static @NotNull List getFluidTooltip(@Nullable FluidStack stack) { if (stack == null) { - return null; + return Collections.emptyList(); } return getFluidTooltip(stack.getFluid()); } + public static void handleFluidTooltip(@NotNull RichTooltip tooltip, @Nullable FluidStack stack) { + if (stack == null) return; + handleFluidTooltip(tooltip, stack.getFluid()); + } + /** * Used to get a Fluid's tooltip. * * @param fluidName A String representing a Fluid to get the tooltip of. * @return The tooltip. */ - public static List getFluidTooltip(String fluidName) { + public static @NotNull List getFluidTooltip(@Nullable String fluidName) { if (fluidName == null || fluidName.isEmpty()) { - return null; + return Collections.emptyList(); } return getFluidTooltip(FluidRegistry.getFluid(fluidName)); @@ -110,4 +132,17 @@ public static Supplier> createFluidTooltip(@Nullable Material mater return tooltip; }; } + + public static void addIngotMolFluidTooltip(@NotNull RichTooltip tooltip, @NotNull FluidStack fluidStack) { + // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held + if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { + int numIngots = fluidStack.amount / GTValues.L; + int extra = fluidStack.amount % GTValues.L; + String fluidAmount = String.format(" %,d L = %,d * %d L", fluidStack.amount, numIngots, GTValues.L); + if (extra != 0) { + fluidAmount += String.format(" + %d L", extra); + } + tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); + } + } } diff --git a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java index baece6234d5..79c31bd31cd 100644 --- a/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java +++ b/src/main/java/gregtech/common/mui/widget/GTFluidSlot.java @@ -1,22 +1,16 @@ package gregtech.common.mui.widget; -import gregtech.api.GTValues; import gregtech.api.mui.sync.GTFluidSyncHandler; -import gregtech.api.util.FluidTooltipUtil; import gregtech.api.util.GTUtility; -import gregtech.api.util.LocalizationUtils; import gregtech.client.utils.RenderUtil; -import gregtech.client.utils.TooltipHelper; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import com.cleanroommc.modularui.api.ITheme; -import com.cleanroommc.modularui.api.drawable.IKey; import com.cleanroommc.modularui.api.widget.Interactable; import com.cleanroommc.modularui.drawable.GuiDraw; import com.cleanroommc.modularui.drawable.text.TextRenderer; @@ -24,7 +18,6 @@ import com.cleanroommc.modularui.integration.jei.JeiIngredientProvider; import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.screen.ModularScreen; -import com.cleanroommc.modularui.screen.RichTooltip; import com.cleanroommc.modularui.screen.viewport.ModularGuiContext; import com.cleanroommc.modularui.theme.WidgetSlotTheme; import com.cleanroommc.modularui.theme.WidgetTheme; @@ -48,29 +41,7 @@ public GTFluidSlot() { tooltip().setAutoUpdate(true).titleMargin(); tooltipBuilder(tooltip -> { if (!isSynced()) return; - tooltip.addLine(syncHandler.getFluidNameKey()); - - if (syncHandler.showAmountInTooltip()) { - tooltip.addLine( - IKey.lang("gregtech.fluid.amount", syncHandler.getFluidAmount(), syncHandler.getCapacity())); - } - - if (syncHandler.isPhantom() && syncHandler.showAmountInTooltip()) { - tooltip.addLine(IKey.lang("modularui.fluid.phantom.control")); - } - - if (syncHandler.hasFluid()) { - FluidStack tankFluid = syncHandler.getFluid(); - // Add various tooltips from the material - for (String s : FluidTooltipUtil.getFluidTooltip(tankFluid)) { - if (s.isEmpty()) continue; - tooltip.addLine(IKey.str(s)); - } - - if (syncHandler.showAmountInTooltip()) { - addIngotMolFluidTooltip(tankFluid, tooltip); - } - } + syncHandler.handleTooltip(tooltip); }); } @@ -185,19 +156,6 @@ protected WidgetTheme getWidgetThemeInternal(ITheme theme) { return theme.getFluidSlotTheme(); } - public static void addIngotMolFluidTooltip(FluidStack fluidStack, RichTooltip tooltip) { - // Add tooltip showing how many "ingot moles" (increments of 144) this fluid is if shift is held - if (TooltipHelper.isShiftDown() && fluidStack.amount > GTValues.L) { - int numIngots = fluidStack.amount / GTValues.L; - int extra = fluidStack.amount % GTValues.L; - String fluidAmount = String.format(" %,d L = %,d * %d L", fluidStack.amount, numIngots, GTValues.L); - if (extra != 0) { - fluidAmount += String.format(" + %d L", extra); - } - tooltip.add(TextFormatting.GRAY + LocalizationUtils.format("gregtech.gui.amount_raw") + fluidAmount); - } - } - @Override public void setGhostIngredient(@NotNull FluidStack ingredient) { if (this.syncHandler.isPhantom()) { From b95a81719712e8d9c25007995087cf239550d0d4 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 01:19:08 -0400 Subject: [PATCH 255/264] Fix locked fluid not being synced to client on load --- .../multi/multiblockpart/MetaTileEntityFluidHatch.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 9cc8667957d..2c11138db0c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -193,6 +193,7 @@ public void writeInitialSyncData(PacketBuffer buf) { buf.writeBoolean(workingEnabled); if (isExportHatch) { buf.writeBoolean(locked); + NetworkUtils.writeFluidStack(buf, lockedFluid); } else { buf.writeVarInt(this.circuitInventory.getCircuitValue()); } @@ -204,6 +205,7 @@ public void receiveInitialSyncData(PacketBuffer buf) { this.workingEnabled = buf.readBoolean(); if (isExportHatch) { this.locked = buf.readBoolean(); + this.lockedFluid = NetworkUtils.readFluidStack(buf); } else { setGhostCircuitConfig(buf.readVarInt()); } From 10c9cf21e7e592d9551d753f8255fb5e2e819167 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 08:07:09 -0400 Subject: [PATCH 256/264] Fix large combustion engines saying "Running Perfectly" when the dynamo hatch is full --- .../generator/MetaTileEntityLargeCombustionEngine.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index b192ae811d2..7c367d349b6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -77,7 +77,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { protected void configureDisplayText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive() && !isDynamoFull()); if (isExtreme) { builder.addEnergyProductionLine(GTValues.V[tier + 1], recipeLogic.getRecipeEUt()); @@ -123,8 +123,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); builder.addCustom((manager, syncer) -> { - long canInsert = syncer.syncLong(getEnergyContainer().getEnergyCanBeInserted()); - if (canInsert < syncer.syncLong(recipeMapWorkable.getRecipeEUt())) { + if (syncer.syncBoolean(this::isDynamoFull)) { manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_combustion_engine.dynamo_hatch_full")); } @@ -366,6 +365,10 @@ private int[] getOxygenAmount() { return new int[2]; } + public boolean isDynamoFull() { + return getEnergyContainer().getEnergyCanBeInserted() < recipeMapWorkable.getRecipeEUt(); + } + private static class LargeCombustionEngineWorkableHandler extends MultiblockFuelRecipeLogic { private boolean isOxygenBoosted = false; From ff511cbf41532c5f676dd21880358e29e0a137b7 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:04:48 -0400 Subject: [PATCH 257/264] Remove old MUI0 code from the fusion reactor class --- .../electric/MetaTileEntityFusionReactor.java | 142 ------------------ 1 file changed, 142 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java index 04b81df43ce..eb63793d711 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFusionReactor.java @@ -6,14 +6,11 @@ import gregtech.api.capability.impl.EnergyContainerHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockRecipeLogic; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.IFastRenderMetaTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; -import gregtech.api.metatileentity.multiblock.MultiblockDisplayText; import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; @@ -74,7 +71,6 @@ import com.cleanroommc.modularui.widgets.ProgressWidget; import com.cleanroommc.modularui.widgets.layout.Column; import com.google.common.collect.Lists; -import com.google.common.util.concurrent.AtomicDouble; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.opengl.GL11; @@ -82,7 +78,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.function.DoubleSupplier; import java.util.function.UnaryOperator; import static gregtech.api.recipes.logic.OverclockingLogic.PERFECT_HALF_DURATION_FACTOR; @@ -98,7 +93,6 @@ public class MetaTileEntityFusionReactor extends RecipeMapMultiblockController private EnergyContainerList inputEnergyContainers; private long heat = 0; // defined in TileEntityFusionReactor but serialized in FusionRecipeLogic private int fusionRingColor = NO_COLOR; - private final FusionProgressSupplier progressBarSupplier; @SideOnly(Side.CLIENT) private boolean registeredBloomRenderTicket; @@ -115,7 +109,6 @@ public String getName() { return GregtechDataCodes.FUSION_REACTOR_ENERGY_CONTAINER_TRAIT; } }; - this.progressBarSupplier = new FusionProgressSupplier(); } @Override @@ -440,133 +433,6 @@ public void registerBars(List> bars, PanelSync 1.0 * heat.getLongValue() / capacity.getLongValue() : 0)); } - private static class FusionProgressSupplier { - - private final AtomicDouble tracker = new AtomicDouble(0.0); - private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier bottomLeft; - private final DoubleSupplier topLeft; - private final DoubleSupplier topRight; - private final DoubleSupplier bottomRight; - - public FusionProgressSupplier() { - // Bottom Left, fill on [0, 0.25) - bottomLeft = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 164, false) { - - @Override - public double getAsDouble() { - double val = super.getAsDouble(); - tracker.set(val); - if (val >= 0.25) { - return 1; - } - return 4 * val; - } - - @Override - public void resetCountdown() { - super.resetCountdown(); - tracker.set(0); - } - }; - - // Top Left, fill on [0.25, 0.5) - topLeft = () -> { - double val = tracker.get(); - if (val < 0.25) { - return 0; - } else if (val >= 0.5) { - return 1; - } - return 4 * (val - 0.25); - }; - - // Top Right, fill on [0.5, 0.75) - topRight = () -> { - double val = tracker.get(); - if (val < 0.5) { - return 0; - } else if (val >= 0.75) { - return 1; - } - return 4 * (val - 0.5); - }; - - // Bottom Right, fill on [0.75, 1.0] - bottomRight = () -> { - double val = tracker.get(); - if (val < 0.75) { - return 0; - } else if (val >= 1) { - return 1; - } - return 4 * (val - 0.75); - }; - } - - public void resetCountdown() { - bottomLeft.resetCountdown(); - } - - public DoubleSupplier getSupplier(Type type) { - return switch (type) { - case BOTTOM_LEFT -> bottomLeft; - case TOP_LEFT -> topLeft; - case TOP_RIGHT -> topRight; - case BOTTOM_RIGHT -> bottomRight; - }; - } - - private enum Type { - - BOTTOM_LEFT( - 61, 66, 35, 41, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BL, - gregtech.api.gui.widgets.ProgressWidget.MoveType.VERTICAL), - TOP_LEFT( - 61, 30, 41, 35, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TL, - gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL), - TOP_RIGHT( - 103, 30, 35, 41, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_TR, - gregtech.api.gui.widgets.ProgressWidget.MoveType.VERTICAL_DOWNWARDS), - BOTTOM_RIGHT( - 97, 72, 41, 35, - GuiTextures.PROGRESS_BAR_FUSION_REACTOR_DIAGRAM_BR, - gregtech.api.gui.widgets.ProgressWidget.MoveType.HORIZONTAL_BACKWARDS); - - private final int x; - private final int y; - private final int width; - private final int height; - private final TextureArea texture; - private final gregtech.api.gui.widgets.ProgressWidget.MoveType moveType; - - Type(int x, int y, int width, int height, TextureArea texture, - gregtech.api.gui.widgets.ProgressWidget.MoveType moveType) { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - this.texture = texture; - this.moveType = moveType; - } - - public gregtech.api.gui.widgets.ProgressWidget getWidget(MetaTileEntityFusionReactor instance) { - return new gregtech.api.gui.widgets.ProgressWidget( - () -> instance.recipeMapWorkable.isActive() ? - instance.progressBarSupplier.getSupplier(this).getAsDouble() : 0, - x, y, width, height, texture, moveType) - .setIgnoreColor(true) - .setHoverTextConsumer( - tl -> MultiblockDisplayText.builder(tl, instance.isStructureFormed()) - .setWorkingStatus(instance.recipeMapWorkable.isWorkingEnabled(), - instance.recipeMapWorkable.isActive()) - .addWorkingStatusLine()); - } - } - } - private class FusionRecipeLogic extends MultiblockRecipeLogic { public FusionRecipeLogic(MetaTileEntityFusionReactor tileEntity) { @@ -654,14 +520,6 @@ public void deserializeNBT(@NotNull NBTTagCompound compound) { super.deserializeNBT(compound); heat = compound.getLong("Heat"); } - - @Override - protected void setActive(boolean active) { - if (active != isActive) { - MetaTileEntityFusionReactor.this.progressBarSupplier.resetCountdown(); - } - super.setActive(active); - } } @Override From feae98e61d583b79d57fe736ee346ea508c62683 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:05:19 -0400 Subject: [PATCH 258/264] Remove old multiblock display text manager impl --- .../multiblock/MultiblockDisplayText.java | 482 ------------------ 1 file changed, 482 deletions(-) delete mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java deleted file mode 100644 index e7b5d68e6d2..00000000000 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockDisplayText.java +++ /dev/null @@ -1,482 +0,0 @@ -package gregtech.api.metatileentity.multiblock; - -import gregtech.api.GTValues; -import gregtech.api.capability.IEnergyContainer; -import gregtech.api.util.GTUtility; -import gregtech.api.util.TextComponentUtil; -import gregtech.api.util.TextFormattingUtil; -import gregtech.common.ConfigHolder; - -import net.minecraft.util.text.*; - -import java.util.List; -import java.util.function.Consumer; - -public class MultiblockDisplayText { - - private static final ITextComponent EMPTY_COMPONENT = new TextComponentString(""); - - /** - * Construct a new Multiblock Display Text builder. - *
- * Automatically adds the "Invalid Structure" line if the structure is not formed. - */ - public static Builder builder(List textList, boolean isStructureFormed) { - return builder(textList, isStructureFormed, true); - } - - public static Builder builder(List textList, boolean isStructureFormed, - boolean showIncompleteStructureWarning) { - return new Builder(textList, isStructureFormed, showIncompleteStructureWarning); - } - - public static class Builder { - - private final List textList; - private final boolean isStructureFormed; - - private boolean isWorkingEnabled, isActive; - - // Keys for the three-state working system, can be set custom by multiblocks. - private String idlingKey = "gregtech.multiblock.idling"; - private String pausedKey = "gregtech.multiblock.work_paused"; - private String runningKey = "gregtech.multiblock.running"; - - private Builder(List textList, boolean isStructureFormed, - boolean showIncompleteStructureWarning) { - this.textList = textList; - this.isStructureFormed = isStructureFormed; - - if (!isStructureFormed && showIncompleteStructureWarning) { - ITextComponent base = TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.invalid_structure"); - ITextComponent hover = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.invalid_structure.tooltip"); - textList.add(TextComponentUtil.setHover(base, hover)); - } - } - - /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ - public Builder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { - this.isWorkingEnabled = isWorkingEnabled; - this.isActive = isActive; - return this; - } - - /** - * Set custom translation keys for the three-state "Idling", "Paused", "Running" display text. - * You still must call {@link Builder#addWorkingStatusLine()} for these to appear! - *
- * Pass any key as null for it to continue to use the default key. - * - * @param idlingKey The translation key for the Idle state, or "!isActive && isWorkingEnabled". - * @param pausedKey The translation key for the Paused state, or "!isWorkingEnabled". - * @param runningKey The translation key for the Running state, or "isActive". - */ - public Builder setWorkingStatusKeys(String idlingKey, String pausedKey, String runningKey) { - if (idlingKey != null) this.idlingKey = idlingKey; - if (pausedKey != null) this.pausedKey = pausedKey; - if (runningKey != null) this.runningKey = runningKey; - return this; - } - - /** - * Adds the max EU/t that this multiblock can use. - *
- * Added if the structure is formed and if the passed energy container has greater than zero capacity. - */ - public Builder addEnergyUsageLine(IEnergyContainer energyContainer) { - if (!isStructureFormed) return this; - if (energyContainer != null && energyContainer.getEnergyCapacity() > 0) { - long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - ITextComponent voltageName = new TextComponentString( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - ITextComponent bodyText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", - energyFormatted, voltageName); - ITextComponent hoverText = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_hover"); - textList.add(TextComponentUtil.setHover(bodyText, hoverText)); - } - return this; - } - - /** - * Adds the max Recipe Tier that this multiblock can use for recipe lookup. - *
- * Added if the structure is formed and if the passed tier is a valid energy tier index for - * {@link GTValues#VNF}. - */ - public Builder addEnergyTierLine(int tier) { - if (!isStructureFormed) return this; - if (tier < GTValues.ULV || tier > GTValues.MAX) return this; - - ITextComponent voltageName = new TextComponentString(GTValues.VNF[tier]); - ITextComponent bodyText = TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier", - voltageName); - ITextComponent hoverText = TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.max_recipe_tier_hover"); - textList.add(TextComponentUtil.setHover(bodyText, hoverText)); - return this; - } - - /** - * Adds the exact EU/t that this multiblock needs to run. - *
- * Added if the structure is formed and if the passed value is greater than zero. - */ - public Builder addEnergyUsageExactLine(long energyUsage) { - if (!isStructureFormed) return this; - if (energyUsage > 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); - // wrap in text component to keep it from being formatted - ITextComponent voltageName = new TextComponentString( - GTValues.VOCNF[GTUtility.getOCTierByVoltage(energyUsage)]); - - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.energy_consumption", - energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce. - *
- * Added if the structure is formed and if the max voltage is greater than zero and the recipe EU/t. - */ - public Builder addEnergyProductionLine(long maxVoltage, long recipeEUt) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= recipeEUt) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - ITextComponent voltageName = new TextComponentString( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick", - energyFormatted, voltageName)); - } - return this; - } - - /** - * Adds the max EU/t that this multiblock can produce, including how many amps. Recommended for multi-amp - * outputting multis. - *
- * Added if the structure is formed, if the amperage is greater than zero and if the max voltage is greater than - * zero. - */ - public Builder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { - if (!isStructureFormed) return this; - if (maxVoltage != 0 && amperage != 0) { - String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); - // wrap in text component to keep it from being formatted - ITextComponent voltageName = new TextComponentString( - GTValues.VOCNF[GTUtility.getFloorTierByVoltage(maxVoltage)]); - - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.max_energy_per_tick_amps", - energyFormatted, amperage, voltageName)); - } - return this; - } - - /** - * Adds the max CWU/t that this multiblock can use. - *
- * Added if the structure is formed and if the max CWU/t is greater than zero. - */ - public Builder addComputationUsageLine(int maxCWUt) { - if (!isStructureFormed) return this; - if (maxCWUt > 0) { - ITextComponent computation = TextComponentUtil.stringWithColor(TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(maxCWUt)); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.computation.max", - computation)); - } - return this; - } - - /** - * Adds a currently used CWU/t line. - *
- * Added if the structure is formed, the machine is active, and the current CWU/t is greater than zero. - */ - public Builder addComputationUsageExactLine(int currentCWUt) { - if (!isStructureFormed) return this; - if (isActive && currentCWUt > 0) { - ITextComponent computation = TextComponentUtil.stringWithColor(TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(currentCWUt) + " CWU/t"); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.computation.usage", - computation)); - } - return this; - } - - /** - * Adds a three-state indicator line, showing if the machine is running, paused, or idling. - *
- * Added if the structure is formed. - */ - public Builder addWorkingStatusLine() { - if (!isStructureFormed) return this; - - if (!isWorkingEnabled) { - return addWorkPausedLine(false); - } else if (isActive) { - return addRunningPerfectlyLine(false); - } else { - return addIdlingLine(false); - } - } - - /** - * Adds the "Work Paused." line. - *
- * Added if working is not enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addWorkPausedLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || !isWorkingEnabled) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GOLD, pausedKey)); - } - return this; - } - - /** - * Adds the "Running Perfectly." line. - *
- * Added if machine is active, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addRunningPerfectlyLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || isActive) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GREEN, runningKey)); - } - return this; - } - - /** - * Adds the "Idling." line. - *
- * Added if the machine is not active and working is enabled, or if the checkState passed parameter is false. - * Also added only if formed. - */ - public Builder addIdlingLine(boolean checkState) { - if (!isStructureFormed) return this; - if (!checkState || (isWorkingEnabled && !isActive)) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, idlingKey)); - } - return this; - } - - /** - * Adds a simple progress line that displays progress as a percentage. - *
- * Added if structure is formed and the machine is active. - * - * @param progressPercent Progress formatted as a range of [0,1] representing the progress of the recipe. - */ - public Builder addProgressLine(double progressPercent) { // todo - if (!isStructureFormed || !isActive) return this; - int currentProgress = (int) (progressPercent * 100); - textList.add(new TextComponentTranslation("gregtech.multiblock.progress", currentProgress)); - return this; - } - - /** - * Adds a line indicating how many parallels this multi can potentially perform. - *
- * Added if structure is formed and the number of parallels is greater than one. - */ - public Builder addParallelsLine(int numParallels) { - if (!isStructureFormed) return this; - if (numParallels > 1) { - ITextComponent parallels = TextComponentUtil.stringWithColor( - TextFormatting.DARK_PURPLE, - TextFormattingUtil.formatNumbers(numParallels)); - - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.parallel", - parallels)); - } - return this; - } - - /** - * Adds a warning line when the machine is low on power. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowPowerLine(boolean isLowPower) { - if (!isStructureFormed) return this; - if (isLowPower) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy")); - } - return this; - } - - /** - * Adds a warning line when the machine is low on computation. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowComputationLine(boolean isLowComputation) { - if (!isStructureFormed) return this; - if (isLowComputation) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.computation.not_enough_computation")); - } - return this; - } - - /** - * Adds a warning line when the machine's dynamo tier is too low for current conditions. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addLowDynamoTierLine(boolean isTooLow) { - if (!isStructureFormed) return this; - if (isTooLow) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy_output")); - } - return this; - } - - /** - * Adds warning line(s) when the machine has maintenance problems. - *
- * Added if there are any maintenance problems, one line per problem as well as a header.
- * Will check the config setting for if maintenance is enabled automatically. - */ - public Builder addMaintenanceProblemLines(byte maintenanceProblems) { - if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - if (maintenanceProblems < 63) { - boolean hasAddedHeader = false; - - // Wrench - if ((maintenanceProblems & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wrench")); - } - - // Screwdriver - if (((maintenanceProblems >> 1) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.screwdriver")); - } - - // Soft Mallet - if (((maintenanceProblems >> 2) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.soft_mallet")); - } - - // Hammer - if (((maintenanceProblems >> 3) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.hard_hammer")); - } - - // Wire Cutters - if (((maintenanceProblems >> 4) & 1) == 0) { - hasAddedHeader = addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.wire_cutter")); - } - - // Crowbar - if (((maintenanceProblems >> 5) & 1) == 0) { - addMaintenanceProblemHeader(hasAddedHeader); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.universal.problem.crowbar")); - } - } - return this; - } - - private boolean addMaintenanceProblemHeader(boolean hasAddedHeader) { - if (!hasAddedHeader) { - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.YELLOW, - "gregtech.multiblock.universal.has_problems")); - } - return true; - } - - /** - * Adds two error lines when the machine's muffler hatch is obstructed. - *
- * Added if the structure is formed and if the passed parameter is true. - */ - public Builder addMufflerObstructedLine(boolean isObstructed) { - if (!isStructureFormed) return this; - if (isObstructed) { - textList.add(TextComponentUtil.translationWithColor(TextFormatting.RED, - "gregtech.multiblock.universal.muffler_obstructed")); - textList.add(TextComponentUtil.translationWithColor(TextFormatting.GRAY, - "gregtech.multiblock.universal.muffler_obstructed_desc")); - } - return this; - } - - /** - * Adds a fuel consumption line showing the fuel name and the number of ticks per recipe run. - *
- * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. - */ - public Builder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; - ITextComponent fuelNeeded = TextComponentUtil.stringWithColor(TextFormatting.RED, fuelName); - ITextComponent numTicks = TextComponentUtil.stringWithColor(TextFormatting.AQUA, - TextFormattingUtil.formatNumbers(previousRecipeDuration)); - textList.add(TextComponentUtil.translationWithColor( - TextFormatting.GRAY, - "gregtech.multiblock.turbine.fuel_needed", - fuelNeeded, numTicks)); - return this; - } - - /** Insert an empty line into the text list. */ - public Builder addEmptyLine() { - textList.add(EMPTY_COMPONENT); - return this; - } - - /** Add custom text dynamically, allowing for custom application logic. */ - public Builder addCustom(Consumer> customConsumer) { - customConsumer.accept(textList); - return this; - } - } -} From 4a52f9ed071dabf46f9d182e4e350e409b983a7b Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:57:33 -0400 Subject: [PATCH 259/264] Moce TimedProgressSupplier out of ProgressWidget (MUI0) --- .../api/gui/widgets/ProgressWidget.java | 35 +----------------- .../java/gregtech/api/util/GTUtility.java | 4 +- .../function/impl/TimedProgressSupplier.java | 37 +++++++++++++++++++ .../multi/electric/MetaTileEntityHPCA.java | 5 ++- 4 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 src/main/java/gregtech/api/util/function/impl/TimedProgressSupplier.java diff --git a/src/main/java/gregtech/api/gui/widgets/ProgressWidget.java b/src/main/java/gregtech/api/gui/widgets/ProgressWidget.java index b4699c241fd..a68f1bfcb2d 100644 --- a/src/main/java/gregtech/api/gui/widgets/ProgressWidget.java +++ b/src/main/java/gregtech/api/gui/widgets/ProgressWidget.java @@ -5,6 +5,7 @@ import gregtech.api.gui.resources.TextureArea; import gregtech.api.util.Position; import gregtech.api.util.Size; +import gregtech.api.util.function.impl.TimedProgressSupplier; import gregtech.common.ConfigHolder; import net.minecraft.client.renderer.GlStateManager; @@ -295,38 +296,4 @@ public void drawInForeground(int mouseX, int mouseY) { } } } - - public static class TimedProgressSupplier implements DoubleSupplier { - - private final int msPerCycle; - private final int maxValue; - private final boolean countDown; - private long startTime; - - public TimedProgressSupplier(int ticksPerCycle, int maxValue, boolean countDown) { - this.msPerCycle = ticksPerCycle * 50; - this.maxValue = maxValue; - this.countDown = countDown; - this.startTime = System.currentTimeMillis(); - } - - public void resetCountdown() { - startTime = System.currentTimeMillis(); - } - - @Override - public double getAsDouble() { - return calculateTime(); - } - - private double calculateTime() { - long currentTime = System.currentTimeMillis(); - long msPassed = (currentTime - startTime) % msPerCycle; - double currentValue = 1.0 * msPassed * maxValue / msPerCycle; - if (countDown) { - return (maxValue - currentValue) / maxValue; - } - return currentValue / maxValue; - } - } } diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 9784bd6bd8b..a4f44bb2bce 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -6,7 +6,6 @@ import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.cover.CoverDefinition; import gregtech.api.fluids.GTFluid; -import gregtech.api.gui.widgets.ProgressWidget; import gregtech.api.items.behavior.CoverItemBehavior; import gregtech.api.items.metaitem.MetaItem; import gregtech.api.items.metaitem.stats.IItemBehaviour; @@ -20,6 +19,7 @@ import gregtech.api.unification.OreDictUnifier; import gregtech.api.unification.ore.OrePrefix; import gregtech.api.unification.stack.ItemAndMetadata; +import gregtech.api.util.function.impl.TimedProgressSupplier; import net.minecraft.block.BlockRedstoneWire; import net.minecraft.block.BlockSnow; @@ -939,7 +939,7 @@ public static TextComponentTranslation getFluidTranslation(@Nullable Fluid fluid public static @NotNull Pair createPairedSupplier(int ticksPerCycle, int width, double splitPoint) { AtomicDouble tracker = new AtomicDouble(0.0); - DoubleSupplier supplier1 = new ProgressWidget.TimedProgressSupplier(ticksPerCycle, width, false) { + DoubleSupplier supplier1 = new TimedProgressSupplier(ticksPerCycle, width, false) { @Override public double getAsDouble() { diff --git a/src/main/java/gregtech/api/util/function/impl/TimedProgressSupplier.java b/src/main/java/gregtech/api/util/function/impl/TimedProgressSupplier.java new file mode 100644 index 00000000000..80346348221 --- /dev/null +++ b/src/main/java/gregtech/api/util/function/impl/TimedProgressSupplier.java @@ -0,0 +1,37 @@ +package gregtech.api.util.function.impl; + +import java.util.function.DoubleSupplier; + +public class TimedProgressSupplier implements DoubleSupplier { + + private final int msPerCycle; + private final int maxValue; + private final boolean countDown; + private long startTime; + + public TimedProgressSupplier(int ticksPerCycle, int maxValue, boolean countDown) { + this.msPerCycle = ticksPerCycle * 50; + this.maxValue = maxValue; + this.countDown = countDown; + this.startTime = System.currentTimeMillis(); + } + + public void resetCountdown() { + startTime = System.currentTimeMillis(); + } + + @Override + public double getAsDouble() { + return calculateTime(); + } + + private double calculateTime() { + long currentTime = System.currentTimeMillis(); + long msPassed = (currentTime - startTime) % msPerCycle; + double currentValue = 1.0 * msPassed * maxValue / msPerCycle; + if (countDown) { + return (maxValue - currentValue) / maxValue; + } + return currentValue / maxValue; + } +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index b166a1bf56c..bab3ab9b334 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -23,6 +23,7 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; +import gregtech.api.util.function.impl.TimedProgressSupplier; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; @@ -92,12 +93,12 @@ public class MetaTileEntityHPCA extends MultiblockWithDisplayBase private double temperature = IDLE_TEMPERATURE; // start at idle temperature - private final gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier progressSupplier; + private final TimedProgressSupplier progressSupplier; public MetaTileEntityHPCA(ResourceLocation metaTileEntityId) { super(metaTileEntityId); this.energyContainer = new EnergyContainerList(new ArrayList<>()); - this.progressSupplier = new gregtech.api.gui.widgets.ProgressWidget.TimedProgressSupplier(200, 47, false); + this.progressSupplier = new TimedProgressSupplier(200, 47, false); this.hpcaHandler = new HPCAGridHandler(this); } From 40066c3f02f3ae27cb7cee2d4fe253d7a4cb26e1 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:02:29 -0400 Subject: [PATCH 260/264] Remove the MUI0 `getComponentIcon` of `IHPCAComponentHatch` instead of deprecating it, since it is completely unused --- .../api/capability/IHPCAComponentHatch.java | 11 ++--------- .../multi/electric/MetaTileEntityHPCA.java | 16 +++------------- .../hpca/MetaTileEntityHPCABridge.java | 9 +-------- .../hpca/MetaTileEntityHPCAComputation.java | 14 +------------- .../hpca/MetaTileEntityHPCACooler.java | 9 +-------- .../hpca/MetaTileEntityHPCAEmpty.java | 7 ------- .../hpca/helper/HPCAComponentHatchTestImpl.java | 6 ------ 7 files changed, 8 insertions(+), 64 deletions(-) diff --git a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java index 319c0ac1ab0..1fc10b8a441 100644 --- a/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java +++ b/src/main/java/gregtech/api/capability/IHPCAComponentHatch.java @@ -1,6 +1,5 @@ package gregtech.api.capability; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -50,13 +49,7 @@ default void setDamaged(boolean damaged) {} /** * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. */ - @Deprecated - TextureArea getComponentIcon(); - - /** - * The icon for this component in the HPCA's UI. Should be a 13x13 px sprite. - */ - default UITexture getComponentIcon2() { + default UITexture getComponentIcon() { return GTGuiTextures.HPCA_ICON_EMPTY_COMPONENT; } @@ -67,6 +60,6 @@ default String getTileName() { if (this instanceof MetaTileEntity mte) { return mte.getMetaFullName(); } - return ""; // should this throw an exception instead? + return ""; } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index bab3ab9b334..9829f604ce0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -4,8 +4,6 @@ import gregtech.api.capability.*; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.*; @@ -384,7 +382,7 @@ protected MultiblockUIFactory createUIFactory() { .sizeRel(1f) .padding(1) .mapTo(3, 9, value -> new Widget<>() - .overlay(new DynamicDrawable(() -> hpcaHandler.getComponentTexture2(value)) + .overlay(new DynamicDrawable(() -> hpcaHandler.getComponentTexture(value)) .asIcon().size(14).marginLeft(2).marginTop(2)) .tooltipAutoUpdate(true) .tooltipBuilder(tooltip -> { @@ -930,19 +928,11 @@ public void addErrors(KeyManager keyManager, UISyncer syncer) { } } - @Deprecated - public TextureArea getComponentTexture(int index) { - if (components.size() <= index) { - return GuiTextures.BLANK_TRANSPARENT; - } - return components.get(index).getComponentIcon(); - } - - public UITexture getComponentTexture2(int index) { + public UITexture getComponentTexture(int index) { if (components.size() <= index) { return GTGuiTextures.BLANK_TRANSPARENT; } - return components.get(index).getComponentIcon2(); + return components.get(index).getComponentIcon(); } public IKey getComponentKey(int index) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java index f49e6f19287..7bc26b5edc9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCABridge.java @@ -1,8 +1,6 @@ package gregtech.common.metatileentities.multi.multiblockpart.hpca; import gregtech.api.GTValues; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -40,12 +38,7 @@ public SimpleOverlayRenderer getFrontOverlay() { } @Override - public TextureArea getComponentIcon() { - return GuiTextures.HPCA_ICON_BRIDGE_COMPONENT; - } - - @Override - public UITexture getComponentIcon2() { + public UITexture getComponentIcon() { return GTGuiTextures.HPCA_ICON_BRIDGE_COMPONENT; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java index 2c9eadb5ff8..9d8ebade08e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAComputation.java @@ -2,8 +2,6 @@ import gregtech.api.GTValues; import gregtech.api.capability.IHPCAComputationProvider; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -40,17 +38,7 @@ public SimpleOverlayRenderer getFrontOverlay() { } @Override - public TextureArea getComponentIcon() { - if (isDamaged()) { - return advanced ? GuiTextures.HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : - GuiTextures.HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT; - } - return advanced ? GuiTextures.HPCA_ICON_ADVANCED_COMPUTATION_COMPONENT : - GuiTextures.HPCA_ICON_COMPUTATION_COMPONENT; - } - - @Override - public UITexture getComponentIcon2() { + public UITexture getComponentIcon() { if (isDamaged()) { return advanced ? GTGuiTextures.HPCA_ICON_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : GTGuiTextures.HPCA_ICON_DAMAGED_COMPUTATION_COMPONENT; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java index fe5aa72cbd9..100960eab92 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCACooler.java @@ -2,8 +2,6 @@ import gregtech.api.GTValues; import gregtech.api.capability.IHPCACoolantProvider; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.mui.GTGuiTextures; @@ -39,12 +37,7 @@ public SimpleOverlayRenderer getFrontOverlay() { } @Override - public TextureArea getComponentIcon() { - return advanced ? GuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; - } - - @Override - public UITexture getComponentIcon2() { + public UITexture getComponentIcon() { return advanced ? GTGuiTextures.HPCA_ICON_ACTIVE_COOLER_COMPONENT : GTGuiTextures.HPCA_ICON_HEAT_SINK_COMPONENT; } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java index 9c25261401e..fdd8cb62050 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/hpca/MetaTileEntityHPCAEmpty.java @@ -1,7 +1,5 @@ package gregtech.common.metatileentities.multi.multiblockpart.hpca; -import gregtech.api.gui.GuiTextures; -import gregtech.api.gui.resources.TextureArea; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.client.renderer.texture.Textures; @@ -30,11 +28,6 @@ public SimpleOverlayRenderer getFrontOverlay() { return Textures.HPCA_EMPTY_OVERLAY; } - @Override - public TextureArea getComponentIcon() { - return GuiTextures.HPCA_ICON_EMPTY_COMPONENT; - } - @Override public int getUpkeepEUt() { return 0; diff --git a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java index 47d6dbf742a..f86838f1383 100644 --- a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java +++ b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java @@ -34,10 +34,4 @@ public boolean canBeDamaged() { public boolean isBridge() { return false; } - - // not tested - @Override - public TextureArea getComponentIcon() { - return null; - } } From bc41372656ca260c282b57b06bb360a5543e5076 Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:38:55 -0400 Subject: [PATCH 261/264] spotless --- .../multiblock/hpca/helper/HPCAComponentHatchTestImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java index f86838f1383..48bbad02219 100644 --- a/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java +++ b/src/test/java/gregtech/common/metatileentities/multiblock/hpca/helper/HPCAComponentHatchTestImpl.java @@ -1,7 +1,6 @@ package gregtech.common.metatileentities.multiblock.hpca.helper; import gregtech.api.capability.IHPCAComponentHatch; -import gregtech.api.gui.resources.TextureArea; public class HPCAComponentHatchTestImpl implements IHPCAComponentHatch { From adfd9dc2ea549569a350e426950eaeb76f70a79a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:51:37 -0400 Subject: [PATCH 262/264] Add supplier version of `addLowPowerLine` for the multiblock fluid drill --- .../multiblock/ui/MultiblockUIBuilder.java | 18 ++++++++++++++---- .../metatileentity/multiblock/ui/UISyncer.java | 12 ++---------- .../api/util/function/ByteSupplier.java | 14 ++++++++++++++ .../api/util/function/FloatSupplier.java | 14 ++++++++++++++ .../electric/MetaTileEntityFluidDrill.java | 7 +------ 5 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 src/main/java/gregtech/api/util/function/ByteSupplier.java create mode 100644 src/main/java/gregtech/api/util/function/FloatSupplier.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 55b89b39126..2dd58a00df4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -16,6 +16,8 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; +import gregtech.api.util.function.ByteSupplier; +import gregtech.api.util.function.FloatSupplier; import gregtech.common.ConfigHolder; import gregtech.common.items.ToolItems; @@ -408,17 +410,25 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { /** * Adds a warning line when the machine is low on power. *
- * Added if the structure is formed and if the passed parameter is true. + * Added if the structure is formed and if the supplier returns true. */ - public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { + public MultiblockUIBuilder addLowPowerLine(@NotNull BooleanSupplier isLowPower) { if (!isStructureFormed) return this; if (getSyncer().syncBoolean(isLowPower)) { - addKey(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.not_enough_energy")); + addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); } return this; } + /** + * Adds a warning line when the machine is low on power. + *
+ * Added if the structure is formed and if the passed parameter is true. + */ + public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { + return addLowPowerLine(() -> isLowPower); + } + /** * Adds a warning line when the machine is low on computation. *
diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index f0e03f25cfb..dd90d7cd367 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -1,6 +1,8 @@ package gregtech.api.metatileentity.multiblock.ui; import gregtech.api.mui.GTByteBufAdapters; +import gregtech.api.util.function.ByteSupplier; +import gregtech.api.util.function.FloatSupplier; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.Fluid; @@ -209,14 +211,4 @@ default Fluid syncFluid(@NotNull Supplier<@Nullable Fluid> initial) { default Fluid syncFluid(@Nullable Fluid initial) { return syncFluid(() -> initial); } - - interface ByteSupplier { - - byte getByte(); - } - - interface FloatSupplier { - - float getFloat(); - } } diff --git a/src/main/java/gregtech/api/util/function/ByteSupplier.java b/src/main/java/gregtech/api/util/function/ByteSupplier.java new file mode 100644 index 00000000000..1d23eb6c0d7 --- /dev/null +++ b/src/main/java/gregtech/api/util/function/ByteSupplier.java @@ -0,0 +1,14 @@ +package gregtech.api.util.function; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface ByteSupplier extends Supplier { + + @Override + default Byte get() { + return getByte(); + } + + byte getByte(); +} diff --git a/src/main/java/gregtech/api/util/function/FloatSupplier.java b/src/main/java/gregtech/api/util/function/FloatSupplier.java new file mode 100644 index 00000000000..4d4501c4778 --- /dev/null +++ b/src/main/java/gregtech/api/util/function/FloatSupplier.java @@ -0,0 +1,14 @@ +package gregtech.api.util.function; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface FloatSupplier extends Supplier { + + @Override + default Float get() { + return getFloat(); + } + + float getFloat(); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 6fbdc522871..d84a81074dd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -199,12 +199,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - boolean lowPower = false; - if (!getWorld().isRemote) { - // drain energy causes NPE on client - lowPower = isStructureFormed() && !drainEnergy(true); - } - builder.addLowPowerLine(lowPower) + builder.addLowPowerLine(() -> isStructureFormed() && !drainEnergy(true)) .addCustom((list, syncer) -> { if (isStructureFormed() && syncer.syncBoolean(minerLogic.isInventoryFull())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); From f30f0cb2550c9df5197e74dfc2d566a93d59d10a Mon Sep 17 00:00:00 2001 From: Zorbatron <46525467+Zorbatron@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:55:50 -0400 Subject: [PATCH 263/264] Suppress unchecked cast on `PatternMatchContext#getOrDefault` --- src/main/java/gregtech/api/pattern/PatternMatchContext.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/gregtech/api/pattern/PatternMatchContext.java b/src/main/java/gregtech/api/pattern/PatternMatchContext.java index f0526f43186..bbbc6326728 100644 --- a/src/main/java/gregtech/api/pattern/PatternMatchContext.java +++ b/src/main/java/gregtech/api/pattern/PatternMatchContext.java @@ -34,6 +34,7 @@ public void increment(String key, int value) { set(key, getOrDefault(key, 0) + value); } + @SuppressWarnings("unchecked") public T getOrDefault(String key, T defaultValue) { return (T) data.getOrDefault(key, defaultValue); } From cbc1e2b2eed0d9fb82583a6b202ab4047e471aba Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Tue, 17 Jun 2025 14:56:39 -0700 Subject: [PATCH 264/264] simplify hpca temperature lang wrap voltage name with IKey instead of appending TextFormatting simplify fluid drill's drilled fluid line add todo --- .../multi/MetaTileEntityLargeBoiler.java | 1 + .../electric/MetaTileEntityFluidDrill.java | 49 +++++++++++-------- .../multi/electric/MetaTileEntityHPCA.java | 5 +- .../resources/assets/gregtech/lang/en_us.lang | 2 +- 4 files changed, 32 insertions(+), 25 deletions(-) diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index afa660d6c41..da5afd69fdc 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -242,6 +242,7 @@ private ModularPanel makeThrottlePanel(PanelSyncManager syncManager, IPanelHandl .value(sliderValue) .widthRel(0.7f) .height(20)) + // todo switch this text field with GTTextFieldWidget in PR #2700 .child(new TextFieldWidget() .widthRel(0.3f) .height(20) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index d84a81074dd..19c09a0def4 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -170,28 +170,35 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.work_paused", "gregtech.multiblock.miner.drilling") .addEnergyUsageLine(energyContainer) - .addCustom((list, syncer) -> { - if (isStructureFormed()) { - if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { - // Fluid name - Fluid drilledFluid = syncer.syncFluid(minerLogic.getDrilledFluid()); - IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); - - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", - fluidInfo)); - - IKey amountInfo = KeyUtil.lang(TextFormatting.BLUE, - TextFormattingUtil.formatNumbers(syncer.syncInt(minerLogic.getFluidToProduce()) * - 20L / FluidDrillLogic.MAX_PROGRESS) + " L/s"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.fluid_amount", - amountInfo)); - } else { - IKey noFluid = KeyUtil.lang(TextFormatting.RED, - "gregtech.multiblock.fluid_rig.no_fluid_in_area"); - list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.fluid_rig.drilled_fluid", - noFluid)); - } + .addCustom((keyManager, syncer) -> { + if (!isStructureFormed()) return; + + // Fluid name + Fluid drilledFluid = syncer.syncFluid(minerLogic.getDrilledFluid()); + if (drilledFluid == null) { + IKey noFluid = KeyUtil.lang(TextFormatting.RED, + "gregtech.multiblock.fluid_rig.no_fluid_in_area"); + + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fluid_rig.drilled_fluid", + noFluid)); + return; } + + IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); + + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fluid_rig.drilled_fluid", + fluidInfo)); + + int fluidProduce = syncer.syncInt(minerLogic.getFluidToProduce()); + + IKey amountInfo = KeyUtil.number(TextFormatting.BLUE, + fluidProduce * 20L / FluidDrillLogic.MAX_PROGRESS, " L/s"); + + keyManager.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.fluid_rig.fluid_amount", + amountInfo)); }) .addProgressLine(minerLogic.getProgressTime(), FluidDrillLogic.MAX_PROGRESS) .addWorkingStatusLine(); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 9829f604ce0..80ba3026917 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -414,7 +414,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.hpca.energy", KeyUtil.number(syncer.syncLong(hpcaHandler.cachedEUt)), KeyUtil.number(syncer.syncLong(hpcaHandler.getMaxEUt())), - voltageName + TextFormatting.GRAY)); + IKey.str(voltageName))); // Provided Computation manager.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", @@ -576,8 +576,7 @@ public void registerBars(List> bars, PanelSync color = TextFormatting.RED; } - t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature", - () -> new Object[] { color, degrees })); + t.addLine(IKey.lang("gregtech.multiblock.hpca.temperature", degrees).style(color)); } else { t.addLine(IKey.lang("gregtech.multiblock.invalid_structure")); } diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index 7ec2399e08b..79b97d5b382 100644 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -5958,7 +5958,7 @@ gregtech.multiblock.data_bank.providing=Providing data. gregtech.multiblock.hpca.computation=§7Providing: §b%,d / %,d CWU/t gregtech.multiblock.hpca.energy=Using: %s / %s EU/t (%s) -gregtech.multiblock.hpca.temperature=§7Temperature: %s%,d°C +gregtech.multiblock.hpca.temperature=Temperature: %,d°C gregtech.multiblock.hpca.hover_for_info=Hover for details gregtech.multiblock.hpca.error_damaged=Damaged component in structure! gregtech.multiblock.hpca.error_temperature=Temperature above 100C, components may be damaged!