mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
congress should pass a bill barring me from using a PC ever again
This commit is contained in:
parent
a9c6405f41
commit
b1e2fbbbbc
@ -80,68 +80,8 @@ public class Nodespace {
|
|||||||
|
|
||||||
private static void updatePowerNets() {
|
private static void updatePowerNets() {
|
||||||
|
|
||||||
int timeout = 3_000;
|
|
||||||
|
|
||||||
for(PowerNetMK2 net : activePowerNets) {
|
for(PowerNetMK2 net : activePowerNets) {
|
||||||
|
net.transferPower();
|
||||||
if(net.providerEntries.isEmpty()) continue;
|
|
||||||
if(net.receiverEntries.isEmpty()) continue;
|
|
||||||
|
|
||||||
long timestamp = System.currentTimeMillis();
|
|
||||||
long transferCap = 100_000_000_000_000_00L; // that ought to be enough
|
|
||||||
|
|
||||||
long supply = 0;
|
|
||||||
long demand = 0;
|
|
||||||
|
|
||||||
for(Entry<IEnergyProviderMK2, Long> entry : net.providerEntries.entrySet()) {
|
|
||||||
IEnergyProviderMK2 provider = entry.getKey();
|
|
||||||
if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed());
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Entry<IEnergyReceiverMK2, Long> entry : net.receiverEntries.entrySet()) {
|
|
||||||
IEnergyReceiverMK2 receiver = entry.getKey();
|
|
||||||
if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand += Math.min(receiver.getMaxPower() - receiver.getPower(), receiver.getConnectionSpeed());
|
|
||||||
}
|
|
||||||
|
|
||||||
double drainScale = 1D;
|
|
||||||
|
|
||||||
if(supply > demand) {
|
|
||||||
drainScale = (double) demand / (double) supply;
|
|
||||||
}
|
|
||||||
|
|
||||||
long toTransfer = Math.min(supply, demand);
|
|
||||||
if(toTransfer > transferCap) toTransfer = transferCap;
|
|
||||||
if(toTransfer <= 0) continue;
|
|
||||||
|
|
||||||
//TODO: add caching for the ordered lists
|
|
||||||
List<IEnergyProviderMK2> providers = new ArrayList() {{ addAll(net.providerEntries.keySet()); }};
|
|
||||||
List<IEnergyReceiverMK2> receivers = new ArrayList() {{ addAll(net.receiverEntries.keySet()); }};
|
|
||||||
receivers.sort(COMP);
|
|
||||||
|
|
||||||
int maxIteration = 1000;
|
|
||||||
//TODO: ok this implementation is shit but we can clutch this. add a var for the current receiver index and shift that after each transfer so that transfers are spaced out instead of shit getting priority treatment
|
|
||||||
while(!receivers.isEmpty() && maxIteration > 0) {
|
|
||||||
maxIteration--;
|
|
||||||
|
|
||||||
IEnergyProviderMK2 src = providers.get(0);
|
|
||||||
IEnergyReceiverMK2 dest = receivers.get(0);
|
|
||||||
long toDrain = Math.min((long) (src.getPower() * drainScale), src.getConnectionSpeed());
|
|
||||||
long toFill = Math.min(dest.getMaxPower() - dest.getPower(), dest.getConnectionSpeed());
|
|
||||||
long finalTransfer = Math.min(toDrain, toFill);
|
|
||||||
if(finalTransfer <= 0) {
|
|
||||||
receivers.remove(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
finalTransfer -= dest.transferPower(finalTransfer);
|
|
||||||
src.usePower(finalTransfer);
|
|
||||||
|
|
||||||
toTransfer -= finalTransfer;
|
|
||||||
if(finalTransfer <= 0) {
|
|
||||||
receivers.remove(0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -252,14 +192,4 @@ public class Nodespace {
|
|||||||
this.recentlyChanged = true;
|
this.recentlyChanged = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final ReceiverComparator COMP = new ReceiverComparator();
|
|
||||||
|
|
||||||
public static class ReceiverComparator implements Comparator<IEnergyReceiverMK2> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) {
|
|
||||||
return o2.getPriority().ordinal() - o1.getPriority().ordinal();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,10 +1,12 @@
|
|||||||
package api.hbm.energymk2;
|
package api.hbm.energymk2;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import api.hbm.energymk2.Nodespace.PowerNode;
|
import api.hbm.energymk2.Nodespace.PowerNode;
|
||||||
|
|
||||||
@ -101,4 +103,80 @@ public class PowerNetMK2 {
|
|||||||
this.receiverEntries.clear();
|
this.receiverEntries.clear();
|
||||||
this.providerEntries.clear();
|
this.providerEntries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void transferPower() {
|
||||||
|
|
||||||
|
int timeout = 3_000;
|
||||||
|
|
||||||
|
if(providerEntries.isEmpty()) return;
|
||||||
|
if(receiverEntries.isEmpty()) return;
|
||||||
|
|
||||||
|
long timestamp = System.currentTimeMillis();
|
||||||
|
long transferCap = 100_000_000_000_000_00L; // that ought to be enough
|
||||||
|
|
||||||
|
long supply = 0;
|
||||||
|
long demand = 0;
|
||||||
|
|
||||||
|
for(Entry<IEnergyProviderMK2, Long> entry : providerEntries.entrySet()) {
|
||||||
|
IEnergyProviderMK2 provider = entry.getKey();
|
||||||
|
if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Entry<IEnergyReceiverMK2, Long> entry : receiverEntries.entrySet()) {
|
||||||
|
IEnergyReceiverMK2 receiver = entry.getKey();
|
||||||
|
if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand += Math.min(receiver.getMaxPower() - receiver.getPower(), receiver.getConnectionSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
double drainScale = 1D;
|
||||||
|
|
||||||
|
if(supply > demand) {
|
||||||
|
drainScale = (double) demand / (double) supply;
|
||||||
|
}
|
||||||
|
|
||||||
|
long toTransfer = Math.min(supply, demand);
|
||||||
|
if(toTransfer > transferCap) toTransfer = transferCap;
|
||||||
|
if(toTransfer <= 0) return;
|
||||||
|
|
||||||
|
List<IEnergyProviderMK2> providers = new ArrayList() {{ addAll(providerEntries.keySet()); }};
|
||||||
|
List<IEnergyReceiverMK2> receivers = new ArrayList() {{ addAll(receiverEntries.keySet()); }};
|
||||||
|
receivers.sort(COMP);
|
||||||
|
|
||||||
|
int maxIteration = 1000;
|
||||||
|
|
||||||
|
//how much the current sender/receiver have already sent/received
|
||||||
|
long prevSrc = 0;
|
||||||
|
long prevDest = 0;
|
||||||
|
|
||||||
|
while(!receivers.isEmpty() && !providers.isEmpty() && maxIteration > 0) {
|
||||||
|
maxIteration--;
|
||||||
|
|
||||||
|
IEnergyProviderMK2 src = providers.get(0);
|
||||||
|
IEnergyReceiverMK2 dest = receivers.get(0);
|
||||||
|
|
||||||
|
long toDrain = Math.min((long) (src.getPower() * drainScale) + prevSrc, src.getConnectionSpeed()) - prevSrc;
|
||||||
|
long toFill = Math.min(dest.getMaxPower() - dest.getPower() + prevDest, dest.getConnectionSpeed()) - prevDest;
|
||||||
|
long finalTransfer = Math.min(toDrain, toFill);
|
||||||
|
|
||||||
|
if(toDrain <= 0) { providers.remove(0); prevSrc = 0; continue; }
|
||||||
|
if(toFill <= 0) { receivers.remove(0); prevDest = 0; continue; }
|
||||||
|
|
||||||
|
finalTransfer -= dest.transferPower(finalTransfer);
|
||||||
|
src.usePower(finalTransfer);
|
||||||
|
|
||||||
|
prevSrc += finalTransfer;
|
||||||
|
prevDest += finalTransfer;
|
||||||
|
|
||||||
|
toTransfer -= finalTransfer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final ReceiverComparator COMP = new ReceiverComparator();
|
||||||
|
|
||||||
|
public static class ReceiverComparator implements Comparator<IEnergyReceiverMK2> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) {
|
||||||
|
return o2.getPriority().ordinal() - o1.getPriority().ordinal();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user