aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gtPlusPlus/xmod
diff options
context:
space:
mode:
authorGlease <4586901+Glease@users.noreply.github.com>2022-03-04 23:13:48 +0800
committerGitHub <noreply@github.com>2022-03-04 16:13:48 +0100
commit04f287d6f5f86ce8b492d074ee0f783c38bb0387 (patch)
tree6d2e3cd102a7604bba9ec6c81549a9a2054fb78e /src/main/java/gtPlusPlus/xmod
parent09362b416f3770559669569c0e9519a2973aed62 (diff)
downloadGT5-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')
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/CONTAINER_PowerSubStation.java90
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/GUI_PowerSubStation.java10
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedLong.java54
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/api/gui/SyncedValueManager.java43
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java24
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