diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index aa129c1c46d..2cc27f0044a 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -16,7 +16,6 @@ import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.util.KeyUtil; -import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; import net.minecraft.entity.player.EntityPlayer; @@ -102,14 +101,15 @@ private void resetTileAbilities() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) - .addCustom(keyManager -> { + .addCustom((keyManager, syncer) -> { // custom steam tank line IFluidTank steamFluidTank = recipeMapWorkable.getSteamFluidTankCombined(); - if (steamFluidTank != null && steamFluidTank.getCapacity() > 0) { - String stored = TextFormattingUtil.formatNumbers(steamFluidTank.getFluidAmount()); - String capacity = TextFormattingUtil.formatNumbers(steamFluidTank.getCapacity()); - - IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, "%s/%s L", stored, capacity); + int stored = syncer.syncInt(steamFluidTank.getFluidAmount()); + int capacity = syncer.syncInt(steamFluidTank.getCapacity()); + if (capacity > 0) { + IKey steamInfo = KeyUtil.string(TextFormatting.BLUE, "%s/%s L", + KeyUtil.number(stored), + KeyUtil.number(capacity)); IKey steamStored = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.steam.steam_stored", steamInfo); keyManager.add(steamStored); @@ -122,12 +122,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { - if (isStructureFormed() && recipeMapWorkable.isHasNotEnoughEnergy()) { + builder.addCustom((list, syncer) -> { + boolean noEnergy = syncer.syncBoolean(recipeMapWorkable.isHasNotEnoughEnergy()); + if (isStructureFormed() && noEnergy) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.steam.low_steam")); } - }) - .addMaintenanceProblemLines(getMaintenanceProblems()); + }).addMaintenanceProblemLines(getMaintenanceProblems()); } @Override diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java new file mode 100644 index 00000000000..d723fe68483 --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/CustomKeyFunction.java @@ -0,0 +1,7 @@ +package gregtech.api.metatileentity.multiblock.ui; + +@FunctionalInterface +public interface CustomKeyFunction { + + void addCustom(KeyManager manager, UISyncer syncer); +} diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java index 15c349eb883..4c6e567ee90 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIBuilder.java @@ -2,7 +2,6 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.util.JsonUtils; import gregtech.api.util.KeyUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.common.ConfigHolder; @@ -16,9 +15,14 @@ import com.cleanroommc.modularui.network.NetworkUtils; import com.cleanroommc.modularui.value.sync.PanelSyncManager; import com.cleanroommc.modularui.value.sync.SyncHandler; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import java.math.BigInteger; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.function.Consumer; @@ -30,6 +34,8 @@ public class MultiblockUIBuilder implements KeyManager { private Consumer action; private final SyncHandler syncHandler = makeSyncHandler(); + @Nullable + private InternalSyncer syncer; private boolean isWorkingEnabled; private boolean isActive; @@ -42,13 +48,25 @@ public class MultiblockUIBuilder implements KeyManager { private boolean dirty; private Runnable onRebuild; + @NotNull + private UISyncer getSyncer() { + if (this.syncer == null) { + this.syncer = new InternalSyncer(isServer()); + } + return this.syncer; + } + void updateFormed(boolean isStructureFormed) { - this.isStructureFormed = isStructureFormed; + this.isStructureFormed = this.getSyncer().syncBoolean(isStructureFormed); + } + + private boolean isServer() { + return !this.syncHandler.getSyncManager().isClient(); } public MultiblockUIBuilder structureFormed(boolean structureFormed) { updateFormed(structureFormed); - if (!structureFormed) { + if (!this.isStructureFormed) { var base = KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.invalid_structure"); var hover = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.invalid_structure.tooltip"); @@ -64,8 +82,8 @@ public MultiblockUIBuilder title(String lang) { /** Set the current working enabled and active status of this multiblock, used by many line addition calls. */ public MultiblockUIBuilder setWorkingStatus(boolean isWorkingEnabled, boolean isActive) { - this.isWorkingEnabled = isWorkingEnabled; - this.isActive = isActive; + this.isWorkingEnabled = this.getSyncer().syncBoolean(isWorkingEnabled); + this.isActive = this.getSyncer().syncBoolean(isActive); return this; } @@ -93,9 +111,11 @@ public MultiblockUIBuilder setWorkingStatusKeys(String idlingKey, String pausedK */ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) { if (!isStructureFormed || energyContainer == null) return this; - if (energyContainer.getEnergyCapacity() <= 0) return this; + boolean hasEnergy = getSyncer().syncBoolean(energyContainer.getEnergyCapacity() > 0); + if (!hasEnergy) return this; long maxVoltage = Math.max(energyContainer.getInputVoltage(), energyContainer.getOutputVoltage()); + maxVoltage = getSyncer().syncLong(maxVoltage); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.max_energy_per_tick", @@ -116,6 +136,7 @@ public MultiblockUIBuilder addEnergyUsageLine(IEnergyContainer energyContainer) */ public MultiblockUIBuilder addEnergyTierLine(int tier) { if (!isStructureFormed) return this; + tier = getSyncer().syncInt(tier); if (tier < GTValues.ULV || tier > GTValues.MAX) return this; var bodyText = KeyUtil.lang(TextFormatting.GRAY, @@ -133,6 +154,7 @@ public MultiblockUIBuilder addEnergyTierLine(int tier) { */ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { if (!isStructureFormed) return this; + energyUsage = getSyncer().syncLong(energyUsage); if (energyUsage > 0) { String energyFormatted = TextFormattingUtil.formatNumbers(energyUsage); // wrap in text component to keep it from being formatted @@ -151,7 +173,10 @@ public MultiblockUIBuilder addEnergyUsageExactLine(long energyUsage) { */ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeEUt) { if (!isStructureFormed) return this; - if (maxVoltage != 0 && maxVoltage >= -recipeEUt) { + maxVoltage = getSyncer().syncLong(maxVoltage); + recipeEUt = getSyncer().syncLong(recipeEUt); + // todo this recipe eut should always be positive + if (maxVoltage != 0 && maxVoltage >= Math.abs(recipeEUt)) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted var voltageName = KeyUtil.voltage(GTValues.VOCNF, maxVoltage); @@ -171,6 +196,8 @@ public MultiblockUIBuilder addEnergyProductionLine(long maxVoltage, long recipeE */ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int amperage) { if (!isStructureFormed) return this; + maxVoltage = getSyncer().syncLong(maxVoltage); + amperage = getSyncer().syncInt(amperage); if (maxVoltage != 0 && amperage != 0) { String energyFormatted = TextFormattingUtil.formatNumbers(maxVoltage); // wrap in text component to keep it from being formatted @@ -190,6 +217,7 @@ public MultiblockUIBuilder addEnergyProductionAmpsLine(long maxVoltage, int ampe */ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { if (!isStructureFormed) return this; + maxCWUt = getSyncer().syncInt(maxCWUt); if (maxCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, maxCWUt); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -205,6 +233,7 @@ public MultiblockUIBuilder addComputationUsageLine(int maxCWUt) { */ public MultiblockUIBuilder addComputationUsageExactLine(int currentCWUt) { if (!isStructureFormed) return this; + currentCWUt = getSyncer().syncInt(currentCWUt); if (isActive && currentCWUt > 0) { var computation = KeyUtil.number(TextFormatting.AQUA, currentCWUt, " CWU/t"); addKey(KeyUtil.lang(TextFormatting.GRAY, @@ -280,6 +309,7 @@ public MultiblockUIBuilder addIdlingLine(boolean checkState) { */ public MultiblockUIBuilder addProgressLine(double progressPercent) { if (!isStructureFormed || !isActive) return this; + progressPercent = getSyncer().syncDouble(progressPercent); addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.progress", (int) (progressPercent * 100))); @@ -293,6 +323,7 @@ public MultiblockUIBuilder addProgressLine(double progressPercent) { */ public MultiblockUIBuilder addParallelsLine(int numParallels) { if (!isStructureFormed) return this; + numParallels = getSyncer().syncInt(numParallels); if (numParallels > 1) { var parallels = KeyUtil.number(TextFormatting.DARK_PURPLE, numParallels); @@ -309,6 +340,7 @@ public MultiblockUIBuilder addParallelsLine(int numParallels) { */ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { if (!isStructureFormed) return this; + isLowPower = getSyncer().syncBoolean(isLowPower); if (isLowPower) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy")); @@ -323,6 +355,7 @@ public MultiblockUIBuilder addLowPowerLine(boolean isLowPower) { */ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { if (!isStructureFormed) return this; + isLowComputation = getSyncer().syncBoolean(isLowComputation); if (isLowComputation) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.not_enough_computation")); @@ -337,6 +370,7 @@ public MultiblockUIBuilder addLowComputationLine(boolean isLowComputation) { */ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { if (!isStructureFormed) return this; + isTooLow = getSyncer().syncBoolean(isTooLow); if (isTooLow) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.not_enough_energy_output")); @@ -353,6 +387,7 @@ public MultiblockUIBuilder addLowDynamoTierLine(boolean isTooLow) { */ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) { if (!isStructureFormed || !ConfigHolder.machines.enableMaintenance) return this; + maintenanceProblems = getSyncer().syncByte(maintenanceProblems); if (maintenanceProblems < 63) { addKey(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.universal.has_problems")); @@ -403,6 +438,7 @@ public MultiblockUIBuilder addMaintenanceProblemLines(byte maintenanceProblems) */ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { if (!isStructureFormed) return this; + isObstructed = getSyncer().syncBoolean(isObstructed); if (isObstructed) { addKey(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.universal.muffler_obstructed")); @@ -418,9 +454,10 @@ public MultiblockUIBuilder addMufflerObstructedLine(boolean isObstructed) { * Added if structure is formed, the machine is active, and the passed fuelName parameter is not null. */ public MultiblockUIBuilder addFuelNeededLine(String fuelName, int previousRecipeDuration) { - if (!isStructureFormed || !isActive || fuelName == null) return this; - - addKey(KeyUtil.lang(TextFormatting.GRAY, + if (!isStructureFormed || !isActive) return this; + fuelName = getSyncer().syncString(fuelName); + previousRecipeDuration = getSyncer().syncInt(previousRecipeDuration); + if (fuelName != null) addKey(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.fuel_needed", KeyUtil.string(TextFormatting.RED, fuelName), KeyUtil.number(TextFormatting.AQUA, previousRecipeDuration))); @@ -434,8 +471,8 @@ public MultiblockUIBuilder addEmptyLine() { } /** Add custom text dynamically, allowing for custom application logic. */ - public MultiblockUIBuilder addCustom(Consumer customConsumer) { - customConsumer.accept(this); + public MultiblockUIBuilder addCustom(CustomKeyFunction customConsumer) { + customConsumer.addCustom(this, getSyncer()); return this; } @@ -450,22 +487,7 @@ public void clear() { protected boolean hasChanged() { if (this.action == null) return false; - List old = toString(this.textList); - build(); - if (textList.size() != old.size()) return true; - for (int i = 0; i < textList.size(); i++) { - if (!JsonUtils.toJsonString(textList.get(i)).equals(old.get(i))) - return true; - } - return false; - } - - private static List toString(List drawables) { - List strings = new ArrayList<>(); - for (IDrawable drawable : drawables) { - strings.add(JsonUtils.toJsonString(drawable)); - } - return strings; + return getSyncer().hasChanged(); } protected void sync(String key, PanelSyncManager syncManager) { @@ -482,29 +504,15 @@ public void detectAndSendChanges(boolean init) { onRebuild(); build(); } - sync(0, this::syncText); - markDirty(); - } - } - - private void syncText(PacketBuffer buffer) { - buffer.writeVarInt(textList.size()); - for (int i = 0; i < textList.size(); i++) { - buffer.writeByte(Operation.getId(operations.get(i))); - var jsonString = JsonUtils.toJsonString(textList.get(i)); - NetworkUtils.writeStringSafe(buffer, jsonString); + syncToClient(0, buf -> getSyncer().writeBuffer(buf)); } } @Override public void readOnClient(int id, PacketBuffer buf) { if (id == 0) { - clear(); - for (int i = buf.readVarInt(); i > 0; i--) { - int op = buf.readByte(); - String jsonString = NetworkUtils.readStringSafe(buf); - addKey(JsonUtils.fromJsonString(jsonString), Operation.getById(op)); - } + getSyncer().readBuffer(buf); + markDirty(); } } @@ -536,7 +544,10 @@ public void markDirty() { protected void build() { clear(); - if (this.action != null) this.action.accept(this); + if (this.action != null) { + if (isServer()) getSyncer().clear(); + this.action.accept(this); + } } protected void setAction(Consumer action) { @@ -568,4 +579,123 @@ private void addKey(@NotNull IDrawable key, @NotNull Operation op) { public void add(IDrawable drawable, Operation op) { addKey(drawable, op); } + + public class InternalSyncer implements UISyncer { + + private final PacketBuffer internal = new PacketBuffer(Unpooled.buffer()); + private final boolean isServer; + + public InternalSyncer(boolean isServer) { + this.isServer = isServer; + } + + private boolean isServer() { + return this.isServer; + } + + @Override + public boolean syncBoolean(boolean initial) { + if (isServer()) { + internal.writeBoolean(initial); + return initial; + } else { + return internal.readBoolean(); + } + } + + @Override + public int syncInt(int initial) { + if (isServer()) { + internal.writeInt(initial); + return initial; + } else { + return internal.readInt(); + } + } + + @Override + public long syncLong(long initial) { + if (isServer()) { + internal.writeLong(initial); + return initial; + } else { + return internal.readLong(); + } + } + + @Override + public String syncString(String initial) { + if (isServer()) { + NetworkUtils.writeStringSafe(internal, initial); + return initial; + } else { + return NetworkUtils.readStringSafe(internal); + } + } + + @Override + public byte syncByte(byte initial) { + if (isServer()) { + internal.writeByte(initial); + return initial; + } else { + return internal.readByte(); + } + } + + @Override + public double syncDouble(double initial) { + if (isServer()) { + internal.writeDouble(initial); + return initial; + } else { + return internal.readDouble(); + } + } + + @Override + public float syncFloat(float initial) { + if (isServer()) { + internal.writeFloat(initial); + return initial; + } else { + return internal.readFloat(); + } + } + + @Override + public BigInteger syncBigInt(BigInteger initial) { + if (isServer()) { + internal.writeByteArray(initial.toByteArray()); + return initial; + } else { + byte[] bytes = internal.readByteArray(); + return new BigInteger(bytes); + } + } + + @Override + public void readBuffer(ByteBuf buf) { + clear(); + internal.writeBytes(buf); + } + + @Override + public void writeBuffer(ByteBuf buf) { + buf.writeBytes(internal); + } + + @Override + public boolean hasChanged() { + byte[] old = internal.array().clone(); + onRebuild(); + build(); + return !Arrays.equals(old, internal.array()); + } + + @Override + public void clear() { + this.internal.clear(); + } + } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java index 12574eebf59..954cf23c31c 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/MultiblockUIFactory.java @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.ProgressBarMultiblock; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; +import gregtech.api.util.GTLambdaUtils; import gregtech.api.util.GTLog; import gregtech.api.util.KeyUtil; @@ -66,16 +67,11 @@ public MultiblockUIFactory(@NotNull MultiblockWithDisplayBase mte) { configureDisplayText(builder -> builder.title(mte.getMetaFullName()).structureFormed(mte.isStructureFormed())); } - private static @NotNull Consumer addAction(@Nullable Consumer first, @NotNull Consumer andThen) { - return first == null ? andThen : first.andThen(andThen); - } - /** * Constructs the multiblock ui panel
* It is not recommended to override this method */ public @NotNull ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager) { - // this.valueSyncer.accept(panelSyncManager); var panel = createRootPanel(); panel.child(createScreen(panelSyncManager)); @@ -113,8 +109,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { } else if (!warning.isEmpty()) { return GTGuiTextures.GREGTECH_LOGO_BLINKING_YELLOW; } else { - // todo getLogo()? - return GTGuiTextures.GREGTECH_LOGO; + return GTGuiTextures.getLogo(mte.getUITheme()); } }); @@ -138,7 +133,7 @@ private Widget createIndicator(PanelSyncManager syncManager) { * This is called every tick on the client-side */ public MultiblockUIFactory configureWarningText(boolean merge, Consumer warningText) { - this.warningText = merge ? addAction(this.warningText, warningText) : warningText; + this.warningText = merge ? GTLambdaUtils.mergeConsumers(this.warningText, warningText) : warningText; return this; } @@ -157,7 +152,7 @@ public MultiblockUIFactory configureWarningText(Consumer wa * This is called every tick on the client-side */ public MultiblockUIFactory configureErrorText(boolean merge, Consumer errorText) { - this.errorText = merge ? addAction(this.errorText, errorText) : errorText; + this.errorText = merge ? GTLambdaUtils.mergeConsumers(this.errorText, errorText) : errorText; return this; } @@ -177,7 +172,7 @@ public MultiblockUIFactory configureErrorText(Consumer erro * or {@link KeyUtil#lang(String, Object...)} */ public MultiblockUIFactory configureDisplayText(boolean merge, Consumer displayText) { - this.displayText = merge ? addAction(this.displayText, displayText) : displayText; + this.displayText = merge ? GTLambdaUtils.mergeConsumers(this.displayText, displayText) : displayText; return this; } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java new file mode 100644 index 00000000000..bc3c99c422e --- /dev/null +++ b/src/main/java/gregtech/api/metatileentity/multiblock/ui/UISyncer.java @@ -0,0 +1,32 @@ +package gregtech.api.metatileentity.multiblock.ui; + +import io.netty.buffer.ByteBuf; + +import java.math.BigInteger; + +public interface UISyncer { + + boolean syncBoolean(boolean initial); + + int syncInt(int initial); + + long syncLong(long initial); + + String syncString(String initial); + + byte syncByte(byte initial); + + double syncDouble(double initial); + + float syncFloat(float initial); + + BigInteger syncBigInt(BigInteger initial); + + void readBuffer(ByteBuf buf); + + void writeBuffer(ByteBuf buf); + + boolean hasChanged(); + + void clear(); +} diff --git a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java b/src/main/java/gregtech/api/mui/drawables/HoverableKey.java deleted file mode 100644 index 7cbf0a30a51..00000000000 --- a/src/main/java/gregtech/api/mui/drawables/HoverableKey.java +++ /dev/null @@ -1,123 +0,0 @@ -package gregtech.api.mui.drawables; - -import net.minecraft.client.gui.FontRenderer; - -import com.cleanroommc.modularui.api.MCHelper; -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.drawable.IHoverable; -import com.cleanroommc.modularui.api.drawable.IIcon; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.api.widget.ITooltip; -import com.cleanroommc.modularui.screen.RichTooltip; -import com.cleanroommc.modularui.screen.viewport.GuiContext; -import com.cleanroommc.modularui.theme.WidgetTheme; -import com.cleanroommc.modularui.widget.sizer.Area; -import com.cleanroommc.modularui.widget.sizer.Box; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -public class HoverableKey implements IIcon, IHoverable, ITooltip { - - private final Box margin = new Box(); - private final Area area = new Area(); - private final List tooltipLines = new ArrayList<>(); - private RichTooltip tooltip; - private IKey key; - - private HoverableKey() { - tooltipAutoUpdate(true); - tooltipBuilder(t -> t.addDrawableLines(getTooltipLines())); - } - - public static HoverableKey of(IKey key) { - return new HoverableKey().setKey(key); - } - - public static HoverableKey of(IKey key, IDrawable... lines) { - return of(key).addLines(Arrays.asList(lines)); - } - - public FontRenderer getFontRenderer() { - return MCHelper.getFontRenderer(); - } - - @Override - public int getWidth() { - return getFontRenderer().getStringWidth(key.get()) + this.margin.horizontal(); - } - - @Override - public int getHeight() { - return getFontRenderer().FONT_HEIGHT + this.margin.vertical(); - } - - @Override - public Box getMargin() { - return margin; - } - - @Override - public void draw(GuiContext context, int x, int y, int width, int height, WidgetTheme widgetTheme) { - int w = getWidth(), h = getHeight(); - x += (int) (width / 2f - w / 2f); - y += (int) (height / 2f - h / 2f); - this.key.draw(context, x, y, width, height, widgetTheme); - } - - public IKey getKey() { - return key; - } - - public HoverableKey setKey(IKey key) { - this.key = key; - return getThis(); - } - - public List getTooltipLines() { - return tooltipLines; - } - - public HoverableKey addLines(Collection drawables) { - this.getTooltipLines().addAll(drawables); - return getThis(); - } - - @Override - @Nullable - public RichTooltip getTooltip() { - return tooltip; - } - - @Override - public void setRenderedAt(int x, int y) { - getRenderedArea().setPos(x, y); - } - - @Override - public Area getRenderedArea() { - this.area.setSize(getWidth(), getHeight()); - return this.area; - } - - @Override - public @NotNull RichTooltip tooltip() { - if (this.tooltip == null) this.tooltip = new RichTooltip(area -> area.set(getRenderedArea())); - return tooltip; - } - - @Override - public HoverableKey tooltip(RichTooltip tooltip) { - this.tooltip = tooltip; - return this; - } - - @Override - public String toString() { - return "HoverableKey(" + key.getFormatted() + ")"; - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java b/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java deleted file mode 100644 index 6316ba15ab0..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/DrawableSerializer.java +++ /dev/null @@ -1,45 +0,0 @@ -package gregtech.api.mui.serialize; - -import gregtech.api.mui.drawables.HoverableKey; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.cleanroommc.modularui.api.drawable.IKey; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; - -import java.util.Arrays; - -public class DrawableSerializer implements JsonHandler { - - KeySerializer keySerializer = new KeySerializer(); - - @Override - public IDrawable deserialize(JsonElement json, JsonDeserializationContext context) - throws JsonParseException { - if (!json.isJsonObject()) return IDrawable.EMPTY; - JsonObject parsed = json.getAsJsonObject(); - if (parsed.has("key") && parsed.has("tooltip")) { - IKey key = context.deserialize(parsed.get("key"), IKey.class); - - IDrawable[] list = deserializeArray(parsed.getAsJsonArray("tooltip"), context, IDrawable[]::new); - return HoverableKey.of(key).addLines(Arrays.asList(list)); - } else { - return keySerializer.deserialize(json, context); - } - } - - @Override - public JsonElement serialize(IDrawable src, JsonSerializationContext context) { - JsonObject object = new JsonObject(); - if (src instanceof IKey key) { - return keySerializer.serialize(key, context); - } else if (src instanceof HoverableKey hoverable) { - object.add("key", keySerializer.serialize(hoverable.getKey(), context)); - object.add("tooltip", serializeArray(hoverable.getTooltipLines(), context)); - } - return object; - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java b/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java deleted file mode 100644 index 1fe8f7e2476..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/FormatSerializer.java +++ /dev/null @@ -1,23 +0,0 @@ -package gregtech.api.mui.serialize; - -import net.minecraft.util.text.TextFormatting; - -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; - -public class FormatSerializer implements JsonHandler { - - @Override - public TextFormatting deserialize(JsonElement json, - JsonDeserializationContext context) throws JsonParseException { - return TextFormatting.getValueByName(json.getAsString()); - } - - @Override - public JsonElement serialize(TextFormatting src, - JsonSerializationContext context) { - return context.serialize(src.getFriendlyName()); - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java b/src/main/java/gregtech/api/mui/serialize/JsonHandler.java deleted file mode 100644 index 447e8723dad..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/JsonHandler.java +++ /dev/null @@ -1,97 +0,0 @@ -package gregtech.api.mui.serialize; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.google.gson.JsonArray; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonPrimitive; -import com.google.gson.JsonSerializationContext; -import com.google.gson.JsonSerializer; - -import java.lang.reflect.Array; -import java.lang.reflect.Type; -import java.util.Arrays; -import java.util.Collection; -import java.util.function.IntFunction; - -public interface JsonHandler extends JsonSerializer, JsonDeserializer { - - @Override - default JsonElement serialize(T src, Type typeOfSrc, JsonSerializationContext context) { - return serialize(src, context); - } - - @Override - default T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) - throws JsonParseException { - return deserialize(json, context); - } - - JsonElement serialize(T src, JsonSerializationContext context); - - T deserialize(JsonElement json, JsonDeserializationContext context) throws JsonParseException; - - default JsonArray serializeArray(R[] objects, JsonSerializationContext context) { - JsonArray array = new JsonArray(); - if (objects == null) return array; - Type arrayType = objects.getClass().getComponentType(); - for (R t : objects) { - JsonElement element = context.serialize(t, arrayType); - if (element.isJsonPrimitive() && element.getAsJsonPrimitive().isNumber()) { - JsonObject typed = new JsonObject(); - typed.addProperty("typed", t.getClass().getSimpleName()); - typed.add("element", element); - array.add(typed); - } else { - array.add(element); - } - } - return array; - } - - @SuppressWarnings("unchecked") - default JsonArray serializeArray(Collection objects, JsonSerializationContext context) { - R[] array = null; - int i = 0; - for (R object : objects) { - if (array == null) array = (R[]) Array.newInstance(object.getClass(), objects.size()); - array[i++] = object; - } - return serializeArray(array, context); - } - - default R[] deserializeArray(JsonArray jsonArray, JsonDeserializationContext context, - IntFunction function) { - if (jsonArray == null || jsonArray.size() == 0) return function.apply(0); - R[] array = function.apply(jsonArray.size()); - Type arrayType = array.getClass().getComponentType(); - Arrays.setAll(array, i -> handleArg(jsonArray.get(i), context, arrayType)); - return array; - } - - static Object handleArg(JsonElement element, JsonDeserializationContext context, Type arrayType) { - // args can sometimes be keys - if (element.isJsonObject()) { - JsonObject object = element.getAsJsonObject(); - if (!object.has("typed")) - return context.deserialize(object, IDrawable.class); - - JsonElement value = object.get("element"); - return switch (object.get("typed").getAsString()) { - case "Integer" -> value.getAsInt(); - case "Long" -> value.getAsLong(); - case "Double" -> value.getAsDouble(); - case "Float" -> value.getAsFloat(); - case "Byte" -> value.getAsByte(); - default -> value.getAsNumber(); - }; - } else if (element instanceof JsonPrimitive primitive && primitive.isNumber()) { - return primitive.getAsNumber(); - } else { - return context.deserialize(element, arrayType); - } - } -} diff --git a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java b/src/main/java/gregtech/api/mui/serialize/KeySerializer.java deleted file mode 100644 index 4563c179125..00000000000 --- a/src/main/java/gregtech/api/mui/serialize/KeySerializer.java +++ /dev/null @@ -1,82 +0,0 @@ -package gregtech.api.mui.serialize; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IKey; -import com.cleanroommc.modularui.drawable.text.CompoundKey; -import com.cleanroommc.modularui.drawable.text.DynamicKey; -import com.cleanroommc.modularui.drawable.text.FormattingState; -import com.cleanroommc.modularui.drawable.text.LangKey; -import com.cleanroommc.modularui.drawable.text.StringKey; -import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; -import com.google.gson.JsonSerializationContext; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import org.apache.commons.lang3.ArrayUtils; - -import java.util.Map; - -public class KeySerializer implements JsonHandler { - - private static final Map FORMATTING_MAP = new Object2ObjectOpenHashMap<>(); - - static { - for (var tf : TextFormatting.values()) { - FORMATTING_MAP.put(tf.toString(), tf); - } - } - - @Override - public IKey deserialize(JsonElement json, JsonDeserializationContext context) - throws JsonParseException { - JsonObject object = json.getAsJsonObject(); - if (object.has("string")) { - return IKey.str(object.get("string").getAsString()); - } else if (object.has("lang")) { - String lang = context.deserialize(object.get("lang"), String.class); - TextFormatting[] formatting = deserializeArray(object.getAsJsonArray("format"), context, - TextFormatting[]::new); - Object[] args = deserializeArray( - object.getAsJsonArray("args"), context, Object[]::new); - return IKey.lang(lang, args).style(formatting); - } else if (object.has("keys")) { - IKey[] keys = deserializeArray( - object.getAsJsonArray("keys"), context, IKey[]::new); - TextFormatting[] formatting = deserializeArray( - object.getAsJsonArray("format"), context, TextFormatting[]::new); - return IKey.comp(keys).style(formatting); - } - return IKey.EMPTY; - } - - @Override - public JsonElement serialize(IKey src, JsonSerializationContext context) { - JsonObject obj = new JsonObject(); - if (src instanceof StringKey || src instanceof DynamicKey) { - obj.add("string", context.serialize(src.getFormatted())); - } else if (src instanceof LangKey langKey) { - obj.add("lang", context.serialize(langKey.getKeySupplier().get())); - TextFormatting[] formattings = convert(langKey.getFormatting()); - obj.add("format", serializeArray(formattings, context)); - Object[] args = langKey.getArgsSupplier().get(); - if (!ArrayUtils.isEmpty(args)) - obj.add("args", serializeArray(args, context)); - } else if (src instanceof CompoundKey compoundKey) { - obj.add("keys", serializeArray(compoundKey.getKeys(), context)); - obj.add("format", serializeArray(convert(compoundKey.getFormatting()), context)); - } - return obj; - } - - public static TextFormatting[] convert(FormattingState state) { - if (state == null) return new TextFormatting[0]; - String s = state.getFormatting(); - TextFormatting[] formattings = new TextFormatting[s.length() / 2]; - for (int i = 0; i < s.length(); i += 2) { - formattings[i / 2] = FORMATTING_MAP.get(s.substring(i, i + 2)); - } - return formattings; - } -} diff --git a/src/main/java/gregtech/api/util/GTLambdaUtils.java b/src/main/java/gregtech/api/util/GTLambdaUtils.java new file mode 100644 index 00000000000..5adca846fb6 --- /dev/null +++ b/src/main/java/gregtech/api/util/GTLambdaUtils.java @@ -0,0 +1,13 @@ +package gregtech.api.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public class GTLambdaUtils { + + public static @NotNull Consumer mergeConsumers(@Nullable Consumer first, @NotNull Consumer andThen) { + return first == null ? andThen : first.andThen(andThen); + } +} diff --git a/src/main/java/gregtech/api/util/JsonUtils.java b/src/main/java/gregtech/api/util/JsonUtils.java deleted file mode 100644 index ebcf949f671..00000000000 --- a/src/main/java/gregtech/api/util/JsonUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package gregtech.api.util; - -import gregtech.api.mui.serialize.DrawableSerializer; -import gregtech.api.mui.serialize.FormatSerializer; - -import net.minecraft.util.text.TextFormatting; - -import com.cleanroommc.modularui.api.drawable.IDrawable; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; - -public class JsonUtils { - - private static final Gson gson = new GsonBuilder() - .setPrettyPrinting() - .registerTypeHierarchyAdapter(IDrawable.class, new DrawableSerializer()) - .registerTypeAdapter(TextFormatting.class, new FormatSerializer()) - .create(); - - public static String toJsonString(IDrawable drawable) { - return getGson().toJson(drawable, IDrawable.class); - } - - public static Gson getGson() { - return gson; - } - - public static IDrawable fromJsonString(String jsonString) { - return getGson().fromJson(jsonString, IDrawable.class); - } -} diff --git a/src/main/java/gregtech/api/util/KeyUtil.java b/src/main/java/gregtech/api/util/KeyUtil.java index c68c61a28b3..7e2f11896f8 100644 --- a/src/main/java/gregtech/api/util/KeyUtil.java +++ b/src/main/java/gregtech/api/util/KeyUtil.java @@ -1,7 +1,6 @@ package gregtech.api.util; import gregtech.api.fluids.GTFluid; -import gregtech.api.mui.drawables.HoverableKey; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.Fluid; @@ -13,6 +12,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.function.LongSupplier; import java.util.function.Supplier; @@ -130,7 +130,9 @@ public static IKey overclock(String[] array, long voltage) { public static IDrawable setHover(IKey body, IDrawable... hover) { if (ArrayUtils.isEmpty(hover)) return body; - return HoverableKey.of(body, hover); + return body.asTextIcon() + .asHoverable() + .addTooltipDrawableLines(Arrays.asList(hover)); } @NotNull diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java index cfdf5827a8f..73604802ff7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityLargeBoiler.java @@ -11,6 +11,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.mui.GTGuis; import gregtech.api.pattern.BlockPattern; @@ -128,11 +129,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom(richText -> { - if (isStructureFormed() && getWaterFilled() == 0) { - richText.add(KeyUtil.lang(TextFormatting.YELLOW, + builder.addCustom((manager, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(getWaterFilled() == 0)) { + manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.large_boiler.no_water")); - richText.add(KeyUtil.lang(TextFormatting.GRAY, + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.explosion_tooltip")); } }); @@ -161,26 +162,29 @@ protected MultiblockUIFactory createUIFactory() { }); } - private void addCustomData(KeyManager keyManager) { + private void addCustomData(KeyManager keyManager, UISyncer syncer) { if (isStructureFormed()) { + int steam = syncer.syncInt(recipeLogic.getLastTickSteam()); + int heatScaled = syncer.syncInt(recipeLogic.getHeatScaled()); + int throttleAmt = syncer.syncInt(getThrottle()); + // Steam Output line IKey steamOutput = KeyUtil.number(TextFormatting.AQUA, - recipeLogic.getLastTickSteam(), " L/t"); + steam, " L/t"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.steam_output", steamOutput)); // Efficiency line IKey efficiency = KeyUtil.number( - () -> getNumberColor(recipeLogic.getHeatScaled()), - recipeLogic.getHeatScaled(), "%"); + getNumberColor(heatScaled), heatScaled, "%"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.efficiency", efficiency)); // Throttle line IKey throttle = KeyUtil.number( - () -> getNumberColor(getThrottle()), - getThrottle(), "%"); + getNumberColor(throttleAmt), + throttleAmt, "%"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_boiler.throttle", throttle)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java index 98c14407d8c..ad4f72c2e5f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityActiveTransformer.java @@ -169,22 +169,24 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.machine.active_transformer.routing") - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { // Max input line IKey maxInputFormatted = KeyUtil.number(TextFormatting.WHITE, - powerInput.getInputVoltage() * powerInput.getInputAmperage(), " EU/t"); + syncer.syncLong(powerInput.getInputVoltage() * powerInput.getInputAmperage()), " EU/t"); list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.active_transformer.max_in", maxInputFormatted)); // Max output line IKey maxOutputFormatted = KeyUtil.number(TextFormatting.WHITE, - powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage(), " EU/t"); + syncer.syncLong(powerOutput.getOutputVoltage() * powerOutput.getOutputAmperage()), + " EU/t"); list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.active_transformer.max_out", maxOutputFormatted)); // Average I/O line - IKey avgIOFormatted = KeyUtil.number(TextFormatting.WHITE, averageIOLastSec, " EU/t"); + IKey avgIOFormatted = KeyUtil.number(TextFormatting.WHITE, syncer.syncLong(averageIOLastSec), + " EU/t"); list.add(KeyUtil.lang(TextFormatting.AQUA, "gregtech.multiblock.active_transformer.average_io", avgIOFormatted)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java index 75d88b392fa..0b1edad8de7 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCleanroom.java @@ -488,11 +488,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(cleanroomLogic.isWorkingEnabled(), cleanroomLogic.isActive()) .addEnergyUsageLine(energyContainer) .addEnergyUsageExactLine(isClean() ? 4 : GTValues.VA[getEnergyTier()]) - .addCustom(list -> { + .addCustom((list, syncer) -> { // Cleanliness status line if (isStructureFormed()) { IKey cleanState; - if (isClean()) { + if (syncer.syncBoolean(isClean())) { // is this method actually synced? cleanState = KeyUtil.lang(TextFormatting.GREEN, "gregtech.multiblock.cleanroom.clean_state", cleanAmount); } else { @@ -511,13 +511,13 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)) - .addCustom(list -> { - if (isStructureFormed() && !isClean()) { + .addCustom((list, syncer) -> { + if (isStructureFormed() && !syncer.syncBoolean(isClean())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.warning_contaminated")); } - if (!cleanroomLogic.isVoltageHighEnough()) { + if (!syncer.syncBoolean(cleanroomLogic.isVoltageHighEnough())) { IKey energyNeeded = IKey.str(GTValues.VNF[cleanroomFilter.getMinTier()]); list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.cleanroom.low_tier", energyNeeded)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java index 78f2f3f6e35..62d05fd2aa2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityCrackingUnit.java @@ -84,12 +84,12 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(textList -> { + .addCustom((textList, syncer) -> { if (!isStructureFormed()) return; // Coil energy discount line IKey energyDiscount = KeyUtil.number(TextFormatting.AQUA, - 100 - 10L * getCoilTier(), "%"); + syncer.syncLong(100 - 10L * getCoilTier()), "%"); IKey base = KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.cracking_unit.energy", diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java index 62d495b86a0..d57007262aa 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityElectricBlastFurnace.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; import gregtech.api.pattern.MultiblockShapeInfo; @@ -80,10 +81,10 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { .addProgressLine(recipeMapWorkable.getProgressPercent()); } - private void addHeatCapacity(KeyManager keyManager) { + private void addHeatCapacity(KeyManager keyManager, UISyncer syncer) { if (isStructureFormed()) { var heatString = KeyUtil.number(TextFormatting.RED, - getCurrentTemperature(), "K"); + syncer.syncInt(getCurrentTemperature()), "K"); keyManager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.blast_furnace.max_temperature", heatString)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index 7f7cefabe3d..b0ac1aa59ec 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -170,9 +170,9 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.work_paused", "gregtech.multiblock.miner.drilling") .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { - if (minerLogic.getDrilledFluid() != null) { + if (syncer.syncBoolean(minerLogic.getDrilledFluid() != null)) { // Fluid name Fluid drilledFluid = minerLogic.getDrilledFluid(); IKey fluidInfo = KeyUtil.fluid(drilledFluid).style(TextFormatting.GREEN); @@ -202,8 +202,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(isStructureFormed() && !drainEnergy(true)) - .addCustom(list -> { - if (isStructureFormed() && minerLogic.isInventoryFull()) { + .addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(minerLogic.isInventoryFull())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java index 99d7c7ec649..80ed75e6ae2 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityHPCA.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.multiblock.ui.KeyManager; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder; import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory; +import gregtech.api.metatileentity.multiblock.ui.UISyncer; import gregtech.api.mui.GTGuiTextures; import gregtech.api.pattern.BlockPattern; import gregtech.api.pattern.FactoryBlockPattern; @@ -21,7 +22,6 @@ import gregtech.api.util.GTUtility; import gregtech.api.util.KeyUtil; import gregtech.api.util.RelativeDirection; -import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; @@ -399,20 +399,22 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.multiblock.idling", "gregtech.multiblock.idling", "gregtech.multiblock.data_bank.providing") - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; // Energy Usage - String voltageName = GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]; - richText.add(KeyUtil.lang(TextFormatting.GRAY, + String voltageName = syncer + .syncString(GTValues.VNF[GTUtility.getTierByVoltage(hpcaHandler.getMaxEUt())]); + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.energy", - TextFormattingUtil.formatNumbers(hpcaHandler.cachedEUt), - TextFormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), + KeyUtil.number(syncer.syncLong(hpcaHandler.cachedEUt)), + KeyUtil.number(syncer.syncLong(hpcaHandler.getMaxEUt())), voltageName)); // Provided Computation - richText.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", - hpcaHandler.cachedCWUt, hpcaHandler.getMaxCWUt())); + manager.add(KeyUtil.lang("gregtech.multiblock.hpca.computation", + syncer.syncInt(hpcaHandler.cachedCWUt), + syncer.syncInt(hpcaHandler.getMaxCWUt()))); }) .addWorkingStatusLine(); } @@ -420,37 +422,35 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(hasNotEnoughEnergy) - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; - if (temperature > 500) { + if (syncer.syncDouble(temperature) > 500) { // Temperature warning - richText.add(KeyUtil.lang(TextFormatting.YELLOW, + manager.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.hpca.warning_temperature")); // Active cooler overdrive warning - richText.add(KeyUtil.lang(TextFormatting.GRAY, + manager.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_temperature_active_cool")); } // Structure warnings - // hpcaHandler.addWarnings(richText); - hpcaHandler.addWarnings2(richText); + hpcaHandler.addWarnings(manager, syncer); }) .addMaintenanceProblemLines(getMaintenanceProblems()); } @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(richText -> { + builder.addCustom((manager, syncer) -> { if (!isStructureFormed()) return; - if (temperature > 1000) { - richText.add(KeyUtil.lang(TextFormatting.RED, + if (syncer.syncDouble(temperature) > 1000) { + manager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_temperature")); } - // hpcaHandler.addErrors(textList); - hpcaHandler.addErrors2(richText); + hpcaHandler.addErrors(manager, syncer); }); } @@ -896,17 +896,17 @@ public void addInfo(IRichTextBuilder textList) { } } - public void addWarnings2(KeyManager keyManager) { + public void addWarnings(KeyManager keyManager, UISyncer syncer) { List warnings = new ArrayList<>(); - if (numBridges > 1) { + if (syncer.syncInt(numBridges) > 1) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_multiple_bridges")); } - if (computationProviders.isEmpty()) { + if (syncer.syncBoolean(computationProviders.isEmpty())) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_no_computation")); } - if (getMaxCoolingDemand() > getMaxCoolingAmount()) { + if (syncer.syncBoolean(getMaxCoolingDemand() > getMaxCoolingAmount())) { warnings.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.hpca.warning_low_cooling")); } @@ -917,9 +917,9 @@ public void addWarnings2(KeyManager keyManager) { } } - public void addErrors2(KeyManager keyManager) { + public void addErrors(KeyManager keyManager, UISyncer syncer) { for (IHPCAComponentHatch component : components) { - if (component.isDamaged()) { + if (syncer.syncBoolean(component.isDamaged())) { keyManager.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.hpca.error_damaged")); return; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index 0a40c20acaa..49ce7b689ed 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -264,18 +264,18 @@ protected MultiblockUIFactory createUIFactory() { protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(minerLogic.isWorkingEnabled(), minerLogic.isActive()) .addEnergyUsageLine(energyContainer) - .addCustom(list -> { + .addCustom((list, syncer) -> { if (isStructureFormed()) { - int workingAreaChunks = this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH; - int workingArea = getWorkingArea(minerLogic.getCurrentRadius()); + int workingAreaChunks = syncer.syncInt(this.minerLogic.getCurrentRadius() * 2 / CHUNK_LENGTH); + int workingArea = syncer.syncInt(getWorkingArea(minerLogic.getCurrentRadius())); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_at")); list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.mining_pos", - minerLogic.getMineX().get(), - minerLogic.getMineY().get(), - minerLogic.getMineZ().get())); + syncer.syncInt(minerLogic.getMineX().get()), + syncer.syncInt(minerLogic.getMineY().get()), + syncer.syncInt(minerLogic.getMineZ().get()))); - if (minerLogic.isChunkMode()) { + if (syncer.syncBoolean(minerLogic.isChunkMode())) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.miner.working_area_chunks", workingAreaChunks, workingAreaChunks)); @@ -284,11 +284,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { workingArea, workingArea)); } - if (minerLogic.isDone()) { + if (syncer.syncBoolean(minerLogic.isDone())) { list.add(KeyUtil.lang(TextFormatting.GREEN, "gregtech.machine.miner.done")); - } else if (minerLogic.isWorking()) { + } else if (syncer.syncBoolean(minerLogic.isWorking())) { list.add(KeyUtil.lang(TextFormatting.GOLD, "gregtech.machine.miner.working")); - } else if (!isWorkingEnabled()) { + } else if (!syncer.syncBoolean(isWorkingEnabled())) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.work_paused")); } } @@ -297,8 +297,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { - if (isStructureFormed() && !drainFluid(false)) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(!drainFluid(false))) { list.add(KeyUtil.lang(TextFormatting.RED, "gregtech.machine.miner.multi.needsfluid")); } }); @@ -307,8 +307,8 @@ protected void configureErrorText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { builder.addLowPowerLine(!drainEnergy(true)); - builder.addCustom(list -> { - if (isStructureFormed() && isInventoryFull) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(isInventoryFull)) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.miner.invfull")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java index 5934e814c99..41ebaeb15a6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityMultiSmelter.java @@ -59,7 +59,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(richText -> { + .addCustom((richText, syncer) -> { if (!isStructureFormed()) return; if (heatingCoilDiscount > 1) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java index b896e78eb0c..4ad8d1fbe4c 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityNetworkSwitch.java @@ -158,8 +158,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { super.configureWarningText(builder); - builder.addCustom(list -> { - if (isStructureFormed() && computationHandler.hasNonBridgingConnections()) { + builder.addCustom((list, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(computationHandler.hasNonBridgingConnections())) { list.add(KeyUtil.lang(TextFormatting.YELLOW, "gregtech.multiblock.computation.non_bridging.detailed")); } }); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPowerSubstation.java index 023b49d1e50..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 -> { - 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)); } } @@ -419,7 +425,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { if (isStructureFormed() && averageInLastSec < averageOutLastSec) { BigInteger timeToDrainSeconds = energyBank.getStored() .divide(BigInteger.valueOf((averageOutLastSec - averageInLastSec) * 20)); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index e70dd905e04..7355e0c91eb 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -120,17 +120,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(richText -> { + .addCustom((manager, syncer) -> { if (!isStructureFormed()) return; // Machine mode text // Shared text components for both states - IKey maxMachinesText = KeyUtil.string(TextFormatting.DARK_PURPLE, - Integer.toString(getMachineLimit())); + IKey maxMachinesText = KeyUtil.number(TextFormatting.DARK_PURPLE, + syncer.syncInt(getMachineLimit())); maxMachinesText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_max", maxMachinesText); - if (logic.activeRecipeMap == null) { + if (syncer.syncBoolean(logic.activeRecipeMap == null)) { // No machines in hatch IKey noneText = KeyUtil.lang(TextFormatting.YELLOW, "gregtech.machine.machine_hatch.machines_none"); @@ -138,32 +138,33 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { "gregtech.machine.machine_hatch.machines", noneText); IKey hoverText1 = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_none_hover"); - richText.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); + manager.add(KeyUtil.setHover(bodyText, hoverText1, maxMachinesText)); } else { // Some amount of machines in hatch - String key = logic.getMachineStack().getTranslationKey(); + String key = syncer.syncString(logic.getMachineStack().getTranslationKey()); IKey mapText = KeyUtil.lang(TextFormatting.DARK_PURPLE, key + ".name"); mapText = KeyUtil.string( TextFormatting.DARK_PURPLE, "%sx %s", - logic.getParallelLimit(), mapText); + syncer.syncInt(logic.getParallelLimit()), mapText); IKey bodyText = KeyUtil.lang(TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines", mapText); - String voltageName = GTValues.VNF[logic.machineTier]; - int amps = logic.getMachineStack().getCount(); + int tier = syncer.syncInt(logic.machineTier); + IKey voltageName = KeyUtil.string(GTValues.VNF[tier]); + int amps = syncer.syncInt(logic.getMachineStack().getCount()); String energyFormatted = TextFormattingUtil - .formatNumbers(GTValues.V[logic.machineTier] * amps); + .formatNumbers(GTValues.V[tier] * amps); IKey hoverText = KeyUtil.lang( TextFormatting.GRAY, "gregtech.machine.machine_hatch.machines_max_eut", energyFormatted, amps, voltageName); - richText.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); + manager.add(KeyUtil.setHover(bodyText, hoverText, maxMachinesText)); } // Hatch locked status - if (isActive()) { - richText.add(KeyUtil.lang(TextFormatting.DARK_RED, + if (syncer.syncBoolean(isActive())) { + manager.add(KeyUtil.lang(TextFormatting.DARK_RED, "gregtech.machine.machine_hatch.locked")); } }) diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java index a0d3815e29a..8734ee35a67 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityPyrolyseOven.java @@ -114,7 +114,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { builder.setWorkingStatus(recipeMapWorkable.isWorkingEnabled(), recipeMapWorkable.isActive()) .addEnergyUsageLine(this.getEnergyContainer()) .addEnergyTierLine(GTUtility.getTierByVoltage(recipeMapWorkable.getMaxVoltage())) - .addCustom(textList -> { + .addCustom((textList, syncer) -> { if (!isStructureFormed()) return; int processingSpeed = coilTier == 0 ? 75 : 50 * (coilTier + 1); diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java index 41b53b3b953..596e7e217a9 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/centralmonitor/MetaTileEntityCentralMonitor.java @@ -309,7 +309,7 @@ protected MultiblockUIFactory createUIFactory() { @Override protected void configureDisplayText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.height", this.height)); if (isStructureFormed()) { @@ -320,7 +320,7 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(list -> { + builder.addCustom((list, syncer) -> { if (isStructureFormed() && !drainEnergy(true)) { list.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.central_monitor.low_power")); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index ee238b69051..8dcd2bd032a 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -86,8 +86,8 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { } builder.addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) - .addCustom(richText -> { - if (isStructureFormed() && recipeLogic.isOxygenBoosted) { + .addCustom((richText, syncer) -> { + if (isStructureFormed() && syncer.syncBoolean(recipeLogic.isOxygenBoosted)) { String key = isExtreme ? "gregtech.multiblock.large_combustion_engine.liquid_oxygen_boosted" : "gregtech.multiblock.large_combustion_engine.oxygen_boosted"; @@ -101,17 +101,17 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { protected void configureErrorText(MultiblockUIBuilder builder) { var recipeLogic = (LargeCombustionEngineWorkableHandler) recipeMapWorkable; - builder.addCustom(keyList -> { + builder.addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - if (checkIntakesObstructed()) { + if (syncer.syncBoolean(checkIntakesObstructed())) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.obstructed")); keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.large_combustion_engine.obstructed.desc")); } - if (!recipeLogic.checkLubricant()) { + if (syncer.syncBoolean(!recipeLogic.checkLubricant())) { keyList.add(KeyUtil.lang(TextFormatting.RED, "gregtech.multiblock.large_combustion_engine.no_lubricant")); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java index e0d82822eb1..87cdd7edd46 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeTurbine.java @@ -124,12 +124,11 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { MultiblockFuelRecipeLogic recipeLogic = (MultiblockFuelRecipeLogic) recipeMapWorkable; builder.setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) .addEnergyProductionLine(getMaxVoltage(), recipeLogic.getRecipeEUt()) - .addCustom(keyList -> { + .addCustom((keyList, syncer) -> { if (!isStructureFormed()) return; - if (getRotorHolder() == null) return; - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); - int totalEfficiency = getRotorHolder().getTotalEfficiency(); + int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); + int totalEfficiency = syncer.syncInt(getRotorTotalEfficiency()); if (rotorEfficiency > 0) { IKey efficiencyInfo = KeyUtil.number(TextFormatting.AQUA, @@ -139,19 +138,39 @@ protected void configureDisplayText(MultiblockUIBuilder builder) { efficiencyInfo)); } }) - // todo fix prev duration being 0 on first ui open .addFuelNeededLine(recipeLogic.getRecipeFluidInputInfo(), recipeLogic.getPreviousRecipeDuration()) .addWorkingStatusLine(); } + private int getRotorEffeciency() { + if (getRotorHolder() != null) { + return getRotorHolder().getRotorEfficiency(); + } + return 0; + } + + private int getRotorTotalEfficiency() { + if (getRotorHolder() != null) { + return getRotorHolder().getTotalEfficiency(); + } + return 0; + } + + private int getRotorDurability() { + if (getRotorHolder() != null) { + return getRotorHolder().getRotorDurabilityPercent(); + } + return 0; + } + @Override protected void configureWarningText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { - if (!isStructureFormed() || getRotorHolder() == null) + builder.addCustom((keyList, syncer) -> { + if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) return; - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); - int rotorDurability = getRotorHolder().getRotorDurabilityPercent(); + int rotorEfficiency = syncer.syncInt(getRotorEffeciency()); + int rotorDurability = syncer.syncInt(getRotorDurability()); if (rotorEfficiency > 0 && rotorDurability <= MIN_DURABILITY_TO_WARN) { keyList.add(KeyUtil.lang(TextFormatting.YELLOW, @@ -163,8 +182,8 @@ protected void configureWarningText(MultiblockUIBuilder builder) { @Override protected void configureErrorText(MultiblockUIBuilder builder) { - builder.addCustom(keyList -> { - if (!isStructureFormed() || getRotorHolder() == null) + builder.addCustom((keyList, syncer) -> { + if (!isStructureFormed() || syncer.syncBoolean(getRotorHolder() == null)) return; if (!isRotorFaceFree()) { @@ -173,7 +192,7 @@ protected void configureErrorText(MultiblockUIBuilder builder) { keyList.add(KeyUtil.lang(TextFormatting.GRAY, "gregtech.multiblock.turbine.obstructed.desc")); } - int rotorEfficiency = getRotorHolder().getRotorEfficiency(); + int rotorEfficiency = syncer.syncInt(getRotorHolder().getRotorEfficiency()); if (rotorEfficiency <= 0) { keyList.add(KeyUtil.lang(TextFormatting.RED,