diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2022-03-04 23:13:48 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-04 16:13:48 +0100 |
commit | 04f287d6f5f86ce8b492d074ee0f783c38bb0387 (patch) | |
tree | 6d2e3cd102a7604bba9ec6c81549a9a2054fb78e /src/main/java/gtPlusPlus/xmod | |
parent | 09362b416f3770559669569c0e9519a2973aed62 (diff) | |
download | GT5-Unofficial-04f287d6f5f86ce8b492d074ee0f783c38bb0387.tar.gz GT5-Unofficial-04f287d6f5f86ce8b492d074ee0f783c38bb0387.tar.bz2 GT5-Unofficial-04f287d6f5f86ce8b492d074ee0f783c38bb0387.zip |
fix power sub station ui variable desync (#145)
Diffstat (limited to 'src/main/java/gtPlusPlus/xmod')
5 files changed, 120 insertions, 101 deletions
diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/CONTAINER_PowerSubStation.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/CONTAINER_PowerSubStation.java index 94cfa5236d..b00af39d91 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/CONTAINER_PowerSubStation.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/CONTAINER_PowerSubStation.java @@ -11,19 +11,11 @@ import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.*; public class CONTAINER_PowerSubStation extends GT_Container_MultiMachine { - - public long mStoredEU; - public int mStoredEU1; - public int mStoredEU2; - public long mMaxStoredEU; - public int mMaxStoredEU1; - public int mMaxStoredEU2; - public long mAverageEuAdded; - public int mAverageEuAdded1; - public int mAverageEuAdded2; - public long mAverageEuConsumed; - public int mAverageEuConsumed1; - public int mAverageEuConsumed2; + private final SyncedValueManager manager = new SyncedValueManager(21); + public final SyncedLong mStoredEU = manager.allocateLong(); + public final SyncedLong mMaxStoredEU = manager.allocateLong(); + public final SyncedLong mAverageEuAdded = manager.allocateLong(); + public final SyncedLong mAverageEuConsumed = manager.allocateLong(); public CONTAINER_PowerSubStation(final InventoryPlayer aInventoryPlayer, final IGregTechTileEntity aTileEntity) { super(aInventoryPlayer, aTileEntity); @@ -53,73 +45,25 @@ public class CONTAINER_PowerSubStation extends GT_Container_MultiMachine { public void detectAndSendChanges() { super.detectAndSendChanges(); - mStoredEU = mTileEntity.getStoredEU(); - mMaxStoredEU = mTileEntity.getEUCapacity(); - GregtechMetaTileEntity_PowerSubStationController aPSS = (GregtechMetaTileEntity_PowerSubStationController) mTileEntity.getMetaTileEntity(); - mAverageEuAdded = aPSS.getAverageEuAdded(); - mAverageEuConsumed = aPSS.getAverageEuConsumed(); - int[] aStored = MathUtils.splitLongIntoTwoIntegers(mStoredEU); - int[] aMaxStorage = MathUtils.splitLongIntoTwoIntegers(mMaxStoredEU); - int[] aAvgIn = MathUtils.splitLongIntoTwoIntegers(mAverageEuAdded); - int[] aAvgOut = MathUtils.splitLongIntoTwoIntegers(mAverageEuConsumed); - mStoredEU1 = aStored[0]; - mStoredEU2 = aStored[1]; - mMaxStoredEU1 = aMaxStorage[0]; - mMaxStoredEU2 = aMaxStorage[1]; - mAverageEuAdded1 = aAvgIn[0]; - mAverageEuAdded2 = aAvgIn[1]; - mAverageEuConsumed1 = aAvgOut[0]; - mAverageEuConsumed2 = aAvgOut[1]; - - for (Object crafter : this.crafters) { - ICrafting var1 = (ICrafting) crafter; - if (mTimer % 20 == 0) { - var1.sendProgressBarUpdate(this, 21, mStoredEU1); - var1.sendProgressBarUpdate(this, 22, mStoredEU2); - var1.sendProgressBarUpdate(this, 23, mMaxStoredEU1); - var1.sendProgressBarUpdate(this, 24, mMaxStoredEU2); - var1.sendProgressBarUpdate(this, 25, mAverageEuAdded1); - var1.sendProgressBarUpdate(this, 26, mAverageEuAdded2); - var1.sendProgressBarUpdate(this, 27, mAverageEuConsumed1); - var1.sendProgressBarUpdate(this, 28, mAverageEuConsumed2); - } - } + GregtechMetaTileEntity_PowerSubStationController aPSS = (GregtechMetaTileEntity_PowerSubStationController) mTileEntity.getMetaTileEntity(); + mStoredEU.setValue(mTileEntity.getStoredEU()); + mMaxStoredEU.setValue(mTileEntity.getEUCapacity()); + mAverageEuAdded.setValue(aPSS.getAverageEuAdded()); + mAverageEuConsumed.setValue(aPSS.getAverageEuConsumed()); + manager.detectAndSendChanges(this::sendProgressBarUpdate, mTimer); } @SideOnly(Side.CLIENT) @Override public void updateProgressBar(int par1, int par2) { super.updateProgressBar(par1, par2); - switch (par1) { - case 21 : - mStoredEU1 = par2; - break; - case 22 : - mStoredEU2 = par2; - mStoredEU = MathUtils.combineTwoIntegersToLong(mStoredEU1, mStoredEU2); - break; - case 23 : - mMaxStoredEU1 = par2; - break; - case 24 : - mMaxStoredEU2 = par2; - mMaxStoredEU = MathUtils.combineTwoIntegersToLong(mMaxStoredEU1, mMaxStoredEU2); - break; - case 25 : - mAverageEuAdded1 = par2; - break; - case 26 : - mAverageEuAdded2 = par2; - mAverageEuAdded = MathUtils.combineTwoIntegersToLong(mAverageEuAdded1, mAverageEuAdded2); - break; - case 27 : - mAverageEuConsumed1 = par2; - break; - case 28 : - mAverageEuConsumed2 = par2; - mAverageEuConsumed = MathUtils.combineTwoIntegersToLong(mAverageEuConsumed1, mAverageEuConsumed2); - break; + manager.updateProgressBar(par1, par2); + } + + private void sendProgressBarUpdate(int short1, int short2) { + for (Object crafter : this.crafters) { + ((ICrafting) crafter).sendProgressBarUpdate(this, short1, short2); } } } diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GUI_PowerSubStation.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GUI_PowerSubStation.java index f8aaa1792d..e80235565e 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GUI_PowerSubStation.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GUI_PowerSubStation.java @@ -80,13 +80,13 @@ public class GUI_PowerSubStation extends GT_GUIContainerMetaTile_Machine { this.fontRendererObj.drawString("In", 178, 10, 16448255); this.fontRendererObj.drawString("Out", 176, 28, 16448255); - this.fontRendererObj.drawString("Avg In: "+GT_Utility.formatNumbers(this.mPowerContainer.mAverageEuAdded)+" EU", 10, 20, 16448255); - this.fontRendererObj.drawString("Avg Out: "+GT_Utility.formatNumbers(this.mPowerContainer.mAverageEuConsumed)+" EU", 10, 30, 16448255); + this.fontRendererObj.drawString("Avg In: "+GT_Utility.formatNumbers(this.mPowerContainer.mAverageEuAdded.getValue())+" EU", 10, 20, 16448255); + this.fontRendererObj.drawString("Avg Out: "+GT_Utility.formatNumbers(this.mPowerContainer.mAverageEuConsumed.getValue())+" EU", 10, 30, 16448255); - final double tScale2 = MathUtils.findPercentage(this.mPowerContainer.mStoredEU, this.mPowerContainer.mMaxStoredEU); + final double tScale2 = MathUtils.findPercentage(this.mPowerContainer.mStoredEU.getValue(), this.mPowerContainer.mMaxStoredEU.getValue()); final int tScale = (int) (tScale2 * 2.55); this.fontRendererObj.drawString("Stored:", 10, 132, 16448255); - this.fontRendererObj.drawString(GT_Utility.formatNumbers(this.mPowerContainer.mStoredEU) + " EU", 10, 142, Utils.rgbtoHexValue((255 - tScale), (0 + tScale), 0)); + this.fontRendererObj.drawString(GT_Utility.formatNumbers(this.mPowerContainer.mStoredEU.getValue()) + " EU", 10, 142, Utils.rgbtoHexValue((255 - tScale), (0 + tScale), 0)); this.fontRendererObj.drawString(GT_Utility.formatNumbers(tScale2)+"%", 70, 155, 16448255); } @@ -104,7 +104,7 @@ public class GUI_PowerSubStation extends GT_GUIContainerMetaTile_Machine { final int y = (this.height - this.ySize) / 2; this.drawTexturedModalRect(x, y, 0, 0, this.xSize, this.ySize); if (this.mPowerContainer != null) { - final double tScale = MathUtils.findPercentage(this.mPowerContainer.mStoredEU, this.mPowerContainer.mMaxStoredEU) / 100; + final double tScale = MathUtils.findPercentage(this.mPowerContainer.mStoredEU.getValue(), this.mPowerContainer.mMaxStoredEU.getValue()) / 100; this.drawTexturedModalRect(x + 5, y + 156, 0, 251, Math.min(147, (int) (tScale * 148.0)), 5); // A1 diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedLong.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedLong.java new file mode 100644 index 0000000000..4430631e07 --- /dev/null +++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedLong.java @@ -0,0 +1,54 @@ +package gtPlusPlus.xmod.gregtech.api.gui; + +import gtPlusPlus.xmod.gregtech.api.gui.SyncedValueManager.SendChanges; + +/** + * A variable of long type that is automatically synchronized between client and server correctly. + * + * @author glee8e + */ +class SyncedLong { + private final int index; + private long value; + private final short[] pieces = new short[4]; + private int received; + + private boolean dirty = true; + + SyncedLong(int index) { + this.index = index; + } + + public long getValue() { + return value; + } + + public void setValue(long value) { + if (this.value != value) + dirty = true; + this.value = value; + } + + void detectAndSendChanges(SendChanges func, int timer) { + if (dirty || (timer & 0xff) == 0) { + for (int i = 0; i < 4; i++) { + func.sendProgressBarUpdate(index + i, (int) ((value >> (16 * i)) & Short.MIN_VALUE)); + } + dirty = false; + } + } + + boolean updateProgressBar(int short1, int short2) { + int offset = short1 - index; + if (offset >= 0 && offset < 4) { + pieces[offset] = (short) short2; + received |= (1 << offset); + if (received == 0b1111) { + value = ((long) pieces[0]) | ((long) pieces[1] << 16) | ((long) pieces[2] << 32) | ((long) pieces[3] << 48); + received = 0; + } + return true; + } + return false; + } +} diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedValueManager.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedValueManager.java new file mode 100644 index 0000000000..ecf591698b --- /dev/null +++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedValueManager.java @@ -0,0 +1,43 @@ +package gtPlusPlus.xmod.gregtech.api.gui; + +import java.util.ArrayList; +import java.util.List; + +/** + * A manager for managing synchronized variables. Handles large data type splitting and merging for you <b>correctly</b>. + * + * @author glee8e + */ +class SyncedValueManager { + private int offset; + private final List<SyncedLong> longs = new ArrayList<>(); + + SyncedValueManager(int offset) { + this.offset = offset; + } + + public SyncedLong allocateLong() { + SyncedLong ret = new SyncedLong(offset); + offset += 4; + longs.add(ret); + return ret; + } + + public void detectAndSendChanges(SendChanges func, int timer) { + for (SyncedLong val : longs) { + val.detectAndSendChanges(func, timer); + } + } + + + public void updateProgressBar(int short1, int short2) { + for (SyncedLong val : longs) { + if (val.updateProgressBar(short1, short2)) return; + } + } + + @FunctionalInterface + public interface SendChanges { + void sendProgressBarUpdate(int short1, int short2); + } +} diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java index 344b7f710a..133f8d4f7e 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java @@ -1,9 +1,6 @@ package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; import static gregtech.api.util.GT_StructureUtility.ofHatchAdderOptional; @@ -288,25 +285,6 @@ public class GregtechMetaTileEntity_PowerSubStationController extends GregtechMe return STRUCTURE_DEFINITION; } - public static <T> IStructureElement<T> onlyIf(Predicate<? super T> predicate, IStructureElement<? super T> downstream) { - return new IStructureElement<T>() { - @Override - public boolean check(T t, World world, int x, int y, int z) { - return predicate.test(t) && downstream.check(t, world, x, y, z); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - return predicate.test(t) && downstream.spawnHint(t, world, x, y, z, trigger); - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - return predicate.test(t) && downstream.placeBlock(t, world, x, y, z, trigger); - } - }; - } - public static <T> IStructureElement<T> ofCell(int aIndex) { return new IStructureElement<T>() { @Override |