Merge branch 'HbmMods:master' into master

This commit is contained in:
KellenHurrey 2025-03-13 21:39:31 -07:00 committed by GitHub
commit 86a805bd92
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 130 additions and 14 deletions

View File

@ -32,4 +32,6 @@
* Fixed all missing texture errors that appear in the startup log * Fixed all missing texture errors that appear in the startup log
* Potentially fixed a crash with mekanism during the recipe change phase * Potentially fixed a crash with mekanism during the recipe change phase
* Removed the coke to heavy oil recipe for allowing infinite oil loops * Removed the coke to heavy oil recipe for allowing infinite oil loops
* Coke to syngas and coalgas recipes should be fine though, so they stay * Coke to syngas and coalgas recipes should be fine though, so they stay
* Potentially fixed another issue regarding NPCs firing belt-fed guns
* Chunk-loading drones may or may not be fixed

View File

@ -1,7 +1,6 @@
package api.hbm.energymk2; package api.hbm.energymk2;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
@ -154,14 +153,4 @@ public class PowerNetMK2 extends NodeNet<IEnergyReceiverMK2, IEnergyProviderMK2,
return power - energyUsed; return power - energyUsed;
} }
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();
}
}
} }

View File

@ -1,13 +1,93 @@
package api.hbm.fluidmk2; package api.hbm.fluidmk2;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.uninos.NodeNet; import com.hbm.uninos.NodeNet;
import com.hbm.util.Tuple.Pair;
import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority;
public class FluidNetMK2 extends NodeNet<IFluidReceiverMK2, IFluidProviderMK2, FluidNode> { public class FluidNetMK2 extends NodeNet<IFluidReceiverMK2, IFluidProviderMK2, FluidNode> {
public long fluidTracker = 0L; public long fluidTracker = 0L;
protected static int timeout = 3_000;
protected static long currentTime = 0;
protected FluidType type;
public FluidNetMK2(FluidType type) {
this.type = type;
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) providers[i] = new ArrayList();
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) for(int j = 0; j < ConnectionPriority.values().length; j++) receivers[i][j] = new ArrayList();
}
@Override public void resetTrackers() { this.fluidTracker = 0; }
@Override @Override
public void update() { public void update() {
if(providerEntries.isEmpty()) return;
if(receiverEntries.isEmpty()) return;
currentTime = System.currentTimeMillis();
setupFluidProviders();
setupFluidReceivers();
cleanUp();
}
//this sucks ass, but it makes the code just a smidge more structured
public long[] fluidAvailable = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
public List<Pair<IFluidProviderMK2, Long>>[] providers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1];
public long[][] fluidDemand = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length];
public List<Pair<IFluidReceiverMK2, Long>>[][] receivers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length];
public void setupFluidProviders() {
Iterator<Entry<IFluidProviderMK2, Long>> iterator = providerEntries.entrySet().iterator();
while(iterator.hasNext()) {
Entry<IFluidProviderMK2, Long> entry = iterator.next();
if(currentTime - entry.getValue() > timeout) { iterator.remove(); continue; }
IFluidProviderMK2 provider = entry.getKey();
int[] pressureRange = provider.getProvidingPressureRange(type);
for(int p = pressureRange[0]; p <= pressureRange[1]; p++) {
long available = Math.min(provider.getFluidAvailable(type, p), provider.getProviderSpeed(type, p));
providers[p].add(new Pair(provider, available));
fluidAvailable[p] += available;
}
}
}
public void setupFluidReceivers() {
Iterator<Entry<IFluidReceiverMK2, Long>> iterator = receiverEntries.entrySet().iterator();
while(iterator.hasNext()) {
Entry<IFluidReceiverMK2, Long> entry = iterator.next();
if(currentTime - entry.getValue() > timeout) { iterator.remove(); continue; }
IFluidReceiverMK2 receiver = entry.getKey();
int[] pressureRange = receiver.getReceivingPressureRange(type);
for(int p = pressureRange[0]; p <= pressureRange[1]; p++) {
long required = Math.min(receiver.getDemand(type, p), receiver.getReceiverSpeed(type, p));
int priority = receiver.getFluidPriority().ordinal();
receivers[p][priority].add(new Pair(receiver, required));
fluidDemand[p][priority] += required;
}
}
}
public void cleanUp() {
for(int i = 0; i < IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1; i++) {
fluidAvailable[i] = 0;
providers[i].clear();
for(int j = 0; j < ConnectionPriority.values().length; j++) {
fluidDemand[i][j] = 0;
receivers[i][j].clear();
}
}
} }
} }

View File

@ -7,4 +7,6 @@ public interface IFluidProviderMK2 extends IFluidUserMK2 {
public void useUpFluid(FluidType type, int pressure, long amount); public void useUpFluid(FluidType type, int pressure, long amount);
public default long getProviderSpeed(FluidType type, int pressure) { return 1_000_000_000; } public default long getProviderSpeed(FluidType type, int pressure) { return 1_000_000_000; }
public long getFluidAvailable(FluidType type, int pressure); public long getFluidAvailable(FluidType type, int pressure);
public default int[] getProvidingPressureRange(FluidType type) { return DEFAULT_PRESSURE_RANGE; }
} }

View File

@ -22,6 +22,8 @@ public interface IFluidReceiverMK2 extends IFluidUserMK2 {
public default long getReceiverSpeed(FluidType type, int pressure) { return 1_000_000_000; } public default long getReceiverSpeed(FluidType type, int pressure) { return 1_000_000_000; }
public long getDemand(FluidType type, int pressure); public long getDemand(FluidType type, int pressure);
public default int[] getReceivingPressureRange(FluidType type) { return DEFAULT_PRESSURE_RANGE; }
public default void trySubscribe(FluidType type, World world, DirPos pos) { trySubscribe(type, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } public default void trySubscribe(FluidType type, World world, DirPos pos) { trySubscribe(type, world, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); }
public default void trySubscribe(FluidType type, World world, int x, int y, int z, ForgeDirection dir) { public default void trySubscribe(FluidType type, World world, int x, int y, int z, ForgeDirection dir) {

View File

@ -46,6 +46,21 @@ public interface IFluidStandardReceiverMK2 extends IFluidReceiverMK2 {
return amount; return amount;
} }
@Override
public default int[] getReceivingPressureRange(FluidType type) {
int lowest = HIGHEST_VALID_PRESSURE;
int highest = 0;
for(FluidTank tank : getReceivingTanks()) {
if(tank.getTankType() == type) {
if(tank.getPressure() < lowest) lowest = tank.getPressure();
if(tank.getPressure() > highest) highest = tank.getPressure();
}
}
return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE;
}
@Override @Override
public default long getReceiverSpeed(FluidType type, int pressure) { public default long getReceiverSpeed(FluidType type, int pressure) {
return 1_000_000_000; return 1_000_000_000;

View File

@ -108,6 +108,21 @@ public interface IFluidStandardSenderMK2 extends IFluidProviderMK2 {
} }
} }
@Override
public default int[] getProvidingPressureRange(FluidType type) {
int lowest = HIGHEST_VALID_PRESSURE;
int highest = 0;
for(FluidTank tank : getSendingTanks()) {
if(tank.getTankType() == type) {
if(tank.getPressure() < lowest) lowest = tank.getPressure();
if(tank.getPressure() > highest) highest = tank.getPressure();
}
}
return lowest <= highest ? new int[] {lowest, highest} : DEFAULT_PRESSURE_RANGE;
}
@Override @Override
public default long getProviderSpeed(FluidType type, int pressure) { public default long getProviderSpeed(FluidType type, int pressure) {
return 1_000_000_000; return 1_000_000_000;

View File

@ -4,6 +4,9 @@ import com.hbm.inventory.fluid.tank.FluidTank;
public interface IFluidUserMK2 extends IFluidConnectorMK2 { public interface IFluidUserMK2 extends IFluidConnectorMK2 {
public static final int HIGHEST_VALID_PRESSURE = 5;
public static final int[] DEFAULT_PRESSURE_RANGE = new int[] {0, 0};
public static final boolean particleDebug = false; public static final boolean particleDebug = false;
public FluidTank[] getAllTanks(); public FluidTank[] getAllTanks();

View File

@ -256,7 +256,7 @@ public class FluidType {
return this.stringId; return this.stringId;
} }
protected INetworkProvider<FluidNetMK2> NETWORK_PROVIDER = new FluidNetProvider(); protected INetworkProvider<FluidNetMK2> NETWORK_PROVIDER = new FluidNetProvider(this);
public INetworkProvider<FluidNetMK2> getNetworkProvider() { public INetworkProvider<FluidNetMK2> getNetworkProvider() {
return NETWORK_PROVIDER; return NETWORK_PROVIDER;

View File

@ -28,6 +28,7 @@ public class MagazineBelt implements IMagazine<BulletConfig> {
@Override @Override
public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) { public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) {
if(inventory == null) return;
BulletConfig first = this.getFirstConfig(stack, inventory); BulletConfig first = this.getFirstConfig(stack, inventory);

View File

@ -1,13 +1,20 @@
package com.hbm.uninos.networkproviders; package com.hbm.uninos.networkproviders;
import com.hbm.inventory.fluid.FluidType;
import com.hbm.uninos.INetworkProvider; import com.hbm.uninos.INetworkProvider;
import api.hbm.fluidmk2.FluidNetMK2; import api.hbm.fluidmk2.FluidNetMK2;
public class FluidNetProvider implements INetworkProvider<FluidNetMK2> { public class FluidNetProvider implements INetworkProvider<FluidNetMK2> {
protected FluidType type;
public FluidNetProvider(FluidType type) {
this.type = type;
}
@Override @Override
public FluidNetMK2 provideNetwork() { public FluidNetMK2 provideNetwork() {
return new FluidNetMK2(); return new FluidNetMK2(type);
} }
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB