From 589c4539699cbdec416d8d82eb58e02360e21f2d Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Thu, 20 Feb 2025 19:36:00 -0700 Subject: [PATCH 1/8] partial syncing rework --- .../RecipeMapSteamMultiblockController.java | 4 +- .../multiblock/ui/CustomKeyFunction.java | 9 ++ .../multiblock/ui/MultiblockUIBuilder.java | 150 +++++++++++++++--- .../multiblock/ui/MultiblockUIFactory.java | 11 +- .../multiblock/ui/ValueSyncManager.java | 87 ++++++++++ .../java/gregtech/api/util/GTLambdaUtils.java | 13 ++ .../multi/MetaTileEntityLargeBoiler.java | 44 +++-- .../MetaTileEntityActiveTransformer.java | 2 +- .../electric/MetaTileEntityCleanroom.java | 4 +- .../electric/MetaTileEntityCrackingUnit.java | 2 +- .../MetaTileEntityElectricBlastFurnace.java | 3 +- .../electric/MetaTileEntityFluidDrill.java | 4 +- .../multi/electric/MetaTileEntityHPCA.java | 6 +- .../electric/MetaTileEntityLargeMiner.java | 6 +- .../electric/MetaTileEntityMultiSmelter.java | 2 +- .../electric/MetaTileEntityNetworkSwitch.java | 2 +- .../MetaTileEntityPowerSubstation.java | 4 +- .../MetaTileEntityProcessingArray.java | 2 +- .../electric/MetaTileEntityPyrolyseOven.java | 2 +- .../MetaTileEntityCentralMonitor.java | 4 +- .../MetaTileEntityLargeCombustionEngine.java | 16 +- .../generator/MetaTileEntityLargeTurbine.java | 6 +- 22 files changed, 314 insertions(+), 69 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/ValueSyncManager.java create mode 100644 src/main/java/gregtech/api/util/GTLambdaUtils.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..fe4674a4c38 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -102,7 +102,7 @@ private void resetTileAbilities() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom(keyManager -> { + .addCustom((keyManager, isServer, internal) -> { // custom steam tank line IFluidTank steamFluidTank = recipeMapWorkable.getSteamFluidTankCombined(); if (steamFluidTank != null && steamFluidTank.getCapacity() > 0) { @@ -122,7 +122,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, isServer, internal) -> { 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/CustomKeyFunction.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java new file mode 100644 index 00000000000..cf49b9fe53a --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java @@ -0,0 +1,9 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import net.minecraft.network.PacketBuffer; + +@FunctionalInterface +public interface CustomKeyFunction { + + void addCustom(KeyManager manager, boolean isServer, PacketBuffer internal); +} 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..1615c201005 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -16,12 +16,15 @@ import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; +import io.netty.buffer.Unpooled; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; +import static gregtech.api.util.GTLambdaUtils.*; + @SuppressWarnings({ "UnusedReturnValue", "unused" }) public class MultiblockUIBuilder implements KeyManager { @@ -30,6 +33,7 @@ public class MultiblockUIBuilder implements KeyManager { private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); + private final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); private boolean isWorkingEnabled; private boolean isActive; @@ -43,12 +47,21 @@ public class MultiblockUIBuilder implements KeyManager { private Runnable onRebuild; void updateFormed(boolean isStructureFormed) { - this.isStructureFormed = isStructureFormed; + if (isServer()) { + this.isStructureFormed = isStructureFormed; + internal.writeBoolean(isStructureFormed); + } else { + this.isStructureFormed = internal.readBoolean(); + } + } + + 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"); @@ -66,6 +79,13 @@ public MultiblockUIBuilder title(String lang) { public MultiblockUIBuilder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { this.isWorkingEnabled = isWorkingEnabled; this.isActive = isActive; + if (isServer()) { + internal.writeBoolean(isWorkingEnabled); + internal.writeBoolean(isActive); + } else { + this.isWorkingEnabled = internal.readBoolean(); + this.isActive = internal.readBoolean(); + } return this; } @@ -97,6 +117,12 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + if (isServer()) { + internal.writeLong(maxVoltage); + } else { + maxVoltage = internal.readLong(); + } + IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", KeyUtil.number(maxVoltage), @@ -116,6 +142,12 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) */ public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeByte(tier); + } else { + tier = internal.readByte(); + } + if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -133,6 +165,11 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { */ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeLong(energyUsage); + } else { + energyUsage = internal.readLong(); + } if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -151,7 +188,15 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + if (isServer()) { + internal.writeLong(maxVoltage); + internal.writeLong(recipeEUt); + } else { + maxVoltage = internal.readLong(); + recipeEUt = internal.readLong(); + } + // 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 +216,13 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE */ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeLong(maxVoltage); + internal.writeInt(amperage); + } else { + maxVoltage = internal.readLong(); + amperage = internal.readInt(); + } if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -190,6 +242,11 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe */ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeInt(maxCWUt); + } else { + maxCWUt = internal.readInt(); + } if (maxCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -205,6 +262,11 @@ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { */ public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeInt(currentCWUt); + } else { + currentCWUt = internal.readInt(); + } if (isActive && currentCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -280,6 +342,11 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; + if (isServer()) { + internal.writeDouble(progressPercent); + } else { + progressPercent = internal.readDouble(); + } addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); @@ -293,6 +360,11 @@ public MultiblockUIBuilder addProgressLine(double progressPercent) { */ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeInt(numParallels); + } else { + numParallels = internal.readInt(); + } if (numParallels > 1) { var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); @@ -309,6 +381,11 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeBoolean(isLowPower); + } else { + isLowPower = internal.readBoolean(); + } if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -323,6 +400,11 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeBoolean(isLowComputation); + } else { + isLowComputation = internal.readBoolean(); + } if (isLowComputation) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); @@ -337,6 +419,11 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeBoolean(isTooLow); + } else { + isTooLow = internal.readBoolean(); + } if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -353,6 +440,11 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; + if (isServer()) { + internal.writeByte(maintenanceProblems); + } else { + maintenanceProblems = internal.readByte(); + } if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -403,6 +495,11 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; + if (isServer()) { + internal.writeBoolean(isObstructed); + } else { + isObstructed = internal.readBoolean(); + } if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -418,9 +515,15 @@ 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; + if (isServer()) { + NetworkUtils.writeStringSafe(internal, fuelName); + internal.writeInt(previousRecipeDuration); + } else { + fuelName = NetworkUtils.readStringSafe(internal); + previousRecipeDuration = internal.readInt(); + } + 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 +537,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, isServer(), this.internal); return this; } @@ -477,6 +580,7 @@ private SyncHandler makeSyncHandler() { @Override public void detectAndSendChanges(boolean init) { + if (getSyncManager().isClient()) return; if (init || hasChanged()) { if (init) { onRebuild(); @@ -488,23 +592,29 @@ public void detectAndSendChanges(boolean init) { } 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); - } + // byte[] bytes = internal.array(); + buffer.writeBytes(internal); + internal.clear(); + // 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)); - } + internal.clear(); + internal.writeBytes(buf); + onRebuild(); + build(); + // for (int i = buf.readVarInt(); i > 0; i--) { + // int op = buf.readByte(); + // String jsonString = NetworkUtils.readStringSafe(buf); + // addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(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 12574eebf59..3a7b64071c7 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,10 +67,6 @@ 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 @@ -138,7 +135,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 +154,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 +174,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/ValueSyncManager.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/ValueSyncManager.java new file mode 100644 index 00000000000..33fa3559e99 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/ValueSyncManager.java @@ -0,0 +1,87 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import com.cleanroommc.modularui.api.value.sync.IValueSyncHandler; +import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; +import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; +import com.cleanroommc.modularui.utils.serialization.IEquals; +import com.cleanroommc.modularui.value.sync.SyncHandler; + +import com.cleanroommc.modularui.value.sync.ValueSyncHandler; + +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntSet; + +import net.minecraft.network.PacketBuffer; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.function.BooleanSupplier; +import java.util.function.Supplier; + +public class ValueSyncManager extends SyncHandler { + + private final List> values = new ArrayList<>(); + + @Override + public void detectAndSendChanges(boolean init) { + for (int i = 0; i < values.size(); i++) { + ValueSyncHandler vsh = values.get(i); + if (vsh.updateCacheFromSource(init)) { + syncToClient(i, vsh::write); + } + } + + } + + @Override + public void readOnClient(int id, PacketBuffer buf) throws IOException { + values.get(id).read(buf); + } + + @Override + public void readOnServer(int id, PacketBuffer buf) throws IOException {} + + public interface ValueUpdatable { + boolean hasChanged(); + void write(PacketBuffer buf); + void read(PacketBuffer buf); + } + + public static class Value implements ValueUpdatable { + + T value; + final Supplier getter; + final IEquals equals; + + public Value(Supplier getter) { + this(getter, Objects::equals); + } + + public Value(Supplier getter, IEquals equals) { + this.getter = getter; + this.equals = equals; + } + + @Override + public boolean hasChanged() { + T newVal = this.getter.get(); + if (!this.equals.areEqual(this.value, newVal)) { + this.value = newVal; + return true; + } + return false; + } + + @Override + public void write(PacketBuffer buf) { + + } + + @Override + public void read(PacketBuffer buf) { + + } + } +} 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/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index cfdf5827a8f..cb0a04283d2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -128,12 +128,20 @@ 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, - "gregtech.multiblock.large_boiler.no_water")); - richText.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); + builder.addCustom((manager, isServer, internal) -> { + if (isStructureFormed()) { + boolean filled = getWaterFilled() == 0; + if (isServer) { + internal.writeBoolean(filled); + } else { + filled = internal.readBoolean(); + } + if (filled) { + manager.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + manager.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); + } } }); } @@ -161,26 +169,38 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(KeyManager keyManager) { + private void addCustomData(KeyManager keyManager, boolean isServer, PacketBuffer internal) { if (isStructureFormed()) { + int steam = recipeLogic.getLastTickSteam(); + int heatScaled = recipeLogic.getHeatScaled(); + int throttleAmt = getThrottle(); + if (isServer) { + internal.writeInt(steam); + internal.writeInt(heatScaled); + internal.writeInt(throttleAmt); + } else { + steam = internal.readInt(); + heatScaled = internal.readInt(); + throttleAmt = internal.readInt(); + } + // 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..549f3255f4a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -169,7 +169,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { if (isStructureFormed()) { // Max input line IKey maxInputFormatted = KeyUtil.number(TextFormatting.WHITE, 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..9c765125f38 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -488,7 +488,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) .addEnergyUsageLine(energyContainer) .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { // Cleanliness status line if (isStructureFormed()) { IKey cleanState; @@ -511,7 +511,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)) - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { if (isStructureFormed() && !isClean()) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.warning_contaminated")); 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..4448921231e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -84,7 +84,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(textList -> { + .addCustom((textList, isServer, internal) -> { if (!isStructureFormed()) return; // Coil energy discount line 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..ac3e4932155 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -35,6 +35,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; @@ -80,7 +81,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(KeyManager keyManager) { + private void addHeatCapacity(KeyManager keyManager, boolean isServer, PacketBuffer internal) { 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 7f7cefabe3d..ca8b5f587e2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -170,7 +170,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.work_paused", "gregtech.multiblock.miner.drilling") .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { if (isStructureFormed()) { if (minerLogic.getDrilledFluid() != null) { // Fluid name @@ -202,7 +202,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { 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 99d7c7ec649..43ab5d2a67e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -399,7 +399,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.multiblock.data_bank.providing") - .addCustom(richText -> { + .addCustom((richText, isServer, internal) -> { if (!isStructureFormed()) return; // Energy Usage @@ -420,7 +420,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) - .addCustom(richText -> { + .addCustom((richText, isServer, internal) -> { if (!isStructureFormed()) return; if (temperature > 500) { @@ -442,7 +442,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(richText -> { + builder.addCustom((richText, isServer, internal) -> { if (!isStructureFormed()) return; if (temperature > 1000) { 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..b5ca8aa45fe 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,7 @@ protected MultiblockUIFactory createUIFactory() { protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, isServer, internal) -> { if (isStructureFormed()) { int workingAreaChunks = this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH; int workingArea = getWorkingArea(minerLogic.getCurrentRadius()); @@ -297,7 +297,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, isServer, internal) -> { if (isStructureFormed() && !drainFluid(false)) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); } @@ -307,7 +307,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)); - builder.addCustom(list -> { + builder.addCustom((list, isServer, internal) -> { if (isStructureFormed() && 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..6a126a71176 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, isServer, internal) -> { 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..f10b690e67a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -158,7 +158,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom(list -> { + builder.addCustom((list, isServer, internal) -> { if (isStructureFormed() && 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 023b49d1e50..f831eeae14a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -348,7 +348,7 @@ 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 -> { + builder.addCustom((list, isServer, internal) -> { if (isStructureFormed() && energyBank != null) { BigInteger energyStored = energyBank.getStored(); BigInteger energyCapacity = energyBank.getCapacity(); @@ -419,7 +419,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, isServer, internal) -> { 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..38cd2b38687 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -120,7 +120,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(richText -> { + .addCustom((richText, isServer, internal) -> { if (!isStructureFormed()) return; // Machine mode text 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..0d1eb4c4198 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, isServer, internal) -> { 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..19df485afaa 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, isServer, internal) -> { 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, isServer, internal) -> { 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..533a51605df 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,7 +86,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { } builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addCustom(richText -> { + .addCustom((richText, isServer, internal) -> { if (isStructureFormed() && recipeLogic.isOxygenBoosted) { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : @@ -101,17 +101,25 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureErrorText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - builder.addCustom(keyList -> { + builder.addCustom((keyList, isServer, internal) -> { if (!isStructureFormed()) return; - if (checkIntakesObstructed()) { + boolean obstructed = checkIntakesObstructed(); + if (isServer) internal.writeBoolean(obstructed); + else obstructed = internal.readBoolean(); + + if (obstructed) { 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()) { + boolean lubricant = recipeLogic.checkLubricant(); + if (isServer) internal.writeBoolean(lubricant); + else lubricant = internal.readBoolean(); + + if (!lubricant) { 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..037e8e5b1a2 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,7 +124,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(keyList -> { + .addCustom((keyList, isServer, internal) -> { if (!isStructureFormed()) return; if (getRotorHolder() == null) return; @@ -146,7 +146,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { + builder.addCustom((keyList, isServer, internal) -> { if (!isStructureFormed() || getRotorHolder() == null) return; @@ -163,7 +163,7 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { + builder.addCustom((keyList, isServer, internal) -> { if (!isStructureFormed() || getRotorHolder() == null) return; From b7f9ebe1bc98943dc9a87f2dfe45224295a6b547 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 18:37:00 -0700 Subject: [PATCH 2/8] evem more work --- .../RecipeMapSteamMultiblockController.java | 21 +- .../multiblock/ui/CustomKeyFunction.java | 4 +- .../multiblock/ui/MultiblockUIBuilder.java | 241 ++++++++---------- .../multiblock/ui/UISyncer.java | 11 + .../multi/MetaTileEntityLargeBoiler.java | 28 +- .../MetaTileEntityActiveTransformer.java | 8 +- .../electric/MetaTileEntityCleanroom.java | 10 +- .../electric/MetaTileEntityCrackingUnit.java | 4 +- .../MetaTileEntityElectricBlastFurnace.java | 5 +- .../electric/MetaTileEntityFluidDrill.java | 8 +- .../multi/electric/MetaTileEntityHPCA.java | 49 ++-- .../electric/MetaTileEntityLargeMiner.java | 28 +- .../electric/MetaTileEntityMultiSmelter.java | 2 +- .../electric/MetaTileEntityNetworkSwitch.java | 4 +- .../MetaTileEntityPowerSubstation.java | 4 +- .../MetaTileEntityProcessingArray.java | 2 +- .../electric/MetaTileEntityPyrolyseOven.java | 2 +- .../MetaTileEntityCentralMonitor.java | 4 +- .../MetaTileEntityLargeCombustionEngine.java | 18 +- .../generator/MetaTileEntityLargeTurbine.java | 43 +++- 20 files changed, 244 insertions(+), 252 deletions(-) create mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index fe4674a4c38..6eae035ea08 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -102,14 +102,15 @@ private void resetTileAbilities() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom((keyManager, isServer, internal) -> { + .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 +123,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom((list, isServer, internal) -> { - 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 index cf49b9fe53a..d723fe68483 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java @@ -1,9 +1,7 @@ package gregtech.api.metatileentity.multiblock.ui; -import net.minecraft.network.PacketBuffer; - @FunctionalInterface public interface CustomKeyFunction { - void addCustom(KeyManager manager, boolean isServer, PacketBuffer internal); + 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 1615c201005..d4887f8b60e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -20,13 +20,12 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Consumer; -import static gregtech.api.util.GTLambdaUtils.*; - @SuppressWarnings({ "UnusedReturnValue", "unused" }) -public class MultiblockUIBuilder implements KeyManager { +public class MultiblockUIBuilder implements KeyManager, UISyncer { private final List textList = new ArrayList<>(); private final List operations = new ArrayList<>(); @@ -47,12 +46,7 @@ public class MultiblockUIBuilder implements KeyManager { private Runnable onRebuild; void updateFormed(boolean isStructureFormed) { - if (isServer()) { - this.isStructureFormed = isStructureFormed; - internal.writeBoolean(isStructureFormed); - } else { - this.isStructureFormed = internal.readBoolean(); - } + this.isStructureFormed = syncBoolean(isStructureFormed); } private boolean isServer() { @@ -77,15 +71,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; - if (isServer()) { - internal.writeBoolean(isWorkingEnabled); - internal.writeBoolean(isActive); - } else { - this.isWorkingEnabled = internal.readBoolean(); - this.isActive = internal.readBoolean(); - } + this.isWorkingEnabled = syncBoolean(isWorkingEnabled); + this.isActive = syncBoolean(isActive); return this; } @@ -113,15 +100,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 = syncBoolean(energyContainer.getEnergyCapacity() > 0); + if (!hasEnergy) return this; long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - - if (isServer()) { - internal.writeLong(maxVoltage); - } else { - maxVoltage = internal.readLong(); - } + maxVoltage = syncLong(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", @@ -142,12 +125,7 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) */ public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeByte(tier); - } else { - tier = internal.readByte(); - } - + tier = syncInt(tier); if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -165,11 +143,7 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { */ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeLong(energyUsage); - } else { - energyUsage = internal.readLong(); - } + energyUsage = syncLong(energyUsage); if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -188,13 +162,8 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeLong(maxVoltage); - internal.writeLong(recipeEUt); - } else { - maxVoltage = internal.readLong(); - recipeEUt = internal.readLong(); - } + maxVoltage = syncLong(maxVoltage); + recipeEUt = syncLong(recipeEUt); // todo this recipe eut should always be positive if (maxVoltage != 0 && maxVoltage >= Math.abs(recipeEUt)) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); @@ -216,13 +185,8 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE */ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeLong(maxVoltage); - internal.writeInt(amperage); - } else { - maxVoltage = internal.readLong(); - amperage = internal.readInt(); - } + maxVoltage = syncLong(maxVoltage); + amperage = syncInt(amperage); if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -242,11 +206,7 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe */ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeInt(maxCWUt); - } else { - maxCWUt = internal.readInt(); - } + maxCWUt = syncInt(maxCWUt); if (maxCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -262,11 +222,7 @@ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { */ public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeInt(currentCWUt); - } else { - currentCWUt = internal.readInt(); - } + currentCWUt = syncInt(currentCWUt); if (isActive && currentCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -342,11 +298,7 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; - if (isServer()) { - internal.writeDouble(progressPercent); - } else { - progressPercent = internal.readDouble(); - } + progressPercent = syncDouble(progressPercent); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); @@ -360,11 +312,7 @@ public MultiblockUIBuilder addProgressLine(double progressPercent) { */ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeInt(numParallels); - } else { - numParallels = internal.readInt(); - } + numParallels = syncInt(numParallels); if (numParallels > 1) { var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); @@ -381,11 +329,7 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeBoolean(isLowPower); - } else { - isLowPower = internal.readBoolean(); - } + isLowPower = syncBoolean(isLowPower); if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -400,11 +344,7 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeBoolean(isLowComputation); - } else { - isLowComputation = internal.readBoolean(); - } + isLowComputation = syncBoolean(isLowComputation); if (isLowComputation) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); @@ -419,11 +359,7 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeBoolean(isTooLow); - } else { - isTooLow = internal.readBoolean(); - } + isTooLow = syncBoolean(isTooLow); if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -440,11 +376,7 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - if (isServer()) { - internal.writeByte(maintenanceProblems); - } else { - maintenanceProblems = internal.readByte(); - } + maintenanceProblems = syncByte(maintenanceProblems); if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -495,11 +427,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; - if (isServer()) { - internal.writeBoolean(isObstructed); - } else { - isObstructed = internal.readBoolean(); - } + isObstructed = syncBoolean(isObstructed); if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -516,13 +444,8 @@ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { */ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { if (!isStructureFormed || !isActive) return this; - if (isServer()) { - NetworkUtils.writeStringSafe(internal, fuelName); - internal.writeInt(previousRecipeDuration); - } else { - fuelName = NetworkUtils.readStringSafe(internal); - previousRecipeDuration = internal.readInt(); - } + fuelName = syncString(fuelName); + previousRecipeDuration = syncInt(previousRecipeDuration); if (fuelName != null) addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), @@ -538,7 +461,7 @@ public MultiblockUIBuilder addEmptyLine() { /** Add custom text dynamically, allowing for custom application logic. */ public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { - customConsumer.addCustom(this, isServer(), this.internal); + customConsumer.addCustom(this, this); return this; } @@ -553,14 +476,18 @@ public void clear() { protected boolean hasChanged() { if (this.action == null) return false; - List old = toString(this.textList); + byte[] old = internal.array().clone(); + onRebuild(); 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; + return !Arrays.equals(old, internal.array()); +// 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) { @@ -580,27 +507,17 @@ private SyncHandler makeSyncHandler() { @Override public void detectAndSendChanges(boolean init) { - if (getSyncManager().isClient()) return; if (init || hasChanged()) { if (init) { onRebuild(); build(); } sync(0, this::syncText); - markDirty(); } } private void syncText(PacketBuffer buffer) { - // byte[] bytes = internal.array(); buffer.writeBytes(internal); - internal.clear(); - // 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 @@ -608,13 +525,7 @@ public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { internal.clear(); internal.writeBytes(buf); - onRebuild(); - build(); - // for (int i = buf.readVarInt(); i > 0; i--) { - // int op = buf.readByte(); - // String jsonString = NetworkUtils.readStringSafe(buf); - // addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); - // } + markDirty(); } } @@ -646,7 +557,11 @@ public void markDirty() { protected void build() { clear(); - if (this.action != null) this.action.accept(this); + if (this.action != null) { + if (isServer()) + this.internal.clear(); + this.action.accept(this); + } } protected void setAction(Consumer action) { @@ -678,4 +593,74 @@ private void addKey(@NotNull IDrawable key, @NotNull Operation op) { public void add(IDrawable drawable, Operation op) { addKey(drawable, op); } + + @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(); + } + } } 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..b74c76e2ca4 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -0,0 +1,11 @@ +package gregtech.api.metatileentity.multiblock.ui; + +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); +} diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index cb0a04283d2..ad585184b88 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,15 +129,9 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom((manager, isServer, internal) -> { + builder.addCustom((manager, syncer) -> { if (isStructureFormed()) { - boolean filled = getWaterFilled() == 0; - if (isServer) { - internal.writeBoolean(filled); - } else { - filled = internal.readBoolean(); - } - if (filled) { + if (syncer.syncBoolean(getWaterFilled() == 0)) { manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); manager.add(KeyUtil.lang(TextFormatting.GRAY, @@ -169,20 +164,11 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(KeyManager keyManager, boolean isServer, PacketBuffer internal) { + private void addCustomData(KeyManager keyManager, UISyncer syncer) { if (isStructureFormed()) { - int steam = recipeLogic.getLastTickSteam(); - int heatScaled = recipeLogic.getHeatScaled(); - int throttleAmt = getThrottle(); - if (isServer) { - internal.writeInt(steam); - internal.writeInt(heatScaled); - internal.writeInt(throttleAmt); - } else { - steam = internal.readInt(); - heatScaled = internal.readInt(); - throttleAmt = internal.readInt(); - } + 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, 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 549f3255f4a..835760cbd9f 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,22 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addCustom((list, isServer, internal) -> { + .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 9c765125f38..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, isServer, internal) -> { + .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, isServer, internal) -> { - 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 4448921231e..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, isServer, internal) -> { + .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 ac3e4932155..f40afc3987a 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; @@ -81,10 +82,10 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(KeyManager keyManager, boolean isServer, PacketBuffer internal) { + 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 ca8b5f587e2..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, isServer, internal) -> { + .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, isServer, internal) -> { - 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 43ab5d2a67e..f285d2b2bdc 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,21 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.multiblock.data_bank.providing") - .addCustom((richText, isServer, internal) -> { + .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 +421,35 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) - .addCustom((richText, isServer, internal) -> { + .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, isServer, internal) -> { + 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 +895,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 +916,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 b5ca8aa45fe..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, isServer, internal) -> { + .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, isServer, internal) -> { - 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, isServer, internal) -> { - 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 6a126a71176..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, isServer, internal) -> { + .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 f10b690e67a..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, isServer, internal) -> { - 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 f831eeae14a..5d59d277fb9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -348,7 +348,7 @@ 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, isServer, internal) -> { + builder.addCustom((list, syncer) -> { if (isStructureFormed() && energyBank != null) { BigInteger energyStored = energyBank.getStored(); BigInteger energyCapacity = energyBank.getCapacity(); @@ -419,7 +419,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom((list, isServer, internal) -> { + 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 38cd2b38687..c646ae7c0be 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -120,7 +120,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom((richText, isServer, internal) -> { + .addCustom((richText, syncer) -> { if (!isStructureFormed()) return; // Machine mode text 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 0d1eb4c4198..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, isServer, internal) -> { + .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 19df485afaa..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, isServer, internal) -> { + 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, isServer, internal) -> { + 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 533a51605df..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, isServer, internal) -> { - 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,25 +101,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureErrorText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - builder.addCustom((keyList, isServer, internal) -> { + builder.addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - boolean obstructed = checkIntakesObstructed(); - if (isServer) internal.writeBoolean(obstructed); - else obstructed = internal.readBoolean(); - - if (obstructed) { + 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")); } - boolean lubricant = recipeLogic.checkLubricant(); - if (isServer) internal.writeBoolean(lubricant); - else lubricant = internal.readBoolean(); - - if (!lubricant) { + 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 037e8e5b1a2..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, isServer, internal) -> { + .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, isServer, internal) -> { - 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, isServer, internal) -> { - 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 2858a9f1c135d60e3a8c9e818c149c6245966fdd Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:31:17 -0700 Subject: [PATCH 3/8] done with new syncing --- .../RecipeMapSteamMultiblockController.java | 1 - .../multiblock/ui/MultiblockUIBuilder.java | 254 +++++++++++------- .../multiblock/ui/UISyncer.java | 21 ++ .../multiblock/ui/ValueSyncManager.java | 87 ------ .../MetaTileEntityActiveTransformer.java | 6 +- .../MetaTileEntityElectricBlastFurnace.java | 1 - .../multi/electric/MetaTileEntityHPCA.java | 3 +- .../MetaTileEntityPowerSubstation.java | 50 ++-- .../MetaTileEntityProcessingArray.java | 27 +- 9 files changed, 222 insertions(+), 228 deletions(-) delete mode 100644 src/main/java/gregtech/api/metatileentity/multiblock/ui/ValueSyncManager.java diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index 6eae035ea08..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; 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 d4887f8b60e..a94bf91ce65 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -16,23 +16,27 @@ 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; @SuppressWarnings({ "UnusedReturnValue", "unused" }) -public class MultiblockUIBuilder implements KeyManager, UISyncer { +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 final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); + @Nullable + private InternalSyncer syncer; private boolean isWorkingEnabled; private boolean isActive; @@ -45,8 +49,16 @@ public class MultiblockUIBuilder implements KeyManager, UISyncer { 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 = syncBoolean(isStructureFormed); + this.isStructureFormed = this.getSyncer().syncBoolean(isStructureFormed); } private boolean isServer() { @@ -71,8 +83,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 = syncBoolean(isWorkingEnabled); - this.isActive = syncBoolean(isActive); + this.isWorkingEnabled = this.getSyncer().syncBoolean(isWorkingEnabled); + this.isActive = this.getSyncer().syncBoolean(isActive); return this; } @@ -100,11 +112,11 @@ public MultiblockUIBuilder setWorkingStatusKeys(String idlingKey, String pausedK */ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) { if (!isStructureFormed || energyContainer == null) return this; - boolean hasEnergy = syncBoolean(energyContainer.getEnergyCapacity() > 0); + boolean hasEnergy = getSyncer().syncBoolean(energyContainer.getEnergyCapacity() > 0); if (!hasEnergy) return this; long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); - maxVoltage = syncLong(maxVoltage); + maxVoltage = getSyncer().syncLong(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", @@ -125,7 +137,7 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) */ public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; - tier = syncInt(tier); + tier = getSyncer().syncInt(tier); if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -143,7 +155,7 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { */ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (!isStructureFormed) return this; - energyUsage = syncLong(energyUsage); + energyUsage = getSyncer().syncLong(energyUsage); if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -162,8 +174,8 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - maxVoltage = syncLong(maxVoltage); - recipeEUt = syncLong(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); @@ -185,8 +197,8 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE */ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (!isStructureFormed) return this; - maxVoltage = syncLong(maxVoltage); - amperage = syncInt(amperage); + 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 @@ -206,7 +218,7 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe */ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; - maxCWUt = syncInt(maxCWUt); + maxCWUt = getSyncer().syncInt(maxCWUt); if (maxCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -222,7 +234,7 @@ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { */ public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; - currentCWUt = syncInt(currentCWUt); + currentCWUt = getSyncer().syncInt(currentCWUt); if (isActive && currentCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -298,7 +310,7 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; - progressPercent = syncDouble(progressPercent); + progressPercent = getSyncer().syncDouble(progressPercent); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); @@ -312,7 +324,7 @@ public MultiblockUIBuilder addProgressLine(double progressPercent) { */ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; - numParallels = syncInt(numParallels); + numParallels = getSyncer().syncInt(numParallels); if (numParallels > 1) { var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); @@ -329,7 +341,7 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; - isLowPower = syncBoolean(isLowPower); + isLowPower = getSyncer().syncBoolean(isLowPower); if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -344,7 +356,7 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; - isLowComputation = syncBoolean(isLowComputation); + isLowComputation = getSyncer().syncBoolean(isLowComputation); if (isLowComputation) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); @@ -359,7 +371,7 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; - isTooLow = syncBoolean(isTooLow); + isTooLow = getSyncer().syncBoolean(isTooLow); if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -376,7 +388,7 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; - maintenanceProblems = syncByte(maintenanceProblems); + maintenanceProblems = getSyncer().syncByte(maintenanceProblems); if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -427,7 +439,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; - isObstructed = syncBoolean(isObstructed); + isObstructed = getSyncer().syncBoolean(isObstructed); if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -444,8 +456,8 @@ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { */ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { if (!isStructureFormed || !isActive) return this; - fuelName = syncString(fuelName); - previousRecipeDuration = syncInt(previousRecipeDuration); + 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), @@ -461,7 +473,7 @@ public MultiblockUIBuilder addEmptyLine() { /** Add custom text dynamically, allowing for custom application logic. */ public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { - customConsumer.addCustom(this, this); + customConsumer.addCustom(this, getSyncer()); return this; } @@ -476,18 +488,15 @@ public void clear() { protected boolean hasChanged() { if (this.action == null) return false; - byte[] old = internal.array().clone(); - onRebuild(); - build(); - return !Arrays.equals(old, internal.array()); -// 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; + return getSyncer().hasChanged(); + // 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) { @@ -512,19 +521,14 @@ public void detectAndSendChanges(boolean init) { onRebuild(); build(); } - sync(0, this::syncText); + syncToClient(0, buf -> getSyncer().writeBuffer(buf)); } } - private void syncText(PacketBuffer buffer) { - buffer.writeBytes(internal); - } - @Override public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { - internal.clear(); - internal.writeBytes(buf); + getSyncer().readBuffer(buf); markDirty(); } } @@ -558,8 +562,7 @@ public void markDirty() { protected void build() { clear(); if (this.action != null) { - if (isServer()) - this.internal.clear(); + if (isServer()) getSyncer().clear(); this.action.accept(this); } } @@ -594,73 +597,122 @@ public void add(IDrawable drawable, Operation op) { addKey(drawable, op); } - @Override - public boolean syncBoolean(boolean initial) { - if (isServer()) { - internal.writeBoolean(initial); - return initial; - } else { - return internal.readBoolean(); + public class InternalSyncer implements UISyncer { + + private final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); + private final boolean isServer; + + public InternalSyncer(boolean isServer) { + this.isServer = isServer; } - } - @Override - public int syncInt(int initial) { - if (isServer()) { - internal.writeInt(initial); - return initial; - } else { - return internal.readInt(); + private boolean isServer() { + return this.isServer; } - } - @Override - public long syncLong(long initial) { - if (isServer()) { - internal.writeLong(initial); - return initial; - } else { - return internal.readLong(); + @Override + public boolean syncBoolean(boolean initial) { + if (isServer()) { + internal.writeBoolean(initial); + return initial; + } else { + return internal.readBoolean(); + } } - } - @Override - public String syncString(String initial) { - if (isServer()) { - NetworkUtils.writeStringSafe(internal, initial); - return initial; - } else { - return NetworkUtils.readStringSafe(internal); + @Override + public int syncInt(int initial) { + if (isServer()) { + internal.writeInt(initial); + return initial; + } else { + return internal.readInt(); + } } - } - @Override - public byte syncByte(byte initial) { - if (isServer()) { - internal.writeByte(initial); - return initial; - } else { - return internal.readByte(); + @Override + public long syncLong(long initial) { + if (isServer()) { + internal.writeLong(initial); + return initial; + } else { + return internal.readLong(); + } } - } - @Override - public double syncDouble(double initial) { - if (isServer()) { - internal.writeDouble(initial); - return initial; - } else { - return internal.readDouble(); + @Override + public String syncString(String initial) { + if (isServer()) { + NetworkUtils.writeStringSafe(internal, initial); + return initial; + } else { + return NetworkUtils.readStringSafe(internal); + } } - } - @Override - public float syncFloat(float initial) { - if (isServer()) { - internal.writeFloat(initial); - return initial; - } else { - return internal.readFloat(); + @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/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java index b74c76e2ca4..bc3c99c422e 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -1,11 +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/metatileentity/multiblock/ui/ValueSyncManager.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/ValueSyncManager.java deleted file mode 100644 index 33fa3559e99..00000000000 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/ValueSyncManager.java +++ /dev/null @@ -1,87 +0,0 @@ -package gregtech.api.metatileentity.multiblock.ui; - -import com.cleanroommc.modularui.api.value.sync.IValueSyncHandler; -import com.cleanroommc.modularui.utils.serialization.IByteBufDeserializer; -import com.cleanroommc.modularui.utils.serialization.IByteBufSerializer; -import com.cleanroommc.modularui.utils.serialization.IEquals; -import com.cleanroommc.modularui.value.sync.SyncHandler; - -import com.cleanroommc.modularui.value.sync.ValueSyncHandler; - -import it.unimi.dsi.fastutil.ints.IntArraySet; -import it.unimi.dsi.fastutil.ints.IntSet; - -import net.minecraft.network.PacketBuffer; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; -import java.util.function.BooleanSupplier; -import java.util.function.Supplier; - -public class ValueSyncManager extends SyncHandler { - - private final List> values = new ArrayList<>(); - - @Override - public void detectAndSendChanges(boolean init) { - for (int i = 0; i < values.size(); i++) { - ValueSyncHandler vsh = values.get(i); - if (vsh.updateCacheFromSource(init)) { - syncToClient(i, vsh::write); - } - } - - } - - @Override - public void readOnClient(int id, PacketBuffer buf) throws IOException { - values.get(id).read(buf); - } - - @Override - public void readOnServer(int id, PacketBuffer buf) throws IOException {} - - public interface ValueUpdatable { - boolean hasChanged(); - void write(PacketBuffer buf); - void read(PacketBuffer buf); - } - - public static class Value implements ValueUpdatable { - - T value; - final Supplier getter; - final IEquals equals; - - public Value(Supplier getter) { - this(getter, Objects::equals); - } - - public Value(Supplier getter, IEquals equals) { - this.getter = getter; - this.equals = equals; - } - - @Override - public boolean hasChanged() { - T newVal = this.getter.get(); - if (!this.equals.areEqual(this.value, newVal)) { - this.value = newVal; - return true; - } - return false; - } - - @Override - public void write(PacketBuffer buf) { - - } - - @Override - public void read(PacketBuffer buf) { - - } - } -} 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 835760cbd9f..ad4f72c2e5f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -179,12 +179,14 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { // Max output line IKey maxOutputFormatted = KeyUtil.number(TextFormatting.WHITE, - syncer.syncLong(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, syncer.syncLong(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/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index f40afc3987a..d57007262aa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -36,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; 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 f285d2b2bdc..80ed75e6ae2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -403,7 +403,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { if (!isStructureFormed()) return; // Energy Usage - String voltageName = syncer.syncString(GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]); + String voltageName = syncer + .syncString(GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]); manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.energy", KeyUtil.number(syncer.syncLong(hpcaHandler.cachedEUt)), 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 5d59d277fb9..991812a1ce0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java @@ -348,10 +348,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, syncer) -> { - 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( @@ -363,7 +365,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( @@ -375,41 +377,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)); } } 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 c646ae7c0be..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, syncer) -> { + .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")); } }) From 3d741bbac629b079545b360b7d9c6e5878749e92 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:34:06 -0700 Subject: [PATCH 4/8] remove json serialization --- .../multiblock/ui/MultiblockUIBuilder.java | 9 -- .../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/JsonUtils.java | 31 ------ 6 files changed, 287 deletions(-) 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 delete mode 100644 src/main/java/gregtech/api/util/JsonUtils.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 a94bf91ce65..80ca953fee7 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; @@ -499,14 +498,6 @@ 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); } 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/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); - } -} From 06e9111ca525ec84f1d443da2f8daff7a9446f63 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:34:39 -0700 Subject: [PATCH 5/8] cleanup --- .../metatileentity/multiblock/ui/MultiblockUIBuilder.java | 8 -------- 1 file changed, 8 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 80ca953fee7..4c6e567ee90 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -488,14 +488,6 @@ public void clear() { protected boolean hasChanged() { if (this.action == null) return false; return getSyncer().hasChanged(); - // 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; } protected void sync(String key, PanelSyncManager syncManager) { From 3772bdd6a917cce193a7943c4493a75da66e5505 Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:43:04 -0700 Subject: [PATCH 6/8] delete HoverableKey.java --- .../api/mui/drawables/HoverableKey.java | 123 ------------------ src/main/java/gregtech/api/util/KeyUtil.java | 6 +- 2 files changed, 4 insertions(+), 125 deletions(-) delete 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 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/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 From 700c3538293d0d794f821118559405c492bb1adb Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 19:46:59 -0700 Subject: [PATCH 7/8] cleanup and address todo --- .../api/metatileentity/multiblock/ui/MultiblockUIFactory.java | 4 +--- 1 file changed, 1 insertion(+), 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 3a7b64071c7..954cf23c31c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -72,7 +72,6 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { * 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)); @@ -110,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()); } }); From a7fe8a49686e33e2a4e04111918bbdccf027c39e Mon Sep 17 00:00:00 2001 From: Ghzdude <44148655+ghzdude@users.noreply.github.com> Date: Fri, 21 Feb 2025 20:04:55 -0700 Subject: [PATCH 8/8] merge ifs --- .../multi/MetaTileEntityLargeBoiler.java | 12 +++++------- 1 file changed, 5 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 ad585184b88..73604802ff7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -130,13 +130,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); builder.addCustom((manager, syncer) -> { - if (isStructureFormed()) { - if (syncer.syncBoolean(getWaterFilled() == 0)) { - manager.add(KeyUtil.lang(TextFormatting.YELLOW, - "gregtech.multiblock.large_boiler.no_water")); - manager.add(KeyUtil.lang(TextFormatting.GRAY, - "gregtech.multiblock.large_boiler.explosion_tooltip")); - } + if (isStructureFormed() && syncer.syncBoolean(getWaterFilled() == 0)) { + manager.add(KeyUtil.lang(TextFormatting.YELLOW, + "gregtech.multiblock.large_boiler.no_water")); + manager.add(KeyUtil.lang(TextFormatting.GRAY, + "gregtech.multiblock.large_boiler.explosion_tooltip")); } }); }