1818 */
1919package dev .technici4n .moderndynamics .network .mienergy ;
2020
21+ import com .google .common .base .Preconditions ;
2122import dev .technici4n .moderndynamics .network .NetworkCache ;
2223import dev .technici4n .moderndynamics .network .NetworkNode ;
2324import dev .technici4n .moderndynamics .network .energy .EnergyCache ;
2728import net .neoforged .neoforge .energy .IEnergyStorage ;
2829
2930public class MIEnergyCache extends NetworkCache <MIEnergyHost , MIEnergyCache > {
30- private int energy = 0 ;
31- private int maxEnergy = 0 ;
31+ private long energy = 0 ;
32+ private long maxEnergy = 0 ;
3233
3334 protected MIEnergyCache (ServerLevel level , List <NetworkNode <MIEnergyHost , MIEnergyCache >> networkNodes ) {
3435 super (level , networkNodes );
@@ -39,8 +40,8 @@ protected void doCombine() {
3940 energy = maxEnergy = 0 ;
4041
4142 for (var node : nodes ) {
42- energy += node .getHost ().getEnergy ();
43- maxEnergy += node .getHost ().getMaxEnergy ();
43+ energy = saturatedSum ( energy , node .getHost ().getEnergy () );
44+ maxEnergy = saturatedSum ( maxEnergy , node .getHost ().getMaxEnergy () );
4445 }
4546 }
4647
@@ -74,9 +75,21 @@ protected void doTick() {
7475
7576 var tier = nodes .get (0 ).getHost ().tier ;
7677
78+ // tier.getMax() is an int and energy is unsigned, so casting to (int) is safe
7779 // Extract
78- energy += EnergyCache .transferForTargets (IEnergyStorage ::extractEnergy , storages , Math .min (maxEnergy - energy , tier .getMax ()));
80+ energy += EnergyCache .transferForTargets (IEnergyStorage ::extractEnergy , storages , ( int ) Math .min (maxEnergy - energy , tier .getMax ()));
7981 // Insert
80- energy -= EnergyCache .transferForTargets (IEnergyStorage ::receiveEnergy , storages , Math .min (energy , tier .getMax ()));
82+ energy -= EnergyCache .transferForTargets (IEnergyStorage ::receiveEnergy , storages , (int ) Math .min (energy , tier .getMax ()));
83+ }
84+
85+ // Energy is unsigned. Hence we handle only one case of satured addition (same sign)
86+ private static long saturatedSum (long a , long b ) {
87+ Preconditions .checkArgument (a >= 0 , "a >= 0" );
88+ Preconditions .checkArgument (b >= 0 , "b >= 0" );
89+ var sum = a + b ;
90+ if (sum < a || sum < b ) {
91+ return Long .MAX_VALUE ;
92+ }
93+ return sum ;
8194 }
8295}
0 commit comments