1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Add overflow protection (untested)

This commit is contained in:
JustAHuman-xD 2023-02-26 06:28:27 -06:00
parent ddb7ebd134
commit 34905ebffa

View File

@ -157,7 +157,9 @@ public class EnergyNet extends Network implements HologramOwner {
if (connectorNodes.isEmpty() && terminusNodes.isEmpty()) {
updateHologram(b, "&4No Energy Network found");
} else {
int supply = tickAllGenerators(timestamp::getAndAdd) + tickAllCapacitors();
int generatorsSupply = tickAllGenerators(timestamp::getAndAdd);
int capacitorsSupply = tickAllCapacitors();
int supply = overflowSafeAddition(generatorsSupply, capacitorsSupply);
int remainingEnergy = supply;
int demand = 0;
@ -245,7 +247,7 @@ public class EnergyNet extends Network implements HologramOwner {
int energy = provider.getGeneratedOutput(loc, data);
if (provider.isChargeable()) {
energy += provider.getCharge(loc, data);
energy = overflowSafeAddition(energy, provider.getCharge(loc, data));
}
if (provider.willExplode(loc, data)) {
@ -257,7 +259,7 @@ public class EnergyNet extends Network implements HologramOwner {
loc.getWorld().createExplosion(loc, 0F, false);
});
} else {
supply += energy;
supply = overflowSafeAddition(supply, energy);
}
} catch (Exception | LinkageError throwable) {
explodedBlocks.add(loc);
@ -280,12 +282,23 @@ public class EnergyNet extends Network implements HologramOwner {
int supply = 0;
for (Map.Entry<Location, EnergyNetComponent> entry : capacitors.entrySet()) {
supply += entry.getValue().getCharge(entry.getKey());
supply = overflowSafeAddition(supply, entry.getValue().getCharge(entry.getKey()));
}
return supply;
}
/**
* This detects if 2 integers will overflow and if they will, returns {@link Integer#MAX_VALUE}
* @param i1 the first integer
* @param i2 the second integer
* @return {@link Integer#MAX_VALUE} if overflow detected else the sum of i1 and i2
*/
private int overflowSafeAddition(int i1, int i2) {
boolean willOverflow = (i1 == Integer.MAX_VALUE || i2 == Integer.MAX_VALUE) || i1 >= 0 ? i2 > Integer.MAX_VALUE - i1 : i2 < Integer.MIN_VALUE - i1;
return willOverflow ? Integer.MAX_VALUE : i1 + i2;
}
private void updateHologram(@Nonnull Block b, double supply, double demand) {
if (demand > supply) {
String netLoss = NumberUtils.getCompactDouble(demand - supply);