diff --git a/changelog b/changelog index d4a2c8ae3..3ba8a629b 100644 --- a/changelog +++ b/changelog @@ -32,4 +32,6 @@ * Fixed all missing texture errors that appear in the startup log * Potentially fixed a crash with mekanism during the recipe change phase * 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 \ No newline at end of file + * 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 \ No newline at end of file diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index b46b66635..24be5194a 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -1,7 +1,6 @@ package api.hbm.energymk2; import java.util.ArrayList; -import java.util.Comparator; import java.util.Iterator; import java.util.List; @@ -154,14 +153,4 @@ public class PowerNetMK2 extends NodeNet { - - @Override - public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) { - return o2.getPriority().ordinal() - o1.getPriority().ordinal(); - } - } } diff --git a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java index b5c70dd75..640f7cbab 100644 --- a/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java +++ b/src/main/java/api/hbm/fluidmk2/FluidNetMK2.java @@ -1,13 +1,93 @@ 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.util.Tuple.Pair; + +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; public class FluidNetMK2 extends NodeNet { 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 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>[] providers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1]; + public long[][] fluidDemand = new long[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length]; + public List>[][] receivers = new ArrayList[IFluidUserMK2.HIGHEST_VALID_PRESSURE + 1][ConnectionPriority.values().length]; + + public void setupFluidProviders() { + Iterator> iterator = providerEntries.entrySet().iterator(); + + while(iterator.hasNext()) { + Entry 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> iterator = receiverEntries.entrySet().iterator(); + + while(iterator.hasNext()) { + Entry 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(); + } + } } } diff --git a/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java index dc50f6e28..190ed8a9b 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidProviderMK2.java @@ -7,4 +7,6 @@ public interface IFluidProviderMK2 extends IFluidUserMK2 { public void useUpFluid(FluidType type, int pressure, long amount); public default long getProviderSpeed(FluidType type, int pressure) { return 1_000_000_000; } public long getFluidAvailable(FluidType type, int pressure); + + public default int[] getProvidingPressureRange(FluidType type) { return DEFAULT_PRESSURE_RANGE; } } diff --git a/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java index 551d12e66..55bdb1372 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidReceiverMK2.java @@ -22,6 +22,8 @@ public interface IFluidReceiverMK2 extends IFluidUserMK2 { public default long getReceiverSpeed(FluidType type, int pressure) { return 1_000_000_000; } 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, int x, int y, int z, ForgeDirection dir) { diff --git a/src/main/java/api/hbm/fluidmk2/IFluidStandardReceiverMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidStandardReceiverMK2.java index 6516c9808..68bab697f 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidStandardReceiverMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidStandardReceiverMK2.java @@ -46,6 +46,21 @@ public interface IFluidStandardReceiverMK2 extends IFluidReceiverMK2 { 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 public default long getReceiverSpeed(FluidType type, int pressure) { return 1_000_000_000; diff --git a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java index ca2fa6b77..2a1a3ce43 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidStandardSenderMK2.java @@ -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 public default long getProviderSpeed(FluidType type, int pressure) { return 1_000_000_000; diff --git a/src/main/java/api/hbm/fluidmk2/IFluidUserMK2.java b/src/main/java/api/hbm/fluidmk2/IFluidUserMK2.java index b989e99cf..a39f40889 100644 --- a/src/main/java/api/hbm/fluidmk2/IFluidUserMK2.java +++ b/src/main/java/api/hbm/fluidmk2/IFluidUserMK2.java @@ -4,6 +4,9 @@ import com.hbm.inventory.fluid.tank.FluidTank; 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 FluidTank[] getAllTanks(); diff --git a/src/main/java/com/hbm/inventory/fluid/FluidType.java b/src/main/java/com/hbm/inventory/fluid/FluidType.java index 91bf70786..6f01bf1f0 100644 --- a/src/main/java/com/hbm/inventory/fluid/FluidType.java +++ b/src/main/java/com/hbm/inventory/fluid/FluidType.java @@ -256,7 +256,7 @@ public class FluidType { return this.stringId; } - protected INetworkProvider NETWORK_PROVIDER = new FluidNetProvider(); + protected INetworkProvider NETWORK_PROVIDER = new FluidNetProvider(this); public INetworkProvider getNetworkProvider() { return NETWORK_PROVIDER; diff --git a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java index 46c91c4ba..957b1b4b3 100644 --- a/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java +++ b/src/main/java/com/hbm/items/weapon/sedna/mags/MagazineBelt.java @@ -28,6 +28,7 @@ public class MagazineBelt implements IMagazine { @Override public void useUpAmmo(ItemStack stack, IInventory inventory, int amount) { + if(inventory == null) return; BulletConfig first = this.getFirstConfig(stack, inventory); diff --git a/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java b/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java index 95fa480a8..a4f5e4918 100644 --- a/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java +++ b/src/main/java/com/hbm/uninos/networkproviders/FluidNetProvider.java @@ -1,13 +1,20 @@ package com.hbm.uninos.networkproviders; +import com.hbm.inventory.fluid.FluidType; import com.hbm.uninos.INetworkProvider; import api.hbm.fluidmk2.FluidNetMK2; public class FluidNetProvider implements INetworkProvider { + + protected FluidType type; + + public FluidNetProvider(FluidType type) { + this.type = type; + } @Override public FluidNetMK2 provideNetwork() { - return new FluidNetMK2(); + return new FluidNetMK2(type); } } diff --git a/src/main/resources/assets/hbm/textures/gui/machine/gui_weapon_modifier.png b/src/main/resources/assets/hbm/textures/gui/machine/gui_weapon_modifier.png new file mode 100644 index 000000000..076e7a978 Binary files /dev/null and b/src/main/resources/assets/hbm/textures/gui/machine/gui_weapon_modifier.png differ