diff --git a/src/main/java/api/hbm/energy/IEnergyConnector.java b/src/main/java/api/hbm/energy/IEnergyConnector.java index a935a42c2..a560a6737 100644 --- a/src/main/java/api/hbm/energy/IEnergyConnector.java +++ b/src/main/java/api/hbm/energy/IEnergyConnector.java @@ -107,4 +107,14 @@ public interface IEnergyConnector extends ILoadedTile { Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); return vec; } + + public default ConnectionPriority getPriority() { + return ConnectionPriority.NORMAL; + } + + public enum ConnectionPriority { + LOW, + NORMAL, + HIGH + } } diff --git a/src/main/java/api/hbm/energy/PowerNet.java b/src/main/java/api/hbm/energy/PowerNet.java index da1edbdf6..be5194fb9 100644 --- a/src/main/java/api/hbm/energy/PowerNet.java +++ b/src/main/java/api/hbm/energy/PowerNet.java @@ -6,6 +6,7 @@ import java.util.List; import com.hbm.config.GeneralConfig; +import api.hbm.energy.IEnergyConnector.ConnectionPriority; import net.minecraft.tileentity.TileEntity; /** @@ -135,33 +136,48 @@ public class PowerNet implements IPowerNet { if(this.subscribers.isEmpty()) return power; - List subList = new ArrayList(subscribers); + ConnectionPriority[] priorities = new ConnectionPriority[] {ConnectionPriority.HIGH, ConnectionPriority.NORMAL, ConnectionPriority.LOW}; - List weight = new ArrayList(); - long totalReq = 0; - - for(IEnergyConnector con : subList) { - long req = con.getTransferWeight(); - weight.add(req); - totalReq += req; + for(ConnectionPriority p : priorities) { + + List subList = new ArrayList(); + subscribers.forEach(x -> { + if(x.getPriority() == p) { + subList.add(x); + } + }); + + if(subList.isEmpty()) + continue; + + List weight = new ArrayList(); + long totalReq = 0; + + for(IEnergyConnector con : subList) { + long req = con.getTransferWeight(); + weight.add(req); + totalReq += req; + } + + if(totalReq == 0) + continue; + + long totalGiven = 0; + + for(int i = 0; i < subList.size(); i++) { + IEnergyConnector con = subList.get(i); + long req = weight.get(i); + double fraction = (double)req / (double)totalReq; + + long given = (long) Math.floor(fraction * power); + + totalGiven += (given - con.transferPower(given)); + } + + power -= totalGiven; } - if(totalReq == 0) - return power; - - long totalGiven = 0; - - for(int i = 0; i < subList.size(); i++) { - IEnergyConnector con = subList.get(i); - long req = weight.get(i); - double fraction = (double)req / (double)totalReq; - - long given = (long) Math.floor(fraction * power); - - totalGiven += (given - con.transferPower(given)); - } - - return power - totalGiven; + return power; } @Override diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 15f788d35..4674a414f 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -120,7 +120,7 @@ public class AssemblerRecipes { ComparableStack compStack = ItemAssemblyTemplate.readType(stack); if(compStack != null) { AStack[] ret = recipes.get(compStack); - return Arrays.asList(ret); + return ret == null ? null : Arrays.asList(ret); } //LEGACY @@ -131,7 +131,7 @@ public class AssemblerRecipes { if(out != null) { ComparableStack comp = new ComparableStack(out); AStack[] ret = recipes.get(comp); - return Arrays.asList(ret); + return ret == null ? null : Arrays.asList(ret); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index 156a96374..f15a75ae1 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -8,6 +8,7 @@ import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyConductor; import api.hbm.energy.IEnergyConnector; import api.hbm.energy.IEnergyUser; +import api.hbm.energy.IEnergyConnector.ConnectionPriority; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -302,6 +303,11 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public void setPower(long power) { this.power = power; } + + @Override + public ConnectionPriority getPriority() { + return ConnectionPriority.LOW; + } // do some opencomputer stuff @Override diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java index fed8cadac..a9a501152 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -16,6 +16,8 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public float prevRotation = 0F; public float rotation = 0F; + public static final long maxTransfer = 10_000_000_000_000_000L; + @Override public void updateEntity() { @@ -68,7 +70,7 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { if(te instanceof IEnergyConnector) { IEnergyConnector con = (IEnergyConnector) te; - long max = 10_000_000_000_000_000L; + long max = maxTransfer; long toTransfer = Math.min(max, this.power); long remainder = this.power - toTransfer; this.power = toTransfer; @@ -108,6 +110,11 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public long getMaxPower() { return Long.MAX_VALUE; } + + @Override + public long getTransferWeight() { + return Math.min(Math.max(this.getMaxPower() - getPower(), 0), maxTransfer); + } public float getSpeed() { return (float) Math.pow(Math.log(power * 0.75 + 1) * 0.05F, 5); @@ -127,7 +134,7 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { // override the name because when connecting the machine to opencomputers it's gonna say "ntm_energy_storage" @Override - public String getComponentName() { - return "ntm_fensu"; + public String getComponentName() { + return "ntm_fensu"; } }