From b65abb526fc201b1509473343aeb9341f35f544f Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 20 Mar 2024 21:07:13 +0100 Subject: [PATCH 01/48] i can taste colors --- .../hbm/energymk2/IEnergyConductorMK2.java | 8 ++ .../hbm/energymk2/IEnergyConnectorMK2.java | 27 +++++++ .../api/hbm/energymk2/IEnergyReceiverMK2.java | 79 +++++++++++++++++++ .../java/api/hbm/energymk2/Nodespace.java | 6 ++ .../java/api/hbm/energymk2/PowerNetMK2.java | 21 +++++ .../java/api/hbm/energymk2/package-info.java | 33 ++++++++ 6 files changed, 174 insertions(+) create mode 100644 src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java create mode 100644 src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java create mode 100644 src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java create mode 100644 src/main/java/api/hbm/energymk2/Nodespace.java create mode 100644 src/main/java/api/hbm/energymk2/PowerNetMK2.java create mode 100644 src/main/java/api/hbm/energymk2/package-info.java diff --git a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java new file mode 100644 index 000000000..8307d4339 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java @@ -0,0 +1,8 @@ +package api.hbm.energymk2; + +public interface IEnergyConductorMK2 extends IEnergyConnectorMK2 { + + public PowerNetMK2 getPowerNet(); + + public void setPowerNet(PowerNetMK2 network); +} diff --git a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java new file mode 100644 index 000000000..77e84b007 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java @@ -0,0 +1,27 @@ +package api.hbm.energymk2; + +import com.hbm.util.CompatEnergyControl; + +import api.hbm.energy.ILoadedTile; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyConnectorMK2 extends ILoadedTile { + + /** + * Whether the given side can be connected to + * dir refers to the side of this block, not the connecting block doing the check + * @param dir + * @return + */ + public default boolean canConnect(ForgeDirection dir) { + return dir != ForgeDirection.UNKNOWN; + } + public long getPower(); + public long getMaxPower(); + + public default void provideInfoForEC(NBTTagCompound data) { + data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); + data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); + } +} diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java new file mode 100644 index 000000000..79992c916 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -0,0 +1,79 @@ +package api.hbm.energymk2; + +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + +import api.hbm.energy.IEnergyConductor; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { + + public long transferPower(long power); + + public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { + + TileEntity te = world.getTileEntity(x, y, z); + boolean red = false; + + /*if(te instanceof IEnergyConductor) { + IEnergyConductor con = (IEnergyConductor) te; + + if(!con.canConnect(dir.getOpposite())) + return; + + if(con.getPowerNet() != null && !con.getPowerNet().isSubscribed(this)) + con.getPowerNet().subscribe(this); + + if(con.getPowerNet() != null) + red = true; + }*/ + + if(particleDebug) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "network"); + data.setString("mode", "power"); + double posX = x + 0.5 + dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + double posY = y + 0.5 + dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + double posZ = z + 0.5 + dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1)); + data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1)); + data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1)); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + } + } + + public default void tryUnsubscribe(World world, int x, int y, int z) { + + TileEntity te = world.getTileEntity(x, y, z); + + if(te instanceof IEnergyConductor) { + IEnergyConductor con = (IEnergyConductor) te; + + /*if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) + con.getPowerNet().unsubscribe(this);*/ + } + } + + public static final boolean particleDebug = false; + + public default Vec3 getDebugParticlePos() { + TileEntity te = (TileEntity) this; + 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/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java new file mode 100644 index 000000000..568f2b423 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -0,0 +1,6 @@ +package api.hbm.energymk2; + +public class Nodespace { + + //we're gonna figure this shit out as we go along +} diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java new file mode 100644 index 000000000..603284af6 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -0,0 +1,21 @@ +package api.hbm.energymk2; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class PowerNetMK2 { + + private boolean valid = true; + private HashMap links = new HashMap(); + private HashMap proxies = new HashMap(); + private List subscribers = new ArrayList(); + + public boolean isSubscribed(IEnergyReceiverMK2 receiver) { + return false; //TBI + } + + public void subscribe(IEnergyReceiverMK2 receiver) { + //TBI + } +} diff --git a/src/main/java/api/hbm/energymk2/package-info.java b/src/main/java/api/hbm/energymk2/package-info.java new file mode 100644 index 000000000..8bb153735 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/package-info.java @@ -0,0 +1,33 @@ +/** + * + */ +/** + * @author hbm + * + */ +package api.hbm.energymk2; + +// i have snorted two lines of pure caffeine and taken one large paracetamol laced with even more caffine, let's fucking go + +//most of the new classes are just copy pasted mashed up shit from yesteryear, what a productive segment that was + +/* + +before my caffine high ends entirely and i black out, here's the gist: +* diodes are handled like energy receiver and simply chain-load the power net they output into in a recursive function, this might be a bit laggy compared to the rest of the system, but it's still way less laggy than the old one +* instead of power nets being bound to tile entities directly, tiles spawn ethereal "nodes" similar to the drone waypoints which can be saved using world data, meaning that breaking cables will delete nodes, but unloading them will keep them alive in "node space" which is what's actually used to check for connections +* power nets may cache some positional info in order to limit the amount of nodes, this should prevent horrific freezes in the unlikely event that some retard makes a superflat world out of cables +* general energy transmission will work in a similar fashion as martin explained his, but somewhat simplified; the system will determine supply and demand and then split those evenly if possible, retrying within one operation is only necessary for minor restrictions like priority, any leftovers from rounding don't have to be re-tried because the next tick will already take care of that +* invest funds in more coal mare nudes +* battery "fair share" transfer will most likely no longer work, but that's not really as relevant these days considering there's capacitors and because batteries have transfer speed limits anyway +* most of the machine's functions will be repurposed, the "sendPower" method will no longer send power directly but register the machine to the network as a power source +* if all else fails and martin still hasn't surrendered his code, i will beg greg for his wisdom (but without loss or tiering because fuck that) +* +* | | || +* ____|____ +* | +* || | |_ +* +* ...i said WITHOUT loss + +*/ \ No newline at end of file From 4869dbb1c86239c0d3dbaff2c4fbddb69e923642 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 21 Mar 2024 21:58:49 +0100 Subject: [PATCH 02/48] my eyes are burning --- .../hbm/energymk2/IEnergyConductorMK2.java | 1 + .../api/hbm/energymk2/IEnergyProviderMK2.java | 7 +++ .../api/hbm/energymk2/IEnergyReceiverMK2.java | 15 +++-- .../java/api/hbm/energymk2/Nodespace.java | 59 ++++++++++++++++++- .../java/api/hbm/energymk2/PowerNetMK2.java | 49 ++++++++++++--- 5 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java diff --git a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java index 8307d4339..4f13f7ff7 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java @@ -2,6 +2,7 @@ package api.hbm.energymk2; public interface IEnergyConductorMK2 extends IEnergyConnectorMK2 { + // ??? could be redundant because of nodespace, we'll see how that works out public PowerNetMK2 getPowerNet(); public void setPowerNet(PowerNetMK2 network); diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java new file mode 100644 index 000000000..bedc06ca4 --- /dev/null +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -0,0 +1,7 @@ +package api.hbm.energymk2; + +import api.hbm.energy.IEnergyConnector; + +public interface IEnergyProviderMK2 extends IEnergyConnector { + +} diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 79992c916..12a387b2a 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -3,7 +3,6 @@ package api.hbm.energymk2; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.IEnergyConductor; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -20,8 +19,8 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { TileEntity te = world.getTileEntity(x, y, z); boolean red = false; - /*if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; + if(te instanceof IEnergyConductorMK2) { + IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; @@ -31,7 +30,7 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { if(con.getPowerNet() != null) red = true; - }*/ + } if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); @@ -51,11 +50,11 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; + if(te instanceof IEnergyConductorMK2) { + IEnergyConductorMK2 con = (IEnergyConductorMK2) te; - /*if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) - con.getPowerNet().unsubscribe(this);*/ + if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) + con.getPowerNet().unsubscribe(this); } } diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 568f2b423..a39c591af 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,6 +1,61 @@ package api.hbm.energymk2; -public class Nodespace { +import java.util.HashMap; - //we're gonna figure this shit out as we go along +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import net.minecraft.world.World; + +/** + * The "Nodespace" is an intermediate, "ethereal" layer of abstraction that tracks nodes (i.e. cables) even when they are no longer loaded, allowing continued operation even when unloaded + * @author hbm + * + */ +public class Nodespace { + + /** Contains all "NodeWorld" instances, i.e. lists of nodes existing per world */ + public static HashMap worlds = new HashMap(); + + public static class NodeWorld { + + /** Contains a map showing where each node is, a node is every spot that a cable exists at. + * Instead of the old proxy system, things like substation now create multiple nodes at their connection points */ + public static HashMap nodes = new HashMap(); + + /** Adds a node at all its positions to the nodespace */ + public void pushNode(PowerNode node) { + for(BlockPos pos : node.positions) { + nodes.put(pos, node); + } + } + + /** Removes the specified node from all positions from nodespace */ + public void popNode(PowerNode node) { + for(BlockPos pos : node.positions) { + nodes.remove(pos); + } + } + + /** Grabs the node at one position, then removes it from all positions it occupies */ + public void popNode(BlockPos pos) { + PowerNode node = nodes.get(pos); + if(node != null) popNode(node); + } + } + + public static class PowerNode { + + public BlockPos[] positions; + public DirPos[] connections; + + public PowerNode(BlockPos... positions) { + this.positions = positions; + } + + public PowerNode setConnections(DirPos... connections) { + this.connections = connections; + return this; + } + } } diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 603284af6..c9c56f72e 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -1,21 +1,56 @@ package api.hbm.energymk2; -import java.util.ArrayList; import java.util.HashMap; -import java.util.List; +import java.util.HashSet; +import java.util.Set; + +import api.hbm.energymk2.Nodespace.PowerNode; public class PowerNetMK2 { private boolean valid = true; - private HashMap links = new HashMap(); - private HashMap proxies = new HashMap(); - private List subscribers = new ArrayList(); + private Set links = new HashSet(); + /** Maps all active subscribers to a timestamp, handy for handling timeouts. In a good system this shouldn't be necessary, but the previous system taught me to be cautious anyway */ + private HashMap subscriberEntries = new HashMap(); + /** A simple set containing all subscribers, might be redundant because of the hashmap, we'll see if we keep this around */ + private Set subscriberSet = new HashSet(); + + private HashMap providerEntries = new HashMap(); + private Set providerSet = new HashSet(); + + /// SUBSCRIBER HANDLING /// public boolean isSubscribed(IEnergyReceiverMK2 receiver) { - return false; //TBI + return this.subscriberSet.contains(receiver); } public void subscribe(IEnergyReceiverMK2 receiver) { - //TBI + this.subscriberSet.add(receiver); + this.subscriberEntries.put(receiver, System.currentTimeMillis()); + } + + public void unsubscribe(IEnergyReceiverMK2 receiver) { + this.subscriberSet.remove(receiver); + this.subscriberEntries.remove(receiver); + } + + /// PROVIDER HANDLING /// + public boolean isProvider(IEnergyProviderMK2 provider) { + return this.providerSet.contains(provider); + } + + public void addProvider(IEnergyProviderMK2 provider) { + this.providerSet.add(provider); + this.providerEntries.put(provider, System.currentTimeMillis()); + } + + public void removeProvider(IEnergyProviderMK2 provider) { + this.providerSet.remove(provider); + this.providerEntries.remove(provider); + } + + /// GENERAL POWER NET CONTROL /// + public void invalidate() { + this.valid = false; } } From 1b24a1d860f098fb22dac4a0e58426175119e857 Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 23 Mar 2024 23:04:30 +0100 Subject: [PATCH 03/48] power net crap --- .../hbm/energymk2/IEnergyConductorMK2.java | 11 ++-- .../hbm/energymk2/IEnergyConnectorMK2.java | 11 ++++ .../api/hbm/energymk2/IEnergyProviderMK2.java | 39 ++++++++++++ .../api/hbm/energymk2/IEnergyReceiverMK2.java | 27 +++----- .../java/api/hbm/energymk2/Nodespace.java | 16 +++++ .../java/api/hbm/energymk2/PowerNetMK2.java | 62 ++++++++++++++----- 6 files changed, 130 insertions(+), 36 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java index 4f13f7ff7..2ba97fce6 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java @@ -1,9 +1,12 @@ package api.hbm.energymk2; -public interface IEnergyConductorMK2 extends IEnergyConnectorMK2 { +import api.hbm.energymk2.Nodespace.PowerNode; +import net.minecraft.tileentity.TileEntity; - // ??? could be redundant because of nodespace, we'll see how that works out - public PowerNetMK2 getPowerNet(); +public interface IEnergyConductorMK2 extends IEnergyConnectorMK2 { - public void setPowerNet(PowerNetMK2 network); + public default PowerNode getNode() { + TileEntity tile = (TileEntity) this; + return Nodespace.getNode(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); + } } diff --git a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java index 77e84b007..c021d6805 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java @@ -4,6 +4,8 @@ import com.hbm.util.CompatEnergyControl; import api.hbm.energy.ILoadedTile; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; public interface IEnergyConnectorMK2 extends ILoadedTile { @@ -17,9 +19,18 @@ public interface IEnergyConnectorMK2 extends ILoadedTile { public default boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN; } + public long getPower(); public long getMaxPower(); + public static final boolean particleDebug = false; + + public default Vec3 getDebugParticlePos() { + TileEntity te = (TileEntity) this; + Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); + return vec; + } + public default void provideInfoForEC(NBTTagCompound data) { data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index bedc06ca4..b693b959c 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -1,7 +1,46 @@ package api.hbm.energymk2; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; + import api.hbm.energy.IEnergyConnector; +import api.hbm.energymk2.Nodespace.PowerNode; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; public interface IEnergyProviderMK2 extends IEnergyConnector { + + public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { + TileEntity te = world.getTileEntity(x, y, z); + boolean red = false; + + if(te instanceof IEnergyConductorMK2) { + IEnergyConductorMK2 con = (IEnergyConductorMK2) te; + if(!con.canConnect(dir.getOpposite())) return; + + PowerNode node = con.getNode(); + + if(node != null && node.net != null) { + node.net.addProvider(this); + red = true; + } + } + + if(particleDebug) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "network"); + data.setString("mode", "power"); + double posX = x + 0.5 - dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + double posY = y + 0.5 - dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + double posZ = z + 0.5 - dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; + data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1)); + data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1)); + data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1)); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); + } + } } diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 12a387b2a..9673baf1c 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -3,10 +3,10 @@ package api.hbm.energymk2; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @@ -21,15 +21,14 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; + if(!con.canConnect(dir.getOpposite())) return; - if(!con.canConnect(dir.getOpposite())) - return; + PowerNode node = con.getNode(); - if(con.getPowerNet() != null && !con.getPowerNet().isSubscribed(this)) - con.getPowerNet().subscribe(this); - - if(con.getPowerNet() != null) + if(node != null && node.net != null) { + node.net.addReceiver(this); red = true; + } } if(particleDebug) { @@ -52,20 +51,14 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; + PowerNode node = con.getNode(); - if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) - con.getPowerNet().unsubscribe(this); + if(node != null && node.net != null) { + node.net.removeReceiver(this); + } } } - public static final boolean particleDebug = false; - - public default Vec3 getDebugParticlePos() { - TileEntity te = (TileEntity) this; - Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); - return vec; - } - public default ConnectionPriority getPriority() { return ConnectionPriority.NORMAL; } diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index a39c591af..a950c2b24 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,10 +1,12 @@ package api.hbm.energymk2; import java.util.HashMap; +import java.util.Map.Entry; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; /** @@ -17,6 +19,19 @@ public class Nodespace { /** Contains all "NodeWorld" instances, i.e. lists of nodes existing per world */ public static HashMap worlds = new HashMap(); + public static PowerNode getNode(World world, int x, int y, int z) { + NodeWorld nodeWorld = worlds.get(world); + if(nodeWorld != null) return nodeWorld.nodes.get(new BlockPos(x, y, z)); + return null; + } + + public static void updateNodespace() { + + for(World world : MinecraftServer.getServer().worldServers) { + NodeWorld nodes = worlds.get(world); + } + } + public static class NodeWorld { /** Contains a map showing where each node is, a node is every spot that a cable exists at. @@ -48,6 +63,7 @@ public class Nodespace { public BlockPos[] positions; public DirPos[] connections; + public PowerNetMK2 net; public PowerNode(BlockPos... positions) { this.positions = positions; diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index c9c56f72e..d84dfc3a5 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -12,45 +12,77 @@ public class PowerNetMK2 { private Set links = new HashSet(); /** Maps all active subscribers to a timestamp, handy for handling timeouts. In a good system this shouldn't be necessary, but the previous system taught me to be cautious anyway */ - private HashMap subscriberEntries = new HashMap(); - /** A simple set containing all subscribers, might be redundant because of the hashmap, we'll see if we keep this around */ - private Set subscriberSet = new HashSet(); - + private HashMap receiverEntries = new HashMap(); private HashMap providerEntries = new HashMap(); - private Set providerSet = new HashSet(); /// SUBSCRIBER HANDLING /// public boolean isSubscribed(IEnergyReceiverMK2 receiver) { - return this.subscriberSet.contains(receiver); + return this.receiverEntries.containsKey(receiver); } - public void subscribe(IEnergyReceiverMK2 receiver) { - this.subscriberSet.add(receiver); - this.subscriberEntries.put(receiver, System.currentTimeMillis()); + public void addReceiver(IEnergyReceiverMK2 receiver) { + this.receiverEntries.put(receiver, System.currentTimeMillis()); } - public void unsubscribe(IEnergyReceiverMK2 receiver) { - this.subscriberSet.remove(receiver); - this.subscriberEntries.remove(receiver); + public void removeReceiver(IEnergyReceiverMK2 receiver) { + this.receiverEntries.remove(receiver); } /// PROVIDER HANDLING /// public boolean isProvider(IEnergyProviderMK2 provider) { - return this.providerSet.contains(provider); + return this.providerEntries.containsKey(provider); } public void addProvider(IEnergyProviderMK2 provider) { - this.providerSet.add(provider); this.providerEntries.put(provider, System.currentTimeMillis()); } public void removeProvider(IEnergyProviderMK2 provider) { - this.providerSet.remove(provider); this.providerEntries.remove(provider); } + /// LINK JOINING /// + + /** Combines two networks into one */ + public void joinNetworks(PowerNetMK2 network) { + + if(network == this) return; //wtf?! + + for(PowerNode conductor : network.links) joinLink(conductor); + network.links.clear(); + + for(IEnergyReceiverMK2 connector : network.receiverEntries.keySet()) this.addReceiver(connector); + for(IEnergyProviderMK2 connector : network.providerEntries.keySet()) this.addProvider(connector); + network.destroy(); + } + + /** Adds the power node as part of this network's links */ + public PowerNetMK2 joinLink(PowerNode node) { + if(node.net != null) node.net.leaveLink(node); + node.net = this; + return this; + } + + /** Removes the specified power node */ + public void leaveLink(PowerNode node) { + node.net = null; + this.links.remove(node); + } + /// GENERAL POWER NET CONTROL /// public void invalidate() { this.valid = false; } + + public boolean isValid() { + return this.valid; + } + + public void destroy() { + this.invalidate(); + for(PowerNode link : this.links) if(link.net == this) link.net = null; + this.links.clear(); + this.receiverEntries.clear(); + this.providerEntries.clear(); + } } From 43d3d03df586e3d21759edc5cfe03e8be3670196 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 1 Apr 2024 20:56:19 +0200 Subject: [PATCH 04/48] nodespace bullshit --- .../java/api/hbm/energymk2/Nodespace.java | 26 +++++++++++++++++++ .../loader/WavefrontObjDisplayList.java | 16 +++++++++--- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index a950c2b24..82b431742 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -25,13 +25,38 @@ public class Nodespace { return null; } + public static void createNode(World world, PowerNode node) { + NodeWorld nodeWorld = worlds.get(world); + if(nodeWorld == null) { + nodeWorld = new NodeWorld(); + worlds.put(world, nodeWorld); + } + nodeWorld.pushNode(node); + } + + public static void destroyNode(World world, int x, int y, int z) { + PowerNode node = getNode(world, x, y, z); + if(node != null) worlds.get(world).popNode(node); + } + public static void updateNodespace() { for(World world : MinecraftServer.getServer().worldServers) { NodeWorld nodes = worlds.get(world); + + for(Entry entry : nodes.nodes.entrySet()) { + PowerNode node = entry.getValue(); + if(node.net == null || !node.net.isValid()) { + tryConnectNode(world, node); + } + } } } + private static void tryConnectNode(World world, PowerNode node) { + + } + public static class NodeWorld { /** Contains a map showing where each node is, a node is every spot that a cable exists at. @@ -47,6 +72,7 @@ public class Nodespace { /** Removes the specified node from all positions from nodespace */ public void popNode(PowerNode node) { + if(node.net != null) node.net.destroy(); for(BlockPos pos : node.positions) { nodes.remove(pos); } diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java index 99eef4360..79f33e16f 100644 --- a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java +++ b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java @@ -56,7 +56,7 @@ public class WavefrontObjDisplayList implements IModelCustom { @Override public void renderAll() { for(Pair p : nameToCallList) - GL11.glCallList(p.getRight()); + callList(p.getRight()); } @Override @@ -64,7 +64,7 @@ public class WavefrontObjDisplayList implements IModelCustom { for(Pair p : nameToCallList){ for(String name : groupNames){ if(p.getLeft().equalsIgnoreCase(name)){ - GL11.glCallList(p.getRight()); + callList(p.getRight()); break; } } @@ -75,7 +75,7 @@ public class WavefrontObjDisplayList implements IModelCustom { public void renderPart(String partName) { for(Pair p : nameToCallList){ if(p.getLeft().equalsIgnoreCase(partName)){ - GL11.glCallList(p.getRight()); + callList(p.getRight()); } } } @@ -91,8 +91,16 @@ public class WavefrontObjDisplayList implements IModelCustom { } } if(!skip){ - GL11.glCallList(p.getRight()); + callList(p.getRight()); } } } + + protected static void callList(int i) { + boolean prevBlend = GL11.glIsEnabled(GL11.GL_BLEND); + GL11.glCallList(i); + boolean newBlend = GL11.glIsEnabled(GL11.GL_BLEND); + if(prevBlend && !newBlend) GL11.glEnable(GL11.GL_BLEND); + if(!prevBlend && newBlend) GL11.glDisable(GL11.GL_BLEND); + } } \ No newline at end of file From 7b6467fb3758bd84c1250d3935ecaa528bf7c076 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 2 Apr 2024 14:41:26 +0200 Subject: [PATCH 05/48] my head hurts --- .../java/api/hbm/energymk2/Nodespace.java | 44 +++++++++++++++++-- .../loader/WavefrontObjDisplayList.java | 16 ++----- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 82b431742..891076ecf 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -39,6 +39,7 @@ public class Nodespace { if(node != null) worlds.get(world).popNode(node); } + /** Goes over each node and manages connections */ public static void updateNodespace() { for(World world : MinecraftServer.getServer().worldServers) { @@ -46,15 +47,46 @@ public class Nodespace { for(Entry entry : nodes.nodes.entrySet()) { PowerNode node = entry.getValue(); - if(node.net == null || !node.net.isValid()) { - tryConnectNode(world, node); - } + checkNodeConnection(world, node); } } } - private static void tryConnectNode(World world, PowerNode node) { + /** Goes over each connection point of the given node, tries to find neighbor nodes and to join networks with them */ + private static void checkNodeConnection(World world, PowerNode node) { + for(DirPos con : node.connections) { + + PowerNode conNode = getNode(world, con.getX() + con.getDir().offsetX, con.getY() + con.getDir().offsetY, con.getZ() + con.getDir().offsetZ); // get whatever neighbor node intersects with that connection + + if(conNode != null) { // if there is a node at that place + + if(conNode.hasValidNet() && conNode.net == node.net) continue; // if the net is valid and both nodes have the same net, skip + + for(DirPos revCon : conNode.connections) { // check if neighbor node also has a valid reverse connection + + // god i hope i didn't fuck this up my brain is hurting already + if(revCon.getX() - revCon.getDir().offsetX == con.getX() && revCon.getY() - revCon.getDir().offsetY == con.getY() && revCon.getZ() - revCon.getDir().offsetZ == con.getZ() && revCon.getDir() == con.getDir().getOpposite()) { + connectToNode(node, conNode); + break; + } + } + } + } + + if(node.net == null || !node.net.isValid()) new PowerNetMK2().joinLink(node); + } + + /** Links two nodes with different or potentially no networks */ + private static void connectToNode(PowerNode origin, PowerNode connection) { + + if(origin.hasValidNet() && connection.hasValidNet()) { // both nodes have nets, but the nets are different (previous assumption), join networks + origin.net.joinNetworks(connection.net); + } else if(!origin.hasValidNet() && connection.hasValidNet()) { // origin has no net, connection does, have origin join connection's net + connection.net.joinLink(origin); + } else if(origin.hasValidNet() && !connection.hasValidNet()) { // ...and vice versa + origin.net.joinLink(connection); + } } public static class NodeWorld { @@ -99,5 +131,9 @@ public class Nodespace { this.connections = connections; return this; } + + public boolean hasValidNet() { + return this.net != null && this.net.isValid(); + } } } diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java index 79f33e16f..99eef4360 100644 --- a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java +++ b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java @@ -56,7 +56,7 @@ public class WavefrontObjDisplayList implements IModelCustom { @Override public void renderAll() { for(Pair p : nameToCallList) - callList(p.getRight()); + GL11.glCallList(p.getRight()); } @Override @@ -64,7 +64,7 @@ public class WavefrontObjDisplayList implements IModelCustom { for(Pair p : nameToCallList){ for(String name : groupNames){ if(p.getLeft().equalsIgnoreCase(name)){ - callList(p.getRight()); + GL11.glCallList(p.getRight()); break; } } @@ -75,7 +75,7 @@ public class WavefrontObjDisplayList implements IModelCustom { public void renderPart(String partName) { for(Pair p : nameToCallList){ if(p.getLeft().equalsIgnoreCase(partName)){ - callList(p.getRight()); + GL11.glCallList(p.getRight()); } } } @@ -91,16 +91,8 @@ public class WavefrontObjDisplayList implements IModelCustom { } } if(!skip){ - callList(p.getRight()); + GL11.glCallList(p.getRight()); } } } - - protected static void callList(int i) { - boolean prevBlend = GL11.glIsEnabled(GL11.GL_BLEND); - GL11.glCallList(i); - boolean newBlend = GL11.glIsEnabled(GL11.GL_BLEND); - if(prevBlend && !newBlend) GL11.glEnable(GL11.GL_BLEND); - if(!prevBlend && newBlend) GL11.glDisable(GL11.GL_BLEND); - } } \ No newline at end of file From 7ab30aa1362ab55d51906dde20e787c0dec274d2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 3 Apr 2024 14:48:50 +0200 Subject: [PATCH 06/48] Do you know what this means? It means that this damn thing doesn't work at all! --- .../hbm/energymk2/IEnergyConductorMK2.java | 15 ++++++- .../hbm/energymk2/IEnergyConnectorMK2.java | 4 +- .../api/hbm/energymk2/IEnergyProviderMK2.java | 2 +- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 4 +- .../java/api/hbm/energymk2/Nodespace.java | 42 +++++++++++++++++-- .../java/api/hbm/energymk2/PowerNetMK2.java | 5 +++ .../java/com/hbm/main/ModEventHandler.java | 2 + .../network/TileEntityCableBaseNT.java | 26 +++++++++++- 8 files changed, 89 insertions(+), 11 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java index 2ba97fce6..96a90bcfd 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConductorMK2.java @@ -1,12 +1,23 @@ package api.hbm.energymk2; +import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + import api.hbm.energymk2.Nodespace.PowerNode; import net.minecraft.tileentity.TileEntity; public interface IEnergyConductorMK2 extends IEnergyConnectorMK2 { - public default PowerNode getNode() { + public default PowerNode createNode() { TileEntity tile = (TileEntity) this; - return Nodespace.getNode(tile.getWorldObj(), tile.xCoord, tile.yCoord, tile.zCoord); + return new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(tile.xCoord + 1, tile.yCoord, tile.zCoord, Library.POS_X), + new DirPos(tile.xCoord - 1, tile.yCoord, tile.zCoord, Library.NEG_X), + new DirPos(tile.xCoord, tile.yCoord + 1, tile.zCoord, Library.POS_Y), + new DirPos(tile.xCoord, tile.yCoord - 1, tile.zCoord, Library.NEG_Y), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord + 1, Library.POS_Z), + new DirPos(tile.xCoord, tile.yCoord, tile.zCoord - 1, Library.NEG_Z) + ); } } diff --git a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java index c021d6805..79f678246 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java @@ -25,13 +25,13 @@ public interface IEnergyConnectorMK2 extends ILoadedTile { public static final boolean particleDebug = false; - public default Vec3 getDebugParticlePos() { + public default Vec3 getDebugParticlePosMK2() { TileEntity te = (TileEntity) this; Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); return vec; } - public default void provideInfoForEC(NBTTagCompound data) { + public default void provideInfoForECMK2(NBTTagCompound data) { data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); } diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index b693b959c..99d029f62 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -22,7 +22,7 @@ public interface IEnergyProviderMK2 extends IEnergyConnector { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.getNode(); + PowerNode node = con.createNode(); if(node != null && node.net != null) { node.net.addProvider(this); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 9673baf1c..677aa596f 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -23,7 +23,7 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.getNode(); + PowerNode node = con.createNode(); if(node != null && node.net != null) { node.net.addReceiver(this); @@ -51,7 +51,7 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; - PowerNode node = con.getNode(); + PowerNode node = con.createNode(); if(node != null && node.net != null) { node.net.removeReceiver(this); diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 891076ecf..6b175db87 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,11 +1,17 @@ package api.hbm.energymk2; import java.util.HashMap; +import java.util.HashSet; import java.util.Map.Entry; +import java.util.Set; +import com.hbm.packet.AuxParticlePacketNT; +import com.hbm.packet.PacketDispatcher; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; +import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; @@ -18,6 +24,7 @@ public class Nodespace { /** Contains all "NodeWorld" instances, i.e. lists of nodes existing per world */ public static HashMap worlds = new HashMap(); + public static Set activePowerNets = new HashSet(); public static PowerNode getNode(World world, int x, int y, int z) { NodeWorld nodeWorld = worlds.get(world); @@ -36,7 +43,19 @@ public class Nodespace { public static void destroyNode(World world, int x, int y, int z) { PowerNode node = getNode(world, x, y, z); - if(node != null) worlds.get(world).popNode(node); + if(node != null) { + worlds.get(world).popNode(node); + markNeigbors(world, node); + } + } + + /** Grabs all neighbor nodes from the given node's connection points and removes them from the network entirely, forcing a hard reconnect */ + private static void markNeigbors(World world, PowerNode node) { + + for(DirPos con : node.connections) { + PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); + if(conNode != null && conNode.hasValidNet()) conNode.net.leaveLink(conNode); + } } /** Goes over each node and manages connections */ @@ -47,7 +66,22 @@ public class Nodespace { for(Entry entry : nodes.nodes.entrySet()) { PowerNode node = entry.getValue(); - checkNodeConnection(world, node); + if(!node.hasValidNet()) { + checkNodeConnection(world, node); + } + + if(node.hasValidNet()) { + + for(BlockPos pos : node.positions) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "marker"); + data.setInteger("color", 0x00ff00); + data.setInteger("expires", 250); + data.setDouble("dist", 15D); + data.setString("label", "" + node.net.hashCode()); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX(), pos.getY(), pos.getZ()), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 50)); + } + } } } } @@ -57,7 +91,7 @@ public class Nodespace { for(DirPos con : node.connections) { - PowerNode conNode = getNode(world, con.getX() + con.getDir().offsetX, con.getY() + con.getDir().offsetY, con.getZ() + con.getDir().offsetZ); // get whatever neighbor node intersects with that connection + PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); // get whatever neighbor node intersects with that connection if(conNode != null) { // if there is a node at that place @@ -107,6 +141,7 @@ public class Nodespace { if(node.net != null) node.net.destroy(); for(BlockPos pos : node.positions) { nodes.remove(pos); + node.expired = true; } } @@ -122,6 +157,7 @@ public class Nodespace { public BlockPos[] positions; public DirPos[] connections; public PowerNetMK2 net; + public boolean expired = false; public PowerNode(BlockPos... positions) { this.positions = positions; diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index d84dfc3a5..aee4e2a1e 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -14,6 +14,10 @@ public class PowerNetMK2 { /** Maps all active subscribers to a timestamp, handy for handling timeouts. In a good system this shouldn't be necessary, but the previous system taught me to be cautious anyway */ private HashMap receiverEntries = new HashMap(); private HashMap providerEntries = new HashMap(); + + public PowerNetMK2() { + Nodespace.activePowerNets.add(this); + } /// SUBSCRIBER HANDLING /// public boolean isSubscribed(IEnergyReceiverMK2 receiver) { @@ -72,6 +76,7 @@ public class PowerNetMK2 { /// GENERAL POWER NET CONTROL /// public void invalidate() { this.valid = false; + Nodespace.activePowerNets.remove(this); } public boolean isValid() { diff --git a/src/main/java/com/hbm/main/ModEventHandler.java b/src/main/java/com/hbm/main/ModEventHandler.java index ebbfc9671..caa150524 100644 --- a/src/main/java/com/hbm/main/ModEventHandler.java +++ b/src/main/java/com/hbm/main/ModEventHandler.java @@ -80,6 +80,7 @@ import com.hbm.util.InventoryUtil; import com.hbm.util.ArmorRegistry.HazardClass; import com.hbm.world.generator.TimedGenerator; +import api.hbm.energymk2.Nodespace; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; @@ -1103,6 +1104,7 @@ public class ModEventHandler { RTTYSystem.updateBroadcastQueue(); RequestNetwork.updateEntries(); TileEntityMachineRadarNT.updateSystem(); + Nodespace.updateNodespace(); } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java index 71b37ab3c..60848881b 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java @@ -3,12 +3,16 @@ package com.hbm.tileentity.network; import api.hbm.energy.IEnergyConductor; import api.hbm.energy.IPowerNet; import api.hbm.energy.PowerNet; +import api.hbm.energymk2.IEnergyConductorMK2; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCableBaseNT extends TileEntity implements IEnergyConductor { +public class TileEntityCableBaseNT extends TileEntity implements IEnergyConductor, IEnergyConductorMK2 { protected IPowerNet network; + protected PowerNode node; @Override public void updateEntity() { @@ -24,6 +28,22 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto this.setPowerNet(new PowerNet().joinLink(this)); } } + + if(!worldObj.isRemote) { + + if(this.node == null || this.node.expired) { + this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + Nodespace.createNode(worldObj, this.node); + } + } + } + } + + public void onNodeDestroyedCallback() { + this.node = null; } protected void connect() { @@ -59,6 +79,10 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto this.network.reevaluate(); this.network = null; } + + if(this.node != null) { + Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + } } } From fb765174dd342373e0d8d80bdbe205a33206e1de Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:42:10 -0400 Subject: [PATCH 07/48] moremore light logic --- .../hbm/entity/mob/glyphid/EntityGlyphidScout.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java index 251bd23d9..318447e46 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java @@ -336,15 +336,13 @@ public class EntityGlyphidScout extends EntityGlyphid { int y = MathHelper.floor_double(this.boundingBox.minY); int z = MathHelper.floor_double(this.posZ); - int light = this.worldObj.getBlockLightValue(x, y, z); + int skylightSubtracted = this.worldObj.skylightSubtracted; - if(this.worldObj.isThundering()) { - int skylightSubtracted = this.worldObj.skylightSubtracted; - this.worldObj.skylightSubtracted = 10; - light = this.worldObj.getBlockLightValue(x, y, z); - this.worldObj.skylightSubtracted = skylightSubtracted; - } - + if(this.worldObj.isThundering()) this.worldObj.skylightSubtracted = 10; + int light = worldObj.getChunkFromChunkCoords(x >> 4, z >> 4).getBlockLightValue(x & 15, y, z & 15, worldObj.skylightSubtracted); + + this.worldObj.skylightSubtracted = skylightSubtracted; return light <= 7; + } } From 3cb6e855a8100cd39d4368ecdada2f08c27e73ae Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 4 Apr 2024 19:35:03 +0200 Subject: [PATCH 08/48] # WE ARE SO FUCKING BACK --- .../java/api/hbm/energymk2/Nodespace.java | 39 +++++++++++++++---- .../java/api/hbm/energymk2/PowerNetMK2.java | 27 +++++++++---- 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 6b175db87..ae6afd5bc 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -45,10 +45,11 @@ public class Nodespace { PowerNode node = getNode(world, x, y, z); if(node != null) { worlds.get(world).popNode(node); - markNeigbors(world, node); + //markNeigbors(world, node); } } + // UNUSED DO NOT TOUCH /** Grabs all neighbor nodes from the given node's connection points and removes them from the network entirely, forcing a hard reconnect */ private static void markNeigbors(World world, PowerNode node) { @@ -66,21 +67,22 @@ public class Nodespace { for(Entry entry : nodes.nodes.entrySet()) { PowerNode node = entry.getValue(); - if(!node.hasValidNet()) { + if(!node.hasValidNet() || node.recentlyChanged) { checkNodeConnection(world, node); + node.recentlyChanged = false; } if(node.hasValidNet()) { - for(BlockPos pos : node.positions) { + /*for(BlockPos pos : node.positions) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "marker"); - data.setInteger("color", 0x00ff00); + data.setInteger("color", node.net.hashCode() % 0xffffff); data.setInteger("expires", 250); - data.setDouble("dist", 15D); - data.setString("label", "" + node.net.hashCode()); + data.setDouble("dist", 50D); + data.setString("label", "" + node.net.links.size()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX(), pos.getY(), pos.getZ()), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 50)); - } + }*/ } } } @@ -115,7 +117,11 @@ public class Nodespace { private static void connectToNode(PowerNode origin, PowerNode connection) { if(origin.hasValidNet() && connection.hasValidNet()) { // both nodes have nets, but the nets are different (previous assumption), join networks - origin.net.joinNetworks(connection.net); + if(origin.net.links.size() > connection.net.links.size()) { + origin.net.joinNetworks(connection.net); + } else { + connection.net.joinNetworks(origin.net); + } } else if(!origin.hasValidNet() && connection.hasValidNet()) { // origin has no net, connection does, have origin join connection's net connection.net.joinLink(origin); } else if(origin.hasValidNet() && !connection.hasValidNet()) { // ...and vice versa @@ -158,6 +164,18 @@ public class Nodespace { public DirPos[] connections; public PowerNetMK2 net; public boolean expired = false; + /** + * Okay so here's the deal: The code has shit idiot brain fungus. I don't know why. I re-tested every part involved several times. + * I don't know why. But for some reason, during neighbor checks, on certain arbitrary fucking places, the joining operation just fails. + * Disallowing nodes to create new networks fixed the problem completely, which is hardly surprising since they wouldn't be able to make + * a new net anyway and they will re-check neighbors until a net is found, so the solution is tautological in nature. So I tried limiting + * creation of new networks. Didn't work. So what's there left to do? Hand out a mark to any node that has changed networks, and let those + * recently modified nodes do another re-check. This creates a second layer of redundant operations, and in theory doubles (in practice, + * it might be an extra 20% due to break-off section sizes) the amount of CPU time needed for re-building the networks after joining or + * breaking, but it seems to allow those parts to connect back to their neighbor nets as they are supposed to. I am not proud of this solution, + * this issue shouldn't exist to begin with and I am going fucking insane but it is what it is. + */ + public boolean recentlyChanged = true; public PowerNode(BlockPos... positions) { this.positions = positions; @@ -171,5 +189,10 @@ public class Nodespace { public boolean hasValidNet() { return this.net != null && this.net.isValid(); } + + public void setNet(PowerNetMK2 net) { + this.net = net; + this.recentlyChanged = true; + } } } diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index aee4e2a1e..2f88d8f05 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -1,19 +1,21 @@ package api.hbm.energymk2; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Set; import api.hbm.energymk2.Nodespace.PowerNode; public class PowerNetMK2 { - private boolean valid = true; - private Set links = new HashSet(); + public boolean valid = true; + public Set links = new HashSet(); /** Maps all active subscribers to a timestamp, handy for handling timeouts. In a good system this shouldn't be necessary, but the previous system taught me to be cautious anyway */ - private HashMap receiverEntries = new HashMap(); - private HashMap providerEntries = new HashMap(); + public HashMap receiverEntries = new HashMap(); + public HashMap providerEntries = new HashMap(); public PowerNetMK2() { Nodespace.activePowerNets.add(this); @@ -52,7 +54,10 @@ public class PowerNetMK2 { if(network == this) return; //wtf?! - for(PowerNode conductor : network.links) joinLink(conductor); + List oldNodes = new ArrayList(network.links.size()); + oldNodes.addAll(network.links); // might prevent oddities related to joining - nvm it does nothing + + for(PowerNode conductor : oldNodes) forceJoinLink(conductor); network.links.clear(); for(IEnergyReceiverMK2 connector : network.receiverEntries.keySet()) this.addReceiver(connector); @@ -63,13 +68,19 @@ public class PowerNetMK2 { /** Adds the power node as part of this network's links */ public PowerNetMK2 joinLink(PowerNode node) { if(node.net != null) node.net.leaveLink(node); - node.net = this; + return forceJoinLink(node); + } + + /** Adds the power node as part of this network's links, skips the part about removing it from existing networks */ + public PowerNetMK2 forceJoinLink(PowerNode node) { + this.links.add(node); + node.setNet(this); return this; } /** Removes the specified power node */ public void leaveLink(PowerNode node) { - node.net = null; + node.setNet(null); this.links.remove(node); } @@ -85,7 +96,7 @@ public class PowerNetMK2 { public void destroy() { this.invalidate(); - for(PowerNode link : this.links) if(link.net == this) link.net = null; + for(PowerNode link : this.links) if(link.net == this) link.setNet(null); this.links.clear(); this.receiverEntries.clear(); this.providerEntries.clear(); From 319ab19e014408ea73b60fbd475e125cc433dd99 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Thu, 4 Apr 2024 19:32:03 -0400 Subject: [PATCH 09/48] the ferocious leapers --- .../mob/glyphid/EntityGlyphidBrawler.java | 99 ++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java index 134f66ca7..cf6747fc0 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java @@ -1,18 +1,104 @@ package com.hbm.entity.mob.glyphid; + import com.hbm.main.ResourceManager; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.util.DamageSource; +import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Vec3; import net.minecraft.world.World; + public class EntityGlyphidBrawler extends EntityGlyphid { public EntityGlyphidBrawler(World world) { super(world); this.setSize(2F, 1.125F); } - + + public int timer = 0; + protected Entity lastTarget; + protected double lastX; + protected double lastY; + protected double lastZ; + + @Override + public void onUpdate(){ + super.onUpdate(); + Entity e = this.getEntityToAttack(); + if (e != null && this.isEntityAlive()) { + + this.lastX = e.posX; + this.lastY = e.posY; + this.lastZ = e.posZ; + + if (--timer <= 0) { + leap(); + timer = 80 + worldObj.rand.nextInt(30); + } + } + } + + /** Mainly composed of crusty old power fist code, with some touch ups **/ + public void leap() { + if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < 20) { + Entity e = this.getEntityToAttack(); + + double velX = e.posX - lastX; + double velY = e.posY - lastY; + double velZ = e.posZ - lastZ; + + if (this.lastTarget != e) { + velX = velY = velZ = 0; + } + + int prediction = 60; + Vec3 delta = Vec3.createVectorHelper(e.posX - posX + velX * prediction, (e.posY + e.height / 2) - (posY + 1) + velY * prediction, e.posZ - posZ + velZ * prediction); + double len = delta.lengthVector(); + if (len < 3) return; + double targetYaw = -Math.atan2(delta.xCoord, delta.zCoord); + + double x = Math.sqrt(delta.xCoord * delta.xCoord + delta.zCoord * delta.zCoord); + double y = delta.yCoord; + double v0 = 1.5; + double v02 = v0 * v0; + double g = 0.01; + double targetPitch = Math.atan((v02 + Math.sqrt(v02 * v02 - g * (g * x * x + 2 * y * v02)) * 1) / (g * x)); + Vec3 fireVec = null; + if (!Double.isNaN(targetPitch)) { + + fireVec = Vec3.createVectorHelper(v0, 0, 0); + fireVec.rotateAroundZ((float) (-targetPitch / 3.5)); + fireVec.rotateAroundY((float) -(targetYaw + Math.PI * 0.5)); + } + if (fireVec != null) + this.setThrowableHeading(fireVec.xCoord, fireVec.yCoord, fireVec.zCoord, (float) v0, rand.nextFloat()); + } + } + //yeag this is now a motherfucking projectile + public void setThrowableHeading(double motionX, double motionY, double motionZ, float velocity, float inaccuracy) { + float throwLen = MathHelper.sqrt_double(motionX * motionX + motionY * motionY + motionZ * motionZ); + motionX /= (double) throwLen; + motionY /= (double) throwLen; + motionZ /= (double) throwLen; + motionX += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionY += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionZ += this.rand.nextGaussian() * 0.0075D * (double) inaccuracy; + motionX *= (double) velocity; + motionY *= (double) velocity; + motionZ *= (double) velocity; + this.motionX = motionX; + this.motionY = motionY; + this.motionZ = motionZ; + float hyp = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ); + this.prevRotationYaw = this.rotationYaw = (float) (Math.atan2(motionX, motionZ) * 180.0D / Math.PI); + this.prevRotationPitch = this.rotationPitch = (float) (Math.atan2(motionY, (double) hyp) * 180.0D / Math.PI); + } @Override public ResourceLocation getSkin() { return ResourceManager.glyphid_brawler_tex; @@ -33,7 +119,18 @@ public class EntityGlyphidBrawler extends EntityGlyphid { @Override public float getDivisorPerArmorPoint() { return GlyphidStats.getStats().getBrawler().divisor; } @Override public float getDamageThreshold() { return GlyphidStats.getStats().getBrawler().damageThreshold; } + @Override + public boolean attackEntityFrom(DamageSource source, float amount) { + /*NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "debug"); + data.setInteger("color", 0x0000ff); + data.setFloat("scale", 2.5F); + data.setString("text", "" + (int) amount); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 2, posZ), new TargetPoint(dimension, posX, posY + 2, posZ, 50));*/ + if(source != DamageSource.fall) super.attackEntityFrom(source, amount); + return false; + } @Override public boolean isArmorBroken(float amount) { return this.rand.nextInt(100) <= Math.min(Math.pow(amount * 0.25, 2), 100); From 1618d9be12451cc980b05478d67556af622fa887 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 5 Apr 2024 14:51:36 +0200 Subject: [PATCH 10/48] enough for today, my head hurts --- .../api/hbm/energymk2/IEnergyProviderMK2.java | 9 +++-- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 15 ++++++- .../java/api/hbm/energymk2/Nodespace.java | 39 ++++++++++++++++--- .../machine/TileEntityMachineDetector.java | 7 ++-- .../machine/TileEntityMachineMiniRTG.java | 9 +++-- 5 files changed, 60 insertions(+), 19 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index 99d029f62..b8a05e0ae 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -3,7 +3,6 @@ package api.hbm.energymk2; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.IEnergyConnector; import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; @@ -11,7 +10,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface IEnergyProviderMK2 extends IEnergyConnector { +public interface IEnergyProviderMK2 extends IEnergyConnectorMK2 { + + public void setPower(long power); public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { @@ -22,7 +23,7 @@ public interface IEnergyProviderMK2 extends IEnergyConnector { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.createNode(); + PowerNode node = Nodespace.getNode(world, x, y, z); if(node != null && node.net != null) { node.net.addProvider(this); @@ -30,6 +31,8 @@ public interface IEnergyProviderMK2 extends IEnergyConnector { } } + //TODO: direct transfer + if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "network"); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index 677aa596f..d68837692 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -12,7 +12,18 @@ import net.minecraftforge.common.util.ForgeDirection; public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { - public long transferPower(long power); + public default long transferPower(long power) { + if(power + this.getPower() <= this.getMaxPower()) { + this.setPower(power + this.getPower()); + return 0; + } + long capacity = this.getMaxPower() - this.getPower(); + long overshoot = power - capacity; + this.setPower(this.getMaxPower()); + return overshoot; + } + + public void setPower(long power); public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { @@ -23,7 +34,7 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; if(!con.canConnect(dir.getOpposite())) return; - PowerNode node = con.createNode(); + PowerNode node = Nodespace.getNode(world, x, y, z); if(node != null && node.net != null) { node.net.addReceiver(this); diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index ae6afd5bc..2a9f4c23a 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,5 +1,6 @@ package api.hbm.energymk2; +import java.math.BigInteger; import java.util.HashMap; import java.util.HashSet; import java.util.Map.Entry; @@ -49,9 +50,8 @@ public class Nodespace { } } - // UNUSED DO NOT TOUCH /** Grabs all neighbor nodes from the given node's connection points and removes them from the network entirely, forcing a hard reconnect */ - private static void markNeigbors(World world, PowerNode node) { + @Deprecated private static void markNeigbors(World world, PowerNode node) { for(DirPos con : node.connections) { PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); @@ -72,9 +72,9 @@ public class Nodespace { node.recentlyChanged = false; } - if(node.hasValidNet()) { + /*if(node.hasValidNet()) { - /*for(BlockPos pos : node.positions) { + for(BlockPos pos : node.positions) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "marker"); data.setInteger("color", node.net.hashCode() % 0xffffff); @@ -82,8 +82,35 @@ public class Nodespace { data.setDouble("dist", 50D); data.setString("label", "" + node.net.links.size()); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX(), pos.getY(), pos.getZ()), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 50)); - }*/ - } + } + }*/ + } + } + + updatePowerNets(); + } + + private static void updatePowerNets() { + + int timeout = 3_000; + + for(PowerNetMK2 net : activePowerNets) { + + long timestamp = System.currentTimeMillis(); + + //TODO: start over, impose a per-tick transfer limit in order to avoid bigints + + BigInteger supply = BigInteger.valueOf(0); + BigInteger demand = BigInteger.valueOf(0); + + for(Entry entry : net.providerEntries.entrySet()) { + IEnergyProviderMK2 provider = entry.getKey(); + if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply = supply.add(BigInteger.valueOf(provider.getPower())); + } + + for(Entry entry : net.receiverEntries.entrySet()) { + IEnergyReceiverMK2 receiver = entry.getKey(); + if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand = demand.add(BigInteger.valueOf(receiver.getMaxPower() - receiver.getPower())); } } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java index 8f62d9f47..b4d1a8d39 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDetector.java @@ -2,15 +2,15 @@ package com.hbm.tileentity.machine; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineDetector extends TileEntityLoadedBase implements IEnergyUser { +public class TileEntityMachineDetector extends TileEntityLoadedBase implements IEnergyReceiverMK2 { long power; @Override - public void updateEntity() { + public void updateEntity() { if(!worldObj.isRemote) { @@ -56,5 +56,4 @@ public class TileEntityMachineDetector extends TileEntityLoadedBase implements I public ConnectionPriority getPriority() { return ConnectionPriority.HIGH; } - } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java index cf6c1372d..ba194d48d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java @@ -4,12 +4,12 @@ import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { +public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyProviderMK2, IInfoProviderEC { public long power; boolean tact = false; @@ -24,8 +24,9 @@ public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IE if(power > getMaxPower()) power = getMaxPower(); - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } } } From ebeb276e947cc0da7f48df6bfb70e86c3b0b3802 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Fri, 5 Apr 2024 18:13:28 -0400 Subject: [PATCH 11/48] some more stuffs --- .../com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java | 7 ++++--- .../com/hbm/entity/mob/glyphid/EntityGlyphidScout.java | 5 ++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java index cf6747fc0..7799040e2 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBrawler.java @@ -44,7 +44,7 @@ public class EntityGlyphidBrawler extends EntityGlyphid { } } - /** Mainly composed of crusty old power fist code, with some touch ups **/ + /** Mainly composed of repurposed bombardier code**/ public void leap() { if (!worldObj.isRemote && entityToAttack instanceof EntityLivingBase && this.getDistanceToEntity(entityToAttack) < 20) { Entity e = this.getEntityToAttack(); @@ -128,8 +128,9 @@ public class EntityGlyphidBrawler extends EntityGlyphid { data.setFloat("scale", 2.5F); data.setString("text", "" + (int) amount); PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 2, posZ), new TargetPoint(dimension, posX, posY + 2, posZ, 50));*/ - if(source != DamageSource.fall) super.attackEntityFrom(source, amount); - return false; + //allows brawlers to get no damage on short leaps, but still affected by fall damage on big drops + if(source == DamageSource.fall && amount <= 10) return false; + return super.attackEntityFrom(source, amount); } @Override public boolean isArmorBroken(float amount) { diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java index 318447e46..ece0ee982 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidScout.java @@ -73,7 +73,10 @@ public class EntityGlyphidScout extends EntityGlyphid { @Override public void onUpdate() { super.onUpdate(); - + //Updates to check whether the player still exists, important to make sure it wont stop doing work + if(entityToAttack != null && ticksExisted % 60 == 0){ + entityToAttack = findPlayerToAttack(); + } if((getCurrentTask() != TASK_BUILD_HIVE || getCurrentTask() != TASK_TERRAFORM) && taskWaypoint == null) { if(MobConfig.rampantGlyphidGuidance && PollutionHandler.targetCoords != null){ From acd2e96c64e18864f50fc88138b3f5a17855e6a3 Mon Sep 17 00:00:00 2001 From: 70000hp <105080577+70000hp@users.noreply.github.com> Date: Sat, 6 Apr 2024 13:34:44 -0400 Subject: [PATCH 12/48] minor behemoth buff --- .../com/hbm/entity/mob/glyphid/EntityGlyphidBehemoth.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBehemoth.java b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBehemoth.java index 28bc49068..22a53e3d2 100644 --- a/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBehemoth.java +++ b/src/main/java/com/hbm/entity/mob/glyphid/EntityGlyphidBehemoth.java @@ -74,7 +74,7 @@ public class EntityGlyphidBehemoth extends EntityGlyphid { super.onDeath(source); if (!worldObj.isRemote) { EntityMist mist = new EntityMist(worldObj); - mist.setType(Fluids.ACID); + mist.setType(Fluids.SULFURIC_ACID); mist.setPosition(posX, posY, posZ); mist.setArea(10, 4); mist.setDuration(120); @@ -88,7 +88,7 @@ public class EntityGlyphidBehemoth extends EntityGlyphid { this.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 2 * 20, 6)); EntityChemical chem = new EntityChemical(worldObj, this); - chem.setFluid(Fluids.ACID); + chem.setFluid(Fluids.SULFURIC_ACID); worldObj.spawnEntityInWorld(chem); } } From 30969b281fc77f42d75da55a219699fa309c7b30 Mon Sep 17 00:00:00 2001 From: George Paton Date: Sun, 7 Apr 2024 11:40:13 +1000 Subject: [PATCH 13/48] Automatically focus search box in Multi Fluid Identifier --- src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java index 8d0105f14..e72526ced 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenFluid.java @@ -67,6 +67,7 @@ public class GUIScreenFluid extends GuiScreen { this.search.setTextColor(-1); this.search.setDisabledTextColour(-1); this.search.setEnableBackgroundDrawing(false); + this.search.setFocused(true); if(player.getHeldItem() != null && player.getHeldItem().getItem() == ModItems.fluid_identifier_multi) { this.primary = ItemFluidIDMulti.getType(player.getHeldItem(), true); From 0146e82866cb1d38194e40e870e8fbf97d9cf2e7 Mon Sep 17 00:00:00 2001 From: George Paton Date: Sun, 7 Apr 2024 13:41:48 +1000 Subject: [PATCH 14/48] Change structure/dungeon configs to be trinary (true|false|flag) --- src/main/java/com/hbm/config/CommonConfig.java | 17 +++++++++++++++++ src/main/java/com/hbm/config/GeneralConfig.java | 7 +++++-- .../java/com/hbm/config/StructureConfig.java | 7 +++++-- src/main/java/com/hbm/lib/HbmWorldGen.java | 4 +++- .../com/hbm/world/gen/NTMWorldGenerator.java | 10 ++++++++-- 5 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/hbm/config/CommonConfig.java b/src/main/java/com/hbm/config/CommonConfig.java index 46acd791a..7fce253e8 100644 --- a/src/main/java/com/hbm/config/CommonConfig.java +++ b/src/main/java/com/hbm/config/CommonConfig.java @@ -87,4 +87,21 @@ public class CommonConfig { return prop.getStringList(); } + public static int parseStructureFlag(String flag) { + if(flag == null) flag = ""; + + switch(flag.toLowerCase(Locale.US)) { + case "true": + case "on": + case "yes": + return 1; + case "false": + case "off": + case "no": + return 0; + default: + return 2; + } + } + } diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 99eb1fed8..13f5e37dd 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -9,7 +9,7 @@ public class GeneralConfig { public static boolean enableDebugMode = true; public static boolean enableMycelium = false; public static boolean enablePlutoniumOre = false; - public static boolean enableDungeons = true; + public static int enableDungeons = 2; public static boolean enableMDOres = true; public static boolean enableMines = true; public static boolean enableRad = true; @@ -73,7 +73,10 @@ public class GeneralConfig { enableDebugMode = config.get(CATEGORY_GENERAL, "1.00_enableDebugMode", false, "Enable debugging mode").getBoolean(false); enableMycelium = config.get(CATEGORY_GENERAL, "1.01_enableMyceliumSpread", false, "Allows glowing mycelium to spread").getBoolean(false); enablePlutoniumOre = config.get(CATEGORY_GENERAL, "1.02_enablePlutoniumNetherOre", false, "Enables plutonium ore generation in the nether").getBoolean(false); - enableDungeons = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", true, "Allows structures and dungeons to spawn").getBoolean(true); + + String unparsedDungeonFlag = config.get(CATEGORY_GENERAL, "1.03_enableDungeonSpawn", "flag", "Allows structures and dungeons to spawn. Valid values are true|false|flag - flag will respect the \"Generate Structures\" world flag.").getString(); + enableDungeons = CommonConfig.parseStructureFlag(unparsedDungeonFlag); + enableMDOres = config.get(CATEGORY_GENERAL, "1.04_enableOresInModdedDimensions", true, "Allows NTM ores to generate in modded dimensions").getBoolean(true); enableMines = config.get(CATEGORY_GENERAL, "1.05_enableLandmineSpawn", true, "Allows landmines to generate").getBoolean(true); enableRad = config.get(CATEGORY_GENERAL, "1.06_enableRadHotspotSpawn", true, "Allows radiation hotspots to generate").getBoolean(true); diff --git a/src/main/java/com/hbm/config/StructureConfig.java b/src/main/java/com/hbm/config/StructureConfig.java index 9d6ad3cc0..944a7cbb0 100644 --- a/src/main/java/com/hbm/config/StructureConfig.java +++ b/src/main/java/com/hbm/config/StructureConfig.java @@ -8,7 +8,7 @@ import net.minecraftforge.common.config.Configuration; public class StructureConfig { - public static boolean enableStructures = true; + public static int enableStructures = 2; public static int structureMinChunks = 8; public static int structureMaxChunks = 24; @@ -18,7 +18,10 @@ public class StructureConfig { public static void loadFromConfig(Configuration config) { final String CATEGORY_STRUCTURES = CommonConfig.CATEGORY_STRUCTURES; - enableStructures = CommonConfig.createConfigBool(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Switch for whether structures using the MapGenStructure system spawn.", true); + + String unparsedStructureFlag = CommonConfig.createConfigString(config, CATEGORY_STRUCTURES, "5.00_enableStructures", "Flag for whether modern NTM structures will spawn. Valid values are true|false|flag - flag will respect the \"Generate Structures\" world flag.", "flag"); + + enableStructures = CommonConfig.parseStructureFlag(unparsedStructureFlag); structureMinChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.01_structureMinChunks", "Minimum non-zero distance between structures in chunks (Settings lower than 8 may be problematic).", 8); structureMaxChunks = CommonConfig.createConfigInt(config, CATEGORY_STRUCTURES, "5.02_structureMaxChunks", "Maximum non-zero distance between structures in chunks.", 24); diff --git a/src/main/java/com/hbm/lib/HbmWorldGen.java b/src/main/java/com/hbm/lib/HbmWorldGen.java index e6029be87..f8ee016ff 100644 --- a/src/main/java/com/hbm/lib/HbmWorldGen.java +++ b/src/main/java/com/hbm/lib/HbmWorldGen.java @@ -220,8 +220,10 @@ public class HbmWorldGen implements IWorldGenerator { } boolean enableDungeons = world.getWorldInfo().isMapFeaturesEnabled(); + if(GeneralConfig.enableDungeons == 1) enableDungeons = true; + if(GeneralConfig.enableDungeons == 0) enableDungeons = false; - if(GeneralConfig.enableDungeons && world.provider.dimensionId == 0 && enableDungeons) { + if(enableDungeons && world.provider.dimensionId == 0) { if(MobConfig.enableHives && rand.nextInt(MobConfig.hiveSpawn) == 0) { int x = i + rand.nextInt(16) + 8; diff --git a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java index 34efa8ea1..6fb9e7fd1 100644 --- a/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java +++ b/src/main/java/com/hbm/world/gen/NTMWorldGenerator.java @@ -49,7 +49,8 @@ public class NTMWorldGenerator implements IWorldGenerator { setRandomSeed(event.world, event.chunkX, event.chunkZ); //Set random for population down the line. hasPopulationEvent = true; - if(!StructureConfig.enableStructures || !event.world.getWorldInfo().isMapFeaturesEnabled()) return; + if(StructureConfig.enableStructures == 0) return; + if(StructureConfig.enableStructures == 2 && !event.world.getWorldInfo().isMapFeaturesEnabled()) return; switch (event.world.provider.dimensionId) { case -1: @@ -94,7 +95,12 @@ public class NTMWorldGenerator implements IWorldGenerator { private void generateSurface(World world, Random rand, IChunkProvider chunkGenerator, IChunkProvider chunkProvider, int chunkX, int chunkZ) { if(!hasPopulationEvent) { //If we've failed to generate any structures (flatlands) setRandomSeed(world, chunkX, chunkZ); //Reset the random seed to compensate - if(StructureConfig.enableStructures) generateOverworldStructures(world, chunkGenerator, chunkX, chunkZ); //Do it through the post-population generation directly + + boolean enableStructures = world.getWorldInfo().isMapFeaturesEnabled(); + if(StructureConfig.enableStructures == 1) enableStructures = true; + if(StructureConfig.enableStructures == 0) enableStructures = false; + + if(enableStructures) generateOverworldStructures(world, chunkGenerator, chunkX, chunkZ); //Do it through the post-population generation directly } /* biome dictionary my beloved <3 From 180234e245b6933d0f71eb48d4190c47ca819b8c Mon Sep 17 00:00:00 2001 From: George Paton Date: Sun, 7 Apr 2024 16:39:33 +1000 Subject: [PATCH 15/48] Integrated geiger counters now generate audio based on dosage AFTER protection --- .../java/com/hbm/items/armor/ArmorFSB.java | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/ArmorFSB.java b/src/main/java/com/hbm/items/armor/ArmorFSB.java index d6eb33079..912a11dcc 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSB.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSB.java @@ -12,6 +12,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.util.ContaminationUtil; import com.hbm.util.I18nUtil; import cpw.mods.fml.common.gameevent.TickEvent; @@ -48,8 +49,8 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { private String texture = ""; private ResourceLocation overlay = null; - public List effects = new ArrayList(); - public HashMap resistance = new HashMap(); + public List effects = new ArrayList(); + public HashMap resistance = new HashMap(); public float blastProtection = -1; public float projectileProtection = -1; public float damageCap = -1; @@ -572,34 +573,31 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { if(this.armorType != 1) return; - if(!this.hasFSBArmor(entity) || !this.geigerSound) + if(!hasFSBArmor(entity) || !this.geigerSound) return; if(world.getTotalWorldTime() % 5 == 0) { - - float x = HbmLivingProps.getRadBuf((EntityLivingBase)entity); + + // Armor piece dosimeters indicate radiation dosage inside the armor, so reduce the counts by the effective protection + float mod = ContaminationUtil.calculateRadiationMod(entity); + float x = HbmLivingProps.getRadBuf(entity) * mod; if(x > 1E-5) { - - if(x > 0) { - List list = new ArrayList(); - - if(x < 1) list.add(0); - if(x < 5) list.add(0); - if(x < 10) list.add(1); - if(x > 5 && x < 15) list.add(2); - if(x > 10 && x < 20) list.add(3); - if(x > 15 && x < 25) list.add(4); - if(x > 20 && x < 30) list.add(5); - if(x > 25) list.add(6); - - int r = list.get(world.rand.nextInt(list.size())); - - if(r > 0) - world.playSoundAtEntity(entity, "hbm:item.geiger" + r, 1.0F, 1.0F); - } else if(world.rand.nextInt(50) == 0) { - world.playSoundAtEntity(entity, "hbm:item.geiger" + (1 + world.rand.nextInt(1)), 1.0F, 1.0F); - } + List list = new ArrayList(); + + if(x < 1) list.add(0); + if(x < 5) list.add(0); + if(x < 10) list.add(1); + if(x > 5 && x < 15) list.add(2); + if(x > 10 && x < 20) list.add(3); + if(x > 15 && x < 25) list.add(4); + if(x > 20 && x < 30) list.add(5); + if(x > 25) list.add(6); + + int r = list.get(world.rand.nextInt(list.size())); + + if(r > 0) + world.playSoundAtEntity(entity, "hbm:item.geiger" + r, 1.0F, 1.0F); } } } @@ -645,7 +643,7 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); } - private HashSet hidden = new HashSet(); + private HashSet hidden = new HashSet(); private boolean needsFullSet = false; public ArmorFSB hides(EnumPlayerPart... parts) { From 0b8332d525c95ec54ce1312217e3eb95af950192 Mon Sep 17 00:00:00 2001 From: George Paton Date: Sun, 7 Apr 2024 17:23:59 +1000 Subject: [PATCH 16/48] Play full counts if the player also has a regular counter --- src/main/java/com/hbm/items/armor/ArmorFSB.java | 4 ++++ src/main/java/com/hbm/items/tool/ItemDosimeter.java | 7 ------- src/main/java/com/hbm/items/tool/ItemGeigerCounter.java | 7 ------- 3 files changed, 4 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/hbm/items/armor/ArmorFSB.java b/src/main/java/com/hbm/items/armor/ArmorFSB.java index 912a11dcc..de7a67afa 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSB.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSB.java @@ -12,6 +12,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.radiation.ChunkRadiationManager; +import com.hbm.items.ModItems; import com.hbm.util.ContaminationUtil; import com.hbm.util.I18nUtil; @@ -576,6 +577,9 @@ public class ArmorFSB extends ItemArmor implements IArmorDisableModel { if(!hasFSBArmor(entity) || !this.geigerSound) return; + if(entity.inventory.hasItem(ModItems.geiger_counter) || entity.inventory.hasItem(ModItems.dosimeter)) + return; + if(world.getTotalWorldTime() % 5 == 0) { // Armor piece dosimeters indicate radiation dosage inside the armor, so reduce the counts by the effective protection diff --git a/src/main/java/com/hbm/items/tool/ItemDosimeter.java b/src/main/java/com/hbm/items/tool/ItemDosimeter.java index 3a6a1f4bf..c8eeb585d 100644 --- a/src/main/java/com/hbm/items/tool/ItemDosimeter.java +++ b/src/main/java/com/hbm/items/tool/ItemDosimeter.java @@ -5,7 +5,6 @@ import java.util.List; import java.util.Random; import com.hbm.extprop.HbmLivingProps; -import com.hbm.items.armor.ArmorFSB; import com.hbm.util.ContaminationUtil; import net.minecraft.entity.Entity; @@ -25,12 +24,6 @@ public class ItemDosimeter extends Item { if(!(entity instanceof EntityLivingBase) || world.isRemote) return; - if(entity instanceof EntityPlayer) { - - if(ArmorFSB.hasFSBArmor((EntityPlayer)entity) && ((ArmorFSB)((EntityPlayer)entity).inventory.armorInventory[2].getItem()).geigerSound) - return; - } - float x = HbmLivingProps.getRadBuf((EntityLivingBase)entity); if(world.getTotalWorldTime() % 5 == 0) { diff --git a/src/main/java/com/hbm/items/tool/ItemGeigerCounter.java b/src/main/java/com/hbm/items/tool/ItemGeigerCounter.java index 72be9d361..cc86cc758 100644 --- a/src/main/java/com/hbm/items/tool/ItemGeigerCounter.java +++ b/src/main/java/com/hbm/items/tool/ItemGeigerCounter.java @@ -6,7 +6,6 @@ import java.util.Random; import com.hbm.extprop.HbmLivingProps; import com.hbm.handler.radiation.ChunkRadiationManager; -import com.hbm.items.armor.ArmorFSB; import com.hbm.util.ContaminationUtil; import net.minecraft.entity.Entity; @@ -27,12 +26,6 @@ public class ItemGeigerCounter extends Item { if(!(entity instanceof EntityLivingBase) || world.isRemote) return; - if(entity instanceof EntityPlayer) { - - if(ArmorFSB.hasFSBArmor((EntityPlayer)entity) && ((ArmorFSB)((EntityPlayer)entity).inventory.armorInventory[2].getItem()).geigerSound) - return; - } - float x = HbmLivingProps.getRadBuf((EntityLivingBase)entity); if(world.getTotalWorldTime() % 5 == 0) { From a9c6405f41f22e9faaaf7eb47aff4dc159f72d10 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 8 Apr 2024 16:44:48 +0200 Subject: [PATCH 17/48] project mkultra --- .../hbm/energymk2/IEnergyConnectorMK2.java | 4 + .../api/hbm/energymk2/IEnergyProviderMK2.java | 5 ++ .../api/hbm/energymk2/IEnergyReceiverMK2.java | 25 +++++- .../java/api/hbm/energymk2/Nodespace.java | 82 ++++++++++++++----- 4 files changed, 94 insertions(+), 22 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java index 79f678246..2245f57ff 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java @@ -23,6 +23,10 @@ public interface IEnergyConnectorMK2 extends ILoadedTile { public long getPower(); public long getMaxPower(); + public default long getConnectionSpeed() { + return this.getMaxPower(); + } + public static final boolean particleDebug = false; public default Vec3 getDebugParticlePosMK2() { diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index b8a05e0ae..d45feb6f9 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -11,6 +11,11 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; public interface IEnergyProviderMK2 extends IEnergyConnectorMK2 { + + /** Uses up available power, default implementation has no sanity checking, make sure that the requested power is lequal to the current power */ + public default void usePower(long power) { + this.setPower(this.getPower() - power); + } public void setPower(long power); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index d68837692..dfb32f097 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -70,13 +70,36 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { } } + /** + * Project MKUltra was an illegal human experiments program designed and undertaken by the U.S. Central Intelligence Agency (CIA) + * to develop procedures and identify drugs that could be used during interrogations to weaken people and force confessions through + * brainwashing and psychological torture. It began in 1953 and was halted in 1973. MKUltra used numerous methods to manipulate + * its subjects' mental states and brain functions, such as the covert administration of high doses of psychoactive drugs (especially LSD) + * and other chemicals without the subjects' consent, electroshocks, hypnosis, sensory deprivation, isolation, verbal and sexual + * abuse, and other forms of torture. + * MKUltra was preceded by Project Artichoke. It was organized through the CIA's Office of Scientific Intelligence and coordinated + * with the United States Army Biological Warfare Laboratories. The program engaged in illegal activities, including the + * use of U.S. and Canadian citizens as unwitting test subjects. MKUltra's scope was broad, with activities carried + * out under the guise of research at more than 80 institutions aside from the military, including colleges and universities, + * hospitals, prisons, and pharmaceutical companies. The CIA operated using front organizations, although some top officials at these + * institutions were aware of the CIA's involvement. + * MKUltra was revealed to the public in 1975 by the Church Committee of the United States Congress and Gerald Ford's United States + * President's Commission on CIA activities within the United States (the Rockefeller Commission). Investigative efforts were hampered + * by CIA Director Richard Helms's order that all MKUltra files be destroyed in 1973; the Church Committee and Rockefeller Commission + * investigations relied on the sworn testimony of direct participants and on the small number of documents that survived Helms's order. + * In 1977, a Freedom of Information Act request uncovered a cache of 20,000 documents relating to MKUltra, which led to Senate hearings. + * Some surviving information about MKUltra was declassified in 2001. + * */ public default ConnectionPriority getPriority() { return ConnectionPriority.NORMAL; } + /** More is better-er */ public enum ConnectionPriority { + LOWEST, LOW, NORMAL, - HIGH + HIGH, + HIGHEST } } diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 2a9f4c23a..bdf7ce105 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,18 +1,16 @@ package api.hbm.energymk2; -import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map.Entry; import java.util.Set; -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.server.MinecraftServer; import net.minecraft.world.World; @@ -46,16 +44,6 @@ public class Nodespace { PowerNode node = getNode(world, x, y, z); if(node != null) { worlds.get(world).popNode(node); - //markNeigbors(world, node); - } - } - - /** Grabs all neighbor nodes from the given node's connection points and removes them from the network entirely, forcing a hard reconnect */ - @Deprecated private static void markNeigbors(World world, PowerNode node) { - - for(DirPos con : node.connections) { - PowerNode conNode = getNode(world, con.getX(), con.getY(), con.getZ()); - if(conNode != null && conNode.hasValidNet()) conNode.net.leaveLink(conNode); } } @@ -95,22 +83,64 @@ public class Nodespace { int timeout = 3_000; for(PowerNetMK2 net : activePowerNets) { + + if(net.providerEntries.isEmpty()) continue; + if(net.receiverEntries.isEmpty()) continue; long timestamp = System.currentTimeMillis(); - - //TODO: start over, impose a per-tick transfer limit in order to avoid bigints + long transferCap = 100_000_000_000_000_00L; // that ought to be enough - BigInteger supply = BigInteger.valueOf(0); - BigInteger demand = BigInteger.valueOf(0); + long supply = 0; + long demand = 0; for(Entry entry : net.providerEntries.entrySet()) { IEnergyProviderMK2 provider = entry.getKey(); - if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply = supply.add(BigInteger.valueOf(provider.getPower())); + if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed()); } for(Entry entry : net.receiverEntries.entrySet()) { IEnergyReceiverMK2 receiver = entry.getKey(); - if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand = demand.add(BigInteger.valueOf(receiver.getMaxPower() - receiver.getPower())); + 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 providers = new ArrayList() {{ addAll(net.providerEntries.keySet()); }}; + List 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; + } } } } @@ -222,4 +252,14 @@ public class Nodespace { this.recentlyChanged = true; } } + + public static final ReceiverComparator COMP = new ReceiverComparator(); + + public static class ReceiverComparator implements Comparator { + + @Override + public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) { + return o2.getPriority().ordinal() - o1.getPriority().ordinal(); + } + } } From b1e2fbbbbc18e216b64902e499a6671cfca55c31 Mon Sep 17 00:00:00 2001 From: Bob Date: Mon, 8 Apr 2024 20:44:48 +0200 Subject: [PATCH 18/48] congress should pass a bill barring me from using a PC ever again --- .../java/api/hbm/energymk2/Nodespace.java | 72 +---------------- .../java/api/hbm/energymk2/PowerNetMK2.java | 78 +++++++++++++++++++ 2 files changed, 79 insertions(+), 71 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index bdf7ce105..ae0caae29 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -80,68 +80,8 @@ public class Nodespace { private static void updatePowerNets() { - int timeout = 3_000; - for(PowerNetMK2 net : activePowerNets) { - - 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 entry : net.providerEntries.entrySet()) { - IEnergyProviderMK2 provider = entry.getKey(); - if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed()); - } - - for(Entry 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 providers = new ArrayList() {{ addAll(net.providerEntries.keySet()); }}; - List 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; - } - } + net.transferPower(); } } @@ -252,14 +192,4 @@ public class Nodespace { this.recentlyChanged = true; } } - - public static final ReceiverComparator COMP = new ReceiverComparator(); - - public static class ReceiverComparator implements Comparator { - - @Override - public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) { - return o2.getPriority().ordinal() - o1.getPriority().ordinal(); - } - } } diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 2f88d8f05..233bf14b0 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -1,10 +1,12 @@ package api.hbm.energymk2; import java.util.ArrayList; +import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.Map.Entry; import api.hbm.energymk2.Nodespace.PowerNode; @@ -101,4 +103,80 @@ public class PowerNetMK2 { this.receiverEntries.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 entry : providerEntries.entrySet()) { + IEnergyProviderMK2 provider = entry.getKey(); + if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed()); + } + + for(Entry 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 providers = new ArrayList() {{ addAll(providerEntries.keySet()); }}; + List 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 { + + @Override + public int compare(IEnergyReceiverMK2 o1, IEnergyReceiverMK2 o2) { + return o2.getPriority().ordinal() - o1.getPriority().ordinal(); + } + } } From c9c6549340ba38049fadfb29a01e7f39a276ec34 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 9 Apr 2024 16:55:53 +0200 Subject: [PATCH 19/48] everything is falling the fuck apart --- .../java/api/hbm/energy/IEnergyConductor.java | 160 ----------- .../java/api/hbm/energy/IEnergyConnector.java | 128 --------- .../java/api/hbm/energy/IEnergyGenerator.java | 19 -- src/main/java/api/hbm/energy/IEnergyUser.java | 114 -------- src/main/java/api/hbm/energy/IPowerNet.java | 37 --- src/main/java/api/hbm/energy/PowerNet.java | 257 ------------------ .../{energy => energymk2}/IBatteryItem.java | 2 +- .../IEnergyConnectorBlock.java | 2 +- .../hbm/energymk2/IEnergyConnectorMK2.java | 28 +- .../api/hbm/energymk2/IEnergyHandlerMK2.java | 33 +++ .../api/hbm/energymk2/IEnergyProviderMK2.java | 5 +- .../api/hbm/energymk2/IEnergyReceiverMK2.java | 5 +- .../java/api/hbm/energymk2/Nodespace.java | 3 - .../java/api/hbm/fluid/IFluidConnector.java | 2 +- .../api/hbm/{energy => tile}/ILoadedTile.java | 2 +- .../hbm/blocks/generic/BlockCableConnect.java | 2 +- .../com/hbm/blocks/generic/HEVBattery.java | 2 +- .../com/hbm/blocks/machine/DummyOldBase.java | 2 +- .../com/hbm/blocks/machine/FWatzHatch.java | 2 +- .../hbm/blocks/machine/MachineCapacitor.java | 7 +- .../blocks/machine/MachineCapacitorBus.java | 2 +- .../com/hbm/blocks/network/CableDiode.java | 4 +- .../entity/train/EntityRailCarElectric.java | 2 +- .../com/hbm/entity/train/TrainCargoTram.java | 2 +- .../hbm/explosion/ExplosionNukeGeneric.java | 11 +- .../container/ContainerCentrifuge.java | 2 +- .../container/ContainerCombustionEngine.java | 2 +- .../container/ContainerCompressor.java | 2 +- .../container/ContainerCrystallizer.java | 2 +- .../container/ContainerElectricFurnace.java | 2 +- .../container/ContainerElectrolyserFluid.java | 2 +- .../container/ContainerElectrolyserMetal.java | 2 +- .../container/ContainerLaunchPadLarge.java | 2 +- .../container/ContainerMachineArcFurnace.java | 2 +- .../container/ContainerMachineArcWelder.java | 2 +- .../ContainerMachineCatalyticReformer.java | 2 +- .../container/ContainerMachineCyclotron.java | 2 +- .../container/ContainerMachineEPress.java | 2 +- .../container/ContainerMachineExcavator.java | 2 +- .../ContainerMachineExposureChamber.java | 2 +- .../container/ContainerMachineGasFlare.java | 2 +- .../ContainerMachineHydrotreater.java | 2 +- .../container/ContainerMachineRadarNT.java | 2 +- .../container/ContainerMachineTurbineGas.java | 2 +- .../container/ContainerMachineWoodBurner.java | 2 +- .../inventory/container/ContainerMixer.java | 2 +- .../com/hbm/items/armor/ArmorFSBPowered.java | 2 +- .../java/com/hbm/items/food/ItemPancake.java | 2 +- .../com/hbm/items/machine/ItemBattery.java | 2 +- .../hbm/items/machine/ItemSelfcharger.java | 2 +- .../com/hbm/items/special/ItemGlitch.java | 2 +- .../com/hbm/items/tool/ItemFusionCore.java | 2 +- .../hbm/items/tool/ItemSwordAbilityPower.java | 2 +- .../hbm/items/tool/ItemToolAbilityPower.java | 2 +- .../weapon/gununified/ItemEnergyGunBase.java | 2 +- src/main/java/com/hbm/lib/Library.java | 10 +- .../java/com/hbm/packet/AuxButtonPacket.java | 1 - .../hbm/tileentity/TileEntityLoadedBase.java | 2 +- .../tileentity/TileEntityProxyConductor.java | 80 +----- .../bomb/TileEntityNukeBalefire.java | 2 +- .../tileentity/machine/TileEntityCharger.java | 2 +- .../machine/TileEntityForceField.java | 2 +- .../machine/TileEntityMachineAssembler.java | 2 +- .../TileEntityMachineBoilerElectric.java | 2 +- .../TileEntityMachineCrystallizer.java | 2 +- .../machine/TileEntityMachineDiesel.java | 2 +- .../TileEntityMachineElectricFurnace.java | 2 +- ...eEntityMachineSchrabidiumTransmutator.java | 2 +- .../TileEntityMachineSeleniumEngine.java | 2 +- .../machine/TileEntityMachineShredder.java | 2 +- .../TileEntityMachineShredderLarge.java | 2 +- .../machine/TileEntityMachineTurbine.java | 2 +- .../machine/oil/TileEntityOilDrillBase.java | 4 +- .../storage/TileEntityMachineBattery.java | 1 + .../network/TileEntityCableBaseNT.java | 84 +----- .../com/hbm/util/CompatEnergyControl.java | 8 +- .../java/com/hbm/util/CompatExternal.java | 15 +- 77 files changed, 125 insertions(+), 999 deletions(-) delete mode 100644 src/main/java/api/hbm/energy/IEnergyConductor.java delete mode 100644 src/main/java/api/hbm/energy/IEnergyConnector.java delete mode 100644 src/main/java/api/hbm/energy/IEnergyGenerator.java delete mode 100644 src/main/java/api/hbm/energy/IEnergyUser.java delete mode 100644 src/main/java/api/hbm/energy/IPowerNet.java delete mode 100644 src/main/java/api/hbm/energy/PowerNet.java rename src/main/java/api/hbm/{energy => energymk2}/IBatteryItem.java (98%) rename src/main/java/api/hbm/{energy => energymk2}/IEnergyConnectorBlock.java (95%) create mode 100644 src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java rename src/main/java/api/hbm/{energy => tile}/ILoadedTile.java (72%) diff --git a/src/main/java/api/hbm/energy/IEnergyConductor.java b/src/main/java/api/hbm/energy/IEnergyConductor.java deleted file mode 100644 index e6195acb8..000000000 --- a/src/main/java/api/hbm/energy/IEnergyConductor.java +++ /dev/null @@ -1,160 +0,0 @@ -package api.hbm.energy; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * For compatible cables with no buffer, using the IPowertNet. You can make your own cables with IEnergyConnector as well, but they won't join their power network. - * @author hbm - */ -public interface IEnergyConductor extends IEnergyConnector { - - public IPowerNet getPowerNet(); - - public void setPowerNet(IPowerNet network); - - /** - * A unique identifier for every conductor tile. Used to prevent duplicates when loading previously persistent unloaded tiles. - * @return - */ - public default int getIdentity() { - return getIdentityFromTile((TileEntity) this); - } - - public static int getIdentityFromTile(TileEntity te) { - return getIdentityFromPos(te.xCoord, te.yCoord, te.zCoord); - } - - public static int getIdentityFromPos(int x, int y, int z) { - final int prime = 27644437; // must be this large to minimize localized collisions - int result = 1; - result = prime * result + x; - result = prime * result + y; - result = prime * result + z; - return result; - } - - /** - * Whether the link should be part of reeval when the network is changed. - * I.e. if this link should join any of the new networks (FALSE for switches that are turned off for example) - * @return - */ - public default boolean canReevaluate() { - return !((TileEntity) this).isInvalid(); - } - - /** - * When a link leaves the network, the net has to manually calculate the resulting networks. - * Each link has to decide what other links will join the same net. - * @param copy - */ - public default void reevaluate(HashMap copy, HashMap proxies) { - - for(int[] pos : getConnectionPoints()) { - int newX = pos[0]; - int newY = pos[1]; - int newZ = pos[2]; - int id = IEnergyConductor.getIdentityFromPos(newX, newY, newZ); - - IEnergyConductor neighbor = copy.get(id); - - if(neighbor == null) { - Integer newId = proxies.get(id); - - if(newId != null) { - neighbor = copy.get(newId); - } - } - - if(neighbor != null && this.canReevaluate() && neighbor.canReevaluate()) { - - if(neighbor.getPowerNet() != null) { - - //neighbor net and no self net - if(this.getPowerNet() == null) { - neighbor.getPowerNet().joinLink(this); - //neighbor net and self net - } else { - this.getPowerNet().joinNetworks(neighbor.getPowerNet()); - } - - //bidirectional re-eval, experimental and technically optional, only useful as a fallback - } /*else { - - //no neighbor net and no self net - if(this.getPowerNet() == null) { - this.setPowerNet(new PowerNet().joinLink(this)); - neighbor.setPowerNet(this.getPowerNet().joinLink(neighbor)); - //no neighbor net and self net - } else { - neighbor.setPowerNet(this.getPowerNet().joinLink(neighbor)); - } - }*/ - - //extensive debugging has shown that bidirectional re-eval is complete shit - } - } - } - - /** - * Creates a list of positions for the re-eval process. In short - what positions should be considered as connected. - * Also used by pylons to quickly figure out what positions to connect to. - * DEFAULT: Connects to all six neighboring blocks. - * @return - */ - public default List getConnectionPoints() { - - List pos = new ArrayList(); - TileEntity tile = (TileEntity) this; - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - int newX = tile.xCoord + dir.offsetX; - int newY = tile.yCoord + dir.offsetY; - int newZ = tile.zCoord + dir.offsetZ; - - pos.add(new int[] {newX, newY, newZ}); - } - - return pos; - } - - /** - * Since isLoaded is only currently used for weeding out unwanted subscribers, and cables shouldn't (although technically can) be - * subscribers, we just default to true because I don't feel like wasting time implementing things that we don't actually need. - * Perhaps this indicates a minor flaw in the new API, but I physically lack the ability to worry about it. - */ - @Override - public default boolean isLoaded() { - return true; - } - - //TODO: check if this standard implementation doesn't break anything (it shouldn't but right now it's a bit redundant) also: remove duplicate implementations - @Override - public default long transferPower(long power) { - - if(this.getPowerNet() == null) - return power; - - return this.getPowerNet().transferPower(power); - } - - /** - * Returns whether the conductor has mutliblock proxies which need to be taken into consideration for re-eval. - * @return - */ - public default boolean hasProxies() { - return false; - } - - /** - * Returns the identities (position-based) of proxies which resolve into the conductor's own identity. - * @return - */ - public default List getProxies() { - return new ArrayList(); - } -} diff --git a/src/main/java/api/hbm/energy/IEnergyConnector.java b/src/main/java/api/hbm/energy/IEnergyConnector.java deleted file mode 100644 index 311a09ff8..000000000 --- a/src/main/java/api/hbm/energy/IEnergyConnector.java +++ /dev/null @@ -1,128 +0,0 @@ -package api.hbm.energy; - -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; -import com.hbm.util.CompatEnergyControl; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * For anything that connects to power and can be transferred power to, the bottom-level interface. - * This is mean for TILE ENTITIES - * @author hbm - */ -public interface IEnergyConnector extends ILoadedTile { - - /** - * Returns the amount of power that remains in the source after transfer - * @param power - * @return - */ - public long transferPower(long power); - - /** - * Whether the given side can be connected to - * dir refers to the side of this block, not the connecting block doing the check - * @param dir - * @return - */ - public default boolean canConnect(ForgeDirection dir) { - return dir != ForgeDirection.UNKNOWN; - } - - /** - * The current power of either the machine or an entire network - * @return - */ - public long getPower(); - - /** - * The capacity of either the machine or an entire network - * @return - */ - public long getMaxPower(); - - public default long getTransferWeight() { - return Math.max(getMaxPower() - getPower(), 0); - } - - /** - * Basic implementation of subscribing to a nearby power grid - * @param world - * @param x - * @param y - * @param z - */ - public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { - - TileEntity te = world.getTileEntity(x, y, z); - boolean red = false; - - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(!con.canConnect(dir.getOpposite())) - return; - - if(con.getPowerNet() != null && !con.getPowerNet().isSubscribed(this)) - con.getPowerNet().subscribe(this); - - if(con.getPowerNet() != null) - red = true; - } - - if(particleDebug) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "network"); - data.setString("mode", "power"); - double posX = x + 0.5 + dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - double posY = y + 0.5 + dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - double posZ = z + 0.5 + dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - data.setDouble("mX", -dir.offsetX * (red ? 0.025 : 0.1)); - data.setDouble("mY", -dir.offsetY * (red ? 0.025 : 0.1)); - data.setDouble("mZ", -dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); - } - } - - public default void tryUnsubscribe(World world, int x, int y, int z) { - - TileEntity te = world.getTileEntity(x, y, z); - - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) - con.getPowerNet().unsubscribe(this); - } - } - - public static final boolean particleDebug = false; - - public default Vec3 getDebugParticlePos() { - TileEntity te = (TileEntity) this; - Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); - return vec; - } - - /** Shortcut for adding energy data to tiles that implement IInfoProviderEC, should NOT be used externally for compat! Use IInfoProviderEC.provideInfo() instead! */ - public default void provideInfoForEC(NBTTagCompound data) { - data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); - data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); - } - - public default ConnectionPriority getPriority() { - return ConnectionPriority.NORMAL; - } - - public enum ConnectionPriority { - LOW, - NORMAL, - HIGH - } -} diff --git a/src/main/java/api/hbm/energy/IEnergyGenerator.java b/src/main/java/api/hbm/energy/IEnergyGenerator.java deleted file mode 100644 index 37db6370d..000000000 --- a/src/main/java/api/hbm/energy/IEnergyGenerator.java +++ /dev/null @@ -1,19 +0,0 @@ -package api.hbm.energy; - -public interface IEnergyGenerator extends IEnergyUser { - - /** - * Standard implementation for machines that can only send energy but never receive it. - * @param power - */ - @Override - public default long transferPower(long power) { - return power; - } - - /* should stop making non-receivers from interfering by applying their weight which doesn't even matter */ - @Override - public default long getTransferWeight() { - return 0; - } -} diff --git a/src/main/java/api/hbm/energy/IEnergyUser.java b/src/main/java/api/hbm/energy/IEnergyUser.java deleted file mode 100644 index 4ca8e369a..000000000 --- a/src/main/java/api/hbm/energy/IEnergyUser.java +++ /dev/null @@ -1,114 +0,0 @@ -package api.hbm.energy; - -import com.hbm.packet.AuxParticlePacketNT; -import com.hbm.packet.PacketDispatcher; - -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * For machines and things that have an energy buffer and are affected by EMPs - * @author hbm - */ -public interface IEnergyUser extends IEnergyConnector { - - /** - * Not to be used for actual energy transfer, rather special external things like EMPs and sync packets - */ - public void setPower(long power); - - /** - * Standard implementation for power transfer. - * Turns out you can override interfaces to provide a default implementation. Neat. - * @param long power - */ - @Override - public default long transferPower(long power) { - - if(this.getPower() + power > this.getMaxPower()) { - - long overshoot = this.getPower() + power - this.getMaxPower(); - this.setPower(this.getMaxPower()); - return overshoot; - } - - if(this.getPower() + power < 0) return 0; //safeguard for negative energy or overflows - - this.setPower(this.getPower() + power); - - return 0; - } - - /** - * Standard implementation of sending power - * @param world - * @param x - * @param y - * @param z - * @param dir - */ - public default void sendPower(World world, int x, int y, int z, ForgeDirection dir) { - - TileEntity te = world.getTileEntity(x, y, z); - boolean wasSubscribed = false; - boolean red = false; - - // first we make sure we're not subscribed to the network that we'll be supplying - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.canConnect(dir.getOpposite()) && con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().unsubscribe(this); - wasSubscribed = true; - } - } - - //then we add energy - if(te instanceof IEnergyConnector) { - IEnergyConnector con = (IEnergyConnector) te; - - if(con.canConnect(dir.getOpposite())) { - long oldPower = this.getPower(); - long transfer = oldPower - con.transferPower(oldPower); - this.setPower(oldPower - transfer); - red = true; - } - } - - //then we subscribe if possible - if(wasSubscribed && te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null && !con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().subscribe(this); - } - } - - if(particleDebug) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "network"); - data.setString("mode", "power"); - double posX = x + 0.5 - dir.offsetX * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - double posY = y + 0.5 - dir.offsetY * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - double posZ = z + 0.5 - dir.offsetZ * 0.5 + world.rand.nextDouble() * 0.5 - 0.25; - data.setDouble("mX", dir.offsetX * (red ? 0.025 : 0.1)); - data.setDouble("mY", dir.offsetY * (red ? 0.025 : 0.1)); - data.setDouble("mZ", dir.offsetZ * (red ? 0.025 : 0.1)); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY, posZ), new TargetPoint(world.provider.dimensionId, posX, posY, posZ, 25)); - } - } - - public default void updateStandardConnections(World world, TileEntity te) { - updateStandardConnections(world, te.xCoord, te.yCoord, te.zCoord); - } - - public default void updateStandardConnections(World world, int x, int y, int z) { - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - this.trySubscribe(world, x + dir.offsetX, y + dir.offsetY, z + dir.offsetZ, dir); - } - } -} diff --git a/src/main/java/api/hbm/energy/IPowerNet.java b/src/main/java/api/hbm/energy/IPowerNet.java deleted file mode 100644 index eb9848226..000000000 --- a/src/main/java/api/hbm/energy/IPowerNet.java +++ /dev/null @@ -1,37 +0,0 @@ -package api.hbm.energy; - -import java.math.BigInteger; -import java.util.List; - -/** - * Not mandatory to use, but making your cables IPowerNet-compliant will allow them to connect to NTM cables. - * Cables will still work without it as long as they implement IEnergyConductor (or even IEnergyConnector) + self-built network code - * @author hbm - */ -public interface IPowerNet { - - public void joinNetworks(IPowerNet network); - - public IPowerNet joinLink(IEnergyConductor conductor); - public void leaveLink(IEnergyConductor conductor); - - public void subscribe(IEnergyConnector connector); - public void unsubscribe(IEnergyConnector connector); - public boolean isSubscribed(IEnergyConnector connector); - - public void destroy(); - - /** - * When a link is removed, instead of destroying the network, causing it to be recreated from currently loaded conductors, - * we re-evaluate it, creating new nets based on the previous links. - */ - public void reevaluate(); - - public boolean isValid(); - - public List getLinks(); - public List getSubscribers(); - - public long transferPower(long power); - public BigInteger getTotalTransfer(); -} diff --git a/src/main/java/api/hbm/energy/PowerNet.java b/src/main/java/api/hbm/energy/PowerNet.java deleted file mode 100644 index 6d55c2f0c..000000000 --- a/src/main/java/api/hbm/energy/PowerNet.java +++ /dev/null @@ -1,257 +0,0 @@ -package api.hbm.energy; - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import com.hbm.config.GeneralConfig; - -import api.hbm.energy.IEnergyConnector.ConnectionPriority; -import net.minecraft.tileentity.TileEntity; - -/** - * Basic IPowerNet implementation. The behavior of this demo might change inbetween releases, but the API remains the same. - * For more consistency please implement your own IPowerNet. - * @author hbm - */ -public class PowerNet implements IPowerNet { - - private boolean valid = true; - private HashMap links = new HashMap(); - private HashMap proxies = new HashMap(); - private List subscribers = new ArrayList(); - - public static List trackingInstances = null; - protected BigInteger totalTransfer = BigInteger.ZERO; - - @Override - public void joinNetworks(IPowerNet network) { - - if(network == this) - return; //wtf?! - - for(IEnergyConductor conductor : network.getLinks()) { - joinLink(conductor); - } - network.getLinks().clear(); - - for(IEnergyConnector connector : network.getSubscribers()) { - this.subscribe(connector); - } - - network.destroy(); - } - - @Override - public IPowerNet joinLink(IEnergyConductor conductor) { - - if(conductor.getPowerNet() != null) - conductor.getPowerNet().leaveLink(conductor); - - conductor.setPowerNet(this); - int identity = conductor.getIdentity(); - this.links.put(identity, conductor); - - if(conductor.hasProxies()) { - for(Integer i : conductor.getProxies()) { - this.proxies.put(i, identity); - } - } - - return this; - } - - @Override - public void leaveLink(IEnergyConductor conductor) { - conductor.setPowerNet(null); - int identity = conductor.getIdentity(); - this.links.remove(identity); - - if(conductor.hasProxies()) { - for(Integer i : conductor.getProxies()) { - this.proxies.remove(i); - } - } - } - - @Override - public void subscribe(IEnergyConnector connector) { - this.subscribers.add(connector); - } - - @Override - public void unsubscribe(IEnergyConnector connector) { - this.subscribers.remove(connector); - } - - @Override - public boolean isSubscribed(IEnergyConnector connector) { - return this.subscribers.contains(connector); - } - - @Override - public List getLinks() { - List linkList = new ArrayList(); - linkList.addAll(this.links.values()); - return linkList; - } - - public HashMap getProxies() { - HashMap proxyCopy = new HashMap(proxies); - return proxyCopy; - } - - @Override - public List getSubscribers() { - return this.subscribers; - } - - @Override - public void destroy() { - this.valid = false; - this.subscribers.clear(); - - for(IEnergyConductor link : this.links.values()) { - link.setPowerNet(null); - } - - this.links.clear(); - } - - @Override - public boolean isValid() { - return this.valid; - } - - @Override - public BigInteger getTotalTransfer() { - return this.totalTransfer; - } - - public long lastCleanup = System.currentTimeMillis(); - - @Override - public long transferPower(long power) { - - /*if(lastCleanup + 45 < System.currentTimeMillis()) { - cleanup(this.subscribers); - lastCleanup = System.currentTimeMillis(); - }*/ - - List cache = new ArrayList(); - if(trackingInstances != null && !trackingInstances.isEmpty()) { - cache.addAll(trackingInstances); - } - - trackingInstances = new ArrayList(); - trackingInstances.add(this); - long result = fairTransfer(this.subscribers, power); - trackingInstances.addAll(cache); - return result; - } - - public static void cleanup(List subscribers) { - - subscribers.removeIf(x -> - x == null || !(x instanceof TileEntity) || ((TileEntity)x).isInvalid() || !x.isLoaded() - ); - } - - public static long fairTransfer(List subscribers, long power) { - - if(power <= 0) return 0; - - if(subscribers.isEmpty()) - return power; - - cleanup(subscribers); - - ConnectionPriority[] priorities = new ConnectionPriority[] {ConnectionPriority.HIGH, ConnectionPriority.NORMAL, ConnectionPriority.LOW}; - - long totalTransfer = 0; - - 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)); - - if(con instanceof TileEntity) { - TileEntity tile = (TileEntity) con; - tile.getWorldObj().markTileEntityChunkModified(tile.xCoord, tile.yCoord, tile.zCoord, tile); - } - } - - power -= totalGiven; - totalTransfer += totalGiven; - } - - if(trackingInstances != null) { - - for(int i = 0; i < trackingInstances.size(); i++) { - PowerNet net = trackingInstances.get(i); - net.totalTransfer = net.totalTransfer.add(BigInteger.valueOf(totalTransfer)); - } - - trackingInstances.clear(); - } - - return power; - } - - @Override - public void reevaluate() { - - if(!GeneralConfig.enableReEval) { - this.destroy(); - return; - } - - HashMap copy = new HashMap(links); - HashMap proxyCopy = new HashMap(proxies); - - for(IEnergyConductor link : copy.values()) { - this.leaveLink(link); - } - - for(IEnergyConductor link : copy.values()) { - - link.setPowerNet(null); - link.reevaluate(copy, proxyCopy); - - if(link.getPowerNet() == null) { - link.setPowerNet(new PowerNet().joinLink(link)); - } - } - } -} diff --git a/src/main/java/api/hbm/energy/IBatteryItem.java b/src/main/java/api/hbm/energymk2/IBatteryItem.java similarity index 98% rename from src/main/java/api/hbm/energy/IBatteryItem.java rename to src/main/java/api/hbm/energymk2/IBatteryItem.java index 827f88a8e..19202cfa1 100644 --- a/src/main/java/api/hbm/energy/IBatteryItem.java +++ b/src/main/java/api/hbm/energymk2/IBatteryItem.java @@ -1,4 +1,4 @@ -package api.hbm.energy; +package api.hbm.energymk2; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/api/hbm/energy/IEnergyConnectorBlock.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorBlock.java similarity index 95% rename from src/main/java/api/hbm/energy/IEnergyConnectorBlock.java rename to src/main/java/api/hbm/energymk2/IEnergyConnectorBlock.java index 8583dcc52..d8de0c379 100644 --- a/src/main/java/api/hbm/energy/IEnergyConnectorBlock.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorBlock.java @@ -1,4 +1,4 @@ -package api.hbm.energy; +package api.hbm.energymk2; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java index 2245f57ff..4c2246ee5 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyConnectorMK2.java @@ -1,14 +1,8 @@ package api.hbm.energymk2; -import com.hbm.util.CompatEnergyControl; - -import api.hbm.energy.ILoadedTile; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; -public interface IEnergyConnectorMK2 extends ILoadedTile { +public interface IEnergyConnectorMK2 { /** * Whether the given side can be connected to @@ -19,24 +13,4 @@ public interface IEnergyConnectorMK2 extends ILoadedTile { public default boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN; } - - public long getPower(); - public long getMaxPower(); - - public default long getConnectionSpeed() { - return this.getMaxPower(); - } - - public static final boolean particleDebug = false; - - public default Vec3 getDebugParticlePosMK2() { - TileEntity te = (TileEntity) this; - Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); - return vec; - } - - public default void provideInfoForECMK2(NBTTagCompound data) { - data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); - data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); - } } diff --git a/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java b/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java new file mode 100644 index 000000000..86b915b2c --- /dev/null +++ b/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java @@ -0,0 +1,33 @@ +package api.hbm.energymk2; + +import com.hbm.util.CompatEnergyControl; + +import api.hbm.tile.ILoadedTile; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; + +/** DO NOT USE DIRECTLY! This is simply the common ancestor to providers and receivers, because all this behavior has to be excluded from conductors! */ +public interface IEnergyHandlerMK2 extends IEnergyConnectorMK2, ILoadedTile { + + public long getPower(); + public void setPower(long power); + public long getMaxPower(); + + public default long getConnectionSpeed() { + return this.getMaxPower(); + } + + public static final boolean particleDebug = false; + + public default Vec3 getDebugParticlePosMK2() { + TileEntity te = (TileEntity) this; + Vec3 vec = Vec3.createVectorHelper(te.xCoord + 0.5, te.yCoord + 1, te.zCoord + 0.5); + return vec; + } + + public default void provideInfoForECMK2(NBTTagCompound data) { + data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); + data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); + } +} diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index d45feb6f9..a678cf969 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -10,15 +10,14 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface IEnergyProviderMK2 extends IEnergyConnectorMK2 { +/** If it sends energy, use this */ +public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { /** Uses up available power, default implementation has no sanity checking, make sure that the requested power is lequal to the current power */ public default void usePower(long power) { this.setPower(this.getPower() - power); } - public void setPower(long power); - public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = world.getTileEntity(x, y, z); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index dfb32f097..a7271294d 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -10,7 +10,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { +/** If it receives energy, use this */ +public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { public default long transferPower(long power) { if(power + this.getPower() <= this.getMaxPower()) { @@ -23,8 +24,6 @@ public interface IEnergyReceiverMK2 extends IEnergyConnectorMK2 { return overshoot; } - public void setPower(long power); - public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = world.getTileEntity(x, y, z); diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index ae0caae29..48afb9b56 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -1,10 +1,7 @@ package api.hbm.energymk2; -import java.util.ArrayList; -import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map.Entry; import java.util.Set; diff --git a/src/main/java/api/hbm/fluid/IFluidConnector.java b/src/main/java/api/hbm/fluid/IFluidConnector.java index a51bcdeb2..a9c900635 100644 --- a/src/main/java/api/hbm/fluid/IFluidConnector.java +++ b/src/main/java/api/hbm/fluid/IFluidConnector.java @@ -4,7 +4,7 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.ILoadedTile; +import api.hbm.tile.ILoadedTile; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/api/hbm/energy/ILoadedTile.java b/src/main/java/api/hbm/tile/ILoadedTile.java similarity index 72% rename from src/main/java/api/hbm/energy/ILoadedTile.java rename to src/main/java/api/hbm/tile/ILoadedTile.java index 1f6d0f88b..65ad9d14c 100644 --- a/src/main/java/api/hbm/energy/ILoadedTile.java +++ b/src/main/java/api/hbm/tile/ILoadedTile.java @@ -1,4 +1,4 @@ -package api.hbm.energy; +package api.hbm.tile; public interface ILoadedTile { diff --git a/src/main/java/com/hbm/blocks/generic/BlockCableConnect.java b/src/main/java/com/hbm/blocks/generic/BlockCableConnect.java index c4215befa..c7999fda1 100644 --- a/src/main/java/com/hbm/blocks/generic/BlockCableConnect.java +++ b/src/main/java/com/hbm/blocks/generic/BlockCableConnect.java @@ -2,7 +2,7 @@ package com.hbm.blocks.generic; import com.hbm.blocks.BlockBase; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorBlock; import net.minecraft.block.material.Material; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.util.ForgeDirection; diff --git a/src/main/java/com/hbm/blocks/generic/HEVBattery.java b/src/main/java/com/hbm/blocks/generic/HEVBattery.java index dbaa4f89d..e65f03038 100644 --- a/src/main/java/com/hbm/blocks/generic/HEVBattery.java +++ b/src/main/java/com/hbm/blocks/generic/HEVBattery.java @@ -3,7 +3,7 @@ package com.hbm.blocks.generic; import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.client.registry.RenderingRegistry; import net.minecraft.block.Block; import net.minecraft.block.material.Material; diff --git a/src/main/java/com/hbm/blocks/machine/DummyOldBase.java b/src/main/java/com/hbm/blocks/machine/DummyOldBase.java index 4d5c183fd..da688e90f 100644 --- a/src/main/java/com/hbm/blocks/machine/DummyOldBase.java +++ b/src/main/java/com/hbm/blocks/machine/DummyOldBase.java @@ -7,7 +7,7 @@ import com.hbm.interfaces.IMultiblock; import com.hbm.inventory.fluid.FluidType; import com.hbm.tileentity.machine.TileEntityDummy; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorBlock; import api.hbm.fluid.IFluidConnectorBlock; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; diff --git a/src/main/java/com/hbm/blocks/machine/FWatzHatch.java b/src/main/java/com/hbm/blocks/machine/FWatzHatch.java index 69a7e5871..d93735c53 100644 --- a/src/main/java/com/hbm/blocks/machine/FWatzHatch.java +++ b/src/main/java/com/hbm/blocks/machine/FWatzHatch.java @@ -8,7 +8,7 @@ import com.hbm.lib.RefStrings; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityFWatzCore; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorBlock; import api.hbm.fluid.IFluidConnectorBlock; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index be083f6e3..ae94aa6d1 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -17,7 +17,8 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyProviderMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -145,7 +146,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP player.addExhaustion(0.025F); } - public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyUser, INBTPacketReceiver, IPersistentNBT { + public static class TileEntityCapacitor extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyReceiverMK2, INBTPacketReceiver, IPersistentNBT { public long power; protected long maxPower; @@ -190,7 +191,7 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP long preSend = power; if(pos != null && last != null) { this.tryUnsubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ()); - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), last); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), last); } long sent = preSend - power; diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java index fa7aa8dbe..dade916fa 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitorBus.java @@ -5,7 +5,7 @@ import java.util.List; import com.hbm.blocks.ITooltipProvider; import com.hbm.lib.RefStrings; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorBlock; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 6771ccf2d..3cdbb238e 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -10,9 +10,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import api.hbm.block.IToolable; -import api.hbm.energy.IEnergyUser; -import api.hbm.energy.IEnergyConnector.ConnectionPriority; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorBlock; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java b/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java index 46643b029..bf794147c 100644 --- a/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java +++ b/src/main/java/com/hbm/entity/train/EntityRailCarElectric.java @@ -2,7 +2,7 @@ package com.hbm.entity.train; import com.hbm.items.ModItems; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.item.ItemStack; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/entity/train/TrainCargoTram.java b/src/main/java/com/hbm/entity/train/TrainCargoTram.java index 3b64d7679..99f2c5c05 100644 --- a/src/main/java/com/hbm/entity/train/TrainCargoTram.java +++ b/src/main/java/com/hbm/entity/train/TrainCargoTram.java @@ -7,7 +7,7 @@ import com.hbm.inventory.gui.GuiInfoContainer; import com.hbm.lib.RefStrings; import com.hbm.tileentity.IGUIProvider; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java b/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java index 1a62d8865..7d1f82a35 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeGeneric.java @@ -31,7 +31,7 @@ import com.hbm.lib.Library; import com.hbm.lib.ModDamageSource; import com.hbm.util.ArmorUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyHandlerMK2; import cofh.api.energy.IEnergyProvider; public class ExplosionNukeGeneric { @@ -425,12 +425,9 @@ public class ExplosionNukeGeneric { Block b = world.getBlock(x,y,z); TileEntity te = world.getTileEntity(x, y, z); - if (te != null && te instanceof IEnergyUser) { - - ((IEnergyUser)te).setPower(0); - - if(random.nextInt(5) < 1) - world.setBlock(x, y, z, ModBlocks.block_electrical_scrap); + if (te != null && te instanceof IEnergyHandlerMK2) { + ((IEnergyHandlerMK2)te).setPower(0); + if(random.nextInt(5) < 1) world.setBlock(x, y, z, ModBlocks.block_electrical_scrap); } if (te != null && te instanceof IEnergyProvider) { diff --git a/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java b/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java index 999bce6f6..58535bd9b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCentrifuge.java @@ -6,7 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerCombustionEngine.java b/src/main/java/com/hbm/inventory/container/ContainerCombustionEngine.java index 3ba9022e5..492bcb866 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCombustionEngine.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCombustionEngine.java @@ -5,7 +5,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineCombustionEngine; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerCompressor.java b/src/main/java/com/hbm/inventory/container/ContainerCompressor.java index 3f81b4f68..6e569938d 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCompressor.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCompressor.java @@ -3,7 +3,7 @@ package com.hbm.inventory.container; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineCompressor; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrystallizer.java b/src/main/java/com/hbm/inventory/container/ContainerCrystallizer.java index 55f73ebd7..337bbea28 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrystallizer.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrystallizer.java @@ -7,7 +7,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineCrystallizer; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java index 19ee67510..593b1feb5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java +++ b/src/main/java/com/hbm/inventory/container/ContainerElectricFurnace.java @@ -6,7 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineElectricFurnace; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java index f9fcff491..05a7ae646 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java +++ b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserFluid.java @@ -6,7 +6,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityElectrolyser; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java index 15c8b9565..a376d01f5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java +++ b/src/main/java/com/hbm/inventory/container/ContainerElectrolyserMetal.java @@ -5,7 +5,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityElectrolyser; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java index b319759f1..f45fd6d79 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java +++ b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadLarge.java @@ -5,7 +5,7 @@ import com.hbm.inventory.SlotTakeOnly; import com.hbm.items.ModItems; import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import api.hbm.item.IDesignatorItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java index 792fc0419..7cf2e32e5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineArcFurnace.java @@ -4,7 +4,7 @@ import com.hbm.inventory.SlotSmelting; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.TileEntityMachineArcFurnace; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineArcWelder.java b/src/main/java/com/hbm/inventory/container/ContainerMachineArcWelder.java index 701d718bf..19ff1155c 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineArcWelder.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineArcWelder.java @@ -7,7 +7,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineArcWelder; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineCatalyticReformer.java b/src/main/java/com/hbm/inventory/container/ContainerMachineCatalyticReformer.java index 41b30d98e..6994b80cc 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineCatalyticReformer.java @@ -5,7 +5,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.oil.TileEntityMachineCatalyticReformer; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineCyclotron.java b/src/main/java/com/hbm/inventory/container/ContainerMachineCyclotron.java index 632769cdf..7251c9623 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineCyclotron.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineCyclotron.java @@ -9,7 +9,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineCyclotron; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java index c2cfea587..020eb7ac4 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineEPress.java @@ -7,7 +7,7 @@ import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.items.machine.ItemStamp; import com.hbm.tileentity.machine.TileEntityMachineEPress; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineExcavator.java b/src/main/java/com/hbm/inventory/container/ContainerMachineExcavator.java index c55fd5400..01f424cce 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineExcavator.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineExcavator.java @@ -4,7 +4,7 @@ import com.hbm.inventory.SlotTakeOnly; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineExcavator; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineExposureChamber.java b/src/main/java/com/hbm/inventory/container/ContainerMachineExposureChamber.java index c4dd07df6..913dc36a2 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineExposureChamber.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineExposureChamber.java @@ -6,7 +6,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineExposureChamber; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineGasFlare.java b/src/main/java/com/hbm/inventory/container/ContainerMachineGasFlare.java index 5165f4e37..37f444835 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineGasFlare.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineGasFlare.java @@ -5,7 +5,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.oil.TileEntityMachineGasFlare; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java index 375e0d753..d48ca954b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java @@ -5,7 +5,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.oil.TileEntityMachineHydrotreater; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java b/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java index 0bd1f475b..ea8efe275 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineRadarNT.java @@ -3,7 +3,7 @@ package com.hbm.inventory.container; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.TileEntityMachineRadarNT; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineTurbineGas.java b/src/main/java/com/hbm/inventory/container/ContainerMachineTurbineGas.java index b1aa96ca1..5507df3c5 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineTurbineGas.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineTurbineGas.java @@ -5,7 +5,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.items.machine.ItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineTurbineGas; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineWoodBurner.java b/src/main/java/com/hbm/inventory/container/ContainerMachineWoodBurner.java index 73684e642..f893fb23f 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineWoodBurner.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineWoodBurner.java @@ -4,7 +4,7 @@ import com.hbm.inventory.SlotTakeOnly; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.tileentity.machine.TileEntityMachineWoodBurner; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMixer.java b/src/main/java/com/hbm/inventory/container/ContainerMixer.java index dcbcdd17b..0242b916b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMixer.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMixer.java @@ -4,7 +4,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineMixer; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java index 139df77fe..0daddf0fb 100644 --- a/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java +++ b/src/main/java/com/hbm/items/armor/ArmorFSBPowered.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/items/food/ItemPancake.java b/src/main/java/com/hbm/items/food/ItemPancake.java index f3bbc368d..784ee8995 100644 --- a/src/main/java/com/hbm/items/food/ItemPancake.java +++ b/src/main/java/com/hbm/items/food/ItemPancake.java @@ -5,7 +5,7 @@ import java.util.List; import com.hbm.items.ModItems; import com.hbm.items.armor.ArmorFSB; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/items/machine/ItemBattery.java b/src/main/java/com/hbm/items/machine/ItemBattery.java index 4f0fda9a7..cefa97fce 100644 --- a/src/main/java/com/hbm/items/machine/ItemBattery.java +++ b/src/main/java/com/hbm/items/machine/ItemBattery.java @@ -5,7 +5,7 @@ import java.util.List; import com.hbm.items.ModItems; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.creativetab.CreativeTabs; diff --git a/src/main/java/com/hbm/items/machine/ItemSelfcharger.java b/src/main/java/com/hbm/items/machine/ItemSelfcharger.java index d8b54f7fe..67c05fb7b 100644 --- a/src/main/java/com/hbm/items/machine/ItemSelfcharger.java +++ b/src/main/java/com/hbm/items/machine/ItemSelfcharger.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/items/special/ItemGlitch.java b/src/main/java/com/hbm/items/special/ItemGlitch.java index 9942c4754..715eacd17 100644 --- a/src/main/java/com/hbm/items/special/ItemGlitch.java +++ b/src/main/java/com/hbm/items/special/ItemGlitch.java @@ -12,7 +12,7 @@ import com.hbm.items.ModItems; import com.hbm.lib.ModDamageSource; import com.hbm.main.MainRegistry; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; diff --git a/src/main/java/com/hbm/items/tool/ItemFusionCore.java b/src/main/java/com/hbm/items/tool/ItemFusionCore.java index afa388fa5..473f6f62b 100644 --- a/src/main/java/com/hbm/items/tool/ItemFusionCore.java +++ b/src/main/java/com/hbm/items/tool/ItemFusionCore.java @@ -6,7 +6,7 @@ import com.hbm.items.armor.ArmorFSB; import com.hbm.items.armor.ArmorFSBPowered; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; diff --git a/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java index 3d6313596..674fb7572 100644 --- a/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemSwordAbilityPower.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java index 80fb5fa87..52b8686b4 100644 --- a/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java +++ b/src/main/java/com/hbm/items/tool/ItemToolAbilityPower.java @@ -4,7 +4,7 @@ import java.util.List; import com.hbm.util.BobMathUtil; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.player.EntityPlayer; diff --git a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java b/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java index b5e040bb3..d93a73f4a 100644 --- a/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java +++ b/src/main/java/com/hbm/items/weapon/gununified/ItemEnergyGunBase.java @@ -19,7 +19,7 @@ import com.hbm.render.util.RenderScreenOverlay.Crosshair; import com.hbm.util.BobMathUtil; import com.hbm.util.ChatBuilder; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; diff --git a/src/main/java/com/hbm/lib/Library.java b/src/main/java/com/hbm/lib/Library.java index cd0059185..bccf0f075 100644 --- a/src/main/java/com/hbm/lib/Library.java +++ b/src/main/java/com/hbm/lib/Library.java @@ -17,9 +17,9 @@ import com.hbm.inventory.fluid.FluidType; import com.hbm.items.ModItems; import com.hbm.tileentity.TileEntityProxyInventory; -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyConnector; -import api.hbm.energy.IEnergyConnectorBlock; +import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorMK2; import api.hbm.fluid.IFluidConnector; import api.hbm.fluid.IFluidConnectorBlock; import net.minecraft.block.Block; @@ -118,8 +118,8 @@ public class Library { TileEntity te = world.getTileEntity(x, y, z); - if(te instanceof IEnergyConnector) { - IEnergyConnector con = (IEnergyConnector) te; + if(te instanceof IEnergyConnectorMK2) { + IEnergyConnectorMK2 con = (IEnergyConnectorMK2) te; if(con.canConnect(dir.getOpposite() /* machine's connecting side */)) return true; diff --git a/src/main/java/com/hbm/packet/AuxButtonPacket.java b/src/main/java/com/hbm/packet/AuxButtonPacket.java index 1241363c1..e2965706e 100644 --- a/src/main/java/com/hbm/packet/AuxButtonPacket.java +++ b/src/main/java/com/hbm/packet/AuxButtonPacket.java @@ -15,7 +15,6 @@ import com.hbm.tileentity.machine.TileEntitySoyuzLauncher; import com.hbm.tileentity.machine.storage.TileEntityBarrel; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; -import api.hbm.energy.IEnergyConnector.ConnectionPriority; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; diff --git a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java index cb529b2d9..11ec8ddd1 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java +++ b/src/main/java/com/hbm/tileentity/TileEntityLoadedBase.java @@ -2,7 +2,7 @@ package com.hbm.tileentity; import com.hbm.sound.AudioWrapper; -import api.hbm.energy.ILoadedTile; +import api.hbm.tile.ILoadedTile; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyConductor.java b/src/main/java/com/hbm/tileentity/TileEntityProxyConductor.java index 1bcbaa6cb..f7b16aec9 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyConductor.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyConductor.java @@ -1,87 +1,11 @@ package com.hbm.tileentity; -import java.util.ArrayList; -import java.util.List; +import api.hbm.energymk2.IEnergyConnectorMK2; -import api.hbm.energy.IEnergyConductor; -import api.hbm.energy.IPowerNet; -import net.minecraft.tileentity.TileEntity; - -public class TileEntityProxyConductor extends TileEntityProxyBase implements IEnergyConductor { +public class TileEntityProxyConductor extends TileEntityProxyBase implements IEnergyConnectorMK2 { @Override public boolean canUpdate() { return false; } - - @Override - public long transferPower(long power) { - - TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - return ((IEnergyConductor)te).transferPower(power); - } - - return 0; - } - - @Override - public long getPower() { - - TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - return ((IEnergyConductor)te).getPower(); - } - - return 0; - } - - @Override - public long getMaxPower() { - - TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - return ((IEnergyConductor)te).getMaxPower(); - } - - return 0; - } - - @Override - public IPowerNet getPowerNet() { - - TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - return ((IEnergyConductor)te).getPowerNet(); - } - - return null; - } - - @Override - public void setPowerNet(IPowerNet network) { - - TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - ((IEnergyConductor)te).setPowerNet(network); - } - } - - @Override - public List getConnectionPoints() { - - /*TileEntity te = this.getTE(); - - if(te instanceof IEnergyConductor) { - return ((IEnergyConductor)te).getConnectionPoints(); - }*/ - - /* Proxy TE doesn't need to implement proxying here because the conductor main TE already has a network-specific proxying system */ - return new ArrayList(); - } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java index 829898ae3..51bef052f 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityNukeBalefire.java @@ -8,7 +8,7 @@ import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 9e47668de..943cec0d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -7,8 +7,8 @@ import java.util.Random; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java index 6259e1eb1..c9c22c014 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java @@ -12,8 +12,8 @@ import com.hbm.packet.TEFFPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java index d0bd26ea0..89a674740 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssembler.java @@ -20,7 +20,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index e29757724..7830b63bb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -21,8 +21,8 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index 5e6d51bbe..c231fe7ce 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -22,8 +22,8 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index cf2e88d8a..aec3af948 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -25,8 +25,8 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IBatteryItem; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index a790d6265..e824f00c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -14,8 +14,8 @@ import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.I18nUtil; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java index 83b516c43..638971d73 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java @@ -12,8 +12,8 @@ import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java index d366b287f..f31be1e46 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java @@ -25,8 +25,8 @@ import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IBatteryItem; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index ab6c81d37..82bb816ea 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -10,8 +10,8 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java index 66454362c..b843ea365 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java @@ -5,7 +5,7 @@ import java.util.Random; import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.PacketDispatcher; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 543f471eb..867a09d8b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -16,8 +16,8 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IBatteryItem; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java index 940cb14d5..b61115d65 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityOilDrillBase.java @@ -24,7 +24,7 @@ import com.hbm.util.Tuple; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -35,7 +35,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityOilDrillBase extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidStandardTransceiver, IConfigurableMachine, IPersistentNBT, IGUIProvider, IUpgradeInfoProvider { +public abstract class TileEntityOilDrillBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidSource, IFluidStandardTransceiver, IConfigurableMachine, IPersistentNBT, IGUIProvider, IUpgradeInfoProvider { public int indicator = 0; 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 21b8f7825..261de2700 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -1,6 +1,7 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energy.*; +import api.hbm.energymk2.IBatteryItem; import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.machine.MachineBattery; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java index 60848881b..1953880ba 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java @@ -1,34 +1,18 @@ package com.hbm.tileentity.network; -import api.hbm.energy.IEnergyConductor; -import api.hbm.energy.IPowerNet; -import api.hbm.energy.PowerNet; import api.hbm.energymk2.IEnergyConductorMK2; import api.hbm.energymk2.Nodespace; import api.hbm.energymk2.Nodespace.PowerNode; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCableBaseNT extends TileEntity implements IEnergyConductor, IEnergyConductorMK2 { +public class TileEntityCableBaseNT extends TileEntity implements IEnergyConductorMK2 { - protected IPowerNet network; protected PowerNode node; @Override public void updateEntity() { - if(!worldObj.isRemote && canUpdate()) { - - //we got here either because the net doesn't exist or because it's not valid, so that's safe to assume - this.setPowerNet(null); - - this.connect(); - - if(this.getPowerNet() == null) { - this.setPowerNet(new PowerNet().joinLink(this)); - } - } - if(!worldObj.isRemote) { if(this.node == null || this.node.expired) { @@ -45,86 +29,20 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto public void onNodeDestroyedCallback() { this.node = null; } - - protected void connect() { - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - if(te instanceof IEnergyConductor) { - - IEnergyConductor conductor = (IEnergyConductor) te; - - if(!conductor.canConnect(dir.getOpposite())) - continue; - - if(this.getPowerNet() == null && conductor.getPowerNet() != null) { - conductor.getPowerNet().joinLink(this); - } - - if(this.getPowerNet() != null && conductor.getPowerNet() != null && this.getPowerNet() != conductor.getPowerNet()) { - conductor.getPowerNet().joinNetworks(this.getPowerNet()); - } - } - } - } @Override public void invalidate() { super.invalidate(); if(!worldObj.isRemote) { - if(this.network != null) { - this.network.reevaluate(); - this.network = null; - } - if(this.node != null) { Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); } } } - /** - * Only update until a power net is formed, in >99% of the cases it should be the first tick. Everything else is handled by neighbors and the net itself. - */ - @Override - public boolean canUpdate() { - return (this.network == null || !this.network.isValid()) && !this.isInvalid(); - } - @Override public boolean canConnect(ForgeDirection dir) { return dir != ForgeDirection.UNKNOWN; } - - @Override - public long getPower() { - return 0; - } - - @Override - public long getMaxPower() { - return 0; - } - - @Override - public void setPowerNet(IPowerNet network) { - this.network = network; - } - - @Override - public long transferPower(long power) { - - if(this.network == null) - return power; - - return this.network.transferPower(power); - } - - @Override - public IPowerNet getPowerNet() { - return this.network; - } } diff --git a/src/main/java/com/hbm/util/CompatEnergyControl.java b/src/main/java/com/hbm/util/CompatEnergyControl.java index ea3ec0683..0de988733 100644 --- a/src/main/java/com/hbm/util/CompatEnergyControl.java +++ b/src/main/java/com/hbm/util/CompatEnergyControl.java @@ -11,8 +11,8 @@ import com.hbm.tileentity.machine.TileEntityMachineGasCent; import com.hbm.tileentity.machine.TileEntityMachineGasCent.PseudoFluidTank; import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; -import api.hbm.energy.IBatteryItem; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyHandlerMK2; import api.hbm.fluid.IFluidUser; import api.hbm.tile.IInfoProviderEC; import net.minecraft.item.ItemStack; @@ -47,8 +47,8 @@ public class CompatEnergyControl { data.setString(KEY_EUTYPE, "HE"); - if(tile instanceof IEnergyUser) { - IEnergyUser user = (IEnergyUser) tile; + if(tile instanceof IEnergyHandlerMK2) { + IEnergyHandlerMK2 user = (IEnergyHandlerMK2) tile; data.setDouble(L_ENERGY_HE, user.getPower()); data.setDouble(L_CAPACITY_HE, user.getMaxPower()); } diff --git a/src/main/java/com/hbm/util/CompatExternal.java b/src/main/java/com/hbm/util/CompatExternal.java index d1c2f1a02..9881ef7fa 100644 --- a/src/main/java/com/hbm/util/CompatExternal.java +++ b/src/main/java/com/hbm/util/CompatExternal.java @@ -12,7 +12,8 @@ import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.machine.TileEntityDummy; import com.hbm.tileentity.turret.TileEntityTurretSentry; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyHandlerMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidUser; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -67,8 +68,8 @@ public class CompatExternal { */ public static long getBufferedPowerFromTile(TileEntity tile) { - if(tile instanceof IEnergyUser) { - return ((IEnergyUser) tile).getPower(); + if(tile instanceof IEnergyHandlerMK2) { + return ((IEnergyHandlerMK2) tile).getPower(); } return 0L; @@ -81,8 +82,8 @@ public class CompatExternal { */ public static long getMaxPowerFromTile(TileEntity tile) { - if(tile instanceof IEnergyUser) { - return ((IEnergyUser) tile).getMaxPower(); + if(tile instanceof IEnergyHandlerMK2) { + return ((IEnergyHandlerMK2) tile).getMaxPower(); } return 0L; @@ -95,8 +96,8 @@ public class CompatExternal { */ public static int getEnergyPriorityFromTile(TileEntity tile) { - if(tile instanceof IEnergyUser) { - return ((IEnergyUser) tile).getPriority().ordinal(); + if(tile instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2) tile).getPriority().ordinal(); } return -1; From b661b89334da22bf285c77c7093cd215c6c94d2d Mon Sep 17 00:00:00 2001 From: Bob Date: Tue, 9 Apr 2024 20:57:33 +0200 Subject: [PATCH 20/48] SISTOR! DID YOU USE ALL MY DIAMONDS TO MAKE JUKEBOXES? yeag --- .../api/hbm/energymk2/IEnergyHandlerMK2.java | 4 -- .../api/hbm/energymk2/IEnergyProviderMK2.java | 4 ++ .../api/hbm/energymk2/IEnergyReceiverMK2.java | 4 ++ src/main/java/com/hbm/test/ReEvalTest.java | 44 ------------------- .../hbm/tileentity/TileEntityProxyCombo.java | 25 +++++------ .../hbm/tileentity/TileEntityProxyEnergy.java | 31 +++++++------ .../bomb/TileEntityCompactLauncher.java | 4 +- .../tileentity/bomb/TileEntityLaunchPad.java | 4 +- .../bomb/TileEntityLaunchPadBase.java | 4 +- .../bomb/TileEntityLaunchPadLarge.java | 5 +-- .../bomb/TileEntityLaunchTable.java | 4 +- .../tileentity/machine/TileEntityCharger.java | 4 +- .../tileentity/machine/TileEntityChungus.java | 6 +-- .../machine/TileEntityCondenserPowered.java | 4 +- .../machine/TileEntityConveyorPress.java | 4 +- .../machine/TileEntityCoreEmitter.java | 4 +- .../machine/TileEntityCoreReceiver.java | 6 +-- .../machine/TileEntityCoreStabilizer.java | 4 +- .../machine/TileEntityCustomMachine.java | 22 ++++++---- .../machine/TileEntityDeuteriumExtractor.java | 4 +- .../machine/TileEntityElectrolyser.java | 4 +- .../hbm/tileentity/machine/TileEntityFEL.java | 4 +- .../machine/TileEntityForceField.java | 4 +- .../tileentity/machine/TileEntityITER.java | 4 +- .../machine/TileEntityMicrowave.java | 4 +- .../machine/TileEntityRadiobox.java | 4 +- .../machine/TileEntitySoyuzLauncher.java | 4 +- .../tileentity/machine/TileEntityTesla.java | 4 +- .../TileEntityMachineCatalyticReformer.java | 4 +- .../oil/TileEntityMachineGasFlare.java | 6 +-- .../oil/TileEntityMachineHydrotreater.java | 4 +- .../oil/TileEntityMachineLiquefactor.java | 4 +- .../oil/TileEntityMachineRefinery.java | 4 +- .../oil/TileEntityMachineSolidifier.java | 4 +- .../oil/TileEntityMachineVacuumDistill.java | 4 +- .../turret/TileEntityTurretBaseNT.java | 4 +- .../java/com/hbm/wiaj/cannery/Dummies.java | 7 +-- 37 files changed, 110 insertions(+), 154 deletions(-) delete mode 100644 src/main/java/com/hbm/test/ReEvalTest.java diff --git a/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java b/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java index 86b915b2c..c79bf3405 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyHandlerMK2.java @@ -14,10 +14,6 @@ public interface IEnergyHandlerMK2 extends IEnergyConnectorMK2, ILoadedTile { public void setPower(long power); public long getMaxPower(); - public default long getConnectionSpeed() { - return this.getMaxPower(); - } - public static final boolean particleDebug = false; public default Vec3 getDebugParticlePosMK2() { diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index a678cf969..1b7f5fe45 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -18,6 +18,10 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { this.setPower(this.getPower() - power); } + public default long getProviderSpeed() { + return this.getMaxPower(); + } + public default void tryProvide(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = world.getTileEntity(x, y, z); diff --git a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java index a7271294d..11e55bedc 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyReceiverMK2.java @@ -24,6 +24,10 @@ public interface IEnergyReceiverMK2 extends IEnergyHandlerMK2 { return overshoot; } + public default long getReceiverSpeed() { + return this.getMaxPower(); + } + public default void trySubscribe(World world, int x, int y, int z, ForgeDirection dir) { TileEntity te = world.getTileEntity(x, y, z); diff --git a/src/main/java/com/hbm/test/ReEvalTest.java b/src/main/java/com/hbm/test/ReEvalTest.java deleted file mode 100644 index 9c137c481..000000000 --- a/src/main/java/com/hbm/test/ReEvalTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hbm.test; - -import java.util.HashMap; - -import com.hbm.main.MainRegistry; - -import api.hbm.energy.IEnergyConductor; - -public class ReEvalTest { - - /** - * Runs a collision test on a relatively large scale. So large in fact that it will most certainly OOM. - * Not an issue, since by that point we will already have our results. - * @throws OutOfMemoryError - */ - public static void runTest() throws OutOfMemoryError { - - HashMap collisions = new HashMap(); - - int minX = -130; - int maxX = 140; - int minZ = 300; - int maxZ = 520; - - MainRegistry.logger.info("Starting collision test..."); - - for(int x = minX; x <= maxX; x++) { - for(int y = 1; y <= 255; y++) { - for(int z = minZ; z <= maxZ; z++) { - int identity = IEnergyConductor.getIdentityFromPos(x, y, z); - - if(collisions.containsKey(identity)) { - int[] collision = collisions.get(identity); - MainRegistry.logger.info("Position " + x + "/" + y + "/" + z + " collides with " + collision[0] + "/" + collision[1] + "/" + collision[2] + "!"); - } else { - collisions.put(identity, new int[] {x, y, z}); - } - } - } - } - - MainRegistry.logger.info("Collision test complete!"); - } -} diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java index c0957eb69..7fe9db0f3 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyCombo.java @@ -6,8 +6,7 @@ import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.fluid.FluidType; -import api.hbm.energy.IEnergyConnector; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidConnector; import api.hbm.tile.IHeatSource; import com.hbm.inventory.material.Mats; @@ -19,7 +18,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyUser, IFluidAcceptor, ISidedInventory, IFluidConnector, IHeatSource, ICrucibleAcceptor { +public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergyReceiverMK2, IFluidAcceptor, ISidedInventory, IFluidConnector, IHeatSource, ICrucibleAcceptor { TileEntity tile; boolean inventory; @@ -170,8 +169,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy if(!power) return; - if(getTile() instanceof IEnergyUser) { - ((IEnergyUser)getTile()).setPower(i); + if(getTile() instanceof IEnergyReceiverMK2) { + ((IEnergyReceiverMK2)getTile()).setPower(i); } } @@ -181,8 +180,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy if(!power) return 0; - if(getTile() instanceof IEnergyConnector) { - return ((IEnergyConnector)getTile()).getPower(); + if(getTile() instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)getTile()).getPower(); } return 0; @@ -194,8 +193,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy if(!power) return 0; - if(getTile() instanceof IEnergyConnector) { - return ((IEnergyConnector)getTile()).getMaxPower(); + if(getTile() instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)getTile()).getMaxPower(); } return 0; @@ -207,8 +206,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy if(!this.power) return power; - if(getTile() instanceof IEnergyConnector) { - return ((IEnergyConnector)getTile()).transferPower(power); + if(getTile() instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)getTile()).transferPower(power); } return power; @@ -220,8 +219,8 @@ public class TileEntityProxyCombo extends TileEntityProxyBase implements IEnergy if(!power) return false; - if(getTile() instanceof IEnergyConnector) { - return ((IEnergyConnector)getTile()).canConnect(dir); + if(getTile() instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)getTile()).canConnect(dir); } return true; diff --git a/src/main/java/com/hbm/tileentity/TileEntityProxyEnergy.java b/src/main/java/com/hbm/tileentity/TileEntityProxyEnergy.java index f4ae0e810..65c983e23 100644 --- a/src/main/java/com/hbm/tileentity/TileEntityProxyEnergy.java +++ b/src/main/java/com/hbm/tileentity/TileEntityProxyEnergy.java @@ -1,24 +1,23 @@ package com.hbm.tileentity; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; //can be used as a soruce too since the core TE handles that anyway -public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnergyUser { +public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnergyReceiverMK2 { - public boolean canUpdate() - { - return false; - } + public boolean canUpdate() { + return false; + } @Override public void setPower(long i) { TileEntity te = getTE(); - if(te instanceof IEnergyUser) { - ((IEnergyUser)te).setPower(i); + if(te instanceof IEnergyReceiverMK2) { + ((IEnergyReceiverMK2)te).setPower(i); } } @@ -27,8 +26,8 @@ public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnerg TileEntity te = getTE(); - if(te instanceof IEnergyUser) { - return ((IEnergyUser)te).getPower(); + if(te instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)te).getPower(); } return 0; @@ -39,8 +38,8 @@ public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnerg TileEntity te = getTE(); - if(te instanceof IEnergyUser) { - return ((IEnergyUser)te).getMaxPower(); + if(te instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)te).getMaxPower(); } return 0; @@ -49,8 +48,8 @@ public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnerg @Override public long transferPower(long power) { - if(getTE() instanceof IEnergyUser) { - return ((IEnergyUser)getTE()).transferPower(power); + if(getTE() instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)getTE()).transferPower(power); } return 0; @@ -60,8 +59,8 @@ public class TileEntityProxyEnergy extends TileEntityProxyBase implements IEnerg public boolean canConnect(ForgeDirection dir) { TileEntity te = getTE(); - if(te instanceof IEnergyUser) { - return ((IEnergyUser)te).canConnect(dir); //for some reason two consecutive getTE calls return different things? + if(te instanceof IEnergyReceiverMK2) { + return ((IEnergyReceiverMK2)te).canConnect(dir); //for some reason two consecutive getTE calls return different things? } return false; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 55068c5fa..8e60ce228 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -27,7 +27,7 @@ import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -48,7 +48,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCompactLauncher extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { +public class TileEntityCompactLauncher extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { private ItemStack slots[]; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java index 857c3a3a1..0adf91ab8 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java @@ -7,8 +7,6 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; -import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; @@ -16,7 +14,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver { +public class TileEntityLaunchPad extends TileEntityLaunchPadBase { @Override public boolean isReadyForLaunch() { return delay <= 0; } @Override public double getLaunchOffset() { return 1D; } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java index 5fc986444..d73ed90bf 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java @@ -31,7 +31,7 @@ import com.hbm.util.TrackerUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.relauncher.Side; @@ -49,7 +49,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { +public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { /** Automatic instantiation of generic missiles, i.e. everything that both extends EntityMissileBaseNT and needs a designator */ public static final HashMap> missiles = new HashMap(); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index a60e17084..55a9dac77 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -8,11 +8,8 @@ import com.hbm.items.weapon.ItemMissile.MissileFormFactor; import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; -import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; -import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -21,7 +18,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver, IRadarCommandReceiver { +public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase { public int formFactor = -1; /** Whether the missile has already been placed on the launchpad. Missile will render statically on the pad if true */ diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index ed300621f..5c2846be8 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -26,7 +26,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IRadarCommandReceiver; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.common.Optional; @@ -53,7 +53,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, SimpleComponent, IRadarCommandReceiver { +public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, SimpleComponent, IRadarCommandReceiver { private ItemStack slots[]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java index 943cec0d2..e747c3a5d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCharger.java @@ -7,15 +7,15 @@ import java.util.Random; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyUser, INBTPacketReceiver { +public class TileEntityCharger extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { private List players = new ArrayList(); private long charge = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index 3ef6a42d2..5ae5bc423 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -24,7 +24,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; @@ -41,7 +41,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC { +public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyProviderMK2, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 100000000000L; @@ -100,7 +100,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc if(power > maxPower) power = maxPower; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - this.sendPower(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir.getOpposite()); + this.tryProvide(worldObj, xCoord - dir.offsetX * 11, yCoord, zCoord - dir.offsetZ * 11, dir.getOpposite()); for(DirPos pos : this.getConPos()) { this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java index 8051f40ff..f8983cd8e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java @@ -5,7 +5,7 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; @@ -13,7 +13,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCondenserPowered extends TileEntityCondenser implements IEnergyUser { +public class TileEntityCondenserPowered extends TileEntityCondenser implements IEnergyReceiverMK2 { public long power; public static final long maxPower = 10_000_000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java index 982b55616..418c9932c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityConveyorPress.java @@ -9,7 +9,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.item.ItemStack; @@ -17,7 +17,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityConveyorPress extends TileEntityMachineBase implements IEnergyUser { +public class TileEntityConveyorPress extends TileEntityMachineBase implements IEnergyReceiverMK2 { public int usage = 100; public long power = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 442668e49..7b2351785 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine; import api.hbm.block.ILaserable; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; @@ -37,7 +37,7 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.List; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEnergyUser, ILaserable, IFluidStandardReceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { +public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEnergyReceiverMK2, ILaserable, IFluidStandardReceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 1000000000L; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java index 2805004db..be45e1ab5 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreReceiver.java @@ -11,7 +11,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import api.hbm.block.ILaserable; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; @@ -32,7 +32,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEnergyGenerator, IFluidAcceptor, ILaserable, IFluidStandardReceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { +public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEnergyProviderMK2, IFluidAcceptor, ILaserable, IFluidStandardReceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { public long power; public long joules; @@ -59,7 +59,7 @@ public class TileEntityCoreReceiver extends TileEntityMachineBase implements IEn power = joules * 5000; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); if(joules > 0) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java index 344b02ea0..50564fb48 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreStabilizer.java @@ -8,7 +8,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; @@ -28,7 +28,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityCoreStabilizer extends TileEntityMachineBase implements IEnergyUser, SimpleComponent, IGUIProvider, IInfoProviderEC { +public class TileEntityCoreStabilizer extends TileEntityMachineBase implements IEnergyReceiverMK2, SimpleComponent, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 2500000000L; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java index f810b8dfb..afc3b4d8e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCustomMachine.java @@ -26,7 +26,8 @@ import com.hbm.util.Compat; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyProviderMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -40,7 +41,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCustomMachine extends TileEntityMachinePolluting implements IFluidStandardTransceiver, IEnergyUser, IGUIProvider { +public class TileEntityCustomMachine extends TileEntityMachinePolluting implements IFluidStandardTransceiver, IEnergyProviderMK2, IEnergyReceiverMK2, IGUIProvider { public String machineType; public MachineConfiguration config; @@ -155,7 +156,7 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen for (DirPos pos : this.connectionPos) { if (config.generatorMode && power > 0) - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); for (FluidTank tank : this.outputTanks) if (tank.getFill() > 0) this.sendFluid(tank, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -592,11 +593,16 @@ public class TileEntityCustomMachine extends TileEntityMachinePolluting implemen return 0; } - + @Override - public long getTransferWeight() { - if(this.config != null && this.config.generatorMode) return 0; - - return Math.max(getMaxPower() - getPower(), 0); + public long getReceiverSpeed() { + if(this.config != null && !this.config.generatorMode) return this.getMaxPower(); + return 0; + } + + @Override + public long getProviderSpeed() { + if(this.config != null && this.config.generatorMode) return this.getMaxPower(); + return 0; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java index 268ca8277..12cc135b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDeuteriumExtractor.java @@ -4,12 +4,12 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver { +public class TileEntityDeuteriumExtractor extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver { public long power = 0; public FluidTank[] tanks; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java index b41f54a7d..633c18cb7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityElectrolyser.java @@ -32,7 +32,7 @@ import com.hbm.util.CrucibleUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; @@ -49,7 +49,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityElectrolyser extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider { public long power; public static final long maxPower = 20000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFEL.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFEL.java index 5619478c3..d34054398 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFEL.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFEL.java @@ -20,7 +20,7 @@ import com.hbm.util.ContaminationUtil; import com.hbm.util.ContaminationUtil.ContaminationType; import com.hbm.util.ContaminationUtil.HazardType; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; @@ -41,7 +41,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityFEL extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { +public class TileEntityFEL extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power; public static final long maxPower = 20000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java index c9c22c014..417c24894 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityForceField.java @@ -12,8 +12,8 @@ import com.hbm.packet.TEFFPacket; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,7 +31,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityForceField extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider { +public class TileEntityForceField extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider { private ItemStack slots[]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 367fd3b2a..22fb2665d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -30,7 +30,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -46,7 +46,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { +public class TileEntityITER extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 10000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java index baf799651..a04e4d5f9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java @@ -6,7 +6,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,7 +25,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMicrowave extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, SimpleComponent { +public class TileEntityMicrowave extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, SimpleComponent { public long power; public static final long maxPower = 50000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityRadiobox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityRadiobox.java index 8a513a99b..7b4751c96 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityRadiobox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityRadiobox.java @@ -9,7 +9,7 @@ import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -22,7 +22,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityRadiobox extends TileEntityLoadedBase implements IEnergyUser, IGUIProvider { +public class TileEntityRadiobox extends TileEntityLoadedBase implements IEnergyReceiverMK2, IGUIProvider { long power; public static long maxPower = 500000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java index 01a399e72..d13fea7ff 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySoyuzLauncher.java @@ -20,7 +20,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.item.IDesignatorItem; import cpw.mods.fml.relauncher.Side; @@ -38,7 +38,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements ISidedInventory, IEnergyUser, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider { +public class TileEntitySoyuzLauncher extends TileEntityMachineBase implements ISidedInventory, IEnergyReceiverMK2, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider { public long power; public static final long maxPower = 1000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java index 664327e1f..ecdb619a0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTesla.java @@ -12,7 +12,7 @@ import com.hbm.lib.ModDamageSource; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ArmorUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.entity.Entity; @@ -28,7 +28,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityTesla extends TileEntityMachineBase implements IEnergyUser { +public class TileEntityTesla extends TileEntityMachineBase implements IEnergyReceiverMK2 { public long power; public static final long maxPower = 100000; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java index 66f4b6eab..3ef9daf56 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineCatalyticReformer.java @@ -16,7 +16,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,7 +28,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { +public class TileEntityMachineCatalyticReformer extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { public long power; public static final long maxPower = 1_000_000; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java index 784c7d158..e8f5928f0 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineGasFlare.java @@ -28,7 +28,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.ParticleUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -44,7 +44,7 @@ import net.minecraft.util.DamageSource; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineGasFlare extends TileEntityMachineBase implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineGasFlare extends TileEntityMachineBase implements IEnergyProviderMK2, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000; @@ -107,7 +107,7 @@ public class TileEntityMachineGasFlare extends TileEntityMachineBase implements this.output = 0; for(DirPos pos : getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java index 3aa9141de..9bffbf38b 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineHydrotreater.java @@ -15,7 +15,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.Tuple.Triplet; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,7 +28,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineHydrotreater extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { +public class TileEntityMachineHydrotreater extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { public long power; public static final long maxPower = 1_000_000; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index f02c1f4b4..531bebb18 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -23,7 +23,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardSender; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -37,7 +37,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineLiquefactor extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineLiquefactor extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidSource, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java index 95ec386e1..65bf61681 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineRefinery.java @@ -33,7 +33,7 @@ import com.hbm.util.ParticleUtil; import com.hbm.util.Tuple.Quintet; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -49,7 +49,7 @@ import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRefinery extends TileEntityMachineBase implements IEnergyUser, IOverpressurable, IPersistentNBT, IRepairable, IFluidStandardTransceiver, IGUIProvider { +public class TileEntityMachineRefinery extends TileEntityMachineBase implements IEnergyReceiverMK2, IOverpressurable, IPersistentNBT, IRepairable, IFluidStandardTransceiver, IGUIProvider { public long power = 0; public int sulfur = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index cf7cb6319..ae595e10d 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -21,7 +21,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -35,7 +35,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineSolidifier extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineSolidifier extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java index ea3ec152e..037982ffd 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineVacuumDistill.java @@ -16,7 +16,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.Tuple.Quartet; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,7 +28,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implements IEnergyUser, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { +public class TileEntityMachineVacuumDistill extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IPersistentNBT, IGUIProvider { public long power; public static final long maxPower = 1_000_000; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java index 48b8ea59f..c3d8ef3db 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretBaseNT.java @@ -28,7 +28,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatExternal; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.entity.IRadarDetectableNT; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -59,7 +59,7 @@ import net.minecraftforge.common.util.ForgeDirection; * @author hbm * */ -public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase implements IEnergyUser, IControlReceiver, IGUIProvider { +public abstract class TileEntityTurretBaseNT extends TileEntityMachineBase implements IEnergyReceiverMK2, IControlReceiver, IGUIProvider { @Override public boolean hasPermission(EntityPlayer player) { diff --git a/src/main/java/com/hbm/wiaj/cannery/Dummies.java b/src/main/java/com/hbm/wiaj/cannery/Dummies.java index 879a3fd3a..cf9e23347 100644 --- a/src/main/java/com/hbm/wiaj/cannery/Dummies.java +++ b/src/main/java/com/hbm/wiaj/cannery/Dummies.java @@ -2,19 +2,16 @@ package com.hbm.wiaj.cannery; import com.hbm.inventory.fluid.FluidType; -import api.hbm.energy.IEnergyConnector; +import api.hbm.energymk2.IEnergyConnectorMK2; import api.hbm.fluid.IFluidConnector; import net.minecraft.tileentity.TileEntity; public class Dummies { - public static class JarDummyConnector extends TileEntity implements IEnergyConnector, IFluidConnector { + public static class JarDummyConnector extends TileEntity implements IEnergyConnectorMK2, IFluidConnector { @Override public boolean isLoaded() { return false; } @Override public long transferFluid(FluidType type, int pressure, long fluid) { return 0; } @Override public long getDemand(FluidType type, int pressure) { return 0; } - @Override public long transferPower(long power) { return 0; } - @Override public long getPower() { return 0; } - @Override public long getMaxPower() { return 0; } } } From 76ca5c0a930b6b48c5a5cc5f23b44e2d36fc622b Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 10 Apr 2024 09:29:29 +1000 Subject: [PATCH 21/48] Prevent players skipping fluid pressurization by just chucking fluid container into machines --- src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 40172b6bd..09e6448e4 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -126,6 +126,9 @@ public class FluidTank { if(slots[in] == null) return false; + + if(pressure != 0) + return false; int prev = this.getFill(); From 93f03208faf964d03a6a9e4e106cab75f47f3cb7 Mon Sep 17 00:00:00 2001 From: George Paton Date: Wed, 10 Apr 2024 10:21:33 +1000 Subject: [PATCH 22/48] Modify GUIs for existing machines that require compressors --- .../com/hbm/inventory/SlotDeprecated.java | 28 ++++++++++++++++++ .../ContainerMachineHydrotreater.java | 9 +++--- .../ContainerMachineVacuumDistill.java | 9 +++--- .../gui/processing/gui_hydrotreater.png | Bin 5260 -> 9002 bytes .../gui/processing/gui_vacuum_distill.png | Bin 3016 -> 6666 bytes 5 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/SlotDeprecated.java diff --git a/src/main/java/com/hbm/inventory/SlotDeprecated.java b/src/main/java/com/hbm/inventory/SlotDeprecated.java new file mode 100644 index 000000000..1fa16a9d6 --- /dev/null +++ b/src/main/java/com/hbm/inventory/SlotDeprecated.java @@ -0,0 +1,28 @@ +package com.hbm.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +/** + * Deprecated slots can hold items from previous versions, but are otherwise entirely uninteractable + */ +public class SlotDeprecated extends Slot { + + public SlotDeprecated(IInventory inventory, int id, int x, int y) { + super(inventory, id, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack) { + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean func_111238_b() { + return false; + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java index 375e0d753..85ed0cfc9 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineHydrotreater.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.inventory.SlotDeprecated; import com.hbm.inventory.SlotTakeOnly; import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; @@ -26,10 +27,10 @@ public class ContainerMachineHydrotreater extends Container { this.addSlotToContainer(new Slot(tedf, 1, 35, 90)); //Canister Output this.addSlotToContainer(new SlotTakeOnly(tedf, 2, 35, 108)); - //Hydrogen Input - this.addSlotToContainer(new Slot(tedf, 3, 53, 90)); - //Hydrogen Output - this.addSlotToContainer(new SlotTakeOnly(tedf, 4, 53, 108)); + //Hydrogen Input (removed, requires pressurization) + this.addSlotToContainer(new SlotDeprecated(tedf, 3, 53, 90)); + //Hydrogen Output (samesies) + this.addSlotToContainer(new SlotDeprecated(tedf, 4, 53, 108)); //Desulfated Oil Input this.addSlotToContainer(new Slot(tedf, 5, 125, 90)); //Desulfated Oil Output diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineVacuumDistill.java b/src/main/java/com/hbm/inventory/container/ContainerMachineVacuumDistill.java index 260bfe17d..c2fd3971b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineVacuumDistill.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineVacuumDistill.java @@ -1,5 +1,6 @@ package com.hbm.inventory.container; +import com.hbm.inventory.SlotDeprecated; import com.hbm.inventory.SlotTakeOnly; import com.hbm.tileentity.machine.oil.TileEntityMachineVacuumDistill; @@ -20,10 +21,10 @@ public class ContainerMachineVacuumDistill extends Container { //Battery this.addSlotToContainer(new Slot(tedf, 0, 26, 90)); - //Canister Input - this.addSlotToContainer(new Slot(tedf, 1, 44, 90)); - //Canister Output - this.addSlotToContainer(new SlotTakeOnly(tedf, 2, 44, 108)); + //Canister Input (removed, requires pressurization) + this.addSlotToContainer(new SlotDeprecated(tedf, 1, 44, 90)); + //Canister Output (same as above) + this.addSlotToContainer(new SlotDeprecated(tedf, 2, 44, 108)); //Heavy Oil Input this.addSlotToContainer(new Slot(tedf, 3, 80, 90)); //Heavy Oil Output diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_hydrotreater.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_hydrotreater.png index 451e335558b66a73ea3cbafbbe914e7c3b61218a..9a96ab43f9d62e95ad8ebae847306fd0bf17f3a9 100644 GIT binary patch literal 9002 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 literal 5260 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 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_vacuum_distill.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_vacuum_distill.png index 2685f3e4e17d631d1a217a2391d6f5906349f431..bdbd368183dc20e9887d8654b709cfd14a214e47 100644 GIT binary patch literal 6666 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 literal 3016 zcmbVOcU03^7Jdm4qA1+~K?ubHGcGWL1jv9y2q=pnN>Kp;2Mh!VGD0XqAj}|T6|f`K zV5K9{kv1TNB1I6Qp@k-x5F;hDfb1{o&YrWov$JR4KkwaF?)$#)zIV@!x3NC5W1IXo z0Kg85qqvg*z@Q-vAcdjM`C>L6>JR}Y7IsLeg(E%U01%C|z#X;=N#_h(CJwgmY?(8q zwaxgc&X^&F8CZO3Pb&uT5$<9lQ~@hgyR**`XGvc$$0zuzmar+iUdVWyxqmvJo`cy$ zxiJq_A5U(dJSBdjKVjzkNk4%1xv0nVSjihD^{qQ~`?N9LKM05G85$c;`w8LK)>jvl z9Zi^n_bygYy-*kRu$8M*d3nV2?Hi$wCfqFF1F#wi zpq|zz#TwRV~ zY#ywYh}(6qNjtlC^ARD{Oy%h)*KC2^`+i<>)P>kwnOUY)?lGdy?b@v4PW3%G{%qJ!R!ihyohGqs&7kWT#RzD<3gdA$)bdIcH=pe=V$aZCF~gz-d(x} zlEiJFjYG!U5QQGW7QuXaG2-J%GWYxWWP92!C?5SH4PM^F)QMAMf&hVzf)3EaU*a;5 zw@^G15F?;AjVjoxR5Bei7&mUPrt5uXdl)aFQP(BiR- zfguJ2IEIPHc z(9eRoMvfJu#PM)S3dH)FIS*cx?<(Q*Q$AFhYR%t>F zw3@&Y!VWU*22-7!6d&4?p@r-Jb}WpOC3X@DCEYxG_kOrlSuEyg!5X+*g0>1(z4par z-WupZs}d9lW&MX8p%@+g-RHS|pftgTVeUeNSls|#gAUaSYK(*+KCsH$O3P;WWs{pb^=&WzlfrrArc9Yxm2t;3XSF0QUqJf3c_jlrNF8I#M^?P92%gKbAnwnO>isx&ajPlymP3Kag!Yo{D&eFsL z$~h$Dwv8K|pet#^ah`ORz7ZJyX6iC#+B5L1>|$k}1ZOL+`ltRgs)5F8iQ~(FQO>J7 zZMv;riAd_=KzXSIF_}yjcWYDE1fH_<1lIiyt=8tVSuN*ud z5|_3Fzr}-!ffRS-fwwwxS|8HYY_pfV@&a7k*Xtz0wzPi7-;SN6U4IcAEzgc-bS^>f zT%Hx3S*%i@57TzRPDh#$!xPF5I#aV44+_NElgZNBEn;Q+80dvkp7?yb5>O#HCB+CZ zWFML9hF$GCf;KmB%k;*BY4#a&%;ympvX=%Eh3Fp#8^YhhnF9&civ6 zBhr6?)iRr_`Bo1`_FFON+qe}am21Rc9awd|rD6d}iQk>2o8?H~|8O#kVQZrJTEhb5 zJLDW$cL^=dmE}c)XEFb;?j|~>bj)Tk#;fpFn>;rvEH=mHl9YK zjY(wg3CoNCLx1}u4`=~&O2}TjqY(L!WBOw{GFrpJ6BKL75M@0C66y5zcAvIxR-$xY zZi~kfSm|^oj(RCOLS|)Z%1jA`%BYK#jvDVD!%^2f#3^#9iTkgX1qH2cA zYu~WhFGI-twR%qmY>{jn+7xgOPRI!nqqZm*zvfQ~Hhl|cp4@>l+o4eT!{Md_ z>$vO603S;O8T+MEhIXw|npwrMQ(3N?_;b4-1Fo#7%o z`?uBI*oDPKnc^Db#C;9}DxMk+O!w(O9#!Ack%VnYG$daV?Eg|8Dxu8&b-N zkJuP4%0!WcePWJ_5yU0}6A~pImHi;AYbqW~9=#IR8uWbU>Zb11%leXW7#7=K)y8lZ z_GcXafbf3!i6dmi7ftcl*C$*BFL(^6%*rl;?762R|BE*N!EZVer^q8obWg@(Ddy=& z88OR$rq;9}#H5`Y%PTt|^jq!5F=z-~_Ac=M*6gZnRL+Asv2np;#+ Date: Wed, 10 Apr 2024 10:59:15 +1000 Subject: [PATCH 23/48] Allow infinite fluid barrels to fill pressurized tanks --- src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java index 09e6448e4..4fa6180d8 100644 --- a/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java +++ b/src/main/java/com/hbm/inventory/fluid/tank/FluidTank.java @@ -10,6 +10,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.gui.GuiInfoContainer; +import com.hbm.items.ModItems; import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.TEFluidPacket; @@ -127,7 +128,9 @@ public class FluidTank { if(slots[in] == null) return false; - if(pressure != 0) + boolean isInfiniteBarrel = slots[in].getItem() == ModItems.fluid_barrel_infinite; + + if(!isInfiniteBarrel && pressure != 0) return false; int prev = this.getFill(); From ba58f42ef2a6f63bccbe78254e942cbadfabe477 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 10 Apr 2024 16:10:55 +0200 Subject: [PATCH 24/48] I will kill Horse Ronald Reagan when I become 23 years old --- .../java/api/hbm/energymk2/PowerNetMK2.java | 8 +- .../java/com/hbm/entity/logic/EntityEMP.java | 12 +- .../java/com/hbm/items/tool/ItemAnalyzer.java | 111 -------- .../com/hbm/packet/AuxElectricityPacket.java | 6 +- .../java/com/hbm/tileentity/TileMappings.java | 1 - .../machine/TileEntityCoreEmitter.java | 3 +- .../machine/TileEntityFWatzCore.java | 19 +- .../tileentity/machine/TileEntityHadron.java | 4 +- .../machine/TileEntityHadronPower.java | 4 +- .../machine/TileEntityHeaterElectric.java | 4 +- .../machine/TileEntityMachineAmgen.java | 6 +- .../machine/TileEntityMachineArcFurnace.java | 10 +- .../machine/TileEntityMachineArcWelder.java | 4 +- .../TileEntityMachineAssemblerBase.java | 4 +- .../machine/TileEntityMachineAutocrafter.java | 7 +- .../TileEntityMachineBoilerElectric.java | 4 +- .../machine/TileEntityMachineCentrifuge.java | 9 +- .../machine/TileEntityMachineChemplant.java | 114 +------- .../TileEntityMachineChemplantBase.java | 4 +- .../machine/TileEntityMachineCoal.java | 33 --- .../TileEntityMachineCombustionEngine.java | 8 +- .../machine/TileEntityMachineCompressor.java | 4 +- .../TileEntityMachineCrystallizer.java | 4 +- .../machine/TileEntityMachineCyclotron.java | 4 +- .../machine/TileEntityMachineDiesel.java | 6 +- .../machine/TileEntityMachineEPress.java | 4 +- .../TileEntityMachineElectricFurnace.java | 4 +- .../machine/TileEntityMachineExcavator.java | 4 +- .../TileEntityMachineExposureChamber.java | 4 +- .../machine/TileEntityMachineGasCent.java | 4 +- .../machine/TileEntityMachineIGenerator.java | 99 +------ .../TileEntityMachineLargeTurbine.java | 6 +- .../machine/TileEntityMachineMiningLaser.java | 4 +- .../machine/TileEntityMachineMixer.java | 4 +- .../TileEntityMachinePlasmaHeater.java | 4 +- .../TileEntityMachinePumpElectric.java | 4 +- .../machine/TileEntityMachineRTG.java | 6 +- .../machine/TileEntityMachineRadGen.java | 6 +- .../machine/TileEntityMachineRadarNT.java | 4 +- .../machine/TileEntityMachineRadiolysis.java | 6 +- .../machine/TileEntityMachineSPP.java | 14 +- ...eEntityMachineSchrabidiumTransmutator.java | 4 +- .../TileEntityMachineSeleniumEngine.java | 265 +----------------- .../machine/TileEntityMachineShredder.java | 4 +- .../machine/TileEntityMachineTeleporter.java | 7 +- .../machine/TileEntityMachineTurbine.java | 6 +- .../machine/TileEntityMachineTurbineGas.java | 6 +- .../machine/TileEntityMachineTurbofan.java | 6 +- .../machine/TileEntityMachineWoodBurner.java | 6 +- .../machine/TileEntityMicrowave.java | 5 +- .../machine/TileEntitySteamEngine.java | 82 +----- .../machine/TileEntityStirling.java | 6 +- .../storage/TileEntityMachineBattery.java | 2 +- 53 files changed, 139 insertions(+), 830 deletions(-) delete mode 100644 src/main/java/com/hbm/items/tool/ItemAnalyzer.java delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 233bf14b0..c509d1cef 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -119,12 +119,12 @@ public class PowerNetMK2 { for(Entry entry : providerEntries.entrySet()) { IEnergyProviderMK2 provider = entry.getKey(); - if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getConnectionSpeed()); + if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getProviderSpeed()); } for(Entry entry : receiverEntries.entrySet()) { IEnergyReceiverMK2 receiver = entry.getKey(); - if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand += Math.min(receiver.getMaxPower() - receiver.getPower(), receiver.getConnectionSpeed()); + if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand += Math.min(receiver.getMaxPower() - receiver.getPower(), receiver.getReceiverSpeed()); } double drainScale = 1D; @@ -153,8 +153,8 @@ public class PowerNetMK2 { 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 toDrain = Math.min((long) (src.getPower() * drainScale) + prevSrc, src.getProviderSpeed()) - prevSrc; + long toFill = Math.min(dest.getMaxPower() - dest.getPower() + prevDest, dest.getReceiverSpeed()) - prevDest; long finalTransfer = Math.min(toDrain, toFill); if(toDrain <= 0) { providers.remove(0); prevSrc = 0; continue; } diff --git a/src/main/java/com/hbm/entity/logic/EntityEMP.java b/src/main/java/com/hbm/entity/logic/EntityEMP.java index 94a9b7d07..3ba75fc54 100644 --- a/src/main/java/com/hbm/entity/logic/EntityEMP.java +++ b/src/main/java/com/hbm/entity/logic/EntityEMP.java @@ -6,7 +6,7 @@ import java.util.List; import com.hbm.packet.PacketDispatcher; import com.hbm.packet.ParticleBurstPacket; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyHandlerMK2; import cofh.api.energy.IEnergyProvider; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; @@ -44,19 +44,15 @@ public class EntityEMP extends Entity { private void allocate() { machines = new ArrayList(); - int radius = 100; for(int x = -radius; x <= radius; x++) { - int x2 = (int) Math.pow(x, 2); for(int y = -radius; y <= radius; y++) { - int y2 = (int) Math.pow(y, 2); for(int z = -radius; z <= radius; z++) { - int z2 = (int) Math.pow(z, 2); if(Math.sqrt(x2 + y2 + z2) <= radius) { @@ -81,7 +77,7 @@ public class EntityEMP extends Entity { private void add(int x, int y, int z) { TileEntity te = worldObj.getTileEntity(x, y, z); - if (te != null && te instanceof IEnergyUser) { + if (te != null && te instanceof IEnergyHandlerMK2) { machines.add(new int[] { x, y, z }); } else if (te != null && te instanceof IEnergyProvider) { machines.add(new int[] { x, y, z }); @@ -94,9 +90,9 @@ public class EntityEMP extends Entity { boolean flag = false; - if (te != null && te instanceof IEnergyUser) { + if (te != null && te instanceof IEnergyHandlerMK2) { - ((IEnergyUser)te).setPower(0); + ((IEnergyHandlerMK2)te).setPower(0); flag = true; } if (te != null && te instanceof IEnergyProvider) { diff --git a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java b/src/main/java/com/hbm/items/tool/ItemAnalyzer.java deleted file mode 100644 index 1076552b1..000000000 --- a/src/main/java/com/hbm/items/tool/ItemAnalyzer.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.hbm.items.tool; - -import com.hbm.interfaces.IFluidDuct; -import com.hbm.tileentity.machine.TileEntityDummy; -import com.hbm.tileentity.machine.TileEntityLockableBase; -import com.hbm.tileentity.network.TileEntityPylon; - -import api.hbm.energy.IEnergyConnector; -import net.minecraft.block.Block; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChatComponentText; -import net.minecraft.world.World; - -public class ItemAnalyzer extends Item { - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int b, float f0, float f1, float f2) - { - Block block = world.getBlock(x, y, z); - TileEntity te = world.getTileEntity(x, y, z); - - if(world.isRemote) { - player.addChatMessage(new ChatComponentText( - "Block: " + I18n.format(block.getUnlocalizedName() + ".name") + " (" + block.getUnlocalizedName() + ")" - )); - - player.addChatMessage(new ChatComponentText( - "Meta: " + world.getBlockMetadata(x, y, z) - )); - } - - if(!world.isRemote) { - - if(te == null) { - player.addChatMessage(new ChatComponentText( - "Tile Entity: none")); - } else { - - if(te instanceof TileEntityDummy) { - - player.addChatMessage(new ChatComponentText( - "Dummy Block, references TE at " + ((TileEntityDummy)te).targetX + " / " + ((TileEntityDummy)te).targetY + " / " + ((TileEntityDummy)te).targetZ)); - - te = world.getTileEntity(((TileEntityDummy)te).targetX, ((TileEntityDummy)te).targetY, ((TileEntityDummy)te).targetZ); - } - - String[] parts = te.toString().split("\\."); - - if(parts.length == 0) - parts = new String[]{"error"}; - - String post = parts[parts.length - 1]; - String name = post.split("@")[0]; - - player.addChatMessage(new ChatComponentText( - "Tile Entity: " + name)); - - if(te instanceof IInventory) { - - player.addChatMessage(new ChatComponentText( - "Slots: " + ((IInventory)te).getSizeInventory())); - } - - if(te instanceof IEnergyConnector) { - - player.addChatMessage(new ChatComponentText( - "Electricity: " + ((IEnergyConnector)te).getPower() + " HE")); - } - - if(te instanceof IFluidDuct) { - - player.addChatMessage(new ChatComponentText( - "Duct Type: " + ((IFluidDuct)te).getType().getLocalizedName())); - } - - if(te instanceof TileEntityPylon) { - - /** - * this is a smoldering crater - */ - } - - if(te instanceof TileEntityLockableBase) { - - player.addChatMessage(new ChatComponentText( - "Locked: " + ((TileEntityLockableBase)te).isLocked())); - - if(((TileEntityLockableBase)te).isLocked()) { - - //player.addChatMessage(new ChatComponentText( - // "Pins: " + ((TileEntityLockableBase)te).getPins())); - player.addChatMessage(new ChatComponentText( - "Pick Chance: " + (((TileEntityLockableBase)te).getMod() * 100D) + "%")); - } - } - } - - player.addChatMessage(new ChatComponentText( - "----------------------------" - )); - } - - return true; - } - -} diff --git a/src/main/java/com/hbm/packet/AuxElectricityPacket.java b/src/main/java/com/hbm/packet/AuxElectricityPacket.java index bebb4e9c1..39c27e7e1 100644 --- a/src/main/java/com/hbm/packet/AuxElectricityPacket.java +++ b/src/main/java/com/hbm/packet/AuxElectricityPacket.java @@ -1,6 +1,6 @@ package com.hbm.packet; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyHandlerMK2; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; @@ -55,9 +55,9 @@ public class AuxElectricityPacket implements IMessage { try { TileEntity te = Minecraft.getMinecraft().theWorld.getTileEntity(m.x, m.y, m.z); - if (te instanceof IEnergyUser) { + if (te instanceof IEnergyHandlerMK2) { - IEnergyUser gen = (IEnergyUser) te; + IEnergyHandlerMK2 gen = (IEnergyHandlerMK2) te; gen.setPower(m.charge); } } catch (Exception x) { } diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index 33081cb50..394e66808 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -68,7 +68,6 @@ public class TileMappings { put(TileEntityDecoPoleSatelliteReceiver.class, "tileentity_satellitereceicer"); put(TileEntityMachineBattery.class, "tileentity_battery"); put(TileEntityCapacitor.class, "tileentity_capacitor"); - put(TileEntityMachineCoal.class, "tileentity_coal"); put(TileEntityMachineWoodBurner.class, "tileentity_wood_burner"); put(TileEntityRedBarrel.class, "tileentity_barrel"); put(TileEntityYellowBarrel.class, "tileentity_nukebarrel"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java index 7b2351785..ff1278e52 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCoreEmitter.java @@ -64,8 +64,7 @@ public class TileEntityCoreEmitter extends TileEntityMachineBase implements IEne public void updateEntity() { if (!worldObj.isRemote) { - - this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); this.subscribeToAllAround(tank.getTankType(), this); watts = MathHelper.clamp_int(watts, 1, 100); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java index ff3e3a1ee..dadc37ec1 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFWatzCore.java @@ -19,7 +19,6 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.world.machine.FWatz; -import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -34,7 +33,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; -public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedInventory, IReactor, IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider { +public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedInventory, IReactor, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider { public long power; public final static long maxPower = 10000000000L; @@ -281,7 +280,6 @@ public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedI if(!worldObj.isRemote && this.isStructureValid(this.worldObj)) { for(DirPos pos : this.getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[1].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[2].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); @@ -387,21 +385,6 @@ public class TileEntityFWatzCore extends TileEntityLoadedBase implements ISidedI public boolean isRunning() { return FWatz.getPlasma(worldObj, this.xCoord, this.yCoord, this.zCoord) && this.isStructureValid(worldObj); } - - @Override - public long getMaxPower() { - return this.maxPower; - } - - @Override - public long getPower() { - return power; - } - - @Override - public void setPower(long i) { - this.power = i; - } @Override public void setFillForSync(int fill, int index) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java index bdafebdbe..167f550c8 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadron.java @@ -21,7 +21,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.tileentity.machine.TileEntityHadronDiode.DiodeConfig; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,7 +37,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHadron extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { +public class TileEntityHadron extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power; public static final long maxPower = 10000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java index 4e8bcf815..814711f6d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHadronPower.java @@ -4,12 +4,12 @@ import com.hbm.blocks.machine.BlockHadronPower; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHadronPower extends TileEntityLoadedBase implements IEnergyUser, INBTPacketReceiver { +public class TileEntityHadronPower extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { public long power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java index 93f49a593..7c8a19797 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityHeaterElectric.java @@ -7,7 +7,7 @@ import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IHeatSource; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -17,7 +17,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyUser, INBTPacketReceiver, IInfoProviderEC { +public class TileEntityHeaterElectric extends TileEntityLoadedBase implements IHeatSource, IEnergyReceiverMK2, INBTPacketReceiver, IInfoProviderEC { public long power; public int heatEnergy; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java index ec2e10421..a01b3b6f6 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java @@ -5,14 +5,14 @@ import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { +public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEnergyProviderMK2, IInfoProviderEC { public long power; public long maxPower = 500; @@ -42,7 +42,7 @@ public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEne power = maxPower; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java index 085eb355e..f907bf852 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java @@ -13,7 +13,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -27,8 +27,9 @@ import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; @@ -315,8 +316,9 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements boolean flag1 = false; if(!worldObj.isRemote) { - - this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); if(hasPower() && canProcess()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java index f42fd7b9d..fc2837579 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcWelder.java @@ -23,7 +23,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -39,7 +39,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineArcWelder extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IConditionalInvAccess, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineArcWelder extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IConditionalInvAccess, IGUIProvider, IUpgradeInfoProvider { public long power; public long maxPower = 2_000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index 836b03f1d..525df1eda 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -13,14 +13,14 @@ import com.hbm.tileentity.machine.storage.TileEntityCrateTemplate; import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { +public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power; public int[] progress; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index f3abfb2ba..9f1834c63 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -10,7 +10,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ItemStackUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -23,8 +23,9 @@ import net.minecraft.item.crafting.CraftingManager; import net.minecraft.item.crafting.IRecipe; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineAutocrafter extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { +public class TileEntityMachineAutocrafter extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public static final String MODE_EXACT = "exact"; public static final String MODE_WILDCARD = "wildcard"; @@ -146,7 +147,7 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase implemen if(!worldObj.isRemote) { this.power = Library.chargeTEFromItems(slots, 20, power, maxPower); - this.updateStandardConnections(worldObj, this); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); if(!this.recipes.isEmpty() && this.power >= this.consumption) { IRecipe recipe = this.recipes.get(recipeIndex); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java index 7830b63bb..dd61cdfae 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineBoilerElectric.java @@ -21,8 +21,8 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -38,7 +38,7 @@ import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyUser, IFluidStandardTransceiver, IGUIProvider { +public class TileEntityMachineBoilerElectric extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider { private ItemStack slots[]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 247214a14..71694f632 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -18,7 +18,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -31,8 +31,9 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public int progress; public long power; @@ -155,8 +156,8 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement public void updateEntity() { if(!worldObj.isRemote) { - - this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); power = Library.chargeTEFromItems(slots, 1, power, maxPower); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java index 00318242c..0e1efc401 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplant.java @@ -1,16 +1,12 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; import java.util.List; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.UpgradeManager; import com.hbm.inventory.container.ContainerMachineChemplant; -import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.gui.GUIMachineChemplant; @@ -29,7 +25,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -46,7 +42,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineChemplant extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidAcceptor, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineChemplant extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider { public long power; public static final long maxPower = 100000; @@ -78,7 +74,7 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements tanks = new FluidTank[4]; for(int i = 0; i < 4; i++) { - tanks[i] = new FluidTank(Fluids.NONE, 24_000, i); + tanks[i] = new FluidTank(Fluids.NONE, 24_000); } } @@ -123,10 +119,6 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements loadItems(); unloadItems(); - if(worldObj.getTotalWorldTime() % 10 == 0) { - this.fillFluidInit(tanks[2].getTankType()); - this.fillFluidInit(tanks[3].getTankType()); - } if(worldObj.getTotalWorldTime() % 20 == 0) { this.updateConnections(); } @@ -511,106 +503,6 @@ public class TileEntityMachineChemplant extends TileEntityMachineBase implements public long getMaxPower() { return this.maxPower; } - - @Override - public void setFillForSync(int fill, int index) { - if(index >= 0 && index < tanks.length) tanks[index].setFill(fill); - } - - @Override - public void setFluidFill(int fill, FluidType type) { - - for(FluidTank tank : tanks) { - if(tank.getTankType() == type) { - tank.setFill(fill); - return; - } - } - } - - @Override - public void setTypeForSync(FluidType type, int index) { - if(index >= 0 && index < tanks.length) tanks[index].setTankType(type); - } - - @Override - public int getFluidFill(FluidType type) { - - for(FluidTank tank : tanks) { - if(tank.getTankType() == type) { - return tank.getFill(); - } - } - - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - - for(int i = 0; i < 2; i++) { - if(tanks[i].getTankType() == type) { - return tanks[i].getMaxFill(); - } - } - - return 0; - } - - @Override - public void fillFluidInit(FluidType type) { - - /* - * #### - * X####X - * X##O#X - * #### - */ - - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset).getOpposite(); - ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - - fillFluid(xCoord + rot.offsetX * 3, yCoord, zCoord + rot.offsetZ * 3, this.getTact(), type); - fillFluid(xCoord - rot.offsetX * 2, yCoord, zCoord - rot.offsetZ * 2, this.getTact(), type); - fillFluid(xCoord + rot.offsetX * 3 + dir.offsetX, yCoord, zCoord + rot.offsetZ * 3 + dir.offsetZ, this.getTact(), type); - fillFluid(xCoord - rot.offsetX * 2 + dir.offsetX, yCoord, zCoord - rot.offsetZ * 2 + dir.offsetZ, this.getTact(), type); - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - public boolean getTact() { - return worldObj.getTotalWorldTime() % 20 < 10; - } - - List[] lists = new List[] { - new ArrayList(), new ArrayList(), new ArrayList(), new ArrayList() - }; - - @Override - public List getFluidList(FluidType type) { - - for(int i = 0; i < tanks.length; i++) { - if(tanks[i].getTankType() == type) { - return lists[i]; - } - } - - return new ArrayList(); - } - - @Override - public void clearFluidList(FluidType type) { - - for(int i = 0; i < tanks.length; i++) { - if(tanks[i].getTankType() == type) { - lists[i].clear(); - } - } - } @Override public void readFromNBT(NBTTagCompound nbt) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java index 162a456f2..1ca2d230e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineChemplantBase.java @@ -16,7 +16,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidUser; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -32,7 +32,7 @@ import net.minecraft.tileentity.TileEntity; * Tanks follow the order R1(I1, I2, O1, O2), R2(I1, I2, O1, O2) ... * @author hbm */ -public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBase implements IEnergyUser, IFluidUser, IGUIProvider { +public abstract class TileEntityMachineChemplantBase extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidUser, IGUIProvider { public long power; public int[] progress; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java deleted file mode 100644 index c616c9afc..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCoal.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hbm.tileentity.machine; - -import com.hbm.blocks.ModBlocks; -import com.hbm.tileentity.TileEntityMachineBase; - -import net.minecraft.entity.item.EntityItem; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; - -@Deprecated -public class TileEntityMachineCoal extends TileEntityMachineBase implements ISidedInventory { - - public TileEntityMachineCoal() { - super(4); - } - - @Override - public String getName() { - return "container.machineCoal"; - } - - @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - EntityItem drop = new EntityItem(worldObj); - drop.setEntityItemStack(new ItemStack(ModBlocks.machine_wood_burner)); - drop.setPosition(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5); - worldObj.spawnEntityInWorld(drop); - } - } -} diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java index eeb04c81e..8e4687ac3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCombustionEngine.java @@ -20,7 +20,7 @@ import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -33,7 +33,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCombustionEngine extends TileEntityMachinePolluting implements IEnergyGenerator, IFluidStandardTransceiver, IControlReceiver, IGUIProvider { +public class TileEntityMachineCombustionEngine extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidStandardTransceiver, IControlReceiver, IGUIProvider { public boolean isOn = false; public static long maxPower = 2_500_000; @@ -52,7 +52,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin public TileEntityMachineCombustionEngine() { super(5, 50); - this.tank = new FluidTank(Fluids.DIESEL, 24_000, 0); + this.tank = new FluidTank(Fluids.DIESEL, 24_000); } @Override @@ -105,7 +105,7 @@ public class TileEntityMachineCombustionEngine extends TileEntityMachinePollutin this.power = Library.chargeItemsFromTE(slots, 3, power, power); for(DirPos pos : getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendSmoke(pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java index 318a1a4d0..c3e94a705 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCompressor.java @@ -23,7 +23,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -37,7 +37,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCompressor extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IEnergyUser, IFluidStandardTransceiver, IUpgradeInfoProvider { +public class TileEntityMachineCompressor extends TileEntityMachineBase implements IGUIProvider, IControlReceiver, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { public FluidTank[] tanks; public long power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java index c231fe7ce..3ead60a33 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCrystallizer.java @@ -22,8 +22,8 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -38,7 +38,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCrystallizer extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineCrystallizer extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider { public long power; public static final long maxPower = 1000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index f538dff8a..2b5d15c08 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -35,7 +35,7 @@ import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -52,7 +52,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyReceiverMK2, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index aec3af948..af951569c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -25,8 +25,8 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachinePolluting; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -39,7 +39,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC { public long power; public int soundCycle = 0; @@ -132,7 +132,7 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); this.sendSmoke(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index b7bd4ec24..081aab10a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -16,7 +16,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,7 +30,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineEPress extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineEPress extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power = 0; public final static long maxPower = 50000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java index e824f00c2..4636da4e2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineElectricFurnace.java @@ -14,8 +14,8 @@ import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.I18nUtil; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -29,7 +29,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineElectricFurnace extends TileEntityMachineBase implements ISidedInventory, IEnergyUser, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineElectricFurnace extends TileEntityMachineBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider, IUpgradeInfoProvider { // HOLY FUCKING SHIT I SPENT 5 DAYS ON THIS SHITFUCK CLASS FILE // thanks Martin, vaer and Bob for the help diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java index ac6265b3a..2dbbcb63b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExcavator.java @@ -35,7 +35,7 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.conveyor.IConveyorBelt; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; @@ -58,7 +58,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineExcavator extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineExcavator extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider { public static final long maxPower = 1_000_000; public long power; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java index 160a35b0b..d733720ba 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineExposureChamber.java @@ -17,7 +17,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; @@ -31,7 +31,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineExposureChamber extends TileEntityMachineBase implements IGUIProvider, IEnergyUser, IUpgradeInfoProvider { +public class TileEntityMachineExposureChamber extends TileEntityMachineBase implements IGUIProvider, IEnergyReceiverMK2, IUpgradeInfoProvider { public long power; public static final long maxPower = 1_000_000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index bc51868ab..cf0ad2b1c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -19,7 +19,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -36,7 +36,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //epic! -public class TileEntityMachineGasCent extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineGasCent extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { public long power; public int progress; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 3b66c7d06..325b68a64 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -1,24 +1,17 @@ package com.hbm.tileentity.machine; -import java.io.IOException; - -import com.google.gson.JsonObject; -import com.google.gson.stream.JsonWriter; import com.hbm.blocks.BlockDummyable; -import com.hbm.interfaces.IFluidAcceptor; import com.hbm.inventory.container.ContainerIGenerator; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Flammable; import com.hbm.inventory.gui.GUIIGenerator; -import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -34,7 +27,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineIGenerator extends TileEntityMachineBase implements IFluidAcceptor, IEnergyGenerator, IFluidStandardReceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineIGenerator extends TileEntityMachineBase implements IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { public long power; public int spin; @@ -66,37 +59,6 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement protected long output; - @Override - public String getConfigName() { - return "igen"; - } - - @Override - public void readIfPresent(JsonObject obj) { - maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); - waterCap = IConfigurableMachine.grab(obj, "I:waterCap", waterCap); - oilCap = IConfigurableMachine.grab(obj, "I:oilCap", oilCap); - lubeCap = IConfigurableMachine.grab(obj, "I:lubeCap", lubeCap); - coalGenRate = IConfigurableMachine.grab(obj, "I:solidFuelRate2", coalGenRate); - rtgHeatMult = IConfigurableMachine.grab(obj, "D:rtgHeatMult", rtgHeatMult); - waterRate = IConfigurableMachine.grab(obj, "I:waterRate", waterRate); - lubeRate = IConfigurableMachine.grab(obj, "I:lubeRate", lubeRate); - fluidHeatDiv = IConfigurableMachine.grab(obj, "D:fluidHeatDiv", fluidHeatDiv); - } - - @Override - public void writeConfig(JsonWriter writer) throws IOException { - writer.name("L:powerCap").value(maxPower); - writer.name("I:waterCap").value(waterCap); - writer.name("I:oilCap").value(oilCap); - writer.name("I:lubeCap").value(lubeCap); - writer.name("I:solidFuelRate2").value(coalGenRate); - writer.name("D:rtgHeatMult").value(rtgHeatMult); - writer.name("I:waterRate").value(waterRate); - writer.name("I:lubeRate").value(lubeRate); - writer.name("D:fluidHeatDiv").value(fluidHeatDiv); - } - public TileEntityMachineIGenerator() { super(21); tanks = new FluidTank[3]; @@ -274,47 +236,6 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement FluidType type = tanks[1].getTankType(); return type.hasTrait(FT_Flammable.class) ? (int)(type.getTrait(FT_Flammable.class).getHeatEnergy() / (con ? 5000L : fluidHeatDiv)) : 0; } - - @Override - public void setFillForSync(int fill, int index) { - tanks[index].setFill(fill); - } - - @Override - public void setFluidFill(int fill, FluidType type) { - - if(type == Fluids.WATER) - tanks[0].setFill(fill); - else if(type == Fluids.LUBRICANT) - tanks[2].setFill(fill); - else if(tanks[1].getTankType() == type) - tanks[1].setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - tanks[index].setTankType(type); - } - - @Override - public int getFluidFill(FluidType type) { - - for(int i = 0; i < 3; i++) - if(tanks[i].getTankType() == type) - return tanks[i].getFill(); - - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - - for(int i = 0; i < 3; i++) - if(tanks[i].getTankType() == type) - return tanks[i].getMaxFill(); - - return 0; - } @Override public void readFromNBT(NBTTagCompound nbt) { @@ -345,26 +266,10 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement @Override @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { + public double getMaxRenderDistanceSquared() { return 65536.0D; } - @Override - public void setPower(long power) { - this.power = power; - } - - @Override - public long getPower() { - return this.power; - } - - @Override - public long getMaxPower() { - return this.maxPower; - } - @Override public FluidTank[] getReceivingTanks() { return new FluidTank[] { tanks[0], tanks[1], tanks[2] }; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 3041a8a9b..508e4d3a0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -24,7 +24,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; @@ -44,7 +44,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineLargeTurbine extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { +public class TileEntityMachineLargeTurbine extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyProviderMK2, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 100000000; @@ -92,7 +92,7 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme fillFluidInit(tanks[1].getTankType()); ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - this.sendPower(worldObj, xCoord + dir.offsetX * -4, yCoord, zCoord + dir.offsetZ * -4, dir.getOpposite()); + this.tryProvide(worldObj, xCoord + dir.offsetX * -4, yCoord, zCoord + dir.offsetZ * -4, dir.getOpposite()); for(DirPos pos : getConPos()) this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); for(DirPos pos : getConPos()) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index fd4e39243..018855a6b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -31,7 +31,7 @@ import com.hbm.util.InventoryUtil; import api.hbm.block.IDrillInteraction; import api.hbm.block.IMiningDrill; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardSender; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -54,7 +54,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineMiningLaser extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IMiningDrill, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineMiningLaser extends TileEntityMachineBase implements IEnergyReceiverMK2, IFluidSource, IMiningDrill, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider { public long power; public int age = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java index d4d8c40cc..34e2b1498 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMixer.java @@ -21,7 +21,7 @@ import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -34,7 +34,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineMixer extends TileEntityMachineBase implements INBTPacketReceiver, IControlReceiver, IGUIProvider, IEnergyUser, IFluidStandardTransceiver, IUpgradeInfoProvider { +public class TileEntityMachineMixer extends TileEntityMachineBase implements INBTPacketReceiver, IControlReceiver, IGUIProvider, IEnergyReceiverMK2, IFluidStandardTransceiver, IUpgradeInfoProvider { public long power; public static final long maxPower = 10_000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java index 583aa45ee..175e11a68 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePlasmaHeater.java @@ -16,7 +16,7 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -29,7 +29,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase implements IFluidAcceptor, IEnergyUser, IFluidStandardReceiver, IGUIProvider { +public class TileEntityMachinePlasmaHeater extends TileEntityMachineBase implements IFluidAcceptor, IEnergyReceiverMK2, IFluidStandardReceiver, IGUIProvider { public long power; public static final long maxPower = 100000000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java index 25b22372d..288193818 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachinePumpElectric.java @@ -4,10 +4,10 @@ import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import net.minecraft.nbt.NBTTagCompound; -public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase implements IEnergyUser { +public class TileEntityMachinePumpElectric extends TileEntityMachinePumpBase implements IEnergyReceiverMK2 { public long power; public static final long maxPower = 10_000; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java index 255966614..56ab3442f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java @@ -11,7 +11,7 @@ import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.RTGUtil; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -26,7 +26,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISidedInventory, IEnergyGenerator, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISidedInventory, IEnergyProviderMK2, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; @@ -211,7 +211,7 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided if(!worldObj.isRemote) { for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); heat = RTGUtil.updateRTGs(slots, slot_io); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java index c3977ba78..825937515 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java @@ -14,7 +14,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.Tuple.Triplet; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,7 +30,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRadGen extends TileEntityMachineBase implements IEnergyGenerator, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineRadGen extends TileEntityMachineBase implements IEnergyProviderMK2, IGUIProvider, IInfoProviderEC { public int[] progress = new int[12]; public int[] maxProgress = new int[12]; @@ -60,7 +60,7 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE this.output = 0; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); - this.sendPower(worldObj, this.xCoord - dir.offsetX * 4, this.yCoord, this.zCoord - dir.offsetZ * 4, dir.getOpposite()); + this.tryProvide(worldObj, this.xCoord - dir.offsetX * 4, this.yCoord, this.zCoord - dir.offsetZ * 4, dir.getOpposite()); //check if reload necessary for any queues for(int i = 0; i < 12; i++) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java index b53f86839..e4f255b8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadarNT.java @@ -32,7 +32,7 @@ import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import com.hbm.world.WorldUtil; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.entity.IRadarDetectable; import api.hbm.entity.IRadarDetectableNT; import api.hbm.entity.IRadarDetectableNT.RadarScanParams; @@ -60,7 +60,7 @@ import net.minecraft.world.WorldServer; * Now with SmЯt™ lag-free entity detection! (patent pending) * @author hbm */ -public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IConfigurableMachine, IControlReceiver { +public class TileEntityMachineRadarNT extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, IConfigurableMachine, IControlReceiver { public boolean scanMissiles = true; public boolean scanShells = true; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index cc5210787..612cdabfd 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -24,7 +24,7 @@ import com.hbm.util.RTGUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -39,7 +39,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRadiolysis extends TileEntityMachineBase implements IEnergyGenerator, IFluidAcceptor, IFluidSource, IFluidContainer, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineRadiolysis extends TileEntityMachineBase implements IEnergyProviderMK2, IFluidAcceptor, IFluidSource, IFluidContainer, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { public long power; public static final int maxPower = 1000000; @@ -144,7 +144,7 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement } for(DirPos pos : getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); if(tanks[1].getFill() > 0) this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); if(tanks[2].getFill() > 0) this.sendFluid(tanks[2], worldObj, pos.getX(), pos.getY(),pos.getZ(), pos.getDir()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java index 9e1a58aa7..f659905d0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java @@ -5,12 +5,12 @@ import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IInfoProviderEC; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; -public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { +public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnergyProviderMK2, IInfoProviderEC { public long power; public static final long maxPower = 100000; @@ -22,11 +22,11 @@ public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnerg if(!worldObj.isRemote) { - this.sendPower(worldObj, xCoord + 1, yCoord, zCoord, Library.POS_X); - this.sendPower(worldObj, xCoord - 1, yCoord, zCoord, Library.NEG_X); - this.sendPower(worldObj, xCoord, yCoord, zCoord + 1, Library.POS_Z); - this.sendPower(worldObj, xCoord, yCoord, zCoord - 1, Library.NEG_Z); - this.sendPower(worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); + this.tryProvide(worldObj, xCoord + 1, yCoord, zCoord, Library.POS_X); + this.tryProvide(worldObj, xCoord - 1, yCoord, zCoord, Library.NEG_X); + this.tryProvide(worldObj, xCoord, yCoord, zCoord + 1, Library.POS_Z); + this.tryProvide(worldObj, xCoord, yCoord, zCoord - 1, Library.NEG_Z); + this.tryProvide(worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); if(worldObj.getTotalWorldTime() % 20 == 0) gen = checkStructure() * 15; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java index 638971d73..8693ef3c2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSchrabidiumTransmutator.java @@ -12,8 +12,8 @@ import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -24,7 +24,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineBase implements IEnergyUser, IGUIProvider { +public class TileEntityMachineSchrabidiumTransmutator extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider { public long power = 0; public int process = 0; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java index f31be1e46..6a30be6fe 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSeleniumEngine.java @@ -1,47 +1,17 @@ package com.hbm.tileentity.machine; -import java.io.IOException; -import java.util.HashMap; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; -import com.google.gson.stream.JsonWriter; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidContainer; import com.hbm.inventory.FluidContainerRegistry; -import com.hbm.inventory.container.ContainerMachineSelenium; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.inventory.fluid.trait.FT_Combustible; -import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; -import com.hbm.inventory.gui.GUIMachineSelenium; -import com.hbm.items.ModItems; -import com.hbm.lib.Library; -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.AuxGaugePacket; -import com.hbm.packet.PacketDispatcher; -import com.hbm.tileentity.IConfigurableMachine; -import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyGenerator; import api.hbm.energymk2.IBatteryItem; -import api.hbm.fluid.IFluidStandardReceiver; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.client.gui.GuiScreen; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implements ISidedInventory, IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IConfigurableMachine, IGUIProvider { +public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implements ISidedInventory { private ItemStack slots[]; @@ -51,27 +21,11 @@ public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implem public FluidTank tank; public int pistonCount = 0; - public static long maxPower = 250000; - public static int fluidCap = 16000; - public static double pistonExp = 1.0D; - public static boolean shutUp = false; - public static HashMap fuelEfficiency = new HashMap(); - static { - fuelEfficiency.put(FuelGrade.LOW, 0.75D); - fuelEfficiency.put(FuelGrade.MEDIUM, 0.5D); - fuelEfficiency.put(FuelGrade.HIGH, 0.25D); - fuelEfficiency.put(FuelGrade.AERO, 0.00D); - } - - private static final int[] slots_top = new int[] { 0 }; - private static final int[] slots_bottom = new int[] { 1, 2 }; - private static final int[] slots_side = new int[] { 2 }; private String customName; public TileEntityMachineSeleniumEngine() { slots = new ItemStack[14]; - tank = new FluidTank(Fluids.DIESEL, fluidCap, 0); } @Override @@ -211,225 +165,16 @@ public class TileEntityMachineSeleniumEngine extends TileEntityLoadedBase implem @Override public int[] getAccessibleSlotsFromSide(int p_94128_1_) { - return p_94128_1_ == 0 ? slots_bottom : (p_94128_1_ == 1 ? slots_top : slots_side); + return new int[0]; } @Override - public boolean canInsertItem(int i, ItemStack itemStack, int j) { - return this.isItemValidForSlot(i, itemStack); - } - - @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - if (i == 1) - if (itemStack.getItem() == ModItems.canister_empty || itemStack.getItem() == ModItems.tank_steel) - return true; - if (i == 2) - if (itemStack.getItem() instanceof IBatteryItem && ((IBatteryItem)itemStack.getItem()).getCharge(itemStack) == ((IBatteryItem)itemStack.getItem()).getMaxCharge()) - return true; - + public boolean canInsertItem(int p_102007_1_, ItemStack p_102007_2_, int p_102007_3_) { return false; } - public long getPowerScaled(long i) { - return (power * i) / powerCap; - } - @Override - public void updateEntity() { - - if (!worldObj.isRemote) { - - this.subscribeToAllAround(tank.getTankType(), this); - this.sendPower(worldObj, xCoord, yCoord - 1, zCoord, ForgeDirection.DOWN); - - pistonCount = countPistons(); - - //Tank Management - tank.setType(11, 12, slots); - tank.loadTank(9, 10, slots); - tank.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId); - - FluidType type = tank.getTankType(); - if(type == Fluids.NITAN) - powerCap = maxPower * 10; - else - powerCap = maxPower; - - // Battery Item - power = Library.chargeItemsFromTE(slots, 13, power, powerCap); - - if(this.pistonCount > 2) - generate(); - - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, pistonCount, 0), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); - PacketDispatcher.wrapper.sendToAllAround(new AuxGaugePacket(xCoord, yCoord, zCoord, (int)powerCap, 1), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 50)); - } - } - - public int countPistons() { - int count = 0; - - for(int i = 0; i < 9; i++) { - if(slots[i] != null && slots[i].getItem() == ModItems.piston_selenium) - count++; - } - - return count; - } - - public boolean hasAcceptableFuel() { - return getHEFromFuel() > 0; - } - - public long getHEFromFuel() { - return getHEFromFuel(tank.getTankType()); - } - - public static long getHEFromFuel(FluidType type) { - - if(type.hasTrait(FT_Combustible.class)) { - FT_Combustible fuel = type.getTrait(FT_Combustible.class); - FuelGrade grade = fuel.getGrade(); - double efficiency = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0; - return (long) (fuel.getCombustionEnergy() / 1000L * efficiency); - } - - return 0; - } - - public void generate() { - if (hasAcceptableFuel()) { - if (tank.getFill() > 0) { - - if(!shutUp) { - if (soundCycle == 0) { - this.worldObj.playSoundEffect(this.xCoord, this.yCoord, this.zCoord, "fireworks.blast", this.getVolume(1.0F), 0.5F); - } - soundCycle++; - - if (soundCycle >= 3) - soundCycle = 0; - } - - tank.setFill(tank.getFill() - this.pistonCount); - if(tank.getFill() < 0) - tank.setFill(0); - - power += getHEFromFuel() * Math.pow(this.pistonCount, pistonExp); - - if(power > powerCap) - power = powerCap; - } - } - } - - @Override - public long getPower() { - return power; - } - - @Override - public long getMaxPower() { - return maxPower; - } - - @Override - public void setPower(long i) { - this.power = i; - } - - @Override - public void setFillForSync(int fill, int index) { - tank.setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - tank.setTankType(type); - } - - @Override - public int getMaxFluidFill(FluidType type) { - return type == this.tank.getTankType() ? tank.getMaxFill() : 0; - } - - @Override - public int getFluidFill(FluidType type) { - return type == this.tank.getTankType() ? tank.getFill() : 0; - } - - @Override - public void setFluidFill(int i, FluidType type) { - if(type == tank.getTankType()) - tank.setFill(i); - } - - @Override - public boolean canConnect(ForgeDirection dir) { - return dir == ForgeDirection.DOWN; - } - - @Override - public String getConfigName() { - return "radialengine"; - } - - @Override - public void readIfPresent(JsonObject obj) { - maxPower = IConfigurableMachine.grab(obj, "L:powerCap", maxPower); - fluidCap = IConfigurableMachine.grab(obj, "I:fuelCap", fluidCap); - pistonExp = IConfigurableMachine.grab(obj, "D:pistonGenExponent", pistonExp); - - if(obj.has("D[:efficiency")) { - JsonArray array = obj.get("D[:efficiency").getAsJsonArray(); - for(FuelGrade grade : FuelGrade.values()) { - fuelEfficiency.put(grade, array.get(grade.ordinal()).getAsDouble()); - } - } - - shutUp = IConfigurableMachine.grab(obj, "B:shutUp", shutUp); - } - - @Override - public void writeConfig(JsonWriter writer) throws IOException { - writer.name("L:powerCap").value(maxPower); - writer.name("I:fuelCap").value(fluidCap); - writer.name("D:pistonGenExponent").value(pistonExp); - - String info = "Fuel grades in order: "; - for(FuelGrade grade : FuelGrade.values()) info += grade.name() + " "; - info = info.trim(); - writer.name("INFO").value(info); - - writer.name("D[:efficiency").beginArray().setIndent(""); - for(FuelGrade grade : FuelGrade.values()) { - double d = fuelEfficiency.containsKey(grade) ? fuelEfficiency.get(grade) : 0.0D; - writer.value(d); - } - writer.endArray().setIndent(" "); - writer.name("B:shutUp").value(shutUp); - } - - @Override - public FluidTank[] getAllTanks() { - return new FluidTank[] {tank}; - } - - @Override - public FluidTank[] getReceivingTanks() { - return new FluidTank[] {tank}; - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerMachineSelenium(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUIMachineSelenium(player.inventory, this); + public boolean canExtractItem(int p_102008_1_, ItemStack p_102008_2_, int p_102008_3_) { + return false; } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java index 82bb816ea..9ac85cf5c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredder.java @@ -10,8 +10,8 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -25,7 +25,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineShredder extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider { +public class TileEntityMachineShredder extends TileEntityLoadedBase implements ISidedInventory, IEnergyReceiverMK2, IGUIProvider { private ItemStack slots[]; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java index 9baaffd5f..0784cd130 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTeleporter.java @@ -6,7 +6,7 @@ import java.util.List; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyUser; +import api.hbm.energymk2.IEnergyReceiverMK2; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.relauncher.ReflectionHelper; import net.minecraft.entity.Entity; @@ -27,8 +27,9 @@ import net.minecraft.util.IntHashMap; import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyUser, INBTPacketReceiver { +public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements IEnergyReceiverMK2, INBTPacketReceiver { public long power = 0; public int targetX = -1; @@ -42,7 +43,7 @@ public class TileEntityMachineTeleporter extends TileEntityLoadedBase implements public void updateEntity() { if(!this.worldObj.isRemote) { - this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); if(this.targetY != -1) { List entities = this.worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(this.xCoord + 0.25, this.yCoord, this.zCoord + 0.25, this.xCoord + 0.75, this.yCoord + 2, this.zCoord + 0.75)); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 867a09d8b..9221bcb5d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -16,8 +16,8 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; @@ -39,7 +39,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineTurbine extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { +public class TileEntityMachineTurbine extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IEnergyProviderMK2, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { private ItemStack slots[]; @@ -239,7 +239,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS this.subscribeToAllAround(tanks[0].getTankType(), this); for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); tanks[0].setType(0, 1, slots); tanks[0].loadTank(2, 3, slots); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 6e784e6e7..28895add2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -21,7 +21,7 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; @@ -41,7 +41,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineTurbineGas extends TileEntityMachineBase implements IFluidStandardTransceiver, IEnergyGenerator, IControlReceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { +public class TileEntityMachineTurbineGas extends TileEntityMachineBase implements IFluidStandardTransceiver, IEnergyProviderMK2, IControlReceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 1000000L; @@ -136,7 +136,7 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement //do net/battery deductions first... power = Library.chargeItemsFromTE(slots, 0, power, maxPower); - this.sendPower(worldObj, xCoord - dir.offsetZ * 5, yCoord + 1, zCoord + dir.offsetX * 5, rot); //sends out power + this.tryProvide(worldObj, xCoord - dir.offsetZ * 5, yCoord + 1, zCoord + dir.offsetX * 5, rot); //sends out power //...and then cap it. Prevents potential future cases where power would be limited due to the fuel being too strong and the buffer too small. if(this.power > this.maxPower) diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java index a1b83fb45..d5155190d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbofan.java @@ -32,7 +32,7 @@ import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; @@ -51,7 +51,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { +public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implements IEnergyProviderMK2, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 1_000_000; @@ -182,7 +182,7 @@ public class TileEntityMachineTurbofan extends TileEntityMachinePolluting implem power = Library.chargeItemsFromTE(slots, 3, power, power); for(DirPos pos : getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(this.blood.getFill() > 0) this.sendFluid(blood, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendSmoke(pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java index 6f4bb62dc..72306abf9 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java @@ -19,7 +19,7 @@ import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardReceiver; import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; @@ -33,7 +33,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineWoodBurner extends TileEntityMachineBase implements IFluidStandardReceiver, IControlReceiver, IEnergyGenerator, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineWoodBurner extends TileEntityMachineBase implements IFluidStandardReceiver, IControlReceiver, IEnergyProviderMK2, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 100_000; @@ -73,7 +73,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement this.power = Library.chargeItemsFromTE(slots, 5, power, maxPower); for(DirPos pos : getConPos()) { - if(power > 0) this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(power > 0) this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); if(worldObj.getTotalWorldTime() % 20 == 0) this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java index a04e4d5f9..781adaa14 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMicrowave.java @@ -23,6 +23,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) public class TileEntityMicrowave extends TileEntityMachineBase implements IEnergyReceiverMK2, IGUIProvider, SimpleComponent { @@ -48,8 +49,8 @@ public class TileEntityMicrowave extends TileEntityMachineBase implements IEnerg public void updateEntity() { if(!worldObj.isRemote) { - - this.updateStandardConnections(worldObj, xCoord, yCoord, zCoord); + + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); this.power = Library.chargeTEFromItems(slots, 2, power, maxPower); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java index 3c0f29220..a09c5747e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySteamEngine.java @@ -1,26 +1,20 @@ package com.hbm.tileentity.machine; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; import com.google.gson.JsonObject; import com.google.gson.stream.JsonWriter; import com.hbm.blocks.BlockDummyable; -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; import com.hbm.inventory.fluid.trait.FT_Coolable; import com.hbm.inventory.fluid.trait.FT_Coolable.CoolingType; -import com.hbm.lib.Library; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.fluid.IFluidStandardTransceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -30,14 +24,13 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntitySteamEngine extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { +public class TileEntitySteamEngine extends TileEntityLoadedBase implements IEnergyProviderMK2, IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine { public long powerBuffer; public float rotor; public float lastRotor; private float syncRotor; - public List list2 = new ArrayList(); public FluidTank[] tanks; private int turnProgress; @@ -51,8 +44,8 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IFlui public TileEntitySteamEngine() { tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.STEAM, steamCap, 0); - tanks[1] = new FluidTank(Fluids.SPENTSTEAM, ldsCap, 1); + tanks[0] = new FluidTank(Fluids.STEAM, steamCap); + tanks[1] = new FluidTank(Fluids.SPENTSTEAM, ldsCap); } @Override @@ -117,12 +110,10 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IFlui tanks[1].writeToNBT(data, "w"); for(DirPos pos : getConPos()) { - if(this.powerBuffer > 0) - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + if(this.powerBuffer > 0) this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.trySubscribe(tanks[0].getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); this.sendFluid(tanks[1], worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - if(tanks[1].getFill() > 0) fillFluidInit(tanks[1].getTankType()); INBTPacketReceiver.networkPack(this, data, 150); } else { @@ -168,69 +159,6 @@ public class TileEntitySteamEngine extends TileEntityLoadedBase implements IFlui tanks[0].writeToNBT(nbt, "s"); tanks[1].writeToNBT(nbt, "w"); } - - @Override - public void fillFluidInit(FluidType type) { - for(DirPos pos : getConPos()) fillFluid(pos.getX(), pos.getY(), pos.getZ(), getTact(), type); - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - public boolean getTact() { - return worldObj.getTotalWorldTime() % 2 == 0; - } - - @Override - public void setFluidFill(int i, FluidType type) { - if(type == tanks[0].getTankType()) - tanks[0].setFill(i); - else if(type == tanks[1].getTankType()) - tanks[1].setFill(i); - } - - @Override - public int getFluidFill(FluidType type) { - if(type == tanks[0].getTankType()) - return tanks[0].getFill(); - else if(type == tanks[1].getTankType()) - return tanks[1].getFill(); - - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - if(type == tanks[0].getTankType()) - return tanks[0].getMaxFill(); - - return 0; - } - - @Override - public void setFillForSync(int fill, int index) { - if(index < 2 && tanks[index] != null) - tanks[index].setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - if(index < 2 && tanks[index] != null) - tanks[index].setTankType(type); - } - - @Override - public List getFluidList(FluidType type) { - return list2; - } - - @Override - public void clearFluidList(FluidType type) { - list2.clear(); - } @Override public AxisAlignedBB getRenderBoundingBox() { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index fc2560845..610ba487d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -13,7 +13,7 @@ import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import api.hbm.tile.IHeatSource; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -22,7 +22,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityStirling extends TileEntityLoadedBase implements INBTPacketReceiver, IEnergyGenerator, IConfigurableMachine { +public class TileEntityStirling extends TileEntityLoadedBase implements INBTPacketReceiver, IEnergyProviderMK2, IConfigurableMachine { public long powerBuffer; public int heat; @@ -95,7 +95,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack if(hasCog) { for(DirPos pos : getConPos()) { - this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); + this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } this.powerBuffer = 0; } else { 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 261de2700..ac39e371a 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -1,7 +1,7 @@ package com.hbm.tileentity.machine.storage; -import api.hbm.energy.*; import api.hbm.energymk2.IBatteryItem; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.machine.MachineBattery; From c16818c15db3eb75467bb9b1f5e9cc4d92e1f691 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 11 Apr 2024 16:08:04 +0200 Subject: [PATCH 25/48] i can hear satan's voice, he's telling me to invest in apple. what does this mean? why does he want me to buy apples?? --- .../java/api/hbm/energymk2/Nodespace.java | 20 ++------- .../java/api/hbm/energymk2/PowerNetMK2.java | 7 ++++ .../blocks/machine/MachineSeleniumEngine.java | 20 +-------- .../hbm/blocks/network/BlockCableGauge.java | 25 +++++------ .../java/com/hbm/packet/AuxButtonPacket.java | 2 + .../network/TileEntityCableBaseNT.java | 15 +++++-- .../network/TileEntityCableSwitch.java | 21 ++++------ .../network/TileEntityConverterHeRf.java | 42 +++++-------------- .../network/TileEntityConverterRfHe.java | 6 +-- 9 files changed, 54 insertions(+), 104 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index 48afb9b56..ea5b6543f 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -56,19 +56,6 @@ public class Nodespace { checkNodeConnection(world, node); node.recentlyChanged = false; } - - /*if(node.hasValidNet()) { - - for(BlockPos pos : node.positions) { - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "marker"); - data.setInteger("color", node.net.hashCode() % 0xffffff); - data.setInteger("expires", 250); - data.setDouble("dist", 50D); - data.setString("label", "" + node.net.links.size()); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX(), pos.getY(), pos.getZ()), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), 50)); - } - }*/ } } @@ -76,10 +63,9 @@ public class Nodespace { } private static void updatePowerNets() { - - for(PowerNetMK2 net : activePowerNets) { - net.transferPower(); - } + + for(PowerNetMK2 net : activePowerNets) net.resetEnergyTracker(); //reset has to be done before everything else + for(PowerNetMK2 net : activePowerNets) net.transferPower(); } /** Goes over each connection point of the given node, tries to find neighbor nodes and to join networks with them */ diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index c509d1cef..2b2a5e24b 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -19,6 +19,8 @@ public class PowerNetMK2 { public HashMap receiverEntries = new HashMap(); public HashMap providerEntries = new HashMap(); + public long energyTracker = 0L; + public PowerNetMK2() { Nodespace.activePowerNets.add(this); } @@ -104,6 +106,10 @@ public class PowerNetMK2 { this.providerEntries.clear(); } + public void resetEnergyTracker() { + this.energyTracker = 0; + } + public void transferPower() { int timeout = 3_000; @@ -167,6 +173,7 @@ public class PowerNetMK2 { prevDest += finalTransfer; toTransfer -= finalTransfer; + this.energyTracker += finalTransfer; } } diff --git a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java index d1d598932..933514087 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java +++ b/src/main/java/com/hbm/blocks/machine/MachineSeleniumEngine.java @@ -1,10 +1,7 @@ package com.hbm.blocks.machine; -import java.util.List; import java.util.Random; -import com.hbm.blocks.ITooltipProvider; -import com.hbm.inventory.fluid.trait.FT_Combustible.FuelGrade; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; @@ -18,11 +15,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class MachineSeleniumEngine extends BlockContainer implements ITooltipProvider { +public class MachineSeleniumEngine extends BlockContainer { private final Random field_149933_a = new Random(); private static boolean keepInventory; @@ -127,18 +123,4 @@ public class MachineSeleniumEngine extends BlockContainer implements ITooltipPro return false; } } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { - - list.add(EnumChatFormatting.YELLOW + "Fuel efficiency:"); - for(FuelGrade grade : FuelGrade.values()) { - Double efficiency = TileEntityMachineSeleniumEngine.fuelEfficiency.get(grade); - - if(efficiency != null) { - int eff = (int) (efficiency * 100); - list.add(EnumChatFormatting.YELLOW + "-" + grade.getGrade() + ": " + EnumChatFormatting.RED + "" + eff + "%"); - } - } - } } diff --git a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java index 54921d0c7..980bdfb32 100644 --- a/src/main/java/com/hbm/blocks/network/BlockCableGauge.java +++ b/src/main/java/com/hbm/blocks/network/BlockCableGauge.java @@ -1,6 +1,5 @@ package com.hbm.blocks.network; -import java.math.BigInteger; import java.util.ArrayList; import java.util.List; @@ -14,6 +13,7 @@ import com.hbm.tileentity.network.TileEntityCableBaseNT; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; +import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.BlockContainer; @@ -100,7 +100,6 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, public static class TileEntityCableGauge extends TileEntityCableBaseNT implements INBTPacketReceiver { - private BigInteger lastMeasurement = BigInteger.valueOf(10); private long deltaTick = 0; private long deltaSecond = 0; private long deltaLastSecond = 0; @@ -111,20 +110,16 @@ public class BlockCableGauge extends BlockContainer implements IBlockMultiPass, if(!worldObj.isRemote) { - if(network != null) { - BigInteger total = network.getTotalTransfer(); - BigInteger delta = total.subtract(this.lastMeasurement); - this.lastMeasurement = total; + if(this.node != null && this.node.net != null) { - try { - this.deltaTick = delta.longValueExact(); - if(worldObj.getTotalWorldTime() % 20 == 0) { - this.deltaLastSecond = this.deltaSecond; - this.deltaSecond = 0; - } - this.deltaSecond += deltaTick; - - } catch(Exception ex) { } + PowerNetMK2 net = this.node.net; + + this.deltaTick = net.energyTracker; + if(worldObj.getTotalWorldTime() % 20 == 0) { + this.deltaLastSecond = this.deltaSecond; + this.deltaSecond = 0; + } + this.deltaSecond += deltaTick; } NBTTagCompound data = new NBTTagCompound(); diff --git a/src/main/java/com/hbm/packet/AuxButtonPacket.java b/src/main/java/com/hbm/packet/AuxButtonPacket.java index e2965706e..c80dfd5ef 100644 --- a/src/main/java/com/hbm/packet/AuxButtonPacket.java +++ b/src/main/java/com/hbm/packet/AuxButtonPacket.java @@ -15,6 +15,7 @@ import com.hbm.tileentity.machine.TileEntitySoyuzLauncher; import com.hbm.tileentity.machine.storage.TileEntityBarrel; import com.hbm.tileentity.machine.storage.TileEntityMachineBattery; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; @@ -67,6 +68,7 @@ public class AuxButtonPacket implements IMessage { public static class Handler implements IMessageHandler { + @SuppressWarnings("incomplete-switch") @Override public IMessage onMessage(AuxButtonPacket m, MessageContext ctx) { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java index 1953880ba..8afaeb73c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableBaseNT.java @@ -16,16 +16,23 @@ public class TileEntityCableBaseNT extends TileEntity implements IEnergyConducto if(!worldObj.isRemote) { if(this.node == null || this.node.expired) { - this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); - if(this.node == null || this.node.expired) { - this.node = this.createNode(); - Nodespace.createNode(worldObj, this.node); + if(this.shouldCreateNode()) { + this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + Nodespace.createNode(worldObj, this.node); + } } } } } + public boolean shouldCreateNode() { + return true; + } + public void onNodeDestroyedCallback() { this.node = null; } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java index e8a80f871..0f7adcda1 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.network; -import api.hbm.energy.PowerNet; +import api.hbm.energymk2.Nodespace; public class TileEntityCableSwitch extends TileEntityCableBaseNT { @@ -13,21 +13,14 @@ public class TileEntityCableSwitch extends TileEntityCableBaseNT { //if the meta is 0 (OFF) and there is a net present, destroy and de-reference it. //that should be all, since the state being 0 also prevents the TE from updating and joining the new net. - if(this.getBlockMetadata() == 0 && this.network != null) { - this.network.reevaluate(); - this.network = null; - } - - if(this.getBlockMetadata() == 1) { - this.connect(); - - if(this.getPowerNet() == null) { - new PowerNet().joinLink(this); - } + if(this.getBlockMetadata() == 0 && this.node != null) { + Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); + this.node = null; } } - public boolean canReevaluate() { - return super.canReevaluate() && this.getBlockMetadata() == 1; + @Override + public boolean shouldCreateNode() { + return this.getBlockMetadata() == 1; } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java index 941f83c1c..325e31ee1 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterHeRf.java @@ -3,13 +3,13 @@ package com.hbm.tileentity.network; import com.hbm.calc.Location; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyConnector; +import api.hbm.energymk2.IEnergyReceiverMK2; import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyReceiver; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEnergyConnector, IEnergyHandler { +public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEnergyReceiverMK2, IEnergyHandler { //Thanks to the great people of Fusion Warfare for helping me with the original implementation of the RF energy API @@ -22,30 +22,13 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn } } - @Override - public boolean canConnectEnergy(ForgeDirection from) { - return true; - } - - @Override - public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { - return 0; - } - - @Override - public int getEnergyStored(ForgeDirection from) { - return 0; - } - - @Override - public int getMaxEnergyStored(ForgeDirection from) { - return 0; - } - - @Override - public long getPower() { - return 0; - } + @Override public boolean canConnectEnergy(ForgeDirection from) { return true; } + @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { return 0; } + @Override public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { return 0; } + @Override public int getEnergyStored(ForgeDirection from) { return 0; } + @Override public int getMaxEnergyStored(ForgeDirection from) { return 0; } + @Override public long getPower() { return 0; } + @Override public void setPower(long power) { } @Override public long getMaxPower() { @@ -55,7 +38,7 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn private long lastTransfer = 0; @Override - public long getTransferWeight() { + public long getReceiverSpeed() { if(lastTransfer > 0) { return lastTransfer * 2; @@ -63,11 +46,6 @@ public class TileEntityConverterHeRf extends TileEntityLoadedBase implements IEn return getMaxPower(); } } - - @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { - return 0; - } private boolean recursionBrake = false; diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java index 7346c5066..a41c62ce2 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConverterRfHe.java @@ -3,11 +3,11 @@ package com.hbm.tileentity.network; import com.hbm.interfaces.Untested; import com.hbm.tileentity.TileEntityLoadedBase; -import api.hbm.energy.IEnergyGenerator; +import api.hbm.energymk2.IEnergyProviderMK2; import cofh.api.energy.IEnergyHandler; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityConverterRfHe extends TileEntityLoadedBase implements IEnergyGenerator, IEnergyHandler { +public class TileEntityConverterRfHe extends TileEntityLoadedBase implements IEnergyProviderMK2, IEnergyHandler { @Override public void setPower(long power) { @@ -48,7 +48,7 @@ public class TileEntityConverterRfHe extends TileEntityLoadedBase implements IEn subBuffer = capacity; for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } recursionBrake = false; From e5dffd3d2a570a4f1fec7fe701faa79fa29f4d51 Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 11 Apr 2024 21:58:47 +0200 Subject: [PATCH 26/48] NEITHER SNOW NOR RAIN NOR THE GLOOM OF NIGHT --- .../java/api/hbm/energymk2/Nodespace.java | 29 ++++++-- .../java/api/hbm/energymk2/PowerNetMK2.java | 4 + .../com/hbm/blocks/network/CableDiode.java | 39 +++++----- .../hbm/inventory/gui/GUIMachineSelenium.java | 45 ----------- .../com/hbm/items/tool/ItemPowerNetTool.java | 74 +++++++------------ .../hbm/render/tileentity/RenderSelenium.java | 3 - .../network/TileEntityConnector.java | 37 +++------- .../tileentity/network/TileEntityPylon.java | 28 ++++--- .../network/TileEntityPylonBase.java | 49 +++++------- .../network/TileEntitySubstation.java | 50 +++++-------- 10 files changed, 138 insertions(+), 220 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/Nodespace.java b/src/main/java/api/hbm/energymk2/Nodespace.java index ea5b6543f..3f0888859 100644 --- a/src/main/java/api/hbm/energymk2/Nodespace.java +++ b/src/main/java/api/hbm/energymk2/Nodespace.java @@ -79,13 +79,8 @@ public class Nodespace { if(conNode.hasValidNet() && conNode.net == node.net) continue; // if the net is valid and both nodes have the same net, skip - for(DirPos revCon : conNode.connections) { // check if neighbor node also has a valid reverse connection - - // god i hope i didn't fuck this up my brain is hurting already - if(revCon.getX() - revCon.getDir().offsetX == con.getX() && revCon.getY() - revCon.getDir().offsetY == con.getY() && revCon.getZ() - revCon.getDir().offsetZ == con.getZ() && revCon.getDir() == con.getDir().getOpposite()) { - connectToNode(node, conNode); - break; - } + if(checkConnection(conNode, con, false)) { + connectToNode(node, conNode); } } } @@ -93,6 +88,18 @@ public class Nodespace { if(node.net == null || !node.net.isValid()) new PowerNetMK2().joinLink(node); } + public static boolean checkConnection(PowerNode connectsTo, DirPos connectFrom, boolean skipSideCheck) { + + for(DirPos revCon : connectsTo.connections) { + + if(revCon.getX() - revCon.getDir().offsetX == connectFrom.getX() && revCon.getY() - revCon.getDir().offsetY == connectFrom.getY() && revCon.getZ() - revCon.getDir().offsetZ == connectFrom.getZ() && (revCon.getDir() == connectFrom.getDir().getOpposite() || skipSideCheck)) { + return true; + } + } + + return false; + } + /** Links two nodes with different or potentially no networks */ private static void connectToNode(PowerNode origin, PowerNode connection) { @@ -166,6 +173,14 @@ public class Nodespace { return this; } + public PowerNode addConnection(DirPos connection) { + DirPos[] newCons = new DirPos[this.connections.length + 1]; + for(int i = 0; i < this.connections.length; i++) newCons[i] = this.connections[i]; + newCons[newCons.length - 1] = connection; + this.connections = newCons; + return this; + } + public boolean hasValidNet() { return this.net != null && this.net.isValid(); } diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 2b2a5e24b..5f9f509be 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -177,6 +177,10 @@ public class PowerNetMK2 { } } + public long sendPowerDiode(long power) { + return power; + } + public static final ReceiverComparator COMP = new ReceiverComparator(); public static class ReceiverComparator implements Comparator { diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index 3cdbb238e..ad16ef673 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -8,9 +8,14 @@ import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; import com.hbm.util.I18nUtil; +import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.block.IToolable; import api.hbm.energymk2.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -136,7 +141,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return new TileEntityDiode(); } - public static class TileEntityDiode extends TileEntityLoadedBase implements IEnergyUser { + public static class TileEntityDiode extends TileEntityLoadedBase implements IEnergyReceiverMK2 { @Override public void readFromNBT(NBTTagCompound nbt) { @@ -189,9 +194,9 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return dir != getDir(); } + /** Used as an intra-tick tracker for how much energy has been transmitted, resets to 0 each tick and maxes out based on transfer */ + private long power; private boolean recursionBrake = false; - private long subBuffer; - private long contingent = 0; private long lastTransfer = 0; private int pulses = 0; public ConnectionPriority priority = ConnectionPriority.NORMAL; @@ -206,31 +211,25 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, if(lastTransfer != worldObj.getTotalWorldTime()) { lastTransfer = worldObj.getTotalWorldTime(); - contingent = getMaxPower(); pulses = 0; + this.setPower(0); //tick is over, reset our allowed transfe } - if(contingent <= 0 || pulses > 10) - return power; - - //this part turns "maxPower" from a glorified transfer weight into an actual transfer cap - long overShoot = Math.max(0, power - contingent); - power = Math.min(power, contingent); + if(this.getPower() >= this.getMaxPower() || pulses > 10) return power; //if we have already maxed out transfer or max pulses, abort recursionBrake = true; - this.subBuffer = power; ForgeDirection dir = getDir(); - this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); - long ret = this.subBuffer; + PowerNode node = Nodespace.getNode(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - long sent = power - ret; - contingent -= sent; + if(node.hasValidNet() && Nodespace.checkConnection(node, new DirPos(xCoord, yCoord, zCoord, dir), false)) { + long prevPower = power; + power = node.net.sendPowerDiode(power); + this.power += (prevPower - power); + } - this.subBuffer = 0; recursionBrake = false; - - return ret + overShoot; + return power; } @@ -241,12 +240,12 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, @Override public long getPower() { - return subBuffer; + return Math.min(power, this.getMaxPower()); } @Override public void setPower(long power) { - this.subBuffer = power; + this.power = power; } @Override diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java index 9c34f199d..5c436c06e 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineSelenium.java @@ -1,20 +1,14 @@ package com.hbm.inventory.gui; -import java.util.ArrayList; -import java.util.List; import org.lwjgl.opengl.GL11; import com.hbm.inventory.container.ContainerMachineSelenium; -import com.hbm.inventory.fluid.FluidType; -import com.hbm.inventory.fluid.Fluids; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.TileEntityMachineSeleniumEngine; -import com.hbm.util.BobMathUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.ResourceLocation; public class GUIMachineSelenium extends GuiInfoContainer { @@ -36,22 +30,6 @@ public class GUIMachineSelenium extends GuiInfoContainer { selenium.tank.renderTankInfo(this, mouseX, mouseY, guiLeft + 116, guiTop + 18, 16, 52); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 108, 160, 16, selenium.power, selenium.powerCap); - - List text = new ArrayList(); - text.add(EnumChatFormatting.YELLOW + "Accepted Fuels:"); - - for(FluidType type : Fluids.getInNiceOrder()) { - long energy = selenium.getHEFromFuel(type); - - if(energy > 0) - text.add(" " + type.getLocalizedName() + " (" + BobMathUtil.getShortNumber(energy) + "HE/t)"); - } - - text.add(EnumChatFormatting.ITALIC + "(These numbers are base values,"); - text.add(EnumChatFormatting.ITALIC + "actual output is based"); - text.add(EnumChatFormatting.ITALIC + "on piston count)"); - - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text.toArray(new String[0])); String[] text1 = new String[] { "Fuel consumption rate:", " 1 mB/t", @@ -65,13 +43,6 @@ public class GUIMachineSelenium extends GuiInfoContainer { "required to operate this radial engine!" }; this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 32, 16, 16, guiLeft - 8, guiTop + 36 + 16 + 32, text2); } - - if(!selenium.hasAcceptableFuel()) { - - String[] text2 = new String[] { "Error: The currently set fuel type", - "is not supported by this engine!" }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 48, 16, 16, guiLeft - 8, guiTop + 36 + 16 + 32, text2); - } } @Override @@ -88,19 +59,6 @@ public class GUIMachineSelenium extends GuiInfoContainer { Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - if(selenium.power > 0) { - int i = (int)selenium.getPowerScaled(160); - - i = (int) Math.min(i, 160); - - drawTexturedModalRect(guiLeft + 8, guiTop + 108, 0, 222, i, 16); - } - - if(selenium.tank.getFill() > 0 && selenium.hasAcceptableFuel() && selenium.pistonCount > 2) - { - drawTexturedModalRect(guiLeft + 115, guiTop + 71, 192, 0, 18, 18); - } - if(selenium.pistonCount > 0) { int k = selenium.pistonCount; @@ -110,9 +68,6 @@ public class GUIMachineSelenium extends GuiInfoContainer { if(selenium.pistonCount < 3) this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 32, 16, 16, 6); - if(!selenium.hasAcceptableFuel()) - this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 48, 16, 16, 7); - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); diff --git a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java index 10b0d2d20..a5907f3f5 100644 --- a/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java +++ b/src/main/java/com/hbm/items/tool/ItemPowerNetTool.java @@ -6,11 +6,12 @@ import com.hbm.blocks.BlockDummyable; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.util.ChatBuilder; +import com.hbm.util.fauxpointtwelve.BlockPos; -import api.hbm.energy.IEnergyConductor; -import api.hbm.energy.IEnergyConnector; -import api.hbm.energy.IPowerNet; -import api.hbm.energy.PowerNet; +import api.hbm.energymk2.IEnergyConductorMK2; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; +import api.hbm.energymk2.PowerNetMK2; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -19,7 +20,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; -import net.minecraft.util.Vec3; import net.minecraft.world.World; public class ItemPowerNetTool extends Item { @@ -44,51 +44,33 @@ public class ItemPowerNetTool extends Item { if(world.isRemote) return true; - if((te instanceof IEnergyConductor)) { + if((te instanceof IEnergyConductorMK2)) { + PowerNode node = Nodespace.getNode(world, x, y, z); - IEnergyConductor con = (IEnergyConductor) te; - IPowerNet net = con.getPowerNet(); - - if(net == null) { - player.addChatComponentMessage(ChatBuilder.start("Error: No network found! This should be impossible!").color(EnumChatFormatting.RED).flush()); - return true; - } - - if(!(net instanceof PowerNet)) { - player.addChatComponentMessage(ChatBuilder.start("Error: Cannot print diagnostic for non-standard power net implementation!").color(EnumChatFormatting.RED).flush()); - } - - PowerNet network = (PowerNet) net; - String id = Integer.toHexString(net.hashCode()); - - player.addChatComponentMessage(ChatBuilder.start("Start of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); - player.addChatComponentMessage(ChatBuilder.start("Links: " + network.getLinks().size()).color(EnumChatFormatting.YELLOW).flush()); - player.addChatComponentMessage(ChatBuilder.start("Proxies: " + network.getProxies().size()).color(EnumChatFormatting.YELLOW).flush()); - player.addChatComponentMessage(ChatBuilder.start("Subscribers: " + network.getSubscribers().size()).color(EnumChatFormatting.YELLOW).flush()); - player.addChatComponentMessage(ChatBuilder.start("End of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); - - for(IEnergyConductor link : network.getLinks()) { - Vec3 pos = link.getDebugParticlePos(); + if(node != null && node.hasValidNet()) { - boolean errored = link.getPowerNet() != net; + PowerNetMK2 net = node.net; + String id = Integer.toHexString(net.hashCode()); + player.addChatComponentMessage(ChatBuilder.start("Start of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); + player.addChatComponentMessage(ChatBuilder.start("Links: " + net.links.size()).color(EnumChatFormatting.YELLOW).flush()); + player.addChatComponentMessage(ChatBuilder.start("Providers: " + net.providerEntries.size()).color(EnumChatFormatting.YELLOW).flush()); + player.addChatComponentMessage(ChatBuilder.start("Receivers: " + net.receiverEntries.size()).color(EnumChatFormatting.YELLOW).flush()); + player.addChatComponentMessage(ChatBuilder.start("End of diagnostic for network " + id).color(EnumChatFormatting.GOLD).flush()); - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "debug"); - data.setInteger("color", errored ? 0xff0000 : 0xffff00); - data.setFloat("scale", 0.5F); - data.setString("text", id); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord, pos.yCoord, pos.zCoord), new TargetPoint(world.provider.dimensionId, pos.xCoord, pos.yCoord, pos.zCoord, radius)); - } - - for(IEnergyConnector subscriber : network.getSubscribers()) { - Vec3 pos = subscriber.getDebugParticlePos(); + for(PowerNode link : net.links) { + + for(BlockPos pos : link.positions) { + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "debug"); + data.setInteger("color", 0xffff00); + data.setFloat("scale", 0.5F); + data.setString("text", id); + PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5), new TargetPoint(world.provider.dimensionId, pos.getX(), pos.getY(), pos.getZ(), radius)); + } + } - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "debug"); - data.setInteger("color", 0x0000ff); - data.setFloat("scale", 1.5F); - data.setString("text", id); - PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, pos.xCoord, pos.yCoord, pos.zCoord), new TargetPoint(world.provider.dimensionId, pos.xCoord, pos.yCoord, pos.zCoord, radius)); + } else { + player.addChatComponentMessage(ChatBuilder.start("Error: No network found!").color(EnumChatFormatting.RED).flush()); } return true; diff --git a/src/main/java/com/hbm/render/tileentity/RenderSelenium.java b/src/main/java/com/hbm/render/tileentity/RenderSelenium.java index 8ee84a595..53362572b 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSelenium.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSelenium.java @@ -46,9 +46,6 @@ public class RenderSelenium extends TileEntitySpecialRenderer { ResourceManager.selenium_piston.renderAll(); GL11.glRotatef(rot, 0, 0, 1); } - - if(count > 2 && ((TileEntityMachineSeleniumEngine)tileEntity).hasAcceptableFuel() && ((TileEntityMachineSeleniumEngine)tileEntity).tank.getFill() > 0) - GL11.glRotatef((System.currentTimeMillis() / 2) % 360, 0F, 0F, -1F); bindTexture(ResourceManager.selenium_rotor_tex); ResourceManager.selenium_rotor.renderAll(); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java b/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java index dc20b8f8d..5c84cb609 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java @@ -1,9 +1,9 @@ package com.hbm.tileentity.network; -import java.util.ArrayList; -import java.util.List; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyConductor; +import api.hbm.energymk2.Nodespace.PowerNode; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; @@ -24,33 +24,14 @@ public class TileEntityConnector extends TileEntityPylonBase { public double getMaxWireLength() { return 10; } - + @Override - public List getConnectionPoints() { - List pos = new ArrayList(connected); - + public PowerNode createNode() { + TileEntity tile = (TileEntity) this; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); - //pos.add(new int[] {xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ}); - - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - if(te instanceof IEnergyConductor) { - - IEnergyConductor conductor = (IEnergyConductor) te; - - if(conductor.canConnect(dir.getOpposite())) { - - if(this.getPowerNet() == null && conductor.getPowerNet() != null) { - conductor.getPowerNet().joinLink(this); - } - - if(this.getPowerNet() != null && conductor.getPowerNet() != null && this.getPowerNet() != conductor.getPowerNet()) { - conductor.getPowerNet().joinNetworks(this.getPowerNet()); - } - } - } - - return pos; + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections(new DirPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir)); + for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); + return node; } @Override diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java index 3dde2245e..655800077 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java @@ -1,8 +1,11 @@ package com.hbm.tileentity.network; -import java.util.ArrayList; -import java.util.List; +import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; +import api.hbm.energymk2.Nodespace.PowerNode; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraftforge.common.util.ForgeDirection; @@ -22,14 +25,19 @@ public class TileEntityPylon extends TileEntityPylonBase { public double getMaxWireLength() { return 25D; } - + @Override - public List getConnectionPoints() { - List pos = new ArrayList(connected); - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - pos.add(new int[] {xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ}); - } - return pos; + public PowerNode createNode() { + TileEntity tile = (TileEntity) this; + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), + new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X), + new DirPos(xCoord, yCoord + 1, zCoord, Library.POS_Y), + new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y), + new DirPos(xCoord, yCoord, zCoord + 1, Library.POS_Z), + new DirPos(xCoord, yCoord, zCoord - 1, Library.NEG_Z) + ); + for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); + return node; } } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java index 09e335094..76e560e33 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java @@ -3,7 +3,11 @@ package com.hbm.tileentity.network; import java.util.ArrayList; import java.util.List; -import api.hbm.energy.IEnergyConductor; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; @@ -14,6 +18,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.Vec3; import net.minecraft.world.WorldServer; +import net.minecraftforge.common.util.ForgeDirection; public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { @@ -40,15 +45,22 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { return len >= delta.lengthVector() ? 0 : 3; } + + @Override + public PowerNode createNode() { + TileEntity tile = (TileEntity) this; + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)); + for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); + return node; + } public void addConnection(int x, int y, int z) { connected.add(new int[] {x, y, z}); - if(this.getPowerNet() != null) { - this.getPowerNet().reevaluate(); - this.network = null; - } + PowerNode node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); + node.recentlyChanged = true; + node.addConnection(new DirPos(x, y, z, ForgeDirection.UNKNOWN)); this.markDirty(); @@ -87,33 +99,8 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { } } } - } - - @Override - protected void connect() { - for(int[] pos : getConnectionPoints()) { - - TileEntity te = worldObj.getTileEntity(pos[0], pos[1], pos[2]); - - if(te instanceof IEnergyConductor) { - - IEnergyConductor conductor = (IEnergyConductor) te; - - if(this.getPowerNet() == null && conductor.getPowerNet() != null) { - conductor.getPowerNet().joinLink(this); - } - - if(this.getPowerNet() != null && conductor.getPowerNet() != null && this.getPowerNet() != conductor.getPowerNet()) { - conductor.getPowerNet().joinNetworks(this.getPowerNet()); - } - } - } - } - - @Override - public List getConnectionPoints() { - return new ArrayList(connected); + Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); } public abstract ConnectionType getConnectionType(); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java b/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java index 6f4235e38..a0b414a43 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java @@ -1,12 +1,14 @@ package com.hbm.tileentity.network; -import java.util.ArrayList; -import java.util.List; - import com.hbm.blocks.BlockDummyable; +import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyConductor; +import api.hbm.energymk2.Nodespace.PowerNode; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; public class TileEntitySubstation extends TileEntityPylonBase { @@ -45,33 +47,21 @@ public class TileEntitySubstation extends TileEntityPylonBase { public double getMaxWireLength() { return 20; } - - @Override - public List getConnectionPoints() { - List pos = new ArrayList(connected); - pos.add(new int[] {xCoord + 2, yCoord, zCoord - 1}); - pos.add(new int[] {xCoord + 2, yCoord, zCoord + 1}); - pos.add(new int[] {xCoord - 2, yCoord, zCoord - 1}); - pos.add(new int[] {xCoord - 2, yCoord, zCoord + 1}); - pos.add(new int[] {xCoord - 1, yCoord, zCoord + 2}); - pos.add(new int[] {xCoord + 1, yCoord, zCoord + 2}); - pos.add(new int[] {xCoord - 1, yCoord, zCoord - 2}); - pos.add(new int[] {xCoord + 1, yCoord, zCoord - 2}); - return pos; - } @Override - public boolean hasProxies() { - return true; - } - - @Override - public List getProxies() { - List proxies = new ArrayList(); - proxies.add(IEnergyConductor.getIdentityFromPos(xCoord + 1, yCoord, zCoord + 1)); - proxies.add(IEnergyConductor.getIdentityFromPos(xCoord + 1, yCoord, zCoord - 1)); - proxies.add(IEnergyConductor.getIdentityFromPos(xCoord - 1, yCoord, zCoord + 1)); - proxies.add(IEnergyConductor.getIdentityFromPos(xCoord - 1, yCoord, zCoord - 1)); - return proxies; + public PowerNode createNode() { + TileEntity tile = (TileEntity) this; + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), + new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), + new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), + new DirPos(xCoord - 2, yCoord, zCoord + 1, Library.NEG_X), + new DirPos(xCoord - 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord + 1, yCoord, zCoord + 2, Library.POS_Z), + new DirPos(xCoord - 1, yCoord, zCoord - 2, Library.NEG_Z), + new DirPos(xCoord + 1, yCoord, zCoord - 2, Library.NEG_Z) + ); + for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); + return node; } } From 9c7a96d86743f3d8174edd030baf6e2baa67d11b Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 12 Apr 2024 09:42:23 +0200 Subject: [PATCH 27/48] CRUSHIN' CRUSHIN' (the second) --- .../api/hbm/energymk2/IEnergyProviderMK2.java | 26 +- .../storage/TileEntityMachineBattery.java | 243 ++++-------------- .../storage/TileEntityMachineFENSU.java | 104 +++----- 3 files changed, 99 insertions(+), 274 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java index 1b7f5fe45..6464995a0 100644 --- a/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java +++ b/src/main/java/api/hbm/energymk2/IEnergyProviderMK2.java @@ -29,17 +29,27 @@ public interface IEnergyProviderMK2 extends IEnergyHandlerMK2 { if(te instanceof IEnergyConductorMK2) { IEnergyConductorMK2 con = (IEnergyConductorMK2) te; - if(!con.canConnect(dir.getOpposite())) return; - - PowerNode node = Nodespace.getNode(world, x, y, z); - - if(node != null && node.net != null) { - node.net.addProvider(this); - red = true; + if(con.canConnect(dir.getOpposite())) { + + PowerNode node = Nodespace.getNode(world, x, y, z); + + if(node != null && node.net != null) { + node.net.addProvider(this); + red = true; + } } } - //TODO: direct transfer + if(te instanceof IEnergyReceiverMK2 && te != this) { + IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; + if(rec.canConnect(dir.getOpposite())) { + long provides = Math.min(this.getPower(), this.getProviderSpeed()); + long receives = Math.min(rec.getMaxPower() - rec.getPower(), rec.getReceiverSpeed()); + long toTransfer = Math.min(provides, receives); + toTransfer -= rec.transferPower(toTransfer); + this.usePower(toTransfer); + } + } if(particleDebug) { NBTTagCompound data = new NBTTagCompound(); 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 ac39e371a..d1fb7d597 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -1,11 +1,14 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energymk2.IBatteryItem; -import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; +import api.hbm.energymk2.IEnergyConductorMK2; +import api.hbm.energymk2.IEnergyProviderMK2; +import api.hbm.energymk2.IEnergyReceiverMK2; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; import api.hbm.tile.IInfoProviderEC; import com.hbm.blocks.machine.MachineBattery; -import com.hbm.config.GeneralConfig; import com.hbm.inventory.container.ContainerMachineBattery; import com.hbm.inventory.gui.GUIMachineBattery; import com.hbm.lib.Library; @@ -26,24 +29,19 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent, IGUIProvider, IInfoProviderEC { +public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyConductorMK2, IEnergyProviderMK2, IEnergyReceiverMK2, IPersistentNBT, SimpleComponent, IGUIProvider, IInfoProviderEC { public long[] log = new long[20]; public long delta = 0; public long power = 0; public long prevPowerState = 0; - public int pingPongTicks = 0; + + protected PowerNode node; //0: input only //1: buffer @@ -96,8 +94,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I switch(i) { case 0: case 1: - if(stack.getItem() instanceof IBatteryItem) - return true; + if(stack.getItem() instanceof IBatteryItem) return true; break; } @@ -166,19 +163,39 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { + int mode = this.getRelevantMode(); + + if(this.node == null || this.node.expired) { + + this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + Nodespace.createNode(worldObj, this.node); + } + } + long prevPower = this.power; power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - ////////////////////////////////////////////////////////////////////// - this.transmitPowerFairly(); - ////////////////////////////////////////////////////////////////////// + if(mode == mode_output || mode == mode_buffer) { + for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.tryProvide(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); + } else { + if(node != null && node.hasValidNet()) node.net.removeProvider(this); + } byte comp = this.getComparatorPower(); if(comp != this.lastRedstone) this.markDirty(); this.lastRedstone = comp; + if(mode == mode_input || mode == mode_buffer) { + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(node != null && node.hasValidNet()) node.net.removeReceiver(this); + } + power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); long avg = (power + prevPower) / 2; @@ -188,19 +205,6 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I this.log[i - 1] = this.log[i]; } - if(GeneralConfig.enable528) { - long threshold = this.getMaxPower() / 3; - if(Math.abs(prevPower - power) > threshold && Math.abs(prevPower - prevPowerState) > threshold) { - this.pingPongTicks++; - if(this.pingPongTicks > 10) { - worldObj.func_147480_a(xCoord, yCoord, zCoord, false); - worldObj.newExplosion(null, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, 10F, false, false); - } - } else { - if(this.pingPongTicks > 0) this.pingPongTicks--; - } - } - this.log[19] = avg; prevPowerState = power; @@ -215,116 +219,23 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } } - protected void transmitPowerFairly() { - - short mode = (short) this.getRelevantMode(); - - //HasSets to we don'T have any duplicates - Set nets = new HashSet(); - Set consumers = new HashSet(); - - //iterate over all sides - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - //if it's a cable, buffer both the network and all subscribers of the net - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - if(con.canConnect(dir.getOpposite()) && con.getPowerNet() != null) { - nets.add(con.getPowerNet()); - con.getPowerNet().unsubscribe(this); - consumers.addAll(con.getPowerNet().getSubscribers()); - } - - //if it's just a consumer, buffer it as a subscriber - } else if(te instanceof IEnergyConnector) { - IEnergyConnector con = (IEnergyConnector) te; - if(con.canConnect(dir.getOpposite())) { - consumers.add((IEnergyConnector) te); - } - } - } + public void onNodeDestroyedCallback() { + this.node = null; + } - //send power to buffered consumers, independent of nets - if(this.power > 0 && (mode == mode_buffer || mode == mode_output)) { - List con = new ArrayList(); - con.addAll(consumers); - - if(PowerNet.trackingInstances == null) { - PowerNet.trackingInstances = new ArrayList(); - } - PowerNet.trackingInstances.clear(); - - nets.forEach(x -> { - if(x instanceof PowerNet) PowerNet.trackingInstances.add((PowerNet) x); - }); - - long toSend = Math.min(this.power, this.getMaxTransfer()); - long powerRemaining = this.power - toSend; - this.power = PowerNet.fairTransfer(con, toSend) + powerRemaining; - } + @Override + public void invalidate() { + super.invalidate(); - //resubscribe to buffered nets, if necessary - if(mode == mode_buffer || mode == mode_input) { - nets.forEach(x -> x.subscribe(this)); - } - } - - @Deprecated protected void transmitPower() { - - short mode = (short) this.getRelevantMode(); - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - // first we make sure we're not subscribed to the network that we'll be supplying - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null && con.getPowerNet().isSubscribed(this)) - con.getPowerNet().unsubscribe(this); - } - - //then we add energy - if(mode == mode_buffer || mode == mode_output) { - if(te instanceof IEnergyConnector) { - IEnergyConnector con = (IEnergyConnector) te; - - long max = getMaxTransfer(); - long toTransfer = Math.min(max, this.power); - long remainder = this.power - toTransfer; - this.power = toTransfer; - - long oldPower = this.power; - long transfer = this.power - con.transferPower(this.power); - this.power = oldPower - transfer; - - power += remainder; - } - } - - //then we subscribe if possible - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - - if(con.getPowerNet() != null) { - if(mode == mode_output || mode == mode_none) { - if(con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().unsubscribe(this); - } - } else if(!con.getPowerNet().isSubscribed(this)) { - con.getPowerNet().subscribe(this); - } - } + if(!worldObj.isRemote) { + if(this.node != null) { + Nodespace.destroyNode(worldObj, xCoord, yCoord, zCoord); } } } - - public long getMaxTransfer() { - return this.getMaxPower() / 20; - } + + @Override public long getProviderSpeed() { return this.getMaxPower() / 20; } + @Override public long getReceiverSpeed() { return this.getMaxPower() / 20; } @Override public void networkUnpack(NBTTagCompound nbt) { @@ -343,12 +254,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } public short getRelevantMode() { - - if(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)) { - return this.redHigh; - } else { - return this.redLow; - } + return worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) ? this.redHigh : this.redLow; } private long bufferedMax; @@ -362,63 +268,10 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I return bufferedMax; } - - /* - * SATAN - TECH - */ - @Override - public long transferPower(long power) { - - long overshoot = 0; - - // if power exceeds our transfer limit, truncate - if(power > getMaxTransfer()) { - overshoot += power - getMaxTransfer(); - power = getMaxTransfer(); - } - - // this check is in essence the same as the default implementation, but re-arranged to never overflow the int64 range - // if the remaining power exceeds the power cap, truncate again - long freespace = this.getMaxPower() - this.getPower(); - - if(freespace < power) { - overshoot += power - freespace; - power = freespace; - } - - // what remains is sure to not exceed the transfer limit and the power cap (and therefore the int64 range) - this.setPower(this.getPower() + power); - this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this); - - return overshoot; - } - - @Override - public long getTransferWeight() { - int mode = this.getRelevantMode(); - - if(mode == mode_output || mode == mode_none) { - return 0; - } - - return Math.min(Math.max(getMaxPower() - getPower(), 0), this.getMaxTransfer()); - } - - @Override - public boolean canConnect(ForgeDirection dir) { - return true; - } - - @Override - public void setPower(long power) { - this.power = power; - } - - @Override - public ConnectionPriority getPriority() { - return this.priority; - } + @Override public boolean canConnect(ForgeDirection dir) { return true; } + @Override public void setPower(long power) { this.power = power; } + @Override public ConnectionPriority getPriority() { return this.priority; } // 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 3ece44aca..138b12693 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -1,16 +1,11 @@ package com.hbm.tileentity.machine.storage; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import com.hbm.lib.Library; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; -import api.hbm.energy.IEnergyConductor; -import api.hbm.energy.IEnergyConnector; -import api.hbm.energy.IPowerNet; -import api.hbm.energy.PowerNet; +import api.hbm.energymk2.Nodespace; +import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; @@ -24,25 +19,48 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public float rotation = 0F; public static final long maxTransfer = 10_000_000_000_000_000L; + + @Override public long getProviderSpeed() { return maxTransfer; } + @Override public long getReceiverSpeed() { return maxTransfer; } @Override public void updateEntity() { if(!worldObj.isRemote) { + + int mode = this.getRelevantMode(); + + if(this.node == null || this.node.expired) { + + this.node = Nodespace.getNode(worldObj, xCoord, yCoord, zCoord); + + if(this.node == null || this.node.expired) { + this.node = this.createNode(); + Nodespace.createNode(worldObj, this.node); + } + } long prevPower = this.power; power = Library.chargeItemsFromTE(slots, 1, power, getMaxPower()); - ////////////////////////////////////////////////////////////////////// - this.transmitPowerFairly(); - ////////////////////////////////////////////////////////////////////// + if(mode == mode_output || mode == mode_buffer) { + this.tryProvide(worldObj, xCoord, yCoord - 1, zCoord, ForgeDirection.DOWN); + } else { + if(node != null && node.hasValidNet()) node.net.removeProvider(this); + } byte comp = this.getComparatorPower(); if(comp != this.lastRedstone) this.markDirty(); this.lastRedstone = comp; + if(mode == mode_input || mode == mode_buffer) { + if(node != null && node.hasValidNet()) node.net.addReceiver(this); + } else { + if(node != null && node.hasValidNet()) node.net.removeReceiver(this); + } + power = Library.chargeTEFromItems(slots, 0, power, getMaxPower()); long avg = (power / 2 + prevPower / 2); @@ -73,61 +91,10 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { } } } - - @Deprecated protected void transmitPower() { - - short mode = (short) this.getRelevantMode(); - - //HasSets to we don'T have any duplicates - Set nets = new HashSet(); - Set consumers = new HashSet(); - - //iterate over all sides - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) { - - TileEntity te = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - - //if it's a cable, buffer both the network and all subscribers of the net - if(te instanceof IEnergyConductor) { - IEnergyConductor con = (IEnergyConductor) te; - if(con.canConnect(dir.getOpposite()) && con.getPowerNet() != null) { - nets.add(con.getPowerNet()); - con.getPowerNet().unsubscribe(this); - consumers.addAll(con.getPowerNet().getSubscribers()); - } - - //if it's just a consumer, buffer it as a subscriber - } else if(te instanceof IEnergyConnector) { - IEnergyConnector con = (IEnergyConnector) te; - if(con.canConnect(dir.getOpposite())) { - consumers.add((IEnergyConnector) te); - } - } - } - //send power to buffered consumers, independent of nets - if(this.power > 0 && (mode == mode_buffer || mode == mode_output)) { - List con = new ArrayList(); - con.addAll(consumers); - - if(PowerNet.trackingInstances == null) { - PowerNet.trackingInstances = new ArrayList(); - } - PowerNet.trackingInstances.clear(); - - nets.forEach(x -> { - if(x instanceof PowerNet) PowerNet.trackingInstances.add((PowerNet) x); - }); - - long toSend = Math.min(this.power, maxTransfer); - long powerRemaining = this.power - toSend; - this.power = PowerNet.fairTransfer(con, toSend) + powerRemaining; - } - - //resubscribe to buffered nets, if necessary - if(mode == mode_buffer || mode == mode_input) { - nets.forEach(x -> x.subscribe(this)); - } + @Override + public PowerNode createNode() { + return new PowerNode(new BlockPos(xCoord, yCoord, zCoord)).setConnections(new DirPos(xCoord, yCoord - 1, zCoord, Library.NEG_Y)); } @Override @@ -140,11 +107,6 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public long getMaxPower() { return Long.MAX_VALUE; } - - @Override - public long getMaxTransfer() { - return maxTransfer; - } public float getSpeed() { return (float) Math.pow(Math.log(power * 0.75 + 1) * 0.05F, 5); From be3147c80db342388c5f5ee0e759b762ada3c672 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 12 Apr 2024 13:45:42 +0200 Subject: [PATCH 28/48] We must construct additional pylons!! --- .../java/api/hbm/energymk2/PowerNetMK2.java | 27 +++++++++++----- .../hbm/blocks/machine/MachineCapacitor.java | 32 ++++++++++++++----- .../network/TileEntityConnector.java | 4 ++- .../tileentity/network/TileEntityPylon.java | 1 + .../network/TileEntityPylonBase.java | 3 +- .../network/TileEntitySubstation.java | 1 + 6 files changed, 50 insertions(+), 18 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 5f9f509be..eedacae92 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Map.Entry; @@ -123,14 +124,20 @@ public class PowerNetMK2 { long supply = 0; long demand = 0; - for(Entry entry : providerEntries.entrySet()) { - IEnergyProviderMK2 provider = entry.getKey(); - if(provider.isLoaded() && timestamp - entry.getValue() < timeout) supply += Math.min(provider.getPower(), provider.getProviderSpeed()); + Iterator> provIt = providerEntries.entrySet().iterator(); + while(provIt.hasNext()) { + Entry entry = provIt.next(); + if(timestamp - entry.getValue() > timeout) provIt.remove(); + supply += Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed()); } - for(Entry entry : receiverEntries.entrySet()) { - IEnergyReceiverMK2 receiver = entry.getKey(); - if(receiver.isLoaded() && timestamp - entry.getValue() < timeout) demand += Math.min(receiver.getMaxPower() - receiver.getPower(), receiver.getReceiverSpeed()); + if(supply <= 0) return; + + Iterator> recIt = receiverEntries.entrySet().iterator(); + while(recIt.hasNext()) { + Entry entry = recIt.next(); + if(timestamp - entry.getValue() > timeout) recIt.remove(); + demand += Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); } double drainScale = 1D; @@ -158,9 +165,13 @@ public class PowerNetMK2 { IEnergyProviderMK2 src = providers.get(0); IEnergyReceiverMK2 dest = receivers.get(0); + + long receiverShare = Math.min((long) ((double) (dest.getMaxPower() - dest.getPower()) * (double) supply / (double) demand), dest.getReceiverSpeed()) - prevDest; + long providerShare = Math.min((long) ((double) src.getPower() * (double) demand / (double) supply), src.getProviderSpeed()) - prevSrc; + + long toDrain = Math.min((long) (src.getPower() * drainScale), providerShare); + long toFill = Math.min(dest.getMaxPower() - dest.getPower(), receiverShare); - long toDrain = Math.min((long) (src.getPower() * drainScale) + prevSrc, src.getProviderSpeed()) - prevSrc; - long toFill = Math.min(dest.getMaxPower() - dest.getPower() + prevDest, dest.getReceiverSpeed()) - prevDest; long finalTransfer = Math.min(toDrain, toFill); if(toDrain <= 0) { providers.remove(0); prevSrc = 0; continue; } diff --git a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java index ae94aa6d1..5abb1e502 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCapacitor.java @@ -150,7 +150,6 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP public long power; protected long maxPower; - public long prevPower; public long powerReceived; public long powerSent; @@ -165,8 +164,6 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP if(!worldObj.isRemote) { - long gain = power - prevPower; - ForgeDirection opp = ForgeDirection.getOrientation(this.getBlockMetadata()); ForgeDirection dir = opp.getOpposite(); @@ -188,26 +185,45 @@ public class MachineCapacitor extends BlockContainer implements ILookOverlay, IP pos = pos.offset(current); } - long preSend = power; if(pos != null && last != null) { this.tryUnsubscribe(worldObj, pos.getX(), pos.getY(), pos.getZ()); this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), last); } - long sent = preSend - power; this.trySubscribe(worldObj, xCoord + opp.offsetX, yCoord+ opp.offsetY, zCoord + opp.offsetZ, opp); NBTTagCompound data = new NBTTagCompound(); data.setLong("power", power); data.setLong("maxPower", maxPower); - data.setLong("rec", gain); - data.setLong("sent", sent); + data.setLong("rec", powerReceived); + data.setLong("sent", powerSent); INBTPacketReceiver.networkPack(this, data, 15); - this.prevPower = power; + this.powerSent = 0; + this.powerReceived = 0; } } + @Override + public long transferPower(long power) { + if(power + this.getPower() <= this.getMaxPower()) { + this.setPower(power + this.getPower()); + this.powerReceived += power; + return 0; + } + long capacity = this.getMaxPower() - this.getPower(); + long overshoot = power - capacity; + this.powerReceived += (this.getMaxPower() - this.getPower()); + this.setPower(this.getMaxPower()); + return overshoot; + } + + @Override + public void usePower(long power) { + this.powerSent += Math.min(this.getPower(), power); + this.setPower(this.getPower() - power); + } + @Override public void networkUnpack(NBTTagCompound nbt) { this.power = nbt.getLong("power"); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java b/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java index 5c84cb609..baa262982 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityConnector.java @@ -29,7 +29,9 @@ public class TileEntityConnector extends TileEntityPylonBase { public PowerNode createNode() { TileEntity tile = (TileEntity) this; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata()).getOpposite(); - PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections(new DirPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir)); + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN), + new DirPos(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir)); for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); return node; } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java index 655800077..03646593c 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylon.java @@ -30,6 +30,7 @@ public class TileEntityPylon extends TileEntityPylonBase { public PowerNode createNode() { TileEntity tile = (TileEntity) this; PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN), new DirPos(xCoord + 1, yCoord, zCoord, Library.POS_X), new DirPos(xCoord - 1, yCoord, zCoord, Library.NEG_X), new DirPos(xCoord, yCoord + 1, zCoord, Library.POS_Y), diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java index 76e560e33..49da2622f 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java @@ -49,7 +49,7 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { @Override public PowerNode createNode() { TileEntity tile = (TileEntity) this; - PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)); + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections(new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN)); for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); return node; } @@ -81,6 +81,7 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { if(te instanceof TileEntityPylonBase) { TileEntityPylonBase pylon = (TileEntityPylonBase) te; + Nodespace.destroyNode(worldObj, pos[0], pos[1], pos[2]); for(int i = 0; i < pylon.connected.size(); i++) { int[] conPos = pylon.connected.get(i); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java b/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java index a0b414a43..33d6291c8 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntitySubstation.java @@ -52,6 +52,7 @@ public class TileEntitySubstation extends TileEntityPylonBase { public PowerNode createNode() { TileEntity tile = (TileEntity) this; PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections( + new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN), new DirPos(xCoord + 2, yCoord, zCoord - 1, Library.POS_X), new DirPos(xCoord + 2, yCoord, zCoord + 1, Library.POS_X), new DirPos(xCoord - 2, yCoord, zCoord - 1, Library.NEG_X), From 8442ee4940fff4e740a1f6f653ef691eea0ce11d Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 13 Apr 2024 19:51:59 +0200 Subject: [PATCH 29/48] i hope i step on a landmine --- .../java/api/hbm/energymk2/PowerNetMK2.java | 66 ++++++++++++++----- .../com/hbm/blocks/network/CableDiode.java | 41 ++++++++---- .../network/TileEntityCableSwitch.java | 2 +- 3 files changed, 78 insertions(+), 31 deletions(-) diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index eedacae92..467d3bbb5 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.Set; import java.util.Map.Entry; +import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; import api.hbm.energymk2.Nodespace.PowerNode; public class PowerNetMK2 { @@ -111,10 +112,10 @@ public class PowerNetMK2 { this.energyTracker = 0; } + protected static int timeout = 3_000; + public void transferPower() { - int timeout = 3_000; - if(providerEntries.isEmpty()) return; if(receiverEntries.isEmpty()) return; @@ -123,11 +124,12 @@ public class PowerNetMK2 { long supply = 0; long demand = 0; + long[] priorityDemand = new long[ConnectionPriority.values().length]; Iterator> provIt = providerEntries.entrySet().iterator(); while(provIt.hasNext()) { Entry entry = provIt.next(); - if(timestamp - entry.getValue() > timeout) provIt.remove(); + if(timestamp - entry.getValue() > timeout) { provIt.remove(); continue; } supply += Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed()); } @@ -136,15 +138,13 @@ public class PowerNetMK2 { Iterator> recIt = receiverEntries.entrySet().iterator(); while(recIt.hasNext()) { Entry entry = recIt.next(); - if(timestamp - entry.getValue() > timeout) recIt.remove(); - demand += Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); + if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } + long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); + demand += rec; + for(int i = 0; i <= entry.getKey().getPriority().ordinal(); i++) priorityDemand[i] += rec; } - double drainScale = 1D; - - if(supply > demand) { - drainScale = (double) demand / (double) supply; - } + if(demand <= 0) return; long toTransfer = Math.min(supply, demand); if(toTransfer > transferCap) toTransfer = transferCap; @@ -165,16 +165,18 @@ public class PowerNetMK2 { IEnergyProviderMK2 src = providers.get(0); IEnergyReceiverMK2 dest = receivers.get(0); - - long receiverShare = Math.min((long) ((double) (dest.getMaxPower() - dest.getPower()) * (double) supply / (double) demand), dest.getReceiverSpeed()) - prevDest; - long providerShare = Math.min((long) ((double) src.getPower() * (double) demand / (double) supply), src.getProviderSpeed()) - prevSrc; - long toDrain = Math.min((long) (src.getPower() * drainScale), providerShare); + long pd = priorityDemand[dest.getPriority().ordinal()]; + + long receiverShare = Math.min((long) Math.ceil((double) Math.min(dest.getMaxPower() - dest.getPower(), dest.getReceiverSpeed()) * (double) supply / (double) pd), dest.getReceiverSpeed()) - prevDest; + long providerShare = Math.min((long) Math.ceil((double) Math.min(src.getPower(), src.getProviderSpeed()) * (double) demand / (double) supply), src.getProviderSpeed()) - prevSrc; + + long toDrain = Math.min((long) (src.getPower()), providerShare); long toFill = Math.min(dest.getMaxPower() - dest.getPower(), receiverShare); long finalTransfer = Math.min(toDrain, toFill); - if(toDrain <= 0) { providers.remove(0); prevSrc = 0; continue; } + if(src.getPower() <= 0) { providers.remove(0); prevSrc = 0; continue; } if(toFill <= 0) { receivers.remove(0); prevDest = 0; continue; } finalTransfer -= dest.transferPower(finalTransfer); @@ -182,6 +184,9 @@ public class PowerNetMK2 { prevSrc += finalTransfer; prevDest += finalTransfer; + + if(prevSrc >= src.getProviderSpeed()) { providers.remove(0); prevSrc = 0; continue; } + if(prevDest >= dest.getReceiverSpeed()) { receivers.remove(0); prevDest = 0; continue; } toTransfer -= finalTransfer; this.energyTracker += finalTransfer; @@ -189,7 +194,36 @@ public class PowerNetMK2 { } public long sendPowerDiode(long power) { - return power; + + long timestamp = System.currentTimeMillis(); + long demand = 0; + long[] priorityDemand = new long[ConnectionPriority.values().length]; + + Iterator> recIt = receiverEntries.entrySet().iterator(); + while(recIt.hasNext()) { + Entry entry = recIt.next(); + if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } + long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); + demand += rec; + for(int i = 0; i <= entry.getKey().getPriority().ordinal(); i++) priorityDemand[i] += rec; + } + + if(demand <= 0) return power; + + long finalRemainder = power; + + for(IEnergyReceiverMK2 dest : receiverEntries.keySet()) { + long pd = priorityDemand[dest.getPriority().ordinal()]; + long toFill = Math.min((long) ((double) (Math.min(dest.getMaxPower() - dest.getPower(), dest.getReceiverSpeed())) * (double) power / (double) pd), dest.getReceiverSpeed()); + toFill = Math.min(toFill, power); + long remainder = dest.transferPower(toFill); + long transferred = toFill - remainder; + finalRemainder -= transferred; + this.energyTracker += transferred; + if(finalRemainder <= 0) break; + } + + return finalRemainder; } public static final ReceiverComparator COMP = new ReceiverComparator(); diff --git a/src/main/java/com/hbm/blocks/network/CableDiode.java b/src/main/java/com/hbm/blocks/network/CableDiode.java index ad16ef673..246094666 100644 --- a/src/main/java/com/hbm/blocks/network/CableDiode.java +++ b/src/main/java/com/hbm/blocks/network/CableDiode.java @@ -7,11 +7,12 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.blocks.ITooltipProvider; import com.hbm.tileentity.TileEntityLoadedBase; import com.hbm.util.BobMathUtil; +import com.hbm.util.Compat; import com.hbm.util.I18nUtil; -import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.block.IToolable; import api.hbm.energymk2.IEnergyConnectorBlock; +import api.hbm.energymk2.IEnergyConnectorMK2; import api.hbm.energymk2.IEnergyReceiverMK2; import api.hbm.energymk2.Nodespace; import api.hbm.energymk2.Nodespace.PowerNode; @@ -101,7 +102,7 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, if(tool == ToolType.DEFUSER) { int p = te.priority.ordinal() + 1; - if(p > 2) p = 0; + if(p > 4) p = 0; te.priority = ConnectionPriority.values()[p]; te.markDirty(); world.markBlockForUpdate(x, y, z); @@ -186,6 +187,9 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, this.trySubscribe(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } + + pulses = 0; + this.setPower(0); //tick is over, reset our allowed transfe } } @@ -197,7 +201,6 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, /** Used as an intra-tick tracker for how much energy has been transmitted, resets to 0 each tick and maxes out based on transfer */ private long power; private boolean recursionBrake = false; - private long lastTransfer = 0; private int pulses = 0; public ConnectionPriority priority = ConnectionPriority.NORMAL; @@ -208,30 +211,40 @@ public class CableDiode extends BlockContainer implements IEnergyConnectorBlock, return power; pulses++; - - if(lastTransfer != worldObj.getTotalWorldTime()) { - lastTransfer = worldObj.getTotalWorldTime(); - pulses = 0; - this.setPower(0); //tick is over, reset our allowed transfe - } - if(this.getPower() >= this.getMaxPower() || pulses > 10) return power; //if we have already maxed out transfer or max pulses, abort recursionBrake = true; ForgeDirection dir = getDir(); PowerNode node = Nodespace.getNode(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); + TileEntity te = Compat.getTileStandard(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ); - if(node.hasValidNet() && Nodespace.checkConnection(node, new DirPos(xCoord, yCoord, zCoord, dir), false)) { - long prevPower = power; - power = node.net.sendPowerDiode(power); - this.power += (prevPower - power); + if(node != null && !node.expired && node.hasValidNet() && te instanceof IEnergyConnectorMK2 && ((IEnergyConnectorMK2) te).canConnect(dir.getOpposite())) { + long toTransfer = Math.min(power, this.getReceiverSpeed()); + long remainder = node.net.sendPowerDiode(toTransfer); + long transferred = (toTransfer - remainder); + this.power += transferred; + power -= transferred; + + } else if(te instanceof IEnergyReceiverMK2 && te != this) { + IEnergyReceiverMK2 rec = (IEnergyReceiverMK2) te; + if(rec.canConnect(dir.getOpposite())) { + long toTransfer = Math.min(power, rec.getReceiverSpeed()); + long remainder = rec.transferPower(toTransfer); + power -= (toTransfer - remainder); + recursionBrake = false; + return power; + } } recursionBrake = false; return power; } + @Override + public long getReceiverSpeed() { + return this.getMaxPower() - this.getPower(); + } @Override public long getMaxPower() { diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java b/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java index 0f7adcda1..acdffcd99 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityCableSwitch.java @@ -6,7 +6,7 @@ public class TileEntityCableSwitch extends TileEntityCableBaseNT { @Override public boolean canUpdate() { - return this.worldObj != null && this.getBlockMetadata() == 1 && super.canUpdate(); + return super.canUpdate(); } public void updateState() { From e87984cc3940561d7483869fa6dae53c24ee886d Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Apr 2024 14:20:20 +0200 Subject: [PATCH 30/48] can we get this over with --- .../hbm/textures/models/network/pylon_medium.png | Bin 0 -> 957 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/models/network/pylon_medium.png diff --git a/src/main/resources/assets/hbm/textures/models/network/pylon_medium.png b/src/main/resources/assets/hbm/textures/models/network/pylon_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..415008e7018e26364f177dfe30ac26a4624b31c6 GIT binary patch literal 957 zcmV;u148_XP)Oz-}xh@HfFOKabKJ#q7Z$amC&iQzL&v$kbgF_Gm zcD%j5z8>noy}c!_e}8}9xMSwY(qkUn2Pz~T6_Sn$Nk@gGqe9ZD`Wm=bU$!eNHJ)Dl z$!BiYXj6FY6+LNLso&?&b!+;$!;K7PGkwN3xvTCIjL25T+VY87iOl}aV+!%QXff1fdiN~IF|YfOIkO)`(r<>jU6 zbUJo(Smk=X9>>SWxfx|HG%5;%!Qdf(ycPwA>d&vQ`1tJ!0QdLzyxduQ(D9-$E|v%0 ziUJTS40++LD7b|oFSIBm(Y9F27CnIHaJ)rs^EmK0+xE`qh{QZJrkFyFrgi6Vv|9#> zcuyhXG#kl4#3^TkAk=>6^aoDc?SK2rIhGACPuv;(p3`oan4C+Hfg(jHg$xu$D5VS( zL1+dUkS;W%3`iE5Lk6S@%_##Cg%*$ji9#+j$bfXA8D&7S&>S)#RcKBbkh*+u3&RY8 z@`TzgGqKib1eU{e>v(xW0Efm*M5)oV#l5gX^l27#jdGAH1anEr7J`|jct)5`sjj;t4^lR568Ms?^etwQah)S9Eu;__4PA2=8nG3VRzXj>6t(jAKly z976CQC3CjzGVPhB`)IJ;GUbWT5EYV6<~j7@ces6h5N@BJg`fYNx3WFHyrK|Q0Gx+# zar^2i=bfleX{0UNlrTanB%RU;WnL754~e_P-dBr!egA*%2d87(-%pNJx(KO|bW}(> zDkL2hl8y>VM}?%LLej~8J#-r1-#Ux`E=22WvEyrmvc^WNIsr^VB&Sij2&s^Ca?c?* zXM*c=`=!k(jZhNbza;E%kkG#%rHhaXNhkLz=T|_bP-Y^>8Ox&R7g51Bpnr!jtWUfg`|`DdMIhVauN5tJt??J_?&m?BBVmn fQ6cH5kaYe5YGV`60J!QC00000NkvXXu0mjf2kg4R literal 0 HcmV?d00001 From 0c111b159a072fbc3637756aa0b97b072a748448 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Apr 2024 14:22:40 +0200 Subject: [PATCH 31/48] DIE --- .../TileEntityMachineShredderLarge.java | 220 ------------------ 1 file changed, 220 deletions(-) delete mode 100644 src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java deleted file mode 100644 index b843ea365..000000000 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineShredderLarge.java +++ /dev/null @@ -1,220 +0,0 @@ -package com.hbm.tileentity.machine; - -import java.util.Random; - -import com.hbm.packet.AuxElectricityPacket; -import com.hbm.packet.PacketDispatcher; - -import api.hbm.energymk2.IBatteryItem; -import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.AxisAlignedBB; - -public class TileEntityMachineShredderLarge extends TileEntity implements ISidedInventory { - - private ItemStack slots[]; - - public long power; - public static final long maxPower = 100000; - public int progress; - public int maxProgress = 100; - - Random rand = new Random(); - - private String customName; - - public TileEntityMachineShredderLarge() { - slots = new ItemStack[31]; - } - - @Override - public int getSizeInventory() { - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i) { - return slots[i]; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) { - if(slots[i] != null) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } else { - return null; - } - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemStack) { - slots[i] = itemStack; - if(itemStack != null && itemStack.stackSize > getInventoryStackLimit()) - { - itemStack.stackSize = getInventoryStackLimit(); - } - } - - @Override - public String getInventoryName() { - return this.hasCustomInventoryName() ? this.customName : "container.assembler"; - } - - @Override - public boolean hasCustomInventoryName() { - return this.customName != null && this.customName.length() > 0; - } - - public void setCustomName(String name) { - this.customName = name; - } - - @Override - public int getInventoryStackLimit() { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player) { - if(worldObj.getTileEntity(xCoord, yCoord, zCoord) != this) - { - return false; - }else{ - return player.getDistanceSq(xCoord + 0.5D, yCoord + 0.5D, zCoord + 0.5D) <=128; - } - } - - //You scrubs aren't needed for anything (right now) - @Override - public void openInventory() {} - @Override - public void closeInventory() {} - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - if(i == 0) - if(itemStack.getItem() instanceof IBatteryItem) - return true; - - if(i == 1) - return true; - - return false; - } - - @Override - public ItemStack decrStackSize(int i, int j) { - if(slots[i] != null) - { - if(slots[i].stackSize <= j) - { - ItemStack itemStack = slots[i]; - slots[i] = null; - return itemStack; - } - ItemStack itemStack1 = slots[i].splitStack(j); - if (slots[i].stackSize == 0) - { - slots[i] = null; - } - - return itemStack1; - } else { - return null; - } - } - - @Override - public void readFromNBT(NBTTagCompound nbt) { - super.readFromNBT(nbt); - NBTTagList list = nbt.getTagList("items", 10); - - this.power = nbt.getLong("powerTime"); - slots = new ItemStack[getSizeInventory()]; - - for(int i = 0; i < list.tagCount(); i++) - { - NBTTagCompound nbt1 = list.getCompoundTagAt(i); - byte b0 = nbt1.getByte("slot"); - if(b0 >= 0 && b0 < slots.length) - { - slots[b0] = ItemStack.loadItemStackFromNBT(nbt1); - } - } - } - - @Override - public void writeToNBT(NBTTagCompound nbt) { - super.writeToNBT(nbt); - nbt.setLong("powerTime", power); - NBTTagList list = new NBTTagList(); - - for(int i = 0; i < slots.length; i++) - { - if(slots[i] != null) - { - NBTTagCompound nbt1 = new NBTTagCompound(); - nbt1.setByte("slot", (byte)i); - slots[i].writeToNBT(nbt1); - list.appendTag(nbt1); - } - } - nbt.setTag("items", list); - } - - @Override - public int[] getAccessibleSlotsFromSide(int p_94128_1_) - { - return new int[] { 0 }; - } - - @Override - public boolean canInsertItem(int i, ItemStack itemStack, int j) { - return this.isItemValidForSlot(i, itemStack); - } - - @Override - public boolean canExtractItem(int i, ItemStack itemStack, int j) { - return false; - } - - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } - - public int getProgressScaled(int i) { - return (progress * i) / maxProgress; - } - - @Override - public void updateEntity() { - - if(!worldObj.isRemote) { - PacketDispatcher.wrapper.sendToAllAround(new AuxElectricityPacket(xCoord, yCoord, zCoord, power), new TargetPoint(worldObj.provider.dimensionId, xCoord, yCoord, zCoord, 150)); - } - - } - - @Override - public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; - } - - @Override - @SideOnly(Side.CLIENT) - public double getMaxRenderDistanceSquared() - { - return 65536.0D; - } - -} From d106b0205ea30c3698966ce272b88e65f32f1c4d Mon Sep 17 00:00:00 2001 From: Doctor17-git <60807716+Doctor17-git@users.noreply.github.com> Date: Sun, 14 Apr 2024 18:15:26 +0300 Subject: [PATCH 32/48] Updated ru_RU.lang updated russian localization --- src/main/resources/assets/hbm/lang/ru_RU.lang | 109 +++++++++++++++--- 1 file changed, 91 insertions(+), 18 deletions(-) diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 6b9614880..581d87635 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -229,6 +229,40 @@ cannery.willow.7=Теперь листья ивы можно собирать. cannery.willow.8=Вскоре растение снова начнет расти, давая больше листьев, если землю заменить на нефтянную. Листья могут быть переработаны в порошок кадмия с помощью рудного окислителя. cannery.willow.9=Сбор ивовых листьев можно автоматизировать с помощью автоматической бензопилы, она будет ломать только те растения, которые готовы к сбору урожая. +cannery.hadron=Ускоритель частиц +cannery.hadron.0=Ускоритель частиц состоит из трех основных частей: Ядро, Камера анализа и набор сверхпроводящих катушек. +cannery.hadron.1=Это компонент ядра ускорителя частиц, который выстреливает частицы с релятивистскими скоростями по катушкам в сторону аналитической камеры +cannery.hadron.2=Частицы выбрасываются отсюда +cannery.hadron.3=И в круговых ускорителях возвращаются сюда +cannery.hadron.4=Сегмент катушки строится с помощью 8 плотных катушек, в середине которых ничего нет (или ядро) +cannery.hadron.5= Этот сегмент катушки также должен быть заключен в оболочку ускорителя частиц +cannery.hadron.6=Для доступа к компоненту ядра вам потребуется добавить один или несколько терминалов доступа +cannery.hadron.7=Для работы основного компонента также потребуется питание, добавьте разъем питания на одной из граней +cannery.hadron.8=Ускорителю потребуется достаточное количество штекеров питания, чтобы обеспечить по крайней мере 10KHE электроэнергии на единицу прочности катушки +cannery.hadron.9= Обратите внимание, что сегмент катушки, который оборачивается вокруг основного компонента, не учитывается при расчете прочности катушки +cannery.hadron.10= Для чисто линейных ускорителей этот сегмент катушки также не требуется +cannery.hadron.11=Для круговых ускорителей необходимо добавить углы для изменения направления частицы +cannery.hadron.12= Внешние угловые катушки можно совсем не добавлять +cannery.hadron.13= Последняя часть нашего ускорителя - камера анализа, которая представляет собой пустую камеру 3x3x3, окруженную блоками камеры анализа +cannery.hadron.14=Ваш готовый ускоритель частиц должен выглядеть примерно так! + +cannery.hadron.math.0= Сила неодимовой катушки: 50 +cannery.hadron.math.1=50 x 8 x 10KHE = 400 x 10KHE = 4MHE +cannery.hadron.math.2=Прочность металлической катушки: 1,000 +cannery.hadron.math.3=1,000 x 8 x 10KHE = 8,000 x 10KHE = 80MHE + +cannery.schottky=Диод с частицами Шоттки +cannery.schottky.0=Это диод Шоттки для частиц. Он позволяет создавать более сложные конструкции ускорителей частиц и экономить электроэнергию +cannery.schottky.1=По умолчанию он блокирует все частицы и должен быть настроен с помощью отвертки +cannery.schottky.2=Это лицо теперь будет принимать входящие частицы +cannery.schottky.3=А это лицо будет выбрасывать входящие частицы +cannery.schottky.4=Диод теперь имеет два выхода и будет вести себя квантовым образом, создавая виртуальные частицы для каждого выхода +cannery.schottky.5=Когда все виртуальные частицы достигнут аналитической камеры, будет выбрана частица с наименьшим импульсом, необходимым для текущего рецепта +cannery.schottky.6= Выбранная частица подвергается коллапсу волновой функции и становится реальной, потребляя только ту энергию, которая требуется коллапсирующей частице +cannery.schottky.7= Если какие-либо виртуальные частицы сталкиваются с неправильными сегментами, все виртуальные частицы отбрасываются, а вместо них коллапсирует ошибочная частица +cannery.schottky.8= Обратите внимание, что виртуальные частицы никогда не будут использовать один и тот же выход диода дважды. Бесконечные циклы будут неудачными, но повторный вход в диод в остальном будет нормальным +cannery.schottky.9= Ваш диод Шоттки для частиц должен быть правильно заключен, со свободными путями для каждого выхода пересечения + potion.hbm_taint=Порча potion.hbm_mutation=Заражённое порчей сердце potion.hbm_radiation=Излучение @@ -455,6 +489,8 @@ shape.ingot=Слиток shape.dust=Порошок shape.plate=Пластина shape.plateTriple=Литая пластина +shape.ntmpipe=Труба +shape.shell=Оболочка shape.quart=Четверть блока shape.block=Блок shape.wireDense=Плотный провод @@ -1949,8 +1985,10 @@ tile.machine_large_turbine.name=Промышленная паровая турб container.machineLargeTurbine=Промышленная паровая турбина tile.machine_chungus.name=Паровая турбина "Левиафан" tile.launch_pad.name=Силосная пусковая площадка +container.launchPadRusted=Пусковая площадка container.launchPad=Пусковая площадка tile.launch_pad_large.name=Пусковая площадка +tile.launch_pad_rusted.name=Старая пусковая площадка tile.compact_launcher.name=Компактная пусковая площадка container.compactLauncher=Компактная пусковая площадка tile.launch_table.name=Большая пусковая площадка @@ -2020,6 +2058,7 @@ tile.fluid_duct_neo.name=Универсальная жидкостная тру tile.fluid_duct_gauge.name=Труба с измерителем потока tile.fluid_duct_gauge.desc=Труба которая показывает сколько жидкости$перемещается внутри сети за тик.$Разделенные сети, соединенные бочками$или резервуары рассматриваются как одна общая сеть. tile.fluid_duct_exhaust.name=Выхлопная труба +tile.machine_drain.name=Сливная труба tile.fluid_switch.name=Редстоун-Жидкостный клапан tile.fluid_valve.name=Жидкостный клапан tile.fluid_duct_solid.name=Покрытая универсальная жидкостная труба (Устаревшее) @@ -2102,6 +2141,7 @@ tile.turret_jeremy.name=Автопушка "Джереми" tile.turret_tauon.name=Прототип турели XVL1456 "Тауон" tile.turret_richard.name=Ракетная турель "Ричард" tile.turret_sentry.name=Сторожевая турель "Браун" +tile.turret_sentry_damaged.name=Сторожевая турель "Эдвин" container.turretHoward=Говард tile.turret_howard.name=Двойная турель Гатлинга CIWS "Говард" container.turretMaxwell=Максвелл @@ -2157,54 +2197,63 @@ container.hydrotreater=Гидроочиститель tile.machine_hydrotreater.name=Гидроочиститель tile.conveyor.name=Конвейер -tile.conveyor.desc=Moves items dropped on it$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend +tile.conveyor.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания tile.conveyor_express.name=Быстрый конвейер -tile.conveyor_express.desc=Moves items dropped on it very fast$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend +tile.conveyor_express.desc=Перемещает предметы, упавшие на него, очень быстро$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку, чтобы согнуть container.craneExtractor=Конвейерный извлекатель container.craneInserter=Конвейерный вставщик tile.crane_extractor.name=Конвейерный извлекатель -tile.crane_extractor.desc=Takes items from inventories and places them on covneyor belts$Has up to 9 filter slots with black and whitelist$Right-click with screwdriver to set output side$Shift-click with screwdriver to set the input side$Click twice to set the opposite side +tile.crane_extractor.desc=Забирает предметы из инвентаря и помещает их на конвейерные ленты$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки выходной стороны$Shift-клик отверткой для установки входной стороны$Кликните дважды для установки противоположной стороны tile.crane_inserter.name=Конвейерный вставщик -tile.crane_inserter.desc=Accepts items from conveyors and places them into containers$Right-click with screwdriver to set input side$Shift-click with screwdriver to set the output side$Click twice to set the opposite side +tile.crane_inserter.desc=Принимает предметы с конвейеров и помещает их в контейнеры$Правый щелчок отверткой для установки входной стороны$Shift-щелчок отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны container.craneBoxer=Конвейерный упаковщик container.craneRouter=Конвейерный сортировщик container.craneUnboxer=Конвейерный распаковщик tile.crane_boxer.name=Конвейерный упаковщик -tile.crane_boxer.desc=Loads a configurable amount of stacks into boxes which move along conveyor belts$Right-click with screwdriver to set input side$Shift-click with screwdriver to set the output side$Click twice to set the opposite side +tile.crane_boxer.desc=Загружает настраиваемое количество стопок в ящики, которые перемещаются по конвейерным лентам$Правый клик отверткой для установки входной стороны$Шифтовый клик отверткой для установки выходной стороны$Кликните дважды для установки противоположной стороны tile.crane_router.name=Конвейерный сортировщик -tile.crane_router.desc=Sorts item based on defined criteria$Sides can be defined as blacklist, whitelist or wildcard$Wildcard sides are only chosen if no other filter matches +tile.crane_router.desc=Сортирует элемент на основе заданных критериев$Стороны могут быть определены как черный список, белый список или подстановочный знак$Стороны подстановочного знака выбираются только в том случае, если ни один другой фильтр не подходит tile.crane_unboxer.name=Конвейерный распаковщик -tile.crane_unboxer.desc=Receives boxes and extracts their contents$Right-click with screwdriver to set output side$Shift-click with screwdriver to set the input side$Click twice to set the opposite side +tile.crane_unboxer.desc=Прием коробок и извлечение их содержимого$Правый щелчок отверткой для установки выходной стороны$Shift-щелчок отверткой для установки входной стороны$Дважды щелкните для установки противоположной стороны tile.conveyor_chute.name=Конвейерный желоб -tile.conveyor_chute.desc=Moves items down$The bottom-most chute will act like a regular conveyor belt +tile.conveyor_chute.desc=Перемещает предметы вниз$Самый нижний желоб будет действовать как обычный конвейер tile.conveyor_double.name=Двухполосный конвейер -tile.conveyor_double.desc=Moves items dropped on it$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend +tile.conveyor_double.desc=Перемещает предметы, опущенные на него$Может поворачиваться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания tile.conveyor_lift.name=Конвейерный цепной лифт -tile.conveyor_lift.desc=Moves items up$Requires at least two blocks on top of each other to work properly +tile.conveyor_lift.desc=Перемещает предметы вверх$Для правильной работы требуется не менее двух блоков друг на друге tile.conveyor_triple.name=Трёхполосный конвейер -tile.conveyor_triple.desc=Moves items dropped on it$Can be rotated clockwise with a screwdriver$Shift-click with screwdriver to bend +tile.conveyor_triple.desc=Перемещает предметы, упавшие на него$Может вращаться по часовой стрелке с помощью отвертки$Нажмите на отвертку для сгибания container.craneGrabber=Конвейерный сборщик tile.crane_grabber.name=Конвейерный сборщик -tile.crane_grabber.desc=Takes items from passing conveyors and places them into containers$Will only take items from the closest lane$Has up to 9 filter slots with black and whitelist$Right-click with screwdriver to set input side$Shift-click with screwdriver to set the output side$Click twice to set the opposite side +tile.crane_grabber.desc=Принимает предметы с проходящих конвейеров и помещает их в контейнеры$Принимает предметы только с ближайшей дорожки$Имеет до 9 слотов фильтрации с черным и белым списком$Правый клик отверткой для установки стороны входа$Сменный клик отверткой для установки стороны выхода$Кликните дважды для установки противоположной стороны tile.crane_splitter.name=Конвейерный разделитель -tile.crane_splitter.desc=Splits items and stacks evenly onto two conveyor belts$Is a conveyor belt itself, so it can directly input into an inserter or sorter +tile.crane_splitter.desc=Разделяет предметы и равномерно укладывает их на две конвейерные ленты$Сама является конвейерной лентой, поэтому может напрямую входить в инсертер или сортировщик container.droneCrate=Пассивный ящик для дронов container.droneDock=Дрон-станция container.droneProvider=Ящик снабжения для дронов container.droneRequester=Ящик запроса для дронов tile.drone_crate.name=Пассивный ящик для дронов +tile.drone_crate.desc=Погрузочно-разгрузочная точка для транспортных дронов.$Действует как путевая точка, должна быть связана с линкером дронов.$Дроны должны приближаться под большим углом, иначе они застрянут. tile.drone_crate_provider.name=Ящик снабжения для дронов +tile.drone_crate_provider.desc=Предлагает предметы логистической сети.$Логистические дроны будут пытаться переместить предметы от поставщиков в ящики покупателей. tile.drone_crate_requester.name=Ящик запроса для дронов +tile.drone_crate_requester.desc=Запрашивает предметы из логистической сети.$Предметы, добавленные в фильтр, будут запрошены, если отсутствуют в его инвентаре. tile.drone_dock.name=Дрон-станция +tile.drone_dock.desc=Точка спауна для логистических дронов.$Может обнаруживать поставщиков и заказчиков только в радиусе 5 чанков.$Дроны будут следовать только до 10 путевых точек за соединение. tile.drone_waypoint.name=Путевая точка для дронов -tile.drone_waypoint.desc=Путевая точка для дронов$Use a transport drone linker to set the path$Click on each waypoint and crate in sequence to create the path,$then shift-click to clear the saved position$Right-click or shift-click the waypoint to change the waypoint's offset +tile.drone_waypoint.desc=Путевая точка для дронов$Используйте линкер транспортного дрона, чтобы задать путь$Нажимайте на каждую путевую точку и крейт последовательно, чтобы создать путь,$ затем нажмите shift, чтобы очистить сохраненную позицию$ Щелкните правой кнопкой мыши или shift, чтобы изменить смещение путевой точки tile.drone_waypoint_request.name=Логистическая путевая точка для дронов item.drone.patrol.name=Транспортный дрон +item.drone.patrol.desc=Путешествует по маршруту с путевыми точками$Пытается загрузиться/разгрузиться каждый раз, когда достигает ящика с дронами$Правый клик на ящике с дронами для размещения. item.drone.patrol_chunkloading.name=Транспортный дрон (Чанклоадер) +item.drone.patrol_chunkloading.desc=Путешествует по маршруту с путевыми точками$Пытается загрузиться/разгрузиться каждый раз, когда достигает ящика с дронами$Правый клик на ящике с дронами для размещения.$Загружает куски! item.drone.patrol_express.name=Быстрый транспортный дрон +item.drone.patrol_express.desc=Путешествует по маршруту с путевыми точками$Пытается загрузиться/разгрузиться каждый раз, когда достигает ящика с дронами$Правый клик на ящике с дронами для размещения. item.drone.patrol_express_chunkloading.name=Быстрый транспортный дрон (Чанклоадер) +item.drone.patrol_express_chunkloading.desc=Путешествует по маршруту с путевыми точками$Пытается загрузиться/разгрузиться каждый раз, когда достигает ящика с дронами$Правый клик поверх ящика с дронами для размещения.$Загружает куски! item.drone.request.name=Логистический дрон +item.drone.request.desc=Используется доками логистических дронов для порождения логистических дронов$Дроны следуют по путевым точкам логистических дронов$После выполнения запроса дрон возвращается в док. item.drone_linker.name=Соединитель пассивных ящиков для дронов container.turretArty=Грег @@ -2397,6 +2446,8 @@ tile.pwr_port.name=Люк доступа ВВЭР tile.pwr_port.desc=Ввод/вывод жидкостей и предметов$Размещение: Обшивка tile.pwr_reflector.name=Нейтронный отражатель ВВЭР tile.pwr_reflector.desc=Отражает нейтроны обратно к топливным стержням$Размещение: Внутри, повышает реактивность$Подходит для обшивки +tile.pwr_heatsink.name=Радиатор ВВЭР +tile.pwr_heatsink.desc=Увеличивает теплоемкость активной зоны на 5%%$Делает каналы охлаждающей жидкости и теплообменники чуть менее эффективными$Размещение: Любое container.hadron=Ускоритель частиц tile.hadron_access.name=Терминал доступа ускорителя частиц @@ -2496,6 +2547,7 @@ tile.rbmk_absorber.name=Борный поглотитель нейтронов tile.rbmk_blank.name=Структурная колонна РБМК tile.rbmk_boiler.name=Паровой канал РБМК tile.rbmk_loader.name=Паровой проводник РБМК +tile.rbmk_loader.desc=Позволяет РБМК иметь внизу соединения для воды и пара$Поместите одну водную трубу под колонной РБМК, затем проводник,$потом подключите паропровод к проводнику. tile.rbmk_control.name=Регулирующие стержни РБМК tile.rbmk_control_auto.name=Автоматические регулирующие стержни РБМК tile.rbmk_moderator.name=Графитовый замедлитель РБМК @@ -2509,7 +2561,9 @@ tile.rbmk_control_mod.name=Замедляющие регулирующие ст tile.rbmk_rod_mod.name=Замедляющие топливные стержни РБМК tile.rbmk_rod_reasim_mod.name=Замедляющие топливные стержни РБМК (РеаСим) tile.rbmk_steam_inlet.name=Порт ввода воды РБМК РеаСим +tile.rbmk_steam_inlet.desc=Подает воду в колонны RBMK, если включены ReaSim бойлеры$Подключается к колоннам RBMK сбоку tile.rbmk_steam_outlet.name=Порт вывода пара РБМК РеаСим +tile.rbmk_steam_outlet.desc=Извлекает перегретый пар из колонн РБМК, если включены ReaSim бойлеры$Подключается к колоннам RBMK сбоку tile.deco_rbmk.name=Деко-блоки РБМК tile.deco_rbmk_smooth.name=Гладкие деко-блоки РБМК container.rbmkBoiler=Паровой канал РБМК @@ -2687,6 +2741,7 @@ item.ingot_steel_dusted.name=Запылённой стальной слиток item.ingot_chainsteel.name=Тяжёлая цепная сталь item.ingot_tcalloy.name=Слиток технециевой стали item.plate_steel.name=Стальная пластина +item.plate_dura_steel.name=Пластина высокоскоростной стали item.ingot_beryllium.name=Бериллевый слиток item.plate_schrabidium.name=Шрабидиевая пластина item.ingot_schraranium.name=Шрараниевый слиток @@ -2790,6 +2845,7 @@ item.ingot_polymer.name=Полимер item.ingot_rubber.name=Резина item.ingot_biorubber.name=Брусок латекса item.ingot_polonium.name=Слиток полония-210 +item.pipe.name=%s трубы item.pipes_steel.name=Стальные трубы item.pipes_steel.desc=Раскрафт был исключен из-за уклонения от уплаты налогов item.drill_titanium.name=Титановый бур @@ -2980,6 +3036,10 @@ item.circuit_star.desc=Не используется сейчас из-за от item.circuit_star_component.chipset.name=Чипсет Звёздного Диспетчера item.circuit_star_component.cpu.name=Процессор Звёздного Диспетчера item.circuit_star_component.ram.name=Оперативная память Звёздного Диспетчера +item.circuit_star_component.card.name=Карта расширения Звёздного Диспетчера +item.circuit_star_piece.board_converter.name=ЗД - Преобразователь напряжения +item.circuit_star_piece.card_board.name=ЗД - Плата карты расширения +item.circuit_star_piece.card_processor.name=ЗД - Процессор платы расширения item.circuit_star_piece.board_blank.name=ЗД - Печатная плата item.circuit_star_piece.board_transistor.name=ЗД - Транзисторы item.circuit_star_piece.bridge_bios.name=ЗД - Чип БИОС @@ -3075,6 +3135,7 @@ tile.balefire.name=Жар-пламя tile.block_waste_painted.name=Покрашенный блок ядерных отходов tile.block_scrap.name=Блок металлолома tile.block_slag.name=Блок шлака +tile.oil_spill.name=Разлитая нефть tile.pribris.name=Обломки РБМК tile.pribris_digamma.name=Почерневшие обломки РБМК tile.pribris_burning.name=Горящие обломки РБМК @@ -3271,6 +3332,7 @@ item.ore_byproduct.b_uranium.name=Урановый побочный продук item.ammonium_nitrate.name=Нитрат аммония tile.bobblehead.name=Болванчик +tile.snowglobe.name=Снежный шар tile.deco_titanium.name=Титановый декоративный блок tile.deco_red_copper.name=Красномедный декоративный блок tile.deco_tungsten.name=Вольфрамовый декоративный блок @@ -3474,7 +3536,7 @@ tile.barbed_wire_fire.name=Пылающая колючая проволока tile.barbed_wire_poison.name=Отравленная колючая проволока tile.barbed_wire_acid.name=Кислотная колючая проволока tile.barbed_wire_wither.name=Иссушающая колючая проволока -tile.barbed_wire_ultradeath.name=Розовооблачная колючая проволока +tile.barbed_wire_ultradeath.name=Радиоактивная колючая проволока tile.fence_metal.name=Проволочная сетка tile.sand_uranium.name=Урановый песок tile.glass_uranium.name=Урановое стекло @@ -4269,7 +4331,7 @@ item.grenade_nuke.name=Буровая граната “Марк VI” item.grenade_nuclear.name=Ядерная граната item.grenade_zomg.name=Граната аннигиляции пар отрицательной энергии item.grenade_black_hole.name=Граната сингулярности -item.grenade_cloud.name=Колба с облаком +item.grenade_cloud.name=Колба с кислотным облаком item.grenade_pink_cloud.name=Колба с розовым облаком item.ullapool_caber.name=Аллапульское бревно item.grenade_smart.name=Смарт-граната @@ -4419,6 +4481,8 @@ tile.tape_recorder.name=Магнитофон tile.steel_poles.name=Стальные опоры tile.pole_top.name=Антенна tile.deco_computer.ibm_300pl.name=Персональный компьютер IBM 300PL +tile.deco_crt.name=Старый ЭЛТ-экран +tile.deco_toaster.name=Сломанный тостер tile.filing_cabinet.green.name=Пыльный карточеный шкафчик tile.filing_cabinet.steel.name=Стальной карточеный шкафчик container.fileCabinet=Карточеный шкафчик @@ -4442,7 +4506,7 @@ item.gun_revolver_cursed.name=Проклятый револьвер item.gun_revolver_nightmare.name=Кошмарный револьвер (Оригинал) item.gun_revolver_nightmare2.name=Кошмарный револьвер (Тёмный) item.gun_revolver_pip.name=Лил' Пипсквик -item.gun_revolver_nopip.name=Новак +item.gun_revolver_nopip.name=Тяжёлый револьвер item.gun_revolver_blackjack.name=Пятизарядный револьвер Блэкджек item.gun_revolver_silver.name=Одолженный пистолет item.gun_revolver_red.name=Револьвер с красным ключом @@ -4808,7 +4872,7 @@ item.syringe_metal_psycho.name=Психо item.syringe_metal_super.name=Супер-стимулятор item.syringe_taint.name=Водянистая инъекция порчи item.syringe_mkunicorn.name=MKUNICORN -item.med_bag.name=Докторский саквояж +item.med_bag.name=Аптечка первой помощи item.radaway.name=Антирадин item.radaway_strong.name=Усиленный антирадин item.radaway_flush.name=Супер-антирадин @@ -4902,6 +4966,7 @@ eye.speakTo=Вы говорите Оку: §o%s item.plastic_bag.name=Пластиковый пакетик item.cap_aluminium.name=Алюминиевый колпачок +item.shell.name=%s оболочка item.hull_small_steel.name=Небольшая стальная оболочка item.hull_small_aluminium.name=Небольшая алюминиевая оболочка item.hull_small_aluminium.desc=Может быть вставлен в просверленный графит @@ -5045,6 +5110,7 @@ item.missile_nuclear_cluster.name=Термоядерная ракета item.missile_endo.name=Эндотермическая ракета item.missile_exo.name=Экзотермическая ракета item.missile_doomsday.name=Ракета Судного Дня +item.missile_doomsday_rusted.name=Повреждённая ракета Судного Дня item.missile_taint.name=Зараженная ракета item.missile_micro.name=Микро-ядерная ракета item.missile_bhole.name=Ракета "Черная Дыра" @@ -5471,6 +5537,10 @@ item.meteorite_sword_fused.name=Метеоритовый меч (Сплавле item.meteorite_sword_baleful.name=Метеоритовый меч (Зловещий) item.crucible.name="Горнило Палача" item.bismuth_pickaxe.name=Висмутовая кирка +item.bismuth_axe.name=Висмутовый топор +item.chlorophyte_axe.name=Хлорофитовый топор +item.mese_axe.name=Месе топор +item.volcanic_axe.name=Литой топор tile.red_cable.name=Провод из красной меди tile.red_cable_paintable.name=Окрашиваемый провод из красной меди @@ -5554,6 +5624,9 @@ item.detonator_de.name=Взрывчатка мертвеца item.crate_caller.name=Запросчик поставки припасов item.bomb_caller.name=Устройство для обозначения авиаудара item.meteor_remote.name=Устройство для вызова метеоритов +item.launch_code.name=Код запуска +item.launch_code_piece.name=Кусок кода запуска +item.launch_key.name=Ключ запуска item.ingot_hes.name=Высокообогащенный слиток шрабидиевого топлива item.ingot_les.name=Низкообогащенный слиток шрабидиевого топлива From bed04f43115f1f7ae0ed8daec9bdbfb5826d0846 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Apr 2024 17:18:57 +0200 Subject: [PATCH 33/48] plylons bylons plons --- changelog | 34 +- src/main/java/com/hbm/blocks/ModBlocks.java | 12 + .../com/hbm/blocks/network/PylonMedium.java | 53 + .../hbm/inventory/container/ContainerFEL.java | 3 +- .../container/ContainerMachineAssembler.java | 2 +- .../container/ContainerMachineChemplant.java | 2 +- .../container/ContainerMachineGasCent.java | 2 +- .../container/ContainerMachineShredder.java | 2 +- .../container/ContainerMachineTurbofan.java | 2 +- .../inventory/recipes/anvil/AnvilRecipes.java | 12 +- src/main/java/com/hbm/main/ClientProxy.java | 3 +- .../java/com/hbm/main/CraftingManager.java | 6 +- .../java/com/hbm/main/ResourceManager.java | 3 + .../render/tileentity/RenderPylonBase.java | 70 +- .../render/tileentity/RenderPylonLarge.java | 1 - .../render/tileentity/RenderPylonMedium.java | 87 ++ .../java/com/hbm/tileentity/TileMappings.java | 1 + .../network/TileEntityPylonBase.java | 1 + .../network/TileEntityPylonLarge.java | 1 - .../network/TileEntityPylonMedium.java | 59 + src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 6 +- .../hbm/models/network/pylon_medium.obj | 1023 +++++++++++++++++ .../textures/models/network/pylon_medium.png | Bin 957 -> 2996 bytes .../models/network/pylon_medium_steel.png | Bin 0 -> 2320 bytes 25 files changed, 1279 insertions(+), 110 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/network/PylonMedium.java create mode 100644 src/main/java/com/hbm/render/tileentity/RenderPylonMedium.java create mode 100644 src/main/java/com/hbm/tileentity/network/TileEntityPylonMedium.java create mode 100644 src/main/resources/assets/hbm/models/network/pylon_medium.obj create mode 100644 src/main/resources/assets/hbm/textures/models/network/pylon_medium_steel.png diff --git a/changelog b/changelog index db178b44d..31bdeeb83 100644 --- a/changelog +++ b/changelog @@ -1,32 +1,10 @@ ## Added -* PWR Heatsink - * Increases the core heat capacity by 5% per block - * Makes cooling channels and heat exchangers slightly less effective (each heatsink counts as one quarter of a fuel rod in the heat calculation) +* New medium sized electricity pylons + * Come in wood and steel flavor + * The regular ones don't connect to cable blocks, the variants with transformers do (i.e. they act like substations for huge pylons) ## Changed -* All launch pad blocks can now accept items, not just ports -* Removed the old watz pellets and titanium filter -* Removed copper panels, cast copper plates now take its place in most use-cases -* Removed generator bodies and rotors, recipes use 6 dense gold wires per generator instead -* Removed reinforced turbine shafts, most turbines now use HSS pipes instead -* Removed the steam batteries (why did we even have those?) -* Removed some old remap items (from back when the ZIRNOX rods got remapped) -* Large and small shells have been merged into a single item which uses material autogen - * A copper variant for shells has been added which is used for artillery shells - * Shells are now only directly craftable via anvil, however they can be cast using the crucible as well -* Most instances of the expensive steel pipes as well as the decorative pipes which need tons of microcrafting have been replaced with a new pipe item - * The new pipes also use autogen, being available in different materials - * Some of the recipes that used the small shells now use pipes instead -* Tenfolded the throughout of powered condensers -* Regular and combo filters now work for blistering agents (like mustard gas or air pollution) -* Wires now render two faces instead of one, making them appear equally thick from any viewed angle -* Slag taps can now be toggled and filtered -* Foundry channels now have twice the throughput (2 ingots) -* RBMK ReaSim and steam connectors now have tooltips explaining how they work, as there is no other ingame documentation on them +* Condensers now need cast plates instead of welded plates +* Tweaked the substation recipe, it now yields two substations -## Fixed -* Fixed crash caused by invalid default loot pool configuration -* Fixed enchantment glint not rendering on upscaled items like certain swords or tier 2 pickaxes -* Fixed wire connections becoming invisible when pointing straight down, wires should now rotate correctly -* Fixed connection issue allowing channels to output into slag taps sideways -* Fixed the strand caster sometimes voiding small amounts of material +## Fixed \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index bbd2bff36..17ca86aa7 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -773,6 +773,10 @@ public class ModBlocks { public static Block red_cable_gauge; public static Block red_connector; public static Block red_pylon; + public static Block red_pylon_medium_wood; + public static Block red_pylon_medium_wood_transformer; + public static Block red_pylon_medium_steel; + public static Block red_pylon_medium_steel_transformer; public static Block red_pylon_large; public static Block substation; public static Block cable_switch; @@ -1922,6 +1926,10 @@ public class ModBlocks { red_cable_gauge = new BlockCableGauge().setBlockName("red_cable_gauge").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); red_connector = new ConnectorRedWire(Material.iron).setBlockName("red_connector").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_connector"); red_pylon = new PylonRedWire(Material.iron).setBlockName("red_pylon").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); + red_pylon_medium_wood = new PylonMedium(Material.wood).setBlockName("red_pylon_medium_wood").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); + red_pylon_medium_wood_transformer = new PylonMedium(Material.wood).setBlockName("red_pylon_medium_wood_transformer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); + red_pylon_medium_steel = new PylonMedium(Material.iron).setBlockName("red_pylon_medium_steel").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); + red_pylon_medium_steel_transformer = new PylonMedium(Material.iron).setBlockName("red_pylon_medium_steel_transformer").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon"); red_pylon_large = new PylonLarge(Material.iron).setBlockName("red_pylon_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":red_pylon_large"); substation = new Substation(Material.iron).setBlockName("substation").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":substation"); cable_switch = new CableSwitch(Material.iron).setBlockName("cable_switch").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab); @@ -3196,6 +3204,10 @@ public class ModBlocks { GameRegistry.registerBlock(red_wire_coated, red_wire_coated.getUnlocalizedName()); GameRegistry.registerBlock(red_connector, ItemBlockBase.class, red_connector.getUnlocalizedName()); GameRegistry.registerBlock(red_pylon, ItemBlockBase.class, red_pylon.getUnlocalizedName()); + register(red_pylon_medium_wood); + register(red_pylon_medium_wood_transformer); + register(red_pylon_medium_steel); + register(red_pylon_medium_steel_transformer); GameRegistry.registerBlock(red_pylon_large, ItemBlockBase.class, red_pylon_large.getUnlocalizedName()); GameRegistry.registerBlock(substation, ItemBlockBase.class, substation.getUnlocalizedName()); GameRegistry.registerBlock(cable_switch, cable_switch.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/network/PylonMedium.java b/src/main/java/com/hbm/blocks/network/PylonMedium.java new file mode 100644 index 000000000..d36921a67 --- /dev/null +++ b/src/main/java/com/hbm/blocks/network/PylonMedium.java @@ -0,0 +1,53 @@ +package com.hbm.blocks.network; + +import java.util.List; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ITooltipProvider; +import com.hbm.tileentity.network.TileEntityPylonBase; +import com.hbm.tileentity.network.TileEntityPylonMedium; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.EnumChatFormatting; +import net.minecraft.world.World; + +public class PylonMedium extends BlockDummyable implements ITooltipProvider { + + public PylonMedium(Material mat) { + super(mat); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + + if(meta >= 12) return new TileEntityPylonMedium(); + return null; + } + + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean ext) { + list.add(EnumChatFormatting.GOLD + "Connection Type: " + EnumChatFormatting.YELLOW + "Triple"); + list.add(EnumChatFormatting.GOLD + "Connection Range: " + EnumChatFormatting.YELLOW + "45m"); + } + + @Override + public int[] getDimensions() { + return new int[] {6, 0, 0, 0, 0, 0}; + } + + @Override + public int getOffset() { + return 0; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block b, int m) { + TileEntity te = world.getTileEntity(x, y, z); + if(te instanceof TileEntityPylonBase) ((TileEntityPylonBase)te).disconnectAll(); + super.breakBlock(world, x, y, z, b, m); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerFEL.java b/src/main/java/com/hbm/inventory/container/ContainerFEL.java index db7cd4949..c80e69e44 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerFEL.java +++ b/src/main/java/com/hbm/inventory/container/ContainerFEL.java @@ -3,7 +3,6 @@ package com.hbm.inventory.container; import com.hbm.items.ModItems; import com.hbm.tileentity.machine.TileEntityFEL; -import api.hbm.energy.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; @@ -49,7 +48,7 @@ public class ContainerFEL extends Container { } } else { - if(rStack.getItem() instanceof IBatteryItem || rStack.getItem() == ModItems.battery_creative) { + if(rStack.getItem() instanceof api.hbm.energymk2.IBatteryItem || rStack.getItem() == ModItems.battery_creative) { if(!this.mergeItemStack(stack, 0, 1, false)) return null; } else { if(!this.mergeItemStack(stack, 1, 2, false)) return null; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineAssembler.java b/src/main/java/com/hbm/inventory/container/ContainerMachineAssembler.java index ed084a881..c8380834b 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineAssembler.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineAssembler.java @@ -6,7 +6,7 @@ import com.hbm.items.machine.ItemAssemblyTemplate; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineAssembler; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineChemplant.java b/src/main/java/com/hbm/inventory/container/ContainerMachineChemplant.java index 6bbf3510a..950a00d7d 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineChemplant.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineChemplant.java @@ -7,7 +7,7 @@ import com.hbm.items.machine.ItemChemistryTemplate; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineChemplant; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineGasCent.java b/src/main/java/com/hbm/inventory/container/ContainerMachineGasCent.java index feb3de896..51513c094 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineGasCent.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineGasCent.java @@ -6,7 +6,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineGasCent; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java b/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java index 3e751f88e..c10e47ae7 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineShredder.java @@ -5,7 +5,7 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBlades; import com.hbm.tileentity.machine.TileEntityMachineShredder; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/container/ContainerMachineTurbofan.java b/src/main/java/com/hbm/inventory/container/ContainerMachineTurbofan.java index 5fb979fe9..d2e12fa98 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerMachineTurbofan.java +++ b/src/main/java/com/hbm/inventory/container/ContainerMachineTurbofan.java @@ -5,7 +5,7 @@ import com.hbm.items.machine.IItemFluidIdentifier; import com.hbm.items.machine.ItemMachineUpgrade; import com.hbm.tileentity.machine.TileEntityMachineTurbofan; -import api.hbm.energy.IBatteryItem; +import api.hbm.energymk2.IBatteryItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index e4cc0a9a5..8a295eea5 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -458,14 +458,12 @@ public class AnvilRecipes { constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { - new OreDictStack(ANY_CONCRETE.any(), 6), - new OreDictStack(STEEL.ingot(), 4), - new ComparableStack(ModBlocks.steel_scaffold, 2), - new ComparableStack(ModItems.plate_polymer, 8), - new ComparableStack(ModItems.coil_copper, 2), - new ComparableStack(ModItems.coil_copper_torus, 2) + new OreDictStack(ANY_CONCRETE.any(), 8), + new OreDictStack(STEEL.ingot(), 8), + new ComparableStack(ModItems.plate_polymer, 12), + new ComparableStack(ModItems.coil_copper, 8) }, - new AnvilOutput(new ItemStack(ModBlocks.substation))).setTier(2)); + new AnvilOutput(new ItemStack(ModBlocks.substation, 2))).setTier(2)); constructionRecipes.add(new AnvilConstructionRecipe( new AStack[] { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index d0beabbc7..6b984dd85 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -147,8 +147,6 @@ public class ClientProxy extends ServerProxy { registerBlockRenderer(); Jars.initJars(); - - //SoundUtil.addSoundCategory("ntmMachines"); } private void registerClientEventHandler(Object handler) { @@ -337,6 +335,7 @@ public class ClientProxy extends ServerProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFluidDuct.class, new RenderFluidDuct()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPylon.class, new RenderPylon()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityConnector.class, new RenderConnector()); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPylonMedium.class, new RenderPylonMedium()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPylonLarge.class, new RenderPylonLarge()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySubstation.class, new RenderSubstation()); //chargers diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index 04b67bc0d..a3896a2fe 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -279,6 +279,10 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModBlocks.red_cable_gauge), new Object[] { ModBlocks.red_wire_coated, STEEL.ingot(), ModItems.circuit_aluminium }); addRecipeAuto(new ItemStack(ModBlocks.red_connector, 4), new Object[] { "C", "I", "S", 'C', ModItems.coil_copper, 'I', ModItems.plate_polymer, 'S', STEEL.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.red_pylon, 4), new Object[] { "CWC", "PWP", " T ", 'C', ModItems.coil_copper, 'W', KEY_PLANKS, 'P', ModItems.plate_polymer, 'T', ModBlocks.red_wire_coated }); + addRecipeAuto(new ItemStack(ModBlocks.red_pylon_medium_wood, 2), new Object[] { "CCW", "IIW", " S", 'C', ModItems.coil_copper, 'W', KEY_PLANKS, 'I', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); + addShapelessAuto(new ItemStack(ModBlocks.red_pylon_medium_wood_transformer, 1), new Object[] { ModBlocks.red_pylon_medium_wood, ModItems.plate_polymer, ModItems.coil_copper }); + addRecipeAuto(new ItemStack(ModBlocks.red_pylon_medium_steel, 2), new Object[] { "CCW", "IIW", " S", 'C', ModItems.coil_copper, 'W', STEEL.pipe(), 'I', ModItems.plate_polymer, 'S', KEY_COBBLESTONE }); + addShapelessAuto(new ItemStack(ModBlocks.red_pylon_medium_steel_transformer, 1), new Object[] { ModBlocks.red_pylon_medium_steel, ModItems.plate_polymer, ModItems.coil_copper }); addRecipeAuto(new ItemStack(ModBlocks.machine_battery_potato, 1), new Object[] { "PCP", "WRW", "PCP", 'P', ItemBattery.getEmptyBattery(ModItems.battery_potato), 'C', CU.ingot(), 'R', REDSTONE.block(), 'W', KEY_PLANKS }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_bus, 1), new Object[] { "PIP", "PIP", "PIP", 'P', ModItems.plate_polymer, 'I', MINGRADE.ingot() }); addRecipeAuto(new ItemStack(ModBlocks.capacitor_copper, 1), new Object[] { "PPP", "PCP", "WWW", 'P', STEEL.plate(), 'C', CU.block(), 'W', KEY_PLANKS }); @@ -960,7 +964,7 @@ public class CraftingManager { addShapelessAuto(new ItemStack(ModItems.solid_fuel, 3), new Object[] { Fluids.HEATINGOIL.getDict(16000), KEY_TOOL_CHEMISTRYSET }); addShapelessAuto(new ItemStack(ModItems.canister_full, 2, Fluids.LUBRICANT.getID()), new Object[] { Fluids.HEATINGOIL.getDict(1000), Fluids.UNSATURATEDS.getDict(1000), ModItems.canister_empty, ModItems.canister_empty, KEY_TOOL_CHEMISTRYSET }); - addRecipeAuto(new ItemStack(ModBlocks.machine_condenser), new Object[] { "SIS", "ICI", "SIS", 'S', STEEL.ingot(), 'I', IRON.plate(), 'C', CU.plateWelded() }); + addRecipeAuto(new ItemStack(ModBlocks.machine_condenser), new Object[] { "SIS", "ICI", "SIS", 'S', STEEL.ingot(), 'I', IRON.plate(), 'C', CU.plateCast() }); addShapelessAuto(new ItemStack(ModItems.book_guide, 1, BookType.TEST.ordinal()), new Object[] { Items.book, ModItems.canned_conserve.stackFromEnum(EnumFoodType.JIZZ) }); addShapelessAuto(new ItemStack(ModItems.book_guide, 1, BookType.RBMK.ordinal()), new Object[] { Items.book, Items.potato }); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 677b69c92..08ba66b2d 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -385,6 +385,7 @@ public class ResourceManager { //Network public static final IModelCustom connector = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/connector.obj")); + public static final IModelCustom pylon_medium = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/pylon_medium.obj")); public static final IModelCustom pylon_large = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/network/pylon_large.obj")); public static final IModelCustom substation = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/network/substation.obj")); @@ -782,6 +783,8 @@ public class ResourceManager { //Electricity public static final ResourceLocation connector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/connector.png"); + public static final ResourceLocation pylon_medium_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_medium.png"); + public static final ResourceLocation pylon_medium_steel_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_medium_steel.png"); public static final ResourceLocation pylon_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_large.png"); public static final ResourceLocation substation_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/substation.png"); public static final ResourceLocation wire_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/wire.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java b/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java index f7ffccd91..dca78271c 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java @@ -4,7 +4,6 @@ import org.lwjgl.opengl.GL11; import com.hbm.main.ResourceManager; import com.hbm.tileentity.network.TileEntityPylonBase; -import com.hbm.tileentity.network.TileEntityPylonBase.ConnectionType; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; @@ -15,63 +14,6 @@ import net.minecraft.world.World; public abstract class RenderPylonBase extends TileEntitySpecialRenderer { - //TODO: adapt this into a more generic form for multi wire pylons - /*@Deprecated - public void renderSingleLine(TileEntityPylonBase pyl, double x, double y, double z) { - - for(int i = 0; i < pyl.connected.size(); i++) { - - int[] wire = pyl.connected.get(i); - TileEntity tile = pyl.getWorldObj().getTileEntity(wire[0], wire[1], wire[2]); - - if(tile instanceof TileEntityPylonBase) { - TileEntityPylonBase pylon = (TileEntityPylonBase) tile; - Vec3 myOffset = pyl.getMountPos()[0]; - Vec3 theirOffset = pylon.getMountPos()[0]; - - double conX0 = pyl.xCoord + myOffset.xCoord; - double conY0 = pyl.yCoord + myOffset.yCoord; - double conZ0 = pyl.zCoord + myOffset.zCoord; - double conX1 = pylon.xCoord + theirOffset.xCoord; - double conY1 = pylon.yCoord + theirOffset.yCoord; - double conZ1 = pylon.zCoord + theirOffset.zCoord; - - double wX = (conX1 - conX0) / 2D; - double wY = (conY1 - conY0) / 2D; - double wZ = (conZ1 - conZ0) / 2D; - - float count = 10; - Vec3 delta = Vec3.createVectorHelper(conX1 - conX0, conY1 - conY0, conZ1 - conZ0); - double hang = delta.lengthVector() / 15D; - - for(float j = 0; j < count; j++) { - - float k = j + 1; - - double ja = j + 0.5D; - double ix = conX0 + delta.xCoord / (double)(count * 2) * ja; - double iy = conY0 + delta.yCoord / (double)(count * 2) * ja - Math.sin(j / count * Math.PI * 0.5) * hang; - double iz = conZ0 + delta.zCoord / (double)(count * 2) * ja; - - //pylon.getWorldObj().spawnParticle("reddust", ix, iy, iz, 0.01 + j * 0.1, 0, 0); - - int brightness = pyl.getWorldObj().getLightBrightnessForSkyBlocks(MathHelper.floor_double(ix), MathHelper.floor_double(iy), MathHelper.floor_double(iz), 0); - int lX = brightness % 65536; - int lY = brightness / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float)lX / 1.0F, (float)lY / 1.0F); - - drawLineSegment( - x + myOffset.xCoord + (wX * j / count), - y + myOffset.yCoord + (wY * j / count) - Math.sin(j / count * Math.PI * 0.5) * hang, - z + myOffset.zCoord + (wZ * j / count), - x + myOffset.xCoord + (wX * k / count), - y + myOffset.yCoord + (wY * k / count) - Math.sin(k / count * Math.PI * 0.5) * hang, - z + myOffset.zCoord + (wZ * k / count)); - } - } - } - }*/ - /** * The closest we have to a does-all solution. It will figure out if it needs to draw multiple lines, * iterate through all the mounting points, try to find the matching mounting points and then draw the lines. @@ -95,7 +37,7 @@ public abstract class RenderPylonBase extends TileEntitySpecialRenderer { Vec3[] m1 = pyl.getMountPos(); Vec3[] m2 = pylon.getMountPos(); - int lineCount = Math.max(pyl.getConnectionType() == ConnectionType.QUAD ? 4 : 1, pylon.getConnectionType() == ConnectionType.QUAD ? 4 : 1); + int lineCount = Math.min(m1.length, m2.length); for(int line = 0; line < lineCount; line++) { @@ -227,12 +169,16 @@ public abstract class RenderPylonBase extends TileEntitySpecialRenderer { double iZ = Math.cos(yaw) * Math.cos(newPitch) * girth; double iX = Math.sin(yaw) * Math.cos(newPitch) * girth; double iY = Math.sin(newPitch) * girth; - double jZ = Math.cos(newYaw) * Math.cos(newPitch) * girth; - double jX = Math.sin(newYaw) * Math.cos(newPitch) * girth; + double jZ = Math.cos(newYaw) * girth; + double jX = Math.sin(newYaw) * girth; double length = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ); int wrap = (int) Math.ceil(length * 8); - if(deltaX + deltaZ < 0) wrap *= -1; + if(deltaX + deltaZ < 0) { + wrap *= -1; + jZ *= -1; + jX *= -1; + } tessellator.setColorOpaque_I(0xffffff); tessellator.addVertexWithUV(x + iX, y + iY, z + iZ, 0, 0); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPylonLarge.java b/src/main/java/com/hbm/render/tileentity/RenderPylonLarge.java index 8df4d64fb..a70616ce7 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPylonLarge.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPylonLarge.java @@ -35,5 +35,4 @@ public class RenderPylonLarge extends RenderPylonBase { this.renderLinesGeneric(pyl, x, y, z); GL11.glPopMatrix(); } - } diff --git a/src/main/java/com/hbm/render/tileentity/RenderPylonMedium.java b/src/main/java/com/hbm/render/tileentity/RenderPylonMedium.java new file mode 100644 index 000000000..c37cd2881 --- /dev/null +++ b/src/main/java/com/hbm/render/tileentity/RenderPylonMedium.java @@ -0,0 +1,87 @@ +package com.hbm.render.tileentity; + +import org.lwjgl.opengl.GL11; + +import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ModBlocks; +import com.hbm.main.ResourceManager; +import com.hbm.render.item.ItemRenderBase; +import com.hbm.tileentity.network.TileEntityPylonMedium; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.client.IItemRenderer; + +public class RenderPylonMedium extends RenderPylonBase implements IItemRendererProvider { + + @Override + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float interp) { + GL11.glPushMatrix(); + GL11.glTranslated(x + 0.5, y, z + 0.5); + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tile.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(0, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(90, 0F, 1F, 0F); break; + } + + TileEntityPylonMedium pyl = (TileEntityPylonMedium)tile; + + + if(tile.getBlockType() == ModBlocks.red_pylon_medium_steel || tile.getBlockType() == ModBlocks.red_pylon_medium_steel_transformer) + bindTexture(ResourceManager.pylon_medium_steel_tex); + else + bindTexture(ResourceManager.pylon_medium_tex); + + ResourceManager.pylon_medium.renderPart("Pylon"); + if(pyl.hasTransformer()) ResourceManager.pylon_medium.renderPart("Transformer"); + + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + this.renderLinesGeneric(pyl, x, y, z); + GL11.glPopMatrix(); + } + + @Override + public Item[] getItemsForRenderer() { + return new Item[] { + Item.getItemFromBlock(ModBlocks.red_pylon_medium_wood), + Item.getItemFromBlock(ModBlocks.red_pylon_medium_wood_transformer), + Item.getItemFromBlock(ModBlocks.red_pylon_medium_steel), + Item.getItemFromBlock(ModBlocks.red_pylon_medium_steel_transformer) + }; + } + + @Override + public Item getItemForRenderer() { return Item.getItemFromBlock(ModBlocks.red_pylon_medium_wood); } + + @Override + public IItemRenderer getRenderer() { + return new ItemRenderBase( ) { + public void renderInventory() { + GL11.glTranslated(1, -5, 0); + GL11.glScaled(4.5, 4.5, 4.5); + } + public void renderCommonWithStack(ItemStack stack) { + GL11.glRotatef(90, 0F, 1F, 0F); + GL11.glScaled(0.5, 0.5, 0.5); + GL11.glTranslated(0.75, 0, 0); + + if(stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon_medium_steel) || stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon_medium_steel_transformer)) + bindTexture(ResourceManager.pylon_medium_steel_tex); + else + bindTexture(ResourceManager.pylon_medium_tex); + + ResourceManager.pylon_medium.renderPart("Pylon"); + + if(stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon_medium_wood_transformer) || stack.getItem() == Item.getItemFromBlock(ModBlocks.red_pylon_medium_steel_transformer)) + ResourceManager.pylon_medium.renderPart("Transformer"); + } + }; + } +} diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index b5fe97b8e..ca90591b5 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -382,6 +382,7 @@ public class TileMappings { put(TileEntityConnector.class, "tileentity_connector_redwire"); put(TileEntityPylon.class, "tileentity_pylon_redwire"); + put(TileEntityPylonMedium.class, "tileentity_pylon_medium"); put(TileEntityPylonLarge.class, "tileentity_pylon_large"); put(TileEntitySubstation.class, "tileentity_substation"); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java index 49da2622f..080001df1 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java @@ -156,6 +156,7 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { public static enum ConnectionType { SINGLE, + TRIPLE, QUAD //more to follow } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonLarge.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonLarge.java index f0ef0c3d5..03b588ed0 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylonLarge.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonLarge.java @@ -37,5 +37,4 @@ public class TileEntityPylonLarge extends TileEntityPylonBase { public double getMaxWireLength() { return 100; } - } diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonMedium.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonMedium.java new file mode 100644 index 000000000..fd7cb146f --- /dev/null +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonMedium.java @@ -0,0 +1,59 @@ +package com.hbm.tileentity.network; + +import com.hbm.blocks.ModBlocks; +import com.hbm.util.fauxpointtwelve.BlockPos; +import com.hbm.util.fauxpointtwelve.DirPos; + +import api.hbm.energymk2.Nodespace.PowerNode; +import net.minecraft.block.Block; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.Vec3; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityPylonMedium extends TileEntityPylonBase { + + @Override + public ConnectionType getConnectionType() { + return ConnectionType.TRIPLE; + } + + @Override + public Vec3[] getMountPos() { + + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + double height = 7.5D; + + return new Vec3[] { + Vec3.createVectorHelper(0.5, height, 0.5), + Vec3.createVectorHelper(0.5 + dir.offsetX, height, 0.5 + dir.offsetZ), + Vec3.createVectorHelper(0.5 + dir.offsetX * 2, height, 0.5 + dir.offsetZ * 2), + }; + } + + @Override + public double getMaxWireLength() { + return 45; + } + + @Override + public boolean canConnect(ForgeDirection dir) { + return this.hasTransformer() ? ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getOpposite() == dir : false; + } + + @Override + public PowerNode createNode() { + TileEntity tile = (TileEntity) this; + PowerNode node = new PowerNode(new BlockPos(tile.xCoord, tile.yCoord, tile.zCoord)).setConnections(new DirPos(xCoord, yCoord, zCoord, ForgeDirection.UNKNOWN)); + for(int[] pos : this.connected) node.addConnection(new DirPos(pos[0], pos[1], pos[2], ForgeDirection.UNKNOWN)); + if(this.hasTransformer()) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10).getOpposite(); + node.addConnection(new DirPos(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ, dir)); + } + return node; + } + + public boolean hasTransformer() { + Block block = this.getBlockType(); + return block == ModBlocks.red_pylon_medium_wood_transformer || block == ModBlocks.red_pylon_medium_steel_transformer; + } +} diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2a1bfc4be..2c3be2817 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -4482,6 +4482,10 @@ tile.red_cable_paintable.name=Geschirmtes rotes Kupferkabel (Färbbar) tile.red_connector.name=Stromverbindungsstück tile.red_pylon.name=Strommasten tile.red_pylon_large.name=Hochspannungsmasten +tile.red_pylon_medium_steel.name=Stählerner mittelgroßer Strommasten +tile.red_pylon_medium_steel_transformer.name=Stählerner mittelgroßer Strommasten mit Transformator +tile.red_pylon_medium_wood.name=Hölzerner mittelgroßer Strommasten +tile.red_pylon_medium_wood_transformer.name=Hölzerner mittelgroßer Strommasten mit Transformator tile.red_wire_coated.name=Geschirmtes rotes Kupferkabel tile.reinforced_brick.name=Verstärkter Stein tile.reinforced_brick_stairs.name=Verstärkte Steintreppe diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 7d74c5a94..32a776667 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -5537,8 +5537,12 @@ tile.red_cable_gauge.name=Power Gauge tile.red_cable_gauge.desc=Cable that displays how much power$moves within the network per tick.$Split networks connected by energy$storage blocks are considered as one shared network. tile.red_cable_paintable.name=Paintable Red Copper Cable tile.red_connector.name=Electricity Connector -tile.red_pylon.name=Electricity Pole +tile.red_pylon.name=Electricity Pylon tile.red_pylon_large.name=Large Electricity Pylon +tile.red_pylon_medium_steel.name=Medium Steel Electicity Pylon +tile.red_pylon_medium_steel_transformer.name=Medium Steel Electicity Pylon with Transformer +tile.red_pylon_medium_wood.name=Medium Wooden Electicity Pylon +tile.red_pylon_medium_wood_transformer.name=Medium Wooden Electicity Pylon with Transformer tile.red_wire_coated.name=Coated Red Copper Cable tile.reinforced_brick.name=Reinforced Stone tile.reinforced_brick_stairs.name=Reinforced Stone Stairs diff --git a/src/main/resources/assets/hbm/models/network/pylon_medium.obj b/src/main/resources/assets/hbm/models/network/pylon_medium.obj new file mode 100644 index 000000000..750e781b9 --- /dev/null +++ b/src/main/resources/assets/hbm/models/network/pylon_medium.obj @@ -0,0 +1,1023 @@ +# Blender v2.79 (sub 0) OBJ File: 'pylon_medium.blend' +# www.blender.org +o Transformer +v -0.187500 0.312500 -0.250000 +v 0.187500 0.312500 -0.250000 +v -0.187500 0.687500 -0.250000 +v 0.187500 0.687500 -0.250000 +v -0.187500 0.687500 -0.500000 +v -0.187500 0.312500 -0.500000 +v 0.187500 0.312500 -0.500000 +v 0.187500 0.687500 -0.500000 +v -0.250000 5.500000 -0.125000 +v 0.250000 5.500000 -0.125000 +v -0.250000 6.500000 -0.125000 +v 0.250000 6.500000 -0.125000 +v -0.250000 6.500000 -0.625000 +v -0.250000 5.500000 -0.625000 +v 0.250000 5.500000 -0.625000 +v 0.250000 6.500000 -0.625000 +v -0.062500 1.000000 -0.125000 +v 0.062500 1.000000 -0.125000 +v -0.062500 1.000000 -0.187500 +v 0.062500 1.000000 -0.187500 +v -0.062500 5.500000 -0.125000 +v 0.062500 5.500000 -0.125000 +v -0.062500 5.500000 -0.187500 +v 0.062500 5.500000 -0.187500 +v -0.062500 6.500000 -0.125000 +v 0.062500 6.500000 -0.125000 +v -0.062500 6.500000 -0.187500 +v 0.062500 6.500000 -0.187500 +v -0.062500 6.937500 -0.125000 +v 0.062500 6.937500 -0.125000 +v -0.062500 6.875000 -0.187500 +v 0.062500 6.875000 -0.187500 +v -0.187500 5.562500 0.187500 +v 0.187500 5.562500 0.187500 +v -0.187500 5.562500 -0.125000 +v 0.187500 5.562500 -0.125000 +v -0.187500 5.687500 -0.125000 +v -0.187500 5.687500 0.187500 +v 0.187500 5.687500 0.187500 +v 0.187500 5.687500 -0.125000 +v -0.187500 6.312500 0.187500 +v 0.187500 6.312500 0.187500 +v -0.187500 6.312500 -0.125000 +v 0.187500 6.312500 -0.125000 +v -0.187500 6.437500 -0.125000 +v -0.187500 6.437500 0.187500 +v 0.187500 6.437500 0.187500 +v 0.187500 6.437500 -0.125000 +vt 0.846154 0.312500 +vt 0.692308 0.437500 +vt 0.692308 0.312500 +vt 0.730769 0.265625 +vt 0.615385 0.218750 +vt 0.730769 0.218750 +vt 0.538462 0.218750 +vt 0.615385 0.265625 +vt 0.538462 0.265625 +vt 0.807692 0.265625 +vt 0.807692 0.218750 +vt 0.615385 0.296875 +vt 0.730769 0.296875 +vt 0.730769 0.187500 +vt 0.615385 0.187500 +vt 0.538462 0.437500 +vt 0.384615 0.312500 +vt 0.538462 0.312500 +vt 0.384615 0.500000 +vt 0.538462 0.500000 +vt 0.538462 0.250000 +vt 0.384615 0.250000 +vt 1.000000 0.437500 +vt 0.846154 0.437500 +vt 0.057692 0.562500 +vt 0.019231 0.000000 +vt 0.057692 0.000000 +vt 0.019231 0.562500 +vt -0.000000 0.000000 +vt 0.076923 0.562500 +vt 0.076923 0.000000 +vt 0.057692 0.859375 +vt 0.019231 0.812500 +vt 0.057692 0.812500 +vt 0.019231 0.859375 +vt 0.000000 0.812500 +vt 0.076923 0.812500 +vt 0.057692 0.867188 +vt 0.788462 0.437500 +vt 0.903846 0.476562 +vt 0.788462 0.476562 +vt 0.903846 0.492188 +vt 0.788462 0.531250 +vt 0.788462 0.492188 +vt 0.788462 0.437500 +vt 0.903846 0.476562 +vt 0.788462 0.476562 +vt 1.000000 0.476562 +vt 0.692308 0.492188 +vt 0.692308 0.476562 +vt 0.903846 0.492188 +vt 0.788462 0.531250 +vt 0.788462 0.492188 +vt 1.000000 0.476562 +vt 0.692308 0.492188 +vt 0.692308 0.476562 +vt 0.384615 0.437500 +vt 1.000000 0.312500 +vt -0.000000 0.562500 +vt 0.000000 0.867188 +vt 0.076923 0.867188 +vt 0.019231 0.867188 +vt 0.903846 0.437500 +vt 0.903846 0.531250 +vt 0.903846 0.437500 +vt 1.000000 0.492188 +vt 0.903846 0.531250 +vt 1.000000 0.492188 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +s off +f 10/1/1 11/2/1 9/3/1 +f 5/4/2 7/5/2 6/6/2 +f 2/7/3 8/8/3 4/9/3 +f 3/10/4 6/6/4 1/11/4 +f 4/12/5 5/4/5 3/13/5 +f 1/14/6 7/5/6 2/15/6 +f 13/16/2 15/17/2 14/18/2 +f 12/19/5 13/16/5 11/20/5 +f 9/21/6 15/17/6 10/22/6 +f 10/1/3 16/23/3 12/24/3 +f 11/2/4 14/18/4 9/3/4 +f 23/25/2 20/26/2 19/27/2 +f 24/28/3 18/29/3 20/26/3 +f 21/30/4 19/27/4 17/31/4 +f 31/32/2 28/33/2 27/34/2 +f 32/35/3 26/36/3 28/33/3 +f 25/37/4 31/32/4 27/34/4 +f 29/38/7 32/35/7 31/32/7 +f 35/39/6 34/40/6 33/41/6 +f 39/42/5 37/43/5 38/44/5 +f 43/45/6 42/46/6 41/47/6 +f 34/40/1 38/44/1 33/41/1 +f 36/48/3 39/42/3 34/40/3 +f 33/41/4 37/49/4 35/50/4 +f 47/51/5 45/52/5 46/53/5 +f 42/46/1 46/53/1 41/47/1 +f 44/54/3 47/51/3 42/46/3 +f 41/47/4 45/55/4 43/56/4 +f 10/1/1 12/24/1 11/2/1 +f 5/4/2 8/8/2 7/5/2 +f 2/7/3 7/5/3 8/8/3 +f 3/10/4 5/4/4 6/6/4 +f 4/12/5 8/8/5 5/4/5 +f 1/14/6 6/6/6 7/5/6 +f 13/16/2 16/57/2 15/17/2 +f 12/19/5 16/57/5 13/16/5 +f 9/21/6 14/18/6 15/17/6 +f 10/1/3 15/58/3 16/23/3 +f 11/2/4 13/16/4 14/18/4 +f 23/25/2 24/28/2 20/26/2 +f 24/28/3 22/59/3 18/29/3 +f 21/30/4 23/25/4 19/27/4 +f 31/32/2 32/35/2 28/33/2 +f 32/35/3 30/60/3 26/36/3 +f 25/37/4 29/61/4 31/32/4 +f 29/38/7 30/62/7 32/35/7 +f 35/39/6 36/63/6 34/40/6 +f 39/42/5 40/64/5 37/43/5 +f 43/45/6 44/65/6 42/46/6 +f 34/40/1 39/42/1 38/44/1 +f 36/48/3 40/66/3 39/42/3 +f 33/41/4 38/44/4 37/49/4 +f 47/51/5 48/67/5 45/52/5 +f 42/46/1 47/51/1 46/53/1 +f 44/54/3 48/68/3 47/51/3 +f 41/47/4 46/53/4 45/55/4 +o Pylon +v -0.250000 0.000000 0.250000 +v 0.250000 0.000000 0.250000 +v -0.250000 0.000000 -0.250000 +v 0.250000 0.000000 -0.250000 +v -0.250000 1.000000 0.250000 +v 0.250000 1.000000 0.250000 +v -0.250000 1.000000 -0.250000 +v 0.250000 1.000000 -0.250000 +v -0.125000 1.000000 0.125000 +v 0.125000 1.000000 0.125000 +v -0.125000 1.000000 -0.125000 +v 0.125000 1.000000 -0.125000 +v -0.125000 7.000000 0.125000 +v 0.125000 7.000000 0.125000 +v -0.125000 7.000000 -0.125000 +v 0.125000 7.000000 -0.125000 +v -0.125000 7.000000 0.125000 +v 0.125000 7.000000 0.125000 +v -0.125000 7.000000 -0.125000 +v 0.125000 7.000000 -0.125000 +v -0.125000 7.062500 -0.125000 +v -0.125000 7.062500 0.125000 +v 0.125000 7.062500 0.125000 +v 0.125000 7.062500 -0.125000 +v -0.187500 7.062500 -0.187500 +v -0.187500 7.062500 0.187500 +v 0.187500 7.062500 0.187500 +v 0.187500 7.062500 -0.187500 +v -0.187500 7.187500 -0.187500 +v -0.187500 7.187500 0.187500 +v 0.187500 7.187500 0.187500 +v 0.187500 7.187500 -0.187500 +v -0.125000 7.187500 0.125000 +v 0.125000 7.187500 0.125000 +v -0.125000 7.187500 -0.125000 +v 0.125000 7.187500 -0.125000 +v -0.125000 7.250000 -0.125000 +v -0.125000 7.250000 0.125000 +v 0.125000 7.250000 0.125000 +v 0.125000 7.250000 -0.125000 +v -0.187500 7.250000 -0.187500 +v -0.187500 7.250000 0.187500 +v 0.187500 7.250000 0.187500 +v 0.187500 7.250000 -0.187500 +v -0.187500 7.375000 -0.187500 +v -0.187500 7.375000 0.187500 +v 0.187500 7.375000 0.187500 +v 0.187500 7.375000 -0.187500 +v -0.125000 7.375000 0.125000 +v 0.125000 7.375000 0.125000 +v -0.125000 7.375000 -0.125000 +v 0.125000 7.375000 -0.125000 +v -0.125000 7.437500 -0.125000 +v -0.125000 7.437500 0.125000 +v 0.125000 7.437500 0.125000 +v 0.125000 7.437500 -0.125000 +v -0.062500 7.437500 -0.062500 +v -0.062500 7.437500 0.062500 +v 0.062500 7.437500 0.062500 +v 0.062500 7.437500 -0.062500 +v -0.062500 7.562500 -0.062500 +v -0.062500 7.562500 0.062500 +v 0.062500 7.562500 0.062500 +v 0.062500 7.562500 -0.062500 +v -0.125000 7.000000 2.125000 +v 0.125000 7.000000 2.125000 +v -0.125000 6.750000 2.125000 +v 0.125000 6.750000 2.125000 +v -0.125000 7.000000 0.125000 +v 0.125000 7.000000 0.125000 +v -0.125000 6.750000 0.125000 +v 0.125000 6.750000 0.125000 +v -0.062500 5.750000 0.125000 +v 0.062500 5.750000 0.125000 +v -0.062500 6.000000 0.125000 +v 0.062500 6.000000 0.125000 +v -0.062500 6.750000 1.125000 +v 0.062500 6.750000 1.125000 +v -0.062500 6.750000 0.875000 +v 0.062500 6.750000 0.875000 +v -0.125000 7.000000 1.125000 +v 0.125000 7.000000 1.125000 +v -0.125000 7.000000 0.875000 +v 0.125000 7.000000 0.875000 +v -0.125000 7.062500 0.875000 +v -0.125000 7.062500 1.125000 +v 0.125000 7.062500 1.125000 +v 0.125000 7.062500 0.875000 +v -0.187500 7.062500 0.812500 +v -0.187500 7.062500 1.187500 +v 0.187500 7.062500 1.187500 +v 0.187500 7.062500 0.812500 +v -0.187500 7.187500 0.812500 +v -0.187500 7.187500 1.187500 +v 0.187500 7.187500 1.187500 +v 0.187500 7.187500 0.812500 +v -0.125000 7.187500 1.125000 +v 0.125000 7.187500 1.125000 +v -0.125000 7.187500 0.875000 +v 0.125000 7.187500 0.875000 +v -0.125000 7.250000 0.875000 +v -0.125000 7.250000 1.125000 +v 0.125000 7.250000 1.125000 +v 0.125000 7.250000 0.875000 +v -0.187500 7.250000 0.812500 +v -0.187500 7.250000 1.187500 +v 0.187500 7.250000 1.187500 +v 0.187500 7.250000 0.812500 +v -0.187500 7.375000 0.812500 +v -0.187500 7.375000 1.187500 +v 0.187500 7.375000 1.187500 +v 0.187500 7.375000 0.812500 +v -0.125000 7.375000 1.125000 +v 0.125000 7.375000 1.125000 +v -0.125000 7.375000 0.875000 +v 0.125000 7.375000 0.875000 +v -0.125000 7.437500 0.875000 +v -0.125000 7.437500 1.125000 +v 0.125000 7.437500 1.125000 +v 0.125000 7.437500 0.875000 +v -0.062500 7.437500 0.937500 +v -0.062500 7.437500 1.062500 +v 0.062500 7.437500 1.062500 +v 0.062500 7.437500 0.937500 +v -0.062500 7.562500 0.937500 +v -0.062500 7.562500 1.062500 +v 0.062500 7.562500 1.062500 +v 0.062500 7.562500 0.937500 +v -0.125000 7.000000 2.125000 +v 0.125000 7.000000 2.125000 +v -0.125000 7.000000 1.875000 +v 0.125000 7.000000 1.875000 +v -0.125000 7.062500 1.875000 +v -0.125000 7.062500 2.125000 +v 0.125000 7.062500 2.125000 +v 0.125000 7.062500 1.875000 +v -0.187500 7.062500 1.812500 +v -0.187500 7.062500 2.187500 +v 0.187500 7.062500 2.187500 +v 0.187500 7.062500 1.812500 +v -0.187500 7.187500 1.812500 +v -0.187500 7.187500 2.187500 +v 0.187500 7.187500 2.187500 +v 0.187500 7.187500 1.812500 +v -0.125000 7.187500 2.125000 +v 0.125000 7.187500 2.125000 +v -0.125000 7.187500 1.875000 +v 0.125000 7.187500 1.875000 +v -0.125000 7.250000 1.875000 +v -0.125000 7.250000 2.125000 +v 0.125000 7.250000 2.125000 +v 0.125000 7.250000 1.875000 +v -0.187500 7.250000 1.812500 +v -0.187500 7.250000 2.187500 +v 0.187500 7.250000 2.187500 +v 0.187500 7.250000 1.812500 +v -0.187500 7.375000 1.812500 +v -0.187500 7.375000 2.187500 +v 0.187500 7.375000 2.187500 +v 0.187500 7.375000 1.812500 +v -0.125000 7.375000 2.125000 +v 0.125000 7.375000 2.125000 +v -0.125000 7.375000 1.875000 +v 0.125000 7.375000 1.875000 +v -0.125000 7.437500 1.875000 +v -0.125000 7.437500 2.125000 +v 0.125000 7.437500 2.125000 +v 0.125000 7.437500 1.875000 +v -0.062500 7.437500 1.937500 +v -0.062500 7.437500 2.062500 +v 0.062500 7.437500 2.062500 +v 0.062500 7.437500 1.937500 +v -0.062500 7.562500 1.937500 +v -0.062500 7.562500 2.062500 +v 0.062500 7.562500 2.062500 +v 0.062500 7.562500 1.937500 +vt 0.538462 -0.000000 +vt 0.384615 0.062500 +vt 0.384615 -0.000000 +vt 0.538462 0.062500 +vt 0.384615 0.187500 +vt 0.846154 0.062500 +vt 0.692308 0.187500 +vt 0.692308 0.062500 +vt 0.538462 0.187500 +vt 1.000000 0.062500 +vt 0.846154 0.187500 +vt 0.230769 0.000000 +vt 0.153846 0.750000 +vt 0.153846 0.000000 +vt 0.384615 0.250000 +vt 0.538462 0.250000 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.384615 0.000000 +vt 0.307692 0.750000 +vt 0.307692 0.000000 +vt 0.076923 0.750000 +vt 0.076923 0.000000 +vt 0.230769 0.750000 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.403846 0.789062 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.403846 0.828125 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.480769 0.820312 +vt 0.403846 0.820312 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.906250 +vt 0.461538 0.890625 +vt 0.461538 0.906250 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.750000 +vt 0.384615 0.781250 +vt 0.384615 0.750000 +vt 0.615385 0.750000 +vt 0.692308 0.500000 +vt 0.692308 0.750000 +vt 0.461538 0.500000 +vt 0.538462 0.500000 +vt 0.538462 0.750000 +vt 0.615385 0.500000 +vt 0.961538 0.875000 +vt 0.923077 0.781250 +vt 0.961538 0.781250 +vt 0.769231 0.656250 +vt 1.000000 0.531250 +vt 1.000000 0.562500 +vt 1.000000 0.906250 +vt 0.961538 0.781250 +vt 1.000000 0.781250 +vt 1.000000 0.781250 +vt 0.692308 0.687500 +vt 0.692308 0.656250 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.403846 0.789062 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.403846 0.828125 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.480769 0.820312 +vt 0.403846 0.820312 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.906250 +vt 0.461538 0.890625 +vt 0.461538 0.906250 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.403846 0.789062 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.781250 +vt 0.480769 0.781250 +vt 0.403846 0.789062 +vt 0.403846 0.781250 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.789062 +vt 0.480769 0.789062 +vt 0.384615 0.796875 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.403846 0.828125 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.500000 0.796875 +vt 0.384615 0.812500 +vt 0.480769 0.820312 +vt 0.403846 0.820312 +vt 0.480769 0.820312 +vt 0.403846 0.828125 +vt 0.403846 0.820312 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.480769 0.828125 +vt 0.480769 0.828125 +vt 0.384615 0.835938 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.835938 +vt 0.384615 0.851562 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.500000 0.812500 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.480769 0.859375 +vt 0.403846 0.867188 +vt 0.403846 0.859375 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.500000 0.851562 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.875000 +vt 0.480769 0.867188 +vt 0.423077 0.906250 +vt 0.461538 0.890625 +vt 0.461538 0.906250 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 0.461538 0.875000 +vt 0.423077 0.890625 +vt 1.000000 0.187500 +vt 0.384615 0.750000 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.781250 +vt 0.384615 0.500000 +vt 0.923077 0.875000 +vt 0.692308 0.656250 +vt 0.961538 0.906250 +vt 0.923077 0.781250 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vt 0.461538 0.890625 +vn 0.0000 -1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 -0.7071 +vn 0.0000 -0.7071 0.7071 +s off +f 51/69/8 50/70/8 49/71/8 +f 52/72/9 54/73/9 50/70/9 +f 49/74/10 55/75/10 51/76/10 +f 51/76/11 56/77/11 52/72/11 +f 50/78/12 53/79/12 49/74/12 +f 59/80/11 64/81/11 60/82/11 +f 53/83/13 56/77/13 55/84/13 +f 84/85/9 87/86/9 82/87/9 +f 58/88/12 61/89/12 57/90/12 +f 60/82/9 62/91/9 58/92/9 +f 57/90/10 63/93/10 59/80/10 +f 81/94/10 85/95/10 83/96/10 +f 69/97/8 76/98/8 72/99/8 +f 68/100/9 71/101/9 66/102/9 +f 65/103/10 69/104/10 67/105/10 +f 67/106/11 72/99/11 68/107/11 +f 66/108/12 70/109/12 65/110/12 +f 76/111/9 79/112/9 75/113/9 +f 71/114/8 74/115/8 70/109/8 +f 72/116/8 75/113/8 71/101/8 +f 70/117/8 73/118/8 69/104/8 +f 85/119/8 92/120/8 88/121/8 +f 74/122/10 77/123/10 73/118/10 +f 73/124/11 80/125/11 76/98/11 +f 75/126/12 78/127/12 74/115/12 +f 83/128/11 88/121/11 84/129/11 +f 82/130/12 86/131/12 81/132/12 +f 92/133/9 95/134/9 91/135/9 +f 87/136/8 90/137/8 86/131/8 +f 88/138/8 91/135/8 87/86/8 +f 86/139/8 89/140/8 85/95/8 +f 90/141/10 93/142/10 89/140/10 +f 89/143/11 96/144/11 92/120/11 +f 91/145/12 94/146/12 90/137/12 +f 82/130/13 78/127/13 79/147/13 +f 84/85/13 79/112/13 80/148/13 +f 83/128/13 80/125/13 77/149/13 +f 81/94/13 77/123/13 78/150/13 +f 100/151/9 103/152/9 98/153/9 +f 97/154/10 101/155/10 99/156/10 +f 99/157/11 104/158/11 100/159/11 +f 98/160/12 102/161/12 97/162/12 +f 98/160/13 94/146/13 95/163/13 +f 100/151/13 95/134/13 96/164/13 +f 99/157/13 96/144/13 93/165/13 +f 97/154/13 93/142/13 94/166/13 +f 102/167/13 105/168/13 101/155/13 +f 108/169/9 111/170/9 107/171/9 +f 101/172/13 108/173/13 104/158/13 +f 103/174/13 106/175/13 102/161/13 +f 104/176/13 107/171/13 103/152/13 +f 110/177/13 112/178/13 109/179/13 +f 106/180/10 109/181/10 105/168/10 +f 105/182/11 112/183/11 108/173/11 +f 107/184/12 110/185/12 106/175/12 +f 113/186/12 116/187/12 114/188/12 +f 116/189/9 118/190/9 114/191/9 +f 114/188/13 117/192/13 113/186/13 +f 113/186/10 119/193/10 115/194/10 +f 115/194/8 120/195/8 116/189/8 +f 127/196/14 124/197/14 123/198/14 +f 128/199/9 122/200/9 124/201/9 +f 126/202/15 121/203/15 122/204/15 +f 125/205/10 123/206/10 121/207/10 +f 148/208/9 151/209/9 146/210/9 +f 145/211/10 149/212/10 147/213/10 +f 133/214/8 140/215/8 136/216/8 +f 132/217/9 135/218/9 130/219/9 +f 129/220/10 133/221/10 131/222/10 +f 131/223/11 136/216/11 132/224/11 +f 130/225/12 134/226/12 129/227/12 +f 140/228/9 143/229/9 139/230/9 +f 135/231/8 138/232/8 134/226/8 +f 136/233/8 139/230/8 135/218/8 +f 134/234/8 137/235/8 133/221/8 +f 149/236/8 156/237/8 152/238/8 +f 138/239/10 141/240/10 137/235/10 +f 137/241/11 144/242/11 140/215/11 +f 139/243/12 142/244/12 138/232/12 +f 147/245/11 152/238/11 148/246/11 +f 146/247/12 150/248/12 145/249/12 +f 156/250/9 159/251/9 155/252/9 +f 151/253/8 154/254/8 150/248/8 +f 152/255/8 155/252/8 151/209/8 +f 150/256/8 153/257/8 149/212/8 +f 154/258/10 157/259/10 153/257/10 +f 153/260/11 160/261/11 156/237/11 +f 155/262/12 158/263/12 154/254/12 +f 146/247/13 142/244/13 143/264/13 +f 148/208/13 143/229/13 144/265/13 +f 147/245/13 144/242/13 141/266/13 +f 145/211/13 141/240/13 142/267/13 +f 164/268/9 167/269/9 162/270/9 +f 161/271/10 165/272/10 163/273/10 +f 163/274/11 168/275/11 164/276/11 +f 162/277/12 166/278/12 161/279/12 +f 162/277/13 158/263/13 159/280/13 +f 164/268/13 159/251/13 160/281/13 +f 163/274/13 160/261/13 157/282/13 +f 161/271/13 157/259/13 158/283/13 +f 166/284/13 169/285/13 165/272/13 +f 172/286/9 175/287/9 171/288/9 +f 165/289/13 172/290/13 168/275/13 +f 167/291/13 170/292/13 166/278/13 +f 168/293/13 171/288/13 167/269/13 +f 174/294/13 176/295/13 173/296/13 +f 170/297/10 173/298/10 169/285/10 +f 169/299/11 176/300/11 172/290/11 +f 171/301/12 174/302/12 170/292/12 +f 196/303/9 199/304/9 194/305/9 +f 193/306/10 197/307/10 195/308/10 +f 181/309/8 188/310/8 184/311/8 +f 180/312/9 183/313/9 178/314/9 +f 177/315/10 181/316/10 179/317/10 +f 179/318/11 184/311/11 180/319/11 +f 178/320/12 182/321/12 177/322/12 +f 188/323/9 191/324/9 187/325/9 +f 183/326/8 186/327/8 182/321/8 +f 184/328/8 187/325/8 183/313/8 +f 182/329/8 185/330/8 181/316/8 +f 197/331/8 204/332/8 200/333/8 +f 186/334/10 189/335/10 185/330/10 +f 185/336/11 192/337/11 188/310/11 +f 187/338/12 190/339/12 186/327/12 +f 195/340/11 200/333/11 196/341/11 +f 194/342/12 198/343/12 193/344/12 +f 204/345/9 207/346/9 203/347/9 +f 199/348/8 202/349/8 198/343/8 +f 200/350/8 203/347/8 199/304/8 +f 198/351/8 201/352/8 197/307/8 +f 202/353/10 205/354/10 201/352/10 +f 201/355/11 208/356/11 204/332/11 +f 203/357/12 206/358/12 202/349/12 +f 194/342/13 190/339/13 191/359/13 +f 196/303/13 191/324/13 192/360/13 +f 195/340/13 192/337/13 189/361/13 +f 193/306/13 189/335/13 190/362/13 +f 212/363/9 215/364/9 210/365/9 +f 209/366/10 213/367/10 211/368/10 +f 211/369/11 216/370/11 212/371/11 +f 210/372/12 214/373/12 209/374/12 +f 210/372/13 206/358/13 207/375/13 +f 212/363/13 207/346/13 208/376/13 +f 211/369/13 208/356/13 205/377/13 +f 209/366/13 205/354/13 206/378/13 +f 214/379/13 217/380/13 213/367/13 +f 220/381/9 223/382/9 219/383/9 +f 213/384/13 220/385/13 216/370/13 +f 215/386/13 218/387/13 214/373/13 +f 216/388/13 219/383/13 215/364/13 +f 222/389/13 224/390/13 221/391/13 +f 218/392/10 221/393/10 217/380/10 +f 217/394/11 224/395/11 220/385/11 +f 219/396/12 222/397/12 218/387/12 +f 51/69/8 52/72/8 50/70/8 +f 52/72/9 56/77/9 54/73/9 +f 49/74/10 53/79/10 55/75/10 +f 51/76/11 55/75/11 56/77/11 +f 50/78/12 54/398/12 53/79/12 +f 59/80/11 63/93/11 64/81/11 +f 53/83/13 54/73/13 56/77/13 +f 84/85/9 88/138/9 87/86/9 +f 58/88/12 62/399/12 61/89/12 +f 60/82/9 64/81/9 62/91/9 +f 57/90/10 61/89/10 63/93/10 +f 81/94/10 86/139/10 85/95/10 +f 69/97/8 73/124/8 76/98/8 +f 68/100/9 72/116/9 71/101/9 +f 65/103/10 70/117/10 69/104/10 +f 67/106/11 69/97/11 72/99/11 +f 66/108/12 71/114/12 70/109/12 +f 76/111/9 80/148/9 79/112/9 +f 71/114/8 75/126/8 74/115/8 +f 72/116/8 76/111/8 75/113/8 +f 70/117/8 74/122/8 73/118/8 +f 85/119/8 89/143/8 92/120/8 +f 74/122/10 78/150/10 77/123/10 +f 73/124/11 77/149/11 80/125/11 +f 75/126/12 79/147/12 78/127/12 +f 83/128/11 85/119/11 88/121/11 +f 82/130/12 87/136/12 86/131/12 +f 92/133/9 96/164/9 95/134/9 +f 87/136/8 91/145/8 90/137/8 +f 88/138/8 92/133/8 91/135/8 +f 86/139/8 90/141/8 89/140/8 +f 90/141/10 94/166/10 93/142/10 +f 89/143/11 93/165/11 96/144/11 +f 91/145/12 95/163/12 94/146/12 +f 82/130/13 81/132/13 78/127/13 +f 84/85/13 82/87/13 79/112/13 +f 83/128/13 84/129/13 80/125/13 +f 81/94/13 83/96/13 77/123/13 +f 100/151/9 104/176/9 103/152/9 +f 97/154/10 102/167/10 101/155/10 +f 99/157/11 101/172/11 104/158/11 +f 98/160/12 103/174/12 102/161/12 +f 98/160/13 97/162/13 94/146/13 +f 100/151/13 98/153/13 95/134/13 +f 99/157/13 100/159/13 96/144/13 +f 97/154/13 99/156/13 93/142/13 +f 102/167/13 106/180/13 105/168/13 +f 108/169/9 112/178/9 111/170/9 +f 101/172/13 105/182/13 108/173/13 +f 103/174/13 107/184/13 106/175/13 +f 104/176/13 108/169/13 107/171/13 +f 110/177/13 111/170/13 112/178/13 +f 106/180/10 110/400/10 109/181/10 +f 105/182/11 109/401/11 112/183/11 +f 107/184/12 111/402/12 110/185/12 +f 113/186/12 115/403/12 116/187/12 +f 116/189/9 120/195/9 118/190/9 +f 114/188/13 118/404/13 117/192/13 +f 113/186/10 117/192/10 119/193/10 +f 115/194/8 119/193/8 120/195/8 +f 127/196/14 128/405/14 124/197/14 +f 128/199/9 126/406/9 122/200/9 +f 126/202/15 125/407/15 121/203/15 +f 125/205/10 127/408/10 123/206/10 +f 148/208/9 152/255/9 151/209/9 +f 145/211/10 150/256/10 149/212/10 +f 133/214/8 137/241/8 140/215/8 +f 132/217/9 136/233/9 135/218/9 +f 129/220/10 134/234/10 133/221/10 +f 131/223/11 133/214/11 136/216/11 +f 130/225/12 135/231/12 134/226/12 +f 140/228/9 144/265/9 143/229/9 +f 135/231/8 139/243/8 138/232/8 +f 136/233/8 140/228/8 139/230/8 +f 134/234/8 138/239/8 137/235/8 +f 149/236/8 153/260/8 156/237/8 +f 138/239/10 142/267/10 141/240/10 +f 137/241/11 141/266/11 144/242/11 +f 139/243/12 143/264/12 142/244/12 +f 147/245/11 149/236/11 152/238/11 +f 146/247/12 151/253/12 150/248/12 +f 156/250/9 160/281/9 159/251/9 +f 151/253/8 155/262/8 154/254/8 +f 152/255/8 156/250/8 155/252/8 +f 150/256/8 154/258/8 153/257/8 +f 154/258/10 158/283/10 157/259/10 +f 153/260/11 157/282/11 160/261/11 +f 155/262/12 159/280/12 158/263/12 +f 146/247/13 145/249/13 142/244/13 +f 148/208/13 146/210/13 143/229/13 +f 147/245/13 148/246/13 144/242/13 +f 145/211/13 147/213/13 141/240/13 +f 164/268/9 168/293/9 167/269/9 +f 161/271/10 166/284/10 165/272/10 +f 163/274/11 165/289/11 168/275/11 +f 162/277/12 167/291/12 166/278/12 +f 162/277/13 161/279/13 158/263/13 +f 164/268/13 162/270/13 159/251/13 +f 163/274/13 164/276/13 160/261/13 +f 161/271/13 163/273/13 157/259/13 +f 166/284/13 170/297/13 169/285/13 +f 172/286/9 176/295/9 175/287/9 +f 165/289/13 169/299/13 172/290/13 +f 167/291/13 171/301/13 170/292/13 +f 168/293/13 172/286/13 171/288/13 +f 174/294/13 175/287/13 176/295/13 +f 170/297/10 174/409/10 173/298/10 +f 169/299/11 173/410/11 176/300/11 +f 171/301/12 175/411/12 174/302/12 +f 196/303/9 200/350/9 199/304/9 +f 193/306/10 198/351/10 197/307/10 +f 181/309/8 185/336/8 188/310/8 +f 180/312/9 184/328/9 183/313/9 +f 177/315/10 182/329/10 181/316/10 +f 179/318/11 181/309/11 184/311/11 +f 178/320/12 183/326/12 182/321/12 +f 188/323/9 192/360/9 191/324/9 +f 183/326/8 187/338/8 186/327/8 +f 184/328/8 188/323/8 187/325/8 +f 182/329/8 186/334/8 185/330/8 +f 197/331/8 201/355/8 204/332/8 +f 186/334/10 190/362/10 189/335/10 +f 185/336/11 189/361/11 192/337/11 +f 187/338/12 191/359/12 190/339/12 +f 195/340/11 197/331/11 200/333/11 +f 194/342/12 199/348/12 198/343/12 +f 204/345/9 208/376/9 207/346/9 +f 199/348/8 203/357/8 202/349/8 +f 200/350/8 204/345/8 203/347/8 +f 198/351/8 202/353/8 201/352/8 +f 202/353/10 206/378/10 205/354/10 +f 201/355/11 205/377/11 208/356/11 +f 203/357/12 207/375/12 206/358/12 +f 194/342/13 193/344/13 190/339/13 +f 196/303/13 194/305/13 191/324/13 +f 195/340/13 196/341/13 192/337/13 +f 193/306/13 195/308/13 189/335/13 +f 212/363/9 216/388/9 215/364/9 +f 209/366/10 214/379/10 213/367/10 +f 211/369/11 213/384/11 216/370/11 +f 210/372/12 215/386/12 214/373/12 +f 210/372/13 209/374/13 206/358/13 +f 212/363/13 210/365/13 207/346/13 +f 211/369/13 212/371/13 208/356/13 +f 209/366/13 211/368/13 205/354/13 +f 214/379/13 218/392/13 217/380/13 +f 220/381/9 224/390/9 223/382/9 +f 213/384/13 217/394/13 220/385/13 +f 215/386/13 219/396/13 218/387/13 +f 216/388/13 220/381/13 219/383/13 +f 222/389/13 223/382/13 224/390/13 +f 218/392/10 222/412/10 221/393/10 +f 217/394/11 221/413/11 224/395/11 +f 219/396/12 223/414/12 222/397/12 diff --git a/src/main/resources/assets/hbm/textures/models/network/pylon_medium.png b/src/main/resources/assets/hbm/textures/models/network/pylon_medium.png index 415008e7018e26364f177dfe30ac26a4624b31c6..84abea9647e6901e8e14295c41962fe4b282aa64 100644 GIT binary patch delta 2975 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 VUys~4pmhKM002ovPDHLkV1mEZvCjYi delta 920 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 qM*ROodq literal 0 HcmV?d00001 From 9206755363ed55ba23a2356ed579c4937757b05e Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 14 Apr 2024 21:23:28 +0200 Subject: [PATCH 34/48] kaboom --- changelog | 20 +++++++++++++++++- gradle.properties | 4 ++-- .../com/hbm/blocks/bomb/BlockCrashedBomb.java | 2 +- .../hbm/entity/effect/EntityFalloutRain.java | 2 +- .../hbm/entity/effect/EntityNukeTorex.java | 11 ++++++++++ .../com/hbm/entity/logic/EntityBalefire.java | 15 ------------- .../hbm/entity/logic/EntityDeathBlast.java | 2 +- .../entity/logic/EntityNukeExplosionMK5.java | 13 ------------ .../hbm/entity/mob/EntityCreeperNuclear.java | 2 +- .../entity/projectile/EntityBombletZeta.java | 2 +- .../entity/projectile/EntityBulletBaseNT.java | 2 +- .../com/hbm/explosion/ExplosionNukeSmall.java | 2 +- .../hbm/inventory/gui/GUIMachineBattery.java | 2 +- src/main/java/com/hbm/items/ModItems.java | 6 +++--- .../com/hbm/items/special/ItemAutogen.java | 10 +++++++++ .../java/com/hbm/items/tool/ItemDrone.java | 2 ++ src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 2 ++ .../com/hbm/main/ModEventHandlerRenderer.java | 8 +++---- .../hbm/render/entity/effect/RenderTorex.java | 8 +++++++ .../machine/TileEntityMachineCyclotron.java | 4 ++-- src/main/resources/assets/hbm/lang/de_DE.lang | 6 +++--- src/main/resources/assets/hbm/lang/en_US.lang | 6 +++--- src/main/resources/assets/hbm/lang/ru_RU.lang | 6 +++--- src/main/resources/assets/hbm/lang/zh_CN.lang | 2 +- src/main/resources/assets/hbm/sounds.json | 1 + .../hbm/sounds/weapon/nuclearExplosion.ogg | Bin 0 -> 725958 bytes 27 files changed, 83 insertions(+), 59 deletions(-) create mode 100644 src/main/resources/assets/hbm/sounds/weapon/nuclearExplosion.ogg diff --git a/changelog b/changelog index 31bdeeb83..9bd0efd23 100644 --- a/changelog +++ b/changelog @@ -1,10 +1,28 @@ +## The new power network +The entire energy transfer system has been rewritten which should hopefully fix a few things +* Energy should no longer be voided (at least voiding is minimized due to timeouts for unloaded receivers) +* Transfers should be way less resource intensive, as the expected iteration count is now `max(providers, receivers)` instead of `providers * receivers` +The new system should respect priorities and diodes just like the old system did. Batteries still have their original three priority settings, diodes got two additional modes: LOWEST and HIGHEST. +A bunch of tests have been done using the most important machines, however not all machines that had to be changed for the new system have been fully tested. Expect some things to not work, in which case please file a bug report on the issues board. +Just like with the old system, grids going though unloaded chunks should still work so long as the endpoints are loaded. Grids should be less janky when changing while having unloaded parts, wwhich is likely the main cause for energy voiding. +The system can potentially support saving to the world, i.e. keeping unloaded grids functional even after the entire world is unloaded, although the functionality hasn't been implemented yet. + ## Added * New medium sized electricity pylons * Come in wood and steel flavor * The regular ones don't connect to cable blocks, the variants with transformers do (i.e. they act like substations for huge pylons) ## Changed +* Updated russian localization * Condensers now need cast plates instead of welded plates * Tweaked the substation recipe, it now yields two substations +* There is now a config option for steam clouds from cooling towers +* Nuclear explosions no longer play thunder and explosion sounds in a loop, instead they play one singular sound once the shockwave passes the player + * The HUD shake is now also synced up with the shockwave + * In addition to the hud shake, there is one brief screen shake, the same used for mini nukes (although it ends up being more subtle because your screen is most likely covered in shockwave dust) + * The HUD shake is now 3x more intense, but also only 1.5s long (instead of 5) making it snappier -## Fixed \ No newline at end of file +## Fixed +* Changed the translation keys for bolts, pipes and shells to avoid naming conflicts +* Fixed glpyhid scout rampant mode spawning not working correctly +* Fixed nuclear explosions petrifying fallout layers, turning them into full sellafite blocks \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 305737cdc..f9a8ca1d9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4921 +mod_build_number=4935 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ @@ -18,4 +18,4 @@ credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion al \ custom machine holograms, I18n improvements), SuperCraftAlex (tooltips) LePeep (coilgun model, BDCL QC),\ \ 70k (textures, glyphid AI, strand caster), Maksymisio (polish localization) Ice-Arrow (research reactor tweaks),\ \ 245tt (anvil GUI improvements), MellowArpeggiation (new animation system, turbine sounds, sound fixes,\ - \ industrial lights, better particle diodes), FOlkvangrField (custom machine parts) + \ industrial lights, better particle diodes), FOlkvangrField (custom machine parts), KoblizekXD (doors) diff --git a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java index 730cac10b..93683f0d2 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockCrashedBomb.java @@ -98,7 +98,7 @@ public class BlockCrashedBomb extends BlockContainer implements IBomb { if(!world.isRemote) { world.setBlockToAir(x, y, z); - EntityBalefire bf = new EntityBalefire(world).mute(); + EntityBalefire bf = new EntityBalefire(world); bf.posX = x; bf.posY = y; bf.posZ = z; diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index df36d3276..0647627b4 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -169,7 +169,7 @@ public class EntityFalloutRain extends Entity { Block b = worldObj.getBlock(x, y, z); - if(b.getMaterial() == Material.air) continue; + if(b.getMaterial() == Material.air || b == ModBlocks.fallout) continue; if(b == Blocks.bedrock) return; if(b == ModBlocks.volcano_core) { diff --git a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java index 2995732e3..bc6eafaec 100644 --- a/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java +++ b/src/main/java/com/hbm/entity/effect/EntityNukeTorex.java @@ -3,6 +3,7 @@ package com.hbm.entity.effect; import java.awt.Color; import java.util.ArrayList; +import com.hbm.main.MainRegistry; import com.hbm.util.BobMathUtil; import com.hbm.util.TrackerUtil; @@ -29,6 +30,9 @@ public class EntityNukeTorex extends Entity { public ArrayList cloudlets = new ArrayList(); //public static int cloudletLife = 200; + public boolean didPlaySound = false; + public boolean didShake = false; + public EntityNukeTorex(World world) { super(world); this.ignoreFrustumCheck = true; @@ -104,6 +108,13 @@ public class EntityNukeTorex extends Entity { .setScale(7F, 2F) .setMotion(ticksExisted > 15 ? 0.75 : 0)); } + + if(!didPlaySound) { + if(MainRegistry.proxy.me() != null && MainRegistry.proxy.me().getDistanceToEntity(this) < (ticksExisted * 1.5 + 1) * 1.5) { + MainRegistry.proxy.playSoundClient(posX, posY, posZ, "hbm:weapon.nuclearExplosion", 10_000F, 1F); + didPlaySound = true; + } + } } // spawn ring clouds diff --git a/src/main/java/com/hbm/entity/logic/EntityBalefire.java b/src/main/java/com/hbm/entity/logic/EntityBalefire.java index 73c8e51b2..b368e171d 100644 --- a/src/main/java/com/hbm/entity/logic/EntityBalefire.java +++ b/src/main/java/com/hbm/entity/logic/EntityBalefire.java @@ -17,7 +17,6 @@ public class EntityBalefire extends EntityExplosionChunkloading { public ExplosionBalefire exp; public int speed = 1; public boolean did = false; - public boolean mute = false; @Override protected void readEntityFromNBT(NBTTagCompound nbt) { @@ -25,7 +24,6 @@ public class EntityBalefire extends EntityExplosionChunkloading { destructionRange = nbt.getInteger("destructionRange"); speed = nbt.getInteger("speed"); did = nbt.getBoolean("did"); - mute = nbt.getBoolean("mute"); exp = new ExplosionBalefire((int)this.posX, (int)this.posY, (int)this.posZ, this.worldObj, this.destructionRange); @@ -41,7 +39,6 @@ public class EntityBalefire extends EntityExplosionChunkloading { nbt.setInteger("destructionRange", destructionRange); nbt.setInteger("speed", speed); nbt.setBoolean("did", did); - nbt.setBoolean("mute", mute); if(exp != null) exp.saveToNbt(nbt, "exp_"); @@ -79,22 +76,10 @@ public class EntityBalefire extends EntityExplosionChunkloading { } } - if(!mute && rand.nextInt(5) == 0) - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); - if(!flag) { - - if(!mute) - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); - ExplosionNukeGeneric.dealDamage(this.worldObj, this.posX, this.posY, this.posZ, this.destructionRange * 2); } age++; } - - public EntityBalefire mute() { - this.mute = true; - return this; - } } diff --git a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java index c4ffd67f3..75fea35f7 100644 --- a/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java +++ b/src/main/java/com/hbm/entity/logic/EntityDeathBlast.java @@ -37,7 +37,7 @@ public class EntityDeathBlast extends Entity { if(this.ticksExisted >= maxAge && !worldObj.isRemote) { this.setDead(); - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, 40, posX, posY, posZ).mute()); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, 40, posX, posY, posZ)); int count = 100; for(int i = 0; i < count; i++) { diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index 90596a9af..918594e0c 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -29,8 +29,6 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { public int speed; public int length; - public boolean mute = false; - public boolean fallout = true; private int falloutAdd = 0; @@ -66,12 +64,6 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { radiate(2_500_000F / (this.ticksExisted * 5 + 1), this.length * 2); } - if(!mute) { - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "ambient.weather.thunder", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); - if(rand.nextInt(5) == 0) - this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "random.explode", 10000.0F, 0.8F + this.rand.nextFloat() * 0.2F); - } - ExplosionNukeGeneric.dealDamage(this.worldObj, this.posX, this.posY, this.posZ, this.length * 2); if(explosion == null) { @@ -177,9 +169,4 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { falloutAdd = fallout; return this; } - - public EntityNukeExplosionMK5 mute() { - this.mute = true; - return this; - } } diff --git a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java index 3be14d073..1051c9222 100644 --- a/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java +++ b/src/main/java/com/hbm/entity/mob/EntityCreeperNuclear.java @@ -120,7 +120,7 @@ public class EntityCreeperNuclear extends EntityCreeper { worldObj.playSoundEffect(posX, posY + 0.5, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F); if(flag) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, 50, posX, posY, posZ).mute()); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, 50, posX, posY, posZ)); } else { ExplosionNukeGeneric.dealDamage(worldObj, posX, posY + 0.5, posZ, 100); } diff --git a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java index 1571ff841..1a21d96c2 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBombletZeta.java @@ -63,7 +63,7 @@ public class EntityBombletZeta extends EntityThrowable { ExplosionChaos.spawnChlorine(worldObj, this.posX + 0.5F - motionX, this.posY + 0.5F - motionY, this.posZ + 0.5F - motionZ, 75, 2, 0); } if(type == 4) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int) (BombConfig.fatmanRadius * 1.5), posX, posY, posZ).mute()); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int) (BombConfig.fatmanRadius * 1.5), posX, posY, posZ)); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); diff --git a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java index f7a9f5758..20bff21ba 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java +++ b/src/main/java/com/hbm/entity/projectile/EntityBulletBaseNT.java @@ -465,7 +465,7 @@ public class EntityBulletBaseNT extends EntityThrowableInterp implements IBullet } if(config.nuke > 0 && !worldObj.isRemote) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, config.nuke, posX, posY, posZ).mute()); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, config.nuke, posX, posY, posZ)); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); if(MainRegistry.polaroidID == 11 || rand.nextInt(100) == 0) data.setBoolean("balefire", true); diff --git a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java index f9cbfec62..0734db2e5 100644 --- a/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java +++ b/src/main/java/com/hbm/explosion/ExplosionNukeSmall.java @@ -32,7 +32,7 @@ public class ExplosionNukeSmall { if(params.shrapnelCount > 0) ExplosionLarge.spawnShrapnels(world, posX, posY, posZ, params.shrapnelCount); if(params.miniNuke && !params.safe) new ExplosionNT(world, null, posX, posY, posZ, params.blastRadius).addAllAttrib(params.explosionAttribs).overrideResolution(params.resolution).explode(); if(params.killRadius > 0) ExplosionNukeGeneric.dealDamage(world, posX, posY, posZ, params.killRadius); - if(!params.miniNuke) world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ).mute()); + if(!params.miniNuke) world.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(world, (int) params.blastRadius, posX, posY, posZ)); if(params.miniNuke) { float radMod = params.radiationLevel / 3F; diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java index 5b2e00658..f350f477d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java @@ -110,6 +110,6 @@ public class GUIMachineBattery extends GuiInfoContainer { int j = battery.redHigh; drawTexturedModalRect(guiLeft + 133, guiTop + 52, 176, 52 + j * 18, 18, 18); - drawTexturedModalRect(guiLeft + 152, guiTop + 35, 194, 52 + battery.priority.ordinal() * 16, 16, 16); + drawTexturedModalRect(guiLeft + 152, guiTop + 35, 194, 52 + battery.priority.ordinal() * 16 - 16, 16, 16); } } diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 655721323..fbae0fe16 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2590,7 +2590,7 @@ public class ModItems { drill_titanium = new Item().setUnlocalizedName("drill_titanium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":drill_titanium"); plate_dalekanium = new Item().setUnlocalizedName("plate_dalekanium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_dalekanium"); plate_euphemium = new ItemCustomLore().setRarity(EnumRarity.epic).setUnlocalizedName("plate_euphemium").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_euphemium"); - bolt = new ItemAutogen(MaterialShapes.BOLT).setUnlocalizedName("bolt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt"); + bolt = new ItemAutogen(MaterialShapes.BOLT).oun("boltntm").setUnlocalizedName("bolt").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt"); bolt_spike = new ItemCustomLore().setUnlocalizedName("bolt_spike").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":bolt_spike"); plate_polymer = new Item().setUnlocalizedName("plate_polymer").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_polymer"); plate_kevlar = new Item().setUnlocalizedName("plate_kevlar").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":plate_kevlar"); @@ -3009,8 +3009,8 @@ public class ModItems { gear_large = new ItemGear().setUnlocalizedName("gear_large").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":gear_large"); sawblade = new Item().setUnlocalizedName("sawblade").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":sawblade"); - shell = new ItemAutogen(MaterialShapes.SHELL).setUnlocalizedName("shell").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":shell"); - pipe = new ItemAutogen(MaterialShapes.PIPE).setUnlocalizedName("pipe").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pipe"); + shell = new ItemAutogen(MaterialShapes.SHELL).oun("shellntm").setUnlocalizedName("shell").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":shell"); + pipe = new ItemAutogen(MaterialShapes.PIPE).oun("pipentm").setUnlocalizedName("pipe").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":pipe"); fins_flat = new Item().setUnlocalizedName("fins_flat").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":fins_flat"); fins_small_steel = new Item().setUnlocalizedName("fins_small_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":fins_small_steel"); fins_big_steel = new Item().setUnlocalizedName("fins_big_steel").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":fins_big_steel"); diff --git a/src/main/java/com/hbm/items/special/ItemAutogen.java b/src/main/java/com/hbm/items/special/ItemAutogen.java index 7e91dd37f..ea2be4db1 100644 --- a/src/main/java/com/hbm/items/special/ItemAutogen.java +++ b/src/main/java/com/hbm/items/special/ItemAutogen.java @@ -27,6 +27,7 @@ public class ItemAutogen extends Item { private HashMap textureOverrides = new HashMap(); private HashMap iconMap = new HashMap(); + private String overrideUnlocalizedName = null; public ItemAutogen(MaterialShapes shape) { this.setHasSubtypes(true); @@ -38,6 +39,10 @@ public class ItemAutogen extends Item { textureOverrides.put(mat, tex); return this; } + public ItemAutogen oun(String overrideUnlocalizedName) { + this.overrideUnlocalizedName = overrideUnlocalizedName; + return this; + } @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister reg) { @@ -117,4 +122,9 @@ public class ItemAutogen extends Item { String matName = StatCollector.translateToLocal(mat.getUnlocalizedName()); return StatCollector.translateToLocalFormatted(this.getUnlocalizedNameInefficiently(stack) + ".name", matName); } + + @Override + public String getUnlocalizedName(ItemStack stack) { + return overrideUnlocalizedName != null ? "item." + overrideUnlocalizedName : super.getUnlocalizedName(stack); + } } diff --git a/src/main/java/com/hbm/items/tool/ItemDrone.java b/src/main/java/com/hbm/items/tool/ItemDrone.java index 73e43ba14..f63f44fd6 100644 --- a/src/main/java/com/hbm/items/tool/ItemDrone.java +++ b/src/main/java/com/hbm/items/tool/ItemDrone.java @@ -53,6 +53,8 @@ public class ItemDrone extends ItemEnumMulti { world.spawnEntityInWorld(toSpawn); } + stack.stackSize--; + return false; } diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index d4ba6dc9a..3b02435f2 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4921)"; + public static final String VERSION = "1.0.27 BETA (4935)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 281a1d9d0..899a3b118 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -150,6 +150,8 @@ public class ModEventHandlerClient { public static final int flashDuration = 5_000; public static long flashTimestamp; + public static final int shakeDuration = 1_500; + public static long shakeTimestamp; @SubscribeEvent public void onOverlayRender(RenderGameOverlayEvent.Pre event) { diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index fd5bf7d78..7fb0fc35b 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -401,10 +401,10 @@ public class ModEventHandlerRenderer { @SubscribeEvent public void onRenderHUD(RenderGameOverlayEvent.Pre event) { - if(event.type == ElementType.HOTBAR && (ModEventHandlerClient.flashTimestamp + ModEventHandlerClient.flashDuration - System.currentTimeMillis()) > 0) { - double mult = (ModEventHandlerClient.flashTimestamp + ModEventHandlerClient.flashDuration - System.currentTimeMillis()) / (double) ModEventHandlerClient.flashDuration * 2; - double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 5; - double vertical = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.01 + 2), -0.7, 0.7) * 1; + if(event.type == ElementType.HOTBAR && (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) > 0) { + double mult = (ModEventHandlerClient.shakeTimestamp + ModEventHandlerClient.shakeDuration - System.currentTimeMillis()) / (double) ModEventHandlerClient.shakeDuration * 2; + double horizontal = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.02), -0.7, 0.7) * 15; + double vertical = MathHelper.clamp_double(Math.sin(System.currentTimeMillis() * 0.01 + 2), -0.7, 0.7) * 3; GL11.glTranslated(horizontal * mult, vertical * mult, 0); } } diff --git a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java index 809f403f4..674eb8818 100644 --- a/src/main/java/com/hbm/render/entity/effect/RenderTorex.java +++ b/src/main/java/com/hbm/render/entity/effect/RenderTorex.java @@ -38,6 +38,14 @@ public class RenderTorex extends Render { cloudletWrapper(cloud, interp); if(cloud.ticksExisted < 101) flashWrapper(cloud, interp); if(cloud.ticksExisted < 10 && System.currentTimeMillis() - ModEventHandlerClient.flashTimestamp > 1_000) ModEventHandlerClient.flashTimestamp = System.currentTimeMillis(); + if(cloud.didPlaySound && !cloud.didShake && System.currentTimeMillis() - ModEventHandlerClient.shakeTimestamp > 1_000) { + ModEventHandlerClient.shakeTimestamp = System.currentTimeMillis(); + cloud.didShake = true; + EntityPlayer player = MainRegistry.proxy.me(); + player.hurtTime = 15; + player.maxHurtTime = 15; + player.attackedAtYaw = 0F; + } if(fog) GL11.glEnable(GL11.GL_FOG); GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index 2b5d15c08..87660cb63 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -224,7 +224,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(rand < 2) { - worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)(BombConfig.fatmanRadius * 1.5), xCoord + 0.5, yCoord + 1.5, zCoord + 0.5).mute()); + worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int)(BombConfig.fatmanRadius * 1.5), xCoord + 0.5, yCoord + 1.5, zCoord + 0.5)); NBTTagCompound data = new NBTTagCompound(); data.setString("type", "muke"); @@ -233,7 +233,7 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements } else if(rand < 4) { - EntityBalefire bf = new EntityBalefire(worldObj).mute(); + EntityBalefire bf = new EntityBalefire(worldObj); bf.posX = xCoord + 0.5; bf.posY = yCoord + 1.5; bf.posZ = zCoord + 0.5; diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 2c3be2817..fe3f47e99 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -1306,7 +1306,7 @@ item.bobmazon_machines.name=Bobmazon: Blöcke und Maschinen item.bobmazon_materials.name=Bobmazon: Ressourcen item.bobmazon_tools.name=Bobmazon: Werkzeuge item.bobmazon_weapons.name=Bobmazon: Waffen und Sprengstoffe -item.bolt.name=%sbolzen +item.boltntm.name=%sbolzen item.bolt_compound.name=Verstärkte Turbinenwelle item.bolt_spike.name=Gleisnagel item.boltgun.name=Pneumatische Nietenpistole @@ -2713,7 +2713,7 @@ item.pill_iodine.name=Iodpille item.pill_herbal.name=Kräuterpaste item.pill_red.name=Rote Pille item.pin.name=Haarklammer -item.pipe.name=%srohr +item.pipentm.name=%srohr item.pipes_steel.name=Stahlrohre item.pipes_steel.desc=Auf Recycling-Rezepte wurden wegen$Steuerhinterziehung verzichtet. item.piston_selenium.name=Motorkolben @@ -3165,7 +3165,7 @@ item.serum.name=Serum item.servo_set.name=Servo-Set item.servo_set_desh.name=Deshservo-Set item.shackles.name=Fußschellen -item.shell.name=%smantel +item.shellntm.name=%smantel item.shimmer_axe.name=Shimmer Axe item.shimmer_axe_head.name=Schwerer Axtkopf item.shimmer_handle.name=Verstärketer Polymergriff diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 32a776667..d742e6715 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -2009,7 +2009,7 @@ item.bobmazon_machines.name=Bobmazon: Blocks and Machines item.bobmazon_materials.name=Bobmazon: Materials item.bobmazon_tools.name=Bobmazon: Tools item.bobmazon_weapons.name=Bobmazon: Weapons and Explosives -item.bolt.name=%s Bolt +item.boltntm.name=%s Bolt item.bolt_compound.name=Reinforced Turbine Shaft item.bolt_spike.name=Railroad Spike item.bolt_spike.desc=Radiates a threatening aura, somehow @@ -3555,7 +3555,7 @@ item.pill_herbal.desc=Effective treatment against lung disease and mild radiatio item.pill_red.name=Red Pill item.pin.name=Bobby Pin item.pin.desc=Standard success rate of picking a regular lock is ~10%%. -item.pipe.name=%s Pipe +item.pipentm.name=%s Pipe item.pipes_steel.name=Steel Pipes item.pipes_steel.desc=Uncrafting was omitted due to tax evasion. item.piston_selenium.name=Combustion Engine Piston @@ -4130,7 +4130,7 @@ item.serum.name=Serum item.servo_set.name=Servo Set item.servo_set_desh.name=Desh Servo Set item.shackles.name=Shackles -item.shell.name=%s Shell +item.shellntm.name=%s Shell item.shimmer_axe.name=Shimmer Axe item.shimmer_axe_head.name=Heavy Axe Head item.shimmer_handle.name=Reinforced Polymer Handle diff --git a/src/main/resources/assets/hbm/lang/ru_RU.lang b/src/main/resources/assets/hbm/lang/ru_RU.lang index 581d87635..effe333e3 100644 --- a/src/main/resources/assets/hbm/lang/ru_RU.lang +++ b/src/main/resources/assets/hbm/lang/ru_RU.lang @@ -2845,11 +2845,11 @@ item.ingot_polymer.name=Полимер item.ingot_rubber.name=Резина item.ingot_biorubber.name=Брусок латекса item.ingot_polonium.name=Слиток полония-210 -item.pipe.name=%s трубы +item.pipentm.name=%s трубы item.pipes_steel.name=Стальные трубы item.pipes_steel.desc=Раскрафт был исключен из-за уклонения от уплаты налогов item.drill_titanium.name=Титановый бур -item.bolt.name=Стержень из %s +item.boltntm.name=Стержень из %s item.bolt_spike.name=Железнодорожный гвоздь item.bolt_spike.desc=Излучает угрожающую ауру, как-то item.bolt_compound.name=Укрепленный вал турбины @@ -4966,7 +4966,7 @@ eye.speakTo=Вы говорите Оку: §o%s item.plastic_bag.name=Пластиковый пакетик item.cap_aluminium.name=Алюминиевый колпачок -item.shell.name=%s оболочка +item.shellntm.name=%s оболочка item.hull_small_steel.name=Небольшая стальная оболочка item.hull_small_aluminium.name=Небольшая алюминиевая оболочка item.hull_small_aluminium.desc=Может быть вставлен в просверленный графит diff --git a/src/main/resources/assets/hbm/lang/zh_CN.lang b/src/main/resources/assets/hbm/lang/zh_CN.lang index 555afa11d..1dae36e7c 100644 --- a/src/main/resources/assets/hbm/lang/zh_CN.lang +++ b/src/main/resources/assets/hbm/lang/zh_CN.lang @@ -1907,7 +1907,7 @@ item.bobmazon_machines.name=Bobmazon: 方块和机器 item.bobmazon_materials.name=Bobmazon: 材料 item.bobmazon_tools.name=Bobmazon: 工具 item.bobmazon_weapons.name=Bobmazon: 武器和爆炸物 -item.bolt.name=%s螺栓 +item.boltntm.name=%s螺栓 item.bolt_compound.name=加强涡轮机轴 item.bolt_dura_steel.name=高速钢螺栓 item.bolt_tungsten.name=钨螺栓 diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index 220cd1fdf..d2eb9f458 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -209,6 +209,7 @@ "weapon.glShoot": {"category": "player", "sounds": [{"name": "weapon/glShoot", "stream": false}]}, "weapon.44Shoot": {"category": "player", "sounds": [{"name": "weapon/44Shoot", "stream": false}]}, "weapon.trainImpact": {"category": "player", "sounds": [{"name": "weapon/trainImpact", "stream": false}]}, + "weapon.nuclearExplosion": {"category": "player", "sounds": [{"name": "weapon/nuclearExplosion", "stream": true}]}, "weapon.dFlash": {"category": "player", "sounds": [{"name": "weapon/dFlash", "stream": false}]}, diff --git a/src/main/resources/assets/hbm/sounds/weapon/nuclearExplosion.ogg b/src/main/resources/assets/hbm/sounds/weapon/nuclearExplosion.ogg new file mode 100644 index 0000000000000000000000000000000000000000..6dddc621bfe2fad990a571e15d3e81ff72ef48a4 GIT binary patch literal 725958 zcmeFYWmH^Ew?EhfO(0kZPLLph;O-;K74?li&pD;L<<`ZJ?3h zG|=>P^1SbT@0~CIHS5l&SyQX}^scI1yQ+S>&aPeO)KRy!)dD;K{43-*E@S*5-`o2q zqCG?Nc6GO~_xO|XK(^-3A1e5u{rzi4Q~y)*zrvrIe@gI*#xMw#kpClWp#LL?9aXMx z|K5&M-QAYX$=*WuuXs8oI$mxb0d5{{0lF6(x#9m6S^vm;i27;k>+4IndD79LVg4hC zNm@o14e$y8VDunolP~ii4JV|OeoL`QEj{UYKq0L{^pToZ#b}Jl;}d=9XX$987ax9p z(gFOb5cS%ZBs}&t4t+S2gnmjGiv)^_7D46N|H&hi{`W;r#12*Z8iyu)lUo=sY+Lx6 zI$TafpAeO|OBYTc-JTOxBZ6XP6i|E{h9$B~9p1 z(K%sC0@sw`wy%9j|7nBqwc@8Rtk)yt;qtFhJ-`xaCkY>W{e?1|O$3KFoQ~h>Dc}LYaReX0RWWZ z3HfET#1+zHLE1VCt87L78jDgIVRVMsV_Z&QgC&5cfh^;Zw5ZiEuWau0<58{|-O zW&GlYwIYzb&Cdq-Im!(pG28|JEdK!h0PqTjK7vG3@!uDVX!=NU_aCekpFb+IRemXs=N)5j z8vlC{J*a8I7sKNjAe4DoJD{oMEHJO{cq9VN32W9hbgXUBRAwzp(|q(7KROil(pVH$ zpEUkRwuok}$a8Heq&08l@ro+6_8PduRp5iw~Hqaw!)ufU9!oQ{|ELWY+? zTaeLWgvnLVDk@%knd@g*8~l&>&(Kl#I~{7W|1%KQA##s#kzK|#!ha7FrBJ|o5{19> zO{tOb%{1f0G`sp4zxopi4HCH-ex0eOCK^J{8iLj{0w!95COW##dKu0}tzO_vYw%SN zJZCo(F%vKwIoyu$i(N5*cvNZb@oVN^$1^0A<-mzmkkiQL7R& z&1rJzXmQMG%FSu%{GWpA48Q6V6tE8gpU?oG360*=4z4_OpthKHA7}JbvmmT$z+q5m zY5T!bMm<Jh)@mvzth(Ly0ibkfd8)}K!{rEexZKv z=t(FW8355w0Nld({Eu_6K+fg3{0Qa#g9Se*tV&vEy$UdK_O9x! z&KJ)A6lFkP>l9VJHwoSLFs4f8jiJSVQC?6|>DHZ^DXOQy(W$6ER;eR$r42XUJ;C_K> z5anUKGswW?pJ)VRVEq&ig`%M>0*d*?pWc0at!3dBiZc8U02%-QmRtk7>Jzz~a{CXkZi-)LPRBk6B@5*&*;iHVpNgXznn5j5DE}p*Jf_$_ z=TA1Q?@V@zUlnDm=e*YaitTbx5>U$qp_~Rv4vN#ugf14jgQ}(ETp5-&VWBDCol?i zd}@@>9RE2ro-OX{R5&idt0MZB4?VNwj`&Gt-w6QVubO6H7BQrKc%Z(Uody zvOW#h)?{NUNzrs*)gjbmWleu1%~qDK4FD{DKu7%|-r9{Q1Lz0

*=7McWdOx17Xs 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 z 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

#NhGzjg+C50q638tD=Y`yHO)(jvLN7E0 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

#H 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�ROZEePju0z9Mt1FoLtRBMd(aRxW(4F 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 literal 0 HcmV?d00001 From 673628bc0206b11fdc2c70ac9f0876dfeb645fb3 Mon Sep 17 00:00:00 2001 From: Boblet Date: Mon, 15 Apr 2024 13:30:23 +0200 Subject: [PATCH 35/48] just keep whacking it until it behaves --- changelog | 30 ++----------------- gradle.properties | 2 +- .../java/api/hbm/energymk2/PowerNetMK2.java | 26 ++++++++++++++-- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../storage/TileEntityMachineBattery.java | 4 +++ 5 files changed, 33 insertions(+), 31 deletions(-) diff --git a/changelog b/changelog index 9bd0efd23..d23e7d596 100644 --- a/changelog +++ b/changelog @@ -1,28 +1,4 @@ -## The new power network -The entire energy transfer system has been rewritten which should hopefully fix a few things -* Energy should no longer be voided (at least voiding is minimized due to timeouts for unloaded receivers) -* Transfers should be way less resource intensive, as the expected iteration count is now `max(providers, receivers)` instead of `providers * receivers` -The new system should respect priorities and diodes just like the old system did. Batteries still have their original three priority settings, diodes got two additional modes: LOWEST and HIGHEST. -A bunch of tests have been done using the most important machines, however not all machines that had to be changed for the new system have been fully tested. Expect some things to not work, in which case please file a bug report on the issues board. -Just like with the old system, grids going though unloaded chunks should still work so long as the endpoints are loaded. Grids should be less janky when changing while having unloaded parts, wwhich is likely the main cause for energy voiding. -The system can potentially support saving to the world, i.e. keeping unloaded grids functional even after the entire world is unloaded, although the functionality hasn't been implemented yet. - -## Added -* New medium sized electricity pylons - * Come in wood and steel flavor - * The regular ones don't connect to cable blocks, the variants with transformers do (i.e. they act like substations for huge pylons) - -## Changed -* Updated russian localization -* Condensers now need cast plates instead of welded plates -* Tweaked the substation recipe, it now yields two substations -* There is now a config option for steam clouds from cooling towers -* Nuclear explosions no longer play thunder and explosion sounds in a loop, instead they play one singular sound once the shockwave passes the player - * The HUD shake is now also synced up with the shockwave - * In addition to the hud shake, there is one brief screen shake, the same used for mini nukes (although it ends up being more subtle because your screen is most likely covered in shockwave dust) - * The HUD shake is now 3x more intense, but also only 1.5s long (instead of 5) making it snappier - ## Fixed -* Changed the translation keys for bolts, pipes and shells to avoid naming conflicts -* Fixed glpyhid scout rampant mode spawning not working correctly -* Fixed nuclear explosions petrifying fallout layers, turning them into full sellafite blocks \ No newline at end of file +* Fixed battery connection priority being broken, all battery blocks present during the previous updates will now have their priority default to LOW +* Fixed batteries sometimes ending up transferring themselves, wasting their entire receiving and sending speed on doing effectively nothing + * Energy tracking is still a bit flakey so there could be issues that remain with buffer mode batteries, however the transfer caps should mitigate most potential issues \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index f9a8ca1d9..b4ec7f1af 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4935 +mod_build_number=4936 credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index 467d3bbb5..c41ff9e9b 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -165,6 +165,30 @@ public class PowerNetMK2 { IEnergyProviderMK2 src = providers.get(0); IEnergyReceiverMK2 dest = receivers.get(0); + + if(src.getPower() <= 0) { providers.remove(0); prevSrc = 0; continue; } + + if(src == dest) { // STALEMATE DETECTED + //if this happens, a buffer will waste both its share of transfer and receiving potential and do effectively nothing, essentially breaking + + //try if placing the conflicting provider at the end of the list does anything + //we do this first because providers have no priority, so we may shuffle those around as much as we want + if(providers.size() > 1) { + providers.add(providers.get(0)); + providers.remove(0); + prevSrc = 0; //this might cause slight issues due to the tracking being effectively lost while there still might be pending operations + continue; + } + //if that didn't work, try shifting the receiver by one place (to minimize priority breakage) + if(receivers.size() > 1) { + receivers.add(2, receivers.get(0)); + receivers.remove(0); + prevDest = 0; //ditto + continue; + } + + //if neither option could be performed, the only conclusion is that this buffer mode battery is alone in the power net, in which case: not my provlem + } long pd = priorityDemand[dest.getPriority().ordinal()]; @@ -175,8 +199,6 @@ public class PowerNetMK2 { long toFill = Math.min(dest.getMaxPower() - dest.getPower(), receiverShare); long finalTransfer = Math.min(toDrain, toFill); - - if(src.getPower() <= 0) { providers.remove(0); prevSrc = 0; continue; } if(toFill <= 0) { receivers.remove(0); prevDest = 0; continue; } finalTransfer -= dest.transferPower(finalTransfer); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 3b02435f2..0d5894efa 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4935)"; + public static final String VERSION = "1.0.27 BETA (4936)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version 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 d1fb7d597..b021eca59 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -163,6 +163,10 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I if(!worldObj.isRemote && worldObj.getBlock(xCoord, yCoord, zCoord) instanceof MachineBattery) { + if(priority == null || priority.ordinal() == 0 || priority.ordinal() == 4) { + priority = ConnectionPriority.LOW; + } + int mode = this.getRelevantMode(); if(this.node == null || this.node.expired) { From 5b41c3d83ac9dbcee128072717ccf254d3bf4d88 Mon Sep 17 00:00:00 2001 From: Boblet Date: Tue, 16 Apr 2024 14:54:06 +0200 Subject: [PATCH 36/48] paintable pylon wires --- changelog | 7 ++-- .../com/hbm/blocks/network/PylonBase.java | 13 +++++++ .../com/hbm/blocks/network/PylonLarge.java | 13 +++++++ .../com/hbm/blocks/network/PylonMedium.java | 13 +++++++ .../com/hbm/blocks/network/Substation.java | 13 +++++++ .../java/com/hbm/main/ResourceManager.java | 1 + .../render/tileentity/RenderPylonBase.java | 5 +-- .../network/TileEntityPylonBase.java | 23 +++++++++++- src/main/java/com/hbm/util/ColorUtil.java | 33 ++++++++++++++++++ .../assets/hbm/textures/items/card_hbm.png | Bin 0 -> 1176 bytes .../assets/hbm/textures/items/kit_hbm.png | Bin 0 -> 1088 bytes .../models/network/wire_greyscale.png | Bin 0 -> 137 bytes 12 files changed, 114 insertions(+), 7 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/card_hbm.png create mode 100644 src/main/resources/assets/hbm/textures/items/kit_hbm.png create mode 100644 src/main/resources/assets/hbm/textures/models/network/wire_greyscale.png diff --git a/changelog b/changelog index d23e7d596..2ae8aa9c2 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,3 @@ -## Fixed -* Fixed battery connection priority being broken, all battery blocks present during the previous updates will now have their priority default to LOW -* Fixed batteries sometimes ending up transferring themselves, wasting their entire receiving and sending speed on doing effectively nothing - * Energy tracking is still a bit flakey so there could be issues that remain with buffer mode batteries, however the transfer caps should mitigate most potential issues \ No newline at end of file +## Changed +* All pylons and electrical connectors are now dyeable, using any dye (even modded ones, based on ore dict) to change the color of the cable + * Colors are based on the connecting pylon, not the cables themselves, meaning that using one dye will change all wires connected to that pylon right up to the half way point \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/network/PylonBase.java b/src/main/java/com/hbm/blocks/network/PylonBase.java index f2bf0c675..bf35c9fbe 100644 --- a/src/main/java/com/hbm/blocks/network/PylonBase.java +++ b/src/main/java/com/hbm/blocks/network/PylonBase.java @@ -6,6 +6,7 @@ import com.hbm.tileentity.network.TileEntityPylonBase; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -41,4 +42,16 @@ public abstract class PylonBase extends BlockContainer implements ITooltipProvid public boolean renderAsNormalBlock() { return false; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + TileEntityPylonBase te = (TileEntityPylonBase) world.getTileEntity(x, y, z); + return te.setColor(player.getHeldItem()); + } else { + return false; + } + } } diff --git a/src/main/java/com/hbm/blocks/network/PylonLarge.java b/src/main/java/com/hbm/blocks/network/PylonLarge.java index 395b27dd1..6333a6e28 100644 --- a/src/main/java/com/hbm/blocks/network/PylonLarge.java +++ b/src/main/java/com/hbm/blocks/network/PylonLarge.java @@ -82,4 +82,17 @@ public class PylonLarge extends BlockDummyable implements ITooltipProvider { return dir.ordinal() + offset; } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + TileEntityPylonBase te = (TileEntityPylonBase) world.getTileEntity(pos[0], pos[1], pos[2]); + return te.setColor(player.getHeldItem()); + } else { + return false; + } + } } diff --git a/src/main/java/com/hbm/blocks/network/PylonMedium.java b/src/main/java/com/hbm/blocks/network/PylonMedium.java index d36921a67..7a29f4614 100644 --- a/src/main/java/com/hbm/blocks/network/PylonMedium.java +++ b/src/main/java/com/hbm/blocks/network/PylonMedium.java @@ -50,4 +50,17 @@ public class PylonMedium extends BlockDummyable implements ITooltipProvider { if(te instanceof TileEntityPylonBase) ((TileEntityPylonBase)te).disconnectAll(); super.breakBlock(world, x, y, z, b, m); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + TileEntityPylonBase te = (TileEntityPylonBase) world.getTileEntity(pos[0], pos[1], pos[2]); + return te.setColor(player.getHeldItem()); + } else { + return false; + } + } } diff --git a/src/main/java/com/hbm/blocks/network/Substation.java b/src/main/java/com/hbm/blocks/network/Substation.java index 7499992fd..6c8e3cb34 100644 --- a/src/main/java/com/hbm/blocks/network/Substation.java +++ b/src/main/java/com/hbm/blocks/network/Substation.java @@ -72,4 +72,17 @@ public class Substation extends BlockDummyable implements ITooltipProvider { this.makeExtra(world, x + dir.offsetX * o - 1, y, z + dir.offsetZ * o + 1); this.makeExtra(world, x + dir.offsetX * o - 1, y, z + dir.offsetZ * o - 1); } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { + if(world.isRemote) { + return true; + } else if(!player.isSneaking()) { + int[] pos = this.findCore(world, x, y, z); + TileEntityPylonBase te = (TileEntityPylonBase) world.getTileEntity(pos[0], pos[1], pos[2]); + return te.setColor(player.getHeldItem()); + } else { + return false; + } + } } diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 08ba66b2d..2e4d78e50 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -788,6 +788,7 @@ public class ResourceManager { public static final ResourceLocation pylon_large_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/pylon_large.png"); public static final ResourceLocation substation_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/substation.png"); public static final ResourceLocation wire_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/wire.png"); + public static final ResourceLocation wire_greyscale_tex = new ResourceLocation(RefStrings.MODID, "textures/models/network/wire_greyscale.png"); //Radiolysis public static final ResourceLocation radiolysis_tex = new ResourceLocation(RefStrings.MODID, "textures/models/radiolysis.png"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java b/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java index dca78271c..1d69ca2ba 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java +++ b/src/main/java/com/hbm/render/tileentity/RenderPylonBase.java @@ -24,7 +24,7 @@ public abstract class RenderPylonBase extends TileEntitySpecialRenderer { */ public void renderLinesGeneric(TileEntityPylonBase pyl, double x, double y, double z) { - this.bindTexture(ResourceManager.wire_tex); + this.bindTexture(pyl.color == 0 ? ResourceManager.wire_tex : ResourceManager.wire_greyscale_tex); for(int i = 0; i < pyl.connected.size(); i++) { @@ -127,6 +127,8 @@ public abstract class RenderPylonBase extends TileEntitySpecialRenderer { int brightness = world.getLightBrightnessForSkyBlocks(MathHelper.floor_double(ix), MathHelper.floor_double(iy), MathHelper.floor_double(iz), 0); tess.setBrightness(brightness); + tess.setColorOpaque_I(pyl.color == 0 ? 0xffffff : pyl.color); + drawLineSegment(tess, x0 + (deltaX * j / count), y0 + (deltaY * j / count) - sagJ, @@ -180,7 +182,6 @@ public abstract class RenderPylonBase extends TileEntitySpecialRenderer { jX *= -1; } - tessellator.setColorOpaque_I(0xffffff); tessellator.addVertexWithUV(x + iX, y + iY, z + iZ, 0, 0); tessellator.addVertexWithUV(x - iX, y - iY, z - iZ, 0, 1); tessellator.addVertexWithUV(a - iX, b - iY, c - iZ, wrap, 1); diff --git a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java index 080001df1..7581ddaed 100644 --- a/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java +++ b/src/main/java/com/hbm/tileentity/network/TileEntityPylonBase.java @@ -3,6 +3,7 @@ package com.hbm.tileentity.network; import java.util.ArrayList; import java.util.List; +import com.hbm.util.ColorUtil; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; @@ -10,6 +11,7 @@ import api.hbm.energymk2.Nodespace; import api.hbm.energymk2.Nodespace.PowerNode; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; @@ -23,6 +25,7 @@ import net.minecraftforge.common.util.ForgeDirection; public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { public List connected = new ArrayList(); + public int color; public static int canConnect(TileEntityPylonBase first, TileEntityPylonBase second) { @@ -45,6 +48,22 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { return len >= delta.lengthVector() ? 0 : 3; } + + public boolean setColor(ItemStack stack) { + if(stack == null) return false; + int color = ColorUtil.getColorFromDye(stack); + if(color == 0 || color == this.color) return false; + stack.stackSize--; + this.color = color; + + this.markDirty(); + if(worldObj instanceof WorldServer) { + WorldServer world = (WorldServer) worldObj; + world.getPlayerManager().markBlockForUpdate(xCoord, yCoord, zCoord); + } + + return true; + } @Override public PowerNode createNode() { @@ -120,8 +139,9 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - + nbt.setInteger("conCount", connected.size()); + nbt.setInteger("color", color); for(int i = 0; i < connected.size(); i++) { nbt.setIntArray("con" + i, connected.get(i)); @@ -133,6 +153,7 @@ public abstract class TileEntityPylonBase extends TileEntityCableBaseNT { super.readFromNBT(nbt); int count = nbt.getInteger("conCount"); + this.color = nbt.getInteger("color"); this.connected.clear(); diff --git a/src/main/java/com/hbm/util/ColorUtil.java b/src/main/java/com/hbm/util/ColorUtil.java index aec239b53..2d0ad9378 100644 --- a/src/main/java/com/hbm/util/ColorUtil.java +++ b/src/main/java/com/hbm/util/ColorUtil.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import javax.imageio.ImageIO; @@ -182,4 +183,36 @@ public class ColorUtil { float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), new float[3]); return hsb[2]; } + + public static HashMap nameToColor = new HashMap() {{ + put("black", 1973019); + put("red", 11743532); + put("green", 3887386); + put("brown", 5320730); + put("blue", 2437522); + put("purple", 8073150); + put("cyan", 2651799); + put("silver", 11250603); + put("gray", 4408131); + put("pink", 14188952); + put("lime", 4312372); + put("yellow", 14602026); + put("lightBlue", 6719955); + put("magenta", 12801229); + put("orange", 15435844); + put("white", 15790320); + }}; + + public static int getColorFromDye(ItemStack stack) { + List oreNames = ItemStackUtil.getOreDictNames(stack); + + for(String dict : oreNames) { + if(dict.length() > 3 && dict.startsWith("dye")) { + String color = dict.substring(3).toLowerCase(Locale.US); + if(nameToColor.containsKey(color)) return nameToColor.get(color); + } + } + + return 0; + } } diff --git a/src/main/resources/assets/hbm/textures/items/card_hbm.png b/src/main/resources/assets/hbm/textures/items/card_hbm.png new file mode 100644 index 0000000000000000000000000000000000000000..c273750fda538fbe4cc656efa261999f1635aa90 GIT binary patch literal 1176 zcmV;J1ZVq+P)J(W?#}>xI9*Qt3dssUA zu=mZE4m!4njanTWd+CEvgu$RN=!+Q)oCWDiZk{a7XtILWPUaRc(rMO3L$Aj4n!AVe zUT@-!nR9=?FS&nz-_JR}bIuL?-!wCY_OF_2KcMLlo#$Hrd6=0gw2g%_ME6@KwBtfF z9M$~7C2Z1Nm|SWHpwTBBYg_69=!?%xp@q+ue=px^rI1r``2;?D`4N%fzo|B=_k3mw z?fG}wjntd($6_&Ue0==K5Vph2Bg2sWt$Z%sh0C{EY4i!Wd;(W`*9o63Uw3!S;qiFN z&q)#!6B9Mpt(N5$SeZ{QwbSSm*v+XG=5)*epePCe;c%FvWWo~Q!X<3c`F(Tqo?m-? z%P?13Zm_tx$oBU3pN6QJ0duumMZRIb4uB|%$AT~b>Q%cr@(ufSWLY-Mjss!SO(Vk) zoiC?m#4flT0Qpjo%D45optx z{w7LMtq)<>4?54aYVlv2Q46I5kt;1Xa5|l|wY4G3GAk=9mgWvSd=&9;rl*My-*C}D ziJNoxQTH^0!62e2B8uYGcsxF#zhe~P>g_GtZmx`crFWgk@P41C(`f)a9*?oFR`R&O z-e6;8b%*GkU0&)Dc<;OmfJ`O>94yR=He9{EWz%PSbiO>{+-^7h{rv_+b?RR^?WVWM z#>F0i`S+U`?1UEwTR7zt`0i(ojV*{qqs-3ET6V{QIiL@rlY=p1yjDZ#`t)rtUw!Q5 ziw{onW7f$hH=R7lsKmeDrcls$#%p6wRgLEpiG%@RnE^9|BuVA8Rzc``wnbp%jGHGV zJI$vYTs(h*hnq#dy`!?2F4E#uDHK%p)IH;!{{H?05JneN>uI%W;cys_$Ah9MxZQ5! zeo%Dq?&ptr;WWJZnu}b%$ivM7t-lD|UsLf24w_vh((9FTC>RWqNF?e5)Pm5}{ahov zJCE71+qw5ZA)D7|YJ&Lk6G|Ffn=8^_gObG@?C$PnVPOFkdbzP&CN|x zsZ>SuaL9kcdKw=e*Pec0P!xqkB2h6XbV-tAL|$!vEPz@N!C=t1pUdTpcC#`+Hb5;1 qbD!5T{>uP#2=jS1o2_g7pV9AROLWvG`l}cK0000|X}&d&qjfC!p6H3PX^PQ>GJJkP^*UDnsvHGu1hgqVp$=-#~xKy-dSWFm4} z@ZioR{3tr{8OUa{B9%%3;5ZKDa#^jpyu2(H7Z-W<$`xLT?FW0S+vVccmYQ>-2pj~L zavX-#gs$r<=ayxK;BxnsN(I}tS=ruJ_k(46ECYsNgmT^s zFBA$2zOu3sx+g2eb=~6|@H~%rJg%;L;f7&QDwSAUTMNO1hgIrSszAy#O<@=YmSr6X z5B7*-M?lwgbsdD4%jLe-o6Tki!jEmBSHYbRg3C%7)FYy!!sh1YL@JfS^E}$^Hi<-n zdcBUOX?<|RFvRTaEC9`Bb6|rSsSyR?rfE_v76H(89mjFhwfs*elj`1}9swhyU~XC=&zoVw$GNX0vJ>%&Szj zT0Im#7KN+tpW~V7F=o$o`J&|U)wPH0bsn?(A|Oi&z_KiYQIPdtsZ`YbVQ>KbEJPz3 zfBdz}k2m1;3o*`)Ykc}`OU(&&!dxyFg6H#j^7%ZLWvPbac^;WehMk=qJkRTczxhI( zixV1`FU0s^d4fyN!)uqONF`$YyeV+*si`7lpclThv_!R91?V#&)o3(ADg5}|Nv?i4 z$?6A5es{C2j z?QWE(Qe#|xYlhp+J-++Nr)uvpHSW`D`E>kFzX2%;uhnWKlSu`UkqFM~eb^Z3G2Z*+ z0iS<;kIh>xw(mE&-E8saKOKtKTl{AGAUfE0LT~Jk51|ZutyW`UVL?rhktmf)s_qBr zrI*j}aQ6Yb(I~&%^l;uyj) zGxW4K7lR=O^97NvM}OaE-u-#gV)nu-Z{j?rtup(UqBcWveR%o(#@)^?AFAdTA5&Ip i+dlK|qE!wqhvlb#QGaRoa@zr*Sqz@8elF{r5}E*aBruWy literal 0 HcmV?d00001 From 664dbd66577322572a1179451a3c08acf635ae10 Mon Sep 17 00:00:00 2001 From: HbmMods Date: Mon, 15 Apr 2024 14:07:53 +0200 Subject: [PATCH 37/48] Revert "Merge pull request #1429 from 70000hp/NHNEI-compat" This reverts commit ef169ac06e51b73b0bb03f25044c07f424080257. --- .../com/hbm/handler/imc/ICompatNHNEI.java | 14 -- .../com/hbm/handler/imc/IMCHandlerNHNEI.java | 120 ------------------ .../nei/AlloyFurnaceRecipeHandler.java | 16 +-- .../hbm/handler/nei/AnvilRecipeHandler.java | 25 +--- .../handler/nei/AssemblerRecipeHandler.java | 16 +-- .../hbm/handler/nei/BookRecipeHandler.java | 16 +-- .../hbm/handler/nei/BreederRecipeHandler.java | 14 +- .../handler/nei/ChemplantRecipeHandler.java | 16 +-- .../hbm/handler/nei/ConstructionHandler.java | 8 -- .../handler/nei/CrucibleAlloyingHandler.java | 12 +- .../handler/nei/CrucibleCastingHandler.java | 16 +-- .../handler/nei/CrucibleSmeltingHandler.java | 14 +- .../handler/nei/CyclotronRecipeHandler.java | 15 +-- .../hbm/handler/nei/FluidRecipeHandler.java | 21 +-- .../hbm/handler/nei/FusionRecipeHandler.java | 15 +-- .../nei/GasCentrifugeRecipeHandler.java | 14 +- .../hbm/handler/nei/HadronRecipeHandler.java | 13 +- .../hbm/handler/nei/NEIUniversalHandler.java | 17 +-- .../hbm/handler/nei/PressRecipeHandler.java | 15 +-- .../handler/nei/RadiolysisRecipeHandler.java | 15 +-- .../handler/nei/RefineryRecipeHandler.java | 13 +- .../hbm/handler/nei/SILEXRecipeHandler.java | 13 +- .../handler/nei/ShredderRecipeHandler.java | 13 +- .../handler/nei/SmithingRecipeHandler.java | 23 +--- .../com/hbm/handler/nei/ToolingHandler.java | 10 +- src/main/java/com/hbm/main/MainRegistry.java | 36 +++--- src/main/java/com/hbm/main/NEIConfig.java | 8 +- 27 files changed, 53 insertions(+), 475 deletions(-) delete mode 100644 src/main/java/com/hbm/handler/imc/ICompatNHNEI.java delete mode 100644 src/main/java/com/hbm/handler/imc/IMCHandlerNHNEI.java diff --git a/src/main/java/com/hbm/handler/imc/ICompatNHNEI.java b/src/main/java/com/hbm/handler/imc/ICompatNHNEI.java deleted file mode 100644 index 37952c867..000000000 --- a/src/main/java/com/hbm/handler/imc/ICompatNHNEI.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.hbm.handler.imc; - -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; - -public interface ICompatNHNEI { - /**First item on the list is the icon for the recipe in the NEI GUI, the rest are displayed on the sidebar - * as other items that can be used for the same purpose**/ - ItemStack[] getMachinesForRecipe(); - - String getRecipeID(); - -} diff --git a/src/main/java/com/hbm/handler/imc/IMCHandlerNHNEI.java b/src/main/java/com/hbm/handler/imc/IMCHandlerNHNEI.java deleted file mode 100644 index e21d027f8..000000000 --- a/src/main/java/com/hbm/handler/imc/IMCHandlerNHNEI.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.hbm.handler.imc; - -import codechicken.nei.recipe.TemplateRecipeHandler; -import com.hbm.config.VersatileConfig; -import com.hbm.handler.nei.*; -import com.hbm.lib.RefStrings; -import com.hbm.main.NEIConfig; -import cpw.mods.fml.common.event.FMLInterModComms; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; - -import java.util.ArrayList; - -public class IMCHandlerNHNEI { - - public static ArrayList handlerList() { - ArrayList handlers = new ArrayList<>(); - - handlers.add(new AlloyFurnaceRecipeHandler()); - handlers.add(new ShredderRecipeHandler()); - handlers.add(new PressRecipeHandler()); - handlers.add(new CentrifugeRecipeHandler()); - handlers.add(new GasCentrifugeRecipeHandler()); - handlers.add(new BreederRecipeHandler()); - handlers.add(new CyclotronRecipeHandler()); - handlers.add(new AssemblerRecipeHandler()); - handlers.add(new RefineryRecipeHandler()); - handlers.add(new VacuumRecipeHandler()); - handlers.add(new CrackingHandler()); - handlers.add(new ReformingHandler()); - handlers.add(new HydrotreatingHandler()); - handlers.add(new BoilerRecipeHandler()); - handlers.add(new ChemplantRecipeHandler()); - handlers.add(new CrystallizerRecipeHandler()); - handlers.add(new BookRecipeHandler()); - handlers.add(new FusionRecipeHandler()); - handlers.add(new HadronRecipeHandler()); - handlers.add(new SILEXRecipeHandler()); - handlers.add(new SmithingRecipeHandler()); - handlers.add(new AnvilRecipeHandler()); - handlers.add(new FuelPoolHandler()); - handlers.add(new FluidRecipeHandler()); - handlers.add(new RadiolysisRecipeHandler()); - handlers.add(new CrucibleSmeltingHandler()); - handlers.add(new CrucibleAlloyingHandler()); - handlers.add(new CrucibleCastingHandler()); - handlers.add(new ToolingHandler()); - handlers.add(new ConstructionHandler()); - - //universal boyes - handlers.add(new ZirnoxRecipeHandler()); - if(VersatileConfig.rtgDecay()) { - handlers.add(new RTGRecipeHandler()); - } - handlers.add(new LiquefactionHandler()); - handlers.add(new SolidificationHandler()); - handlers.add(new CokingHandler()); - handlers.add(new FractioningHandler()); - handlers.add(new BoilingHandler()); - handlers.add(new CombinationHandler()); - handlers.add(new SawmillHandler()); - handlers.add(new MixerHandler()); - handlers.add(new OutgasserHandler()); - handlers.add(new ElectrolyserFluidHandler()); - handlers.add(new ElectrolyserMetalHandler()); - handlers.add(new AshpitHandler()); - handlers.add(new ArcWelderHandler()); - handlers.add(new ExposureChamberHandler()); - - return handlers; - } - public static void IMCSender() { - - for (TemplateRecipeHandler handler: handlerList()) { - - Class handlerClass = handler.getClass(); - - if(handler instanceof ICompatNHNEI && ((ICompatNHNEI) handler).getMachinesForRecipe() != null) { - String blockName = "hbm:" + ((ICompatNHNEI) handler).getMachinesForRecipe()[0].getUnlocalizedName(); - String hClass = handlerClass.getName(); - sendHandler(hClass, ((ICompatNHNEI) handler).getRecipeID(), blockName); - for (ItemStack stack: ((ICompatNHNEI) handler).getMachinesForRecipe()) { - sendCatalyst(hClass, "hbm:" + stack.getUnlocalizedName()); - } - } - } - - } - private static void sendHandler(String aName, String handlerID, String aBlock) { - sendHandler(aName, handlerID, aBlock, 3); - } - - private static void sendHandler(String aName, String handlerID, String aBlock, int maxRecipesPerPage) { - NBTTagCompound aNBT = new NBTTagCompound(); - aNBT.setString("handler", aName); - aNBT.setString("handlerID", handlerID); - aNBT.setString("modName", RefStrings.NAME); - aNBT.setString("modId", RefStrings.MODID); - aNBT.setBoolean("modRequired", true); - aNBT.setString("itemName", aBlock); - aNBT.setInteger("handlerHeight", 65); - aNBT.setInteger("handlerWidth", 166); - aNBT.setInteger("maxRecipesPerPage", maxRecipesPerPage); - aNBT.setInteger("yShift", 6); - FMLInterModComms.sendMessage("NotEnoughItems", "registerHandlerInfo", aNBT); - } - - private static void sendCatalyst(String aName, String aStack, int aPriority) { - NBTTagCompound aNBT = new NBTTagCompound(); - aNBT.setString("handlerID", aName); - aNBT.setString("catalystHandlerID", aName); - aNBT.setString("itemName", aStack); - aNBT.setInteger("priority", aPriority); - FMLInterModComms.sendMessage("NotEnoughItems", "registerCatalystInfo", aNBT); - } - - private static void sendCatalyst(String aName, String aStack) { - sendCatalyst(aName, aStack, 0); - } -} diff --git a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java index ee1d09a5b..8b76d904b 100644 --- a/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/AlloyFurnaceRecipeHandler.java @@ -7,8 +7,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIDiFurnace; import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.inventory.recipes.MachineRecipes; @@ -19,22 +17,10 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class AlloyFurnaceRecipeHandler extends TemplateRecipeHandler { public static ArrayList fuels; - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_difurnace_off), - new ItemStack(ModBlocks.machine_difurnace_rtg_off)}; - } - - @Override - public String getRecipeID() { - return "alloysmelting"; - } - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { PositionedStack input1; PositionedStack input2; diff --git a/src/main/java/com/hbm/handler/nei/AnvilRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AnvilRecipeHandler.java index 3c01db05a..4df799a33 100644 --- a/src/main/java/com/hbm/handler/nei/AnvilRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/AnvilRecipeHandler.java @@ -7,9 +7,7 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import com.hbm.blocks.ModBlocks; import com.hbm.blocks.machine.NTMAnvil; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.gui.GUIAnvil; import com.hbm.inventory.recipes.anvil.AnvilRecipes; @@ -26,28 +24,7 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -public class AnvilRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.anvil_iron), - new ItemStack(ModBlocks.anvil_lead), - new ItemStack(ModBlocks.anvil_steel), - new ItemStack(ModBlocks.anvil_starmetal), - new ItemStack(ModBlocks.anvil_meteorite), - new ItemStack(ModBlocks.anvil_ferrouranium), - new ItemStack(ModBlocks.anvil_bismuth), - new ItemStack(ModBlocks.anvil_schrabidate), - new ItemStack(ModBlocks.anvil_dnt), - new ItemStack(ModBlocks.anvil_osmiridium), - new ItemStack(ModBlocks.anvil_murky)}; - } - - @Override - public String getRecipeID() { - return "ntmAnvil"; - } +public class AnvilRecipeHandler extends TemplateRecipeHandler { public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); diff --git a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java b/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java index d3ddb9df0..f533fc02c 100644 --- a/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/AssemblerRecipeHandler.java @@ -6,8 +6,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIMachineAssembler; import com.hbm.inventory.recipes.AssemblerRecipes; @@ -21,25 +19,13 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class AssemblerRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class AssemblerRecipeHandler extends TemplateRecipeHandler { public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); public LinkedList> guiGui = new LinkedList>(); - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_assembler), - new ItemStack(ModBlocks.machine_assemfac)}; - } - - @Override - public String getRecipeID() { - return "assembly"; - } - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { List input; diff --git a/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java b/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java index 3b18cd6f6..44e6c7ded 100644 --- a/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/BookRecipeHandler.java @@ -4,8 +4,6 @@ import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; @@ -16,22 +14,12 @@ import com.hbm.inventory.recipes.MagicRecipes.MagicRecipe; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; -import com.hbm.items.ModItems; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class BookRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModItems.book_of_)}; - } +public class BookRecipeHandler extends TemplateRecipeHandler { - @Override - public String getRecipeID() { - return "book_of_boxcars"; - } - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { + public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { List input; PositionedStack result; diff --git a/src/main/java/com/hbm/handler/nei/BreederRecipeHandler.java b/src/main/java/com/hbm/handler/nei/BreederRecipeHandler.java index 0fc3f70d2..8f91f8d75 100644 --- a/src/main/java/com/hbm/handler/nei/BreederRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/BreederRecipeHandler.java @@ -5,8 +5,6 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIMachineReactorBreeding; import com.hbm.inventory.recipes.BreederRecipes; import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; @@ -18,18 +16,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class BreederRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class BreederRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_reactor_breeding)}; - } - - @Override - public String getRecipeID() { - return "breeding"; - } public class BreedingSet extends TemplateRecipeHandler.CachedRecipe { PositionedStack input; diff --git a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java index b0b5e19a4..9ef27b9a9 100644 --- a/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/ChemplantRecipeHandler.java @@ -5,8 +5,6 @@ import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.FluidStack; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.gui.GUIMachineChemplant; @@ -22,26 +20,14 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class ChemplantRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class ChemplantRecipeHandler extends TemplateRecipeHandler { public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); public LinkedList> guiGui = new LinkedList>(); - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_chemplant), - new ItemStack(ModBlocks.machine_chemfac)}; - } - - @Override - public String getRecipeID() { - return "chemistry"; - } public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { - PositionedStack[] itemIn = new PositionedStack[4]; PositionedStack[] fluidIn = new PositionedStack[2]; PositionedStack[] itemOut = new PositionedStack[4]; diff --git a/src/main/java/com/hbm/handler/nei/ConstructionHandler.java b/src/main/java/com/hbm/handler/nei/ConstructionHandler.java index baf61bfc1..91f46bd1d 100644 --- a/src/main/java/com/hbm/handler/nei/ConstructionHandler.java +++ b/src/main/java/com/hbm/handler/nei/ConstructionHandler.java @@ -16,14 +16,6 @@ public class ConstructionHandler extends NEIUniversalHandler { super("Construction", getRecipes(true), getRecipes(false)); } - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModItems.acetylene_torch), - new ItemStack(ModItems.blowtorch), - new ItemStack(ModItems.boltgun)}; - } - @Override public String getKey() { return "ntmConstruction"; diff --git a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java index 4cdca10fe..80ccd314b 100644 --- a/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java +++ b/src/main/java/com/hbm/handler/nei/CrucibleAlloyingHandler.java @@ -6,7 +6,6 @@ import java.util.LinkedList; import java.util.List; import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.material.Mats; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.inventory.material.NTMMaterial; @@ -21,16 +20,7 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class CrucibleAlloyingHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_crucible)}; - } - @Override - public String getRecipeID() { - return "ntmCrucibleAlloying"; - } +public class CrucibleAlloyingHandler extends TemplateRecipeHandler { public LinkedList transferRectsRec = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java index eff865fb4..1befff001 100644 --- a/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java +++ b/src/main/java/com/hbm/handler/nei/CrucibleCastingHandler.java @@ -6,8 +6,6 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.material.Mats; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.items.machine.ItemMold; @@ -19,19 +17,7 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class CrucibleCastingHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.foundry_basin), - new ItemStack(ModBlocks.foundry_mold), - new ItemStack(ModBlocks.machine_strand_caster)}; - } - @Override - public String getRecipeID() { - return "ntmCrucibleFoundry"; - } +public class CrucibleCastingHandler extends TemplateRecipeHandler { public LinkedList transferRectsRec = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java index 63bbc26e7..b6af31dc1 100644 --- a/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java +++ b/src/main/java/com/hbm/handler/nei/CrucibleSmeltingHandler.java @@ -9,7 +9,6 @@ import java.util.List; import java.util.Map.Entry; import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.recipes.CrucibleRecipes; import com.hbm.lib.RefStrings; @@ -20,17 +19,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class CrucibleSmeltingHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_crucible)}; - } - @Override - public String getRecipeID() { - return "ntmCrucibleSmelting"; - } +public class CrucibleSmeltingHandler extends TemplateRecipeHandler { + public LinkedList transferRectsRec = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/CyclotronRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CyclotronRecipeHandler.java index 51b0a6b6f..b4f9221f2 100644 --- a/src/main/java/com/hbm/handler/nei/CyclotronRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CyclotronRecipeHandler.java @@ -6,8 +6,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIMachineCyclotron; import com.hbm.inventory.recipes.CyclotronRecipes; import com.hbm.lib.RefStrings; @@ -18,17 +16,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class CyclotronRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_cyclotron)}; - } - - @Override - public String getRecipeID() { - return "cyclotronProcessing"; - } +public class CyclotronRecipeHandler extends TemplateRecipeHandler { + public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/FluidRecipeHandler.java b/src/main/java/com/hbm/handler/nei/FluidRecipeHandler.java index a575f867f..792f4465f 100644 --- a/src/main/java/com/hbm/handler/nei/FluidRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/FluidRecipeHandler.java @@ -5,10 +5,7 @@ import java.util.Arrays; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.recipes.MachineRecipes; -import com.hbm.items.ModItems; import com.hbm.lib.RefStrings; import codechicken.nei.NEIServerUtils; @@ -17,23 +14,7 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class FluidRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModItems.fluid_barrel_empty), - new ItemStack(ModItems.fluid_tank_empty), - new ItemStack(ModItems.fluid_tank_lead_empty), - new ItemStack(ModItems.canister_empty), - new ItemStack(ModItems.gas_empty), - new ItemStack(ModItems.cell_empty), - new ItemStack(ModItems.disperser_canister_empty), - new ItemStack(ModItems.glyphid_gland_empty)}; - } - @Override - public String getRecipeID() { - return "fluidcons"; - } +public class FluidRecipeHandler extends TemplateRecipeHandler { public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { diff --git a/src/main/java/com/hbm/handler/nei/FusionRecipeHandler.java b/src/main/java/com/hbm/handler/nei/FusionRecipeHandler.java index f5a69a4ec..ff6624e23 100644 --- a/src/main/java/com/hbm/handler/nei/FusionRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/FusionRecipeHandler.java @@ -6,8 +6,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIITER; import com.hbm.inventory.recipes.FusionRecipes; import com.hbm.lib.RefStrings; @@ -18,17 +16,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class FusionRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.iter)}; - } - @Override - public String getRecipeID() { - return "fusion"; - } +public class FusionRecipeHandler extends TemplateRecipeHandler { + public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java index 085ec8b7a..add9dcf95 100644 --- a/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/GasCentrifugeRecipeHandler.java @@ -9,8 +9,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIMachineGasCent; import com.hbm.inventory.recipes.GasCentrifugeRecipes; import com.hbm.inventory.recipes.MachineRecipes; @@ -24,16 +22,8 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class GasCentrifugeRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_gascent)}; - } - @Override - public String getRecipeID() { - return "gascentprocessing"; - } +public class GasCentrifugeRecipeHandler extends TemplateRecipeHandler { + public static ArrayList fuels; public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { diff --git a/src/main/java/com/hbm/handler/nei/HadronRecipeHandler.java b/src/main/java/com/hbm/handler/nei/HadronRecipeHandler.java index b9325cd9c..cbd520858 100644 --- a/src/main/java/com/hbm/handler/nei/HadronRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/HadronRecipeHandler.java @@ -8,8 +8,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Locale; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIHadron; import com.hbm.inventory.recipes.HadronRecipes; import com.hbm.inventory.recipes.HadronRecipes.HadronRecipe; @@ -23,17 +21,8 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class HadronRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class HadronRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.hadron_core)}; - } - @Override - public String getRecipeID() { - return "hadron"; - } public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index 06ad8caaf..0bb53100a 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -10,8 +10,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.lib.RefStrings; import com.hbm.util.InventoryUtil; @@ -23,13 +21,8 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -public abstract class NEIUniversalHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return machine; - } - +public abstract class NEIUniversalHandler extends TemplateRecipeHandler { + public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); @@ -41,6 +34,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler implemen public final HashMap recipes; public HashMap machineOverrides; /// SETUP /// + public NEIUniversalHandler(String display, ItemStack machine[], HashMap recipes) { this.display = display; this.machine = machine; @@ -311,9 +305,4 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler implemen } public abstract String getKey(); - - @Override - public String getRecipeID() { - return getKey(); - } } diff --git a/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java b/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java index f0b2adefb..fbc14c5cd 100644 --- a/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/PressRecipeHandler.java @@ -7,8 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.interfaces.Untested; import com.hbm.inventory.RecipesCommon.AStack; import com.hbm.inventory.RecipesCommon.ComparableStack; @@ -27,19 +25,8 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; @Untested -public class PressRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class PressRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_press), - new ItemStack(ModBlocks.machine_epress), - new ItemStack(ModBlocks.machine_conveyor_press)}; - } - @Override - public String getRecipeID() { - return "pressing"; - } public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/RadiolysisRecipeHandler.java b/src/main/java/com/hbm/handler/nei/RadiolysisRecipeHandler.java index 84cd78979..9d5d619d4 100644 --- a/src/main/java/com/hbm/handler/nei/RadiolysisRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/RadiolysisRecipeHandler.java @@ -8,8 +8,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIRadiolysis; import com.hbm.inventory.recipes.RadiolysisRecipes; import com.hbm.lib.RefStrings; @@ -20,17 +18,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class RadiolysisRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { - - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_radiolysis)}; - } - @Override - public String getRecipeID() { - return "ntmRadiolysis"; - } +public class RadiolysisRecipeHandler extends TemplateRecipeHandler { + public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/RefineryRecipeHandler.java b/src/main/java/com/hbm/handler/nei/RefineryRecipeHandler.java index f085e4ebe..f3068bf17 100644 --- a/src/main/java/com/hbm/handler/nei/RefineryRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/RefineryRecipeHandler.java @@ -7,8 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIMachineRefinery; import com.hbm.inventory.recipes.RefineryRecipes; import com.hbm.lib.RefStrings; @@ -18,17 +16,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class RefineryRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class RefineryRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_refinery)}; - } - @Override - public String getRecipeID() { - return "refinery"; - } public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java index bc1363383..444489abc 100644 --- a/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/SILEXRecipeHandler.java @@ -7,8 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUISILEX; import com.hbm.inventory.recipes.SILEXRecipes; import com.hbm.inventory.recipes.SILEXRecipes.SILEXRecipe; @@ -26,17 +24,8 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; -public class SILEXRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class SILEXRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_silex)}; - } - @Override - public String getRecipeID() { - return "silex"; - } public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java b/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java index 7524f5091..396109047 100644 --- a/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/ShredderRecipeHandler.java @@ -7,8 +7,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.gui.GUIMachineShredder; import com.hbm.inventory.recipes.MachineRecipes; @@ -21,17 +19,8 @@ import codechicken.nei.recipe.TemplateRecipeHandler; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class ShredderRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class ShredderRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.machine_shredder)}; - } - @Override - public String getRecipeID() { - return "ntmRadiolysis"; - } public static ArrayList fuels; public LinkedList transferRectsRec = new LinkedList(); diff --git a/src/main/java/com/hbm/handler/nei/SmithingRecipeHandler.java b/src/main/java/com/hbm/handler/nei/SmithingRecipeHandler.java index fc03dd060..35e698422 100644 --- a/src/main/java/com/hbm/handler/nei/SmithingRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/SmithingRecipeHandler.java @@ -5,8 +5,6 @@ import java.util.Arrays; import java.util.LinkedList; import java.util.List; -import com.hbm.blocks.ModBlocks; -import com.hbm.handler.imc.ICompatNHNEI; import com.hbm.inventory.gui.GUIAnvil; import com.hbm.inventory.recipes.anvil.AnvilRecipes; import com.hbm.inventory.recipes.anvil.AnvilSmithingRecipe; @@ -20,27 +18,8 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; -public class SmithingRecipeHandler extends TemplateRecipeHandler implements ICompatNHNEI { +public class SmithingRecipeHandler extends TemplateRecipeHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModBlocks.anvil_lead), - new ItemStack(ModBlocks.anvil_iron), - new ItemStack(ModBlocks.anvil_steel), - new ItemStack(ModBlocks.anvil_starmetal), - new ItemStack(ModBlocks.anvil_meteorite), - new ItemStack(ModBlocks.anvil_ferrouranium), - new ItemStack(ModBlocks.anvil_bismuth), - new ItemStack(ModBlocks.anvil_schrabidate), - new ItemStack(ModBlocks.anvil_dnt), - new ItemStack(ModBlocks.anvil_osmiridium), - new ItemStack(ModBlocks.anvil_murky)}; - } - @Override - public String getRecipeID() { - return "ntmSmithing"; - } public LinkedList transferRectsRec = new LinkedList(); public LinkedList transferRectsGui = new LinkedList(); public LinkedList> guiRec = new LinkedList>(); diff --git a/src/main/java/com/hbm/handler/nei/ToolingHandler.java b/src/main/java/com/hbm/handler/nei/ToolingHandler.java index 9c0420b18..c50074f1e 100644 --- a/src/main/java/com/hbm/handler/nei/ToolingHandler.java +++ b/src/main/java/com/hbm/handler/nei/ToolingHandler.java @@ -1,17 +1,9 @@ package com.hbm.handler.nei; import com.hbm.blocks.generic.BlockToolConversion; -import com.hbm.items.ModItems; -import net.minecraft.item.ItemStack; public class ToolingHandler extends NEIUniversalHandler { - @Override - public ItemStack[] getMachinesForRecipe() { - return new ItemStack[]{ - new ItemStack(ModItems.boltgun), - new ItemStack(ModItems.blowtorch), - new ItemStack(ModItems.acetylene_torch)}; - } + public ToolingHandler() { super("Tooling", BlockToolConversion.getRecipes(true), BlockToolConversion.getRecipes(false)); } diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 2cbe13204..cc6778d93 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -14,7 +14,10 @@ import com.hbm.entity.grenade.*; import com.hbm.entity.logic.IChunkLoader; import com.hbm.entity.mob.siege.SiegeTier; import com.hbm.handler.*; -import com.hbm.handler.imc.*; +import com.hbm.handler.imc.IMCBlastFurnace; +import com.hbm.handler.imc.IMCCentrifuge; +import com.hbm.handler.imc.IMCCrystallizer; +import com.hbm.handler.imc.IMCHandler; import com.hbm.handler.pollution.PollutionHandler; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.hazard.HazardRegistry; @@ -49,10 +52,13 @@ import com.hbm.world.feature.OreCave; import com.hbm.world.feature.OreLayer3D; import com.hbm.world.feature.SchistStratum; import com.hbm.world.generator.CellularDungeonFactory; -import cpw.mods.fml.common.*; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; import cpw.mods.fml.common.Mod.Metadata; +import cpw.mods.fml.common.ModMetadata; +import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.*; import cpw.mods.fml.common.event.FMLInterModComms.IMCEvent; import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; @@ -659,7 +665,7 @@ public class MainRegistry { @EventHandler public static void load(FMLInitializationEvent event) { - + RodRecipes.registerInit(); achSacrifice = new Achievement("achievement.sacrifice", "sacrifice", -3, 1, ModItems.burnt_bark, null).initIndependentStat().setSpecial().registerStat(); @@ -681,7 +687,7 @@ public class MainRegistry { achSulfuric = new Achievement("achievement.sulfuric", "sulfuric", -10, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.BALLS), achSlimeball).initIndependentStat().setSpecial().registerStat(); achInferno = new Achievement("achievement.inferno", "inferno", -8, 10, ModItems.canister_napalm, null).initIndependentStat().setSpecial().registerStat(); achRedRoom = new Achievement("achievement.redRoom", "redRoom", -10, 10, ModItems.key_red, null).initIndependentStat().setSpecial().registerStat(); - + bobHidden = new Achievement("achievement.hidden", "hidden", 15, -4, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.QUESTIONMARK), null).initIndependentStat().registerStat(); horizonsStart = new Achievement("achievement.horizonsStart", "horizonsStart", -5, 4, ModItems.sat_gerald, null).initIndependentStat().registerStat(); @@ -698,20 +704,20 @@ public class MainRegistry { achRadDeath = new Achievement("achievement.radDeath", "radDeath", 0, 6, Items.skull, achRadPoison).initIndependentStat().registerStat().setSpecial(); achSomeWounds = new Achievement("achievement.someWounds", "someWounds", -2, 10, ModItems.injector_knife, null).initIndependentStat().registerStat(); - + digammaSee = new Achievement("achievement.digammaSee", "digammaSee", -1, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMASEE), null).initIndependentStat().registerStat(); digammaFeel = new Achievement("achievement.digammaFeel", "digammaFeel", 1, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAFEEL), digammaSee).initIndependentStat().registerStat(); digammaKnow = new Achievement("achievement.digammaKnow", "digammaKnow", 3, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAKNOW), digammaFeel).initIndependentStat().registerStat().setSpecial(); digammaKauaiMoho = new Achievement("achievement.digammaKauaiMoho", "digammaKauaiMoho", 5, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAKAUAIMOHO), digammaKnow).initIndependentStat().registerStat().setSpecial(); digammaUpOnTop = new Achievement("achievement.digammaUpOnTop", "digammaUpOnTop", 7, 8, DictFrame.fromOne(ModItems.achievement_icon, EnumAchievementType.DIGAMMAUPONTOP), digammaKauaiMoho).initIndependentStat().registerStat().setSpecial(); - + //progression achieves achBurnerPress = new Achievement("achievement.burnerPress", "burnerPress", 0, 0, new ItemStack(ModBlocks.machine_press), null).initIndependentStat().registerStat(); achBlastFurnace = new Achievement("achievement.blastFurnace", "blastFurnace", 1, 3, new ItemStack(ModBlocks.machine_difurnace_off), achBurnerPress).initIndependentStat().registerStat(); achAssembly = new Achievement("achievement.assembly", "assembly", 3, -1, new ItemStack(ModBlocks.machine_assembler), achBurnerPress).initIndependentStat().registerStat(); achSelenium = new Achievement("achievement.selenium", "selenium", 3, 2, ModItems.ingot_starmetal, achBurnerPress).initIndependentStat().setSpecial().registerStat(); achChemplant = new Achievement("achievement.chemplant", "chemplant", 6, -1, new ItemStack(ModBlocks.machine_chemplant), achAssembly).initIndependentStat().registerStat(); - achConcrete = new Achievement("achievement.concrete", "concrete", 6, -4, new ItemStack(ModBlocks.concrete), achChemplant).initIndependentStat().registerStat(); + achConcrete = new Achievement("achievement.concrete", "concrete", 6, -4, new ItemStack(ModBlocks.concrete), achChemplant).initIndependentStat().registerStat(); achPolymer = new Achievement("achievement.polymer", "polymer", 9, -1, ModItems.ingot_polymer, achChemplant).initIndependentStat().registerStat(); achDesh = new Achievement("achievement.desh", "desh", 9, 2, ModItems.ingot_desh, achChemplant).initIndependentStat().registerStat(); achTantalum = new Achievement("achievement.tantalum", "tantalum", 7, 3, ModItems.gem_tantalium, achChemplant).initIndependentStat().setSpecial().registerStat(); @@ -737,8 +743,8 @@ public class MainRegistry { achMeltdown = new Achievement("achievement.meltdown", "meltdown", 15, -7, ModItems.powder_balefire, achFusion).initIndependentStat().setSpecial().registerStat(); achRedBalloons = new Achievement("achievement.redBalloons", "redBalloons", 11, 0, ModItems.missile_nuclear, achPolymer).initIndependentStat().setSpecial().registerStat(); achManhattan = new Achievement("achievement.manhattan", "manhattan", 11, -4, new ItemStack(ModBlocks.nuke_boy), achPolymer).initIndependentStat().setSpecial().registerStat(); - - AchievementPage.registerAchievementPage(new AchievementPage("Nuclear Tech", new Achievement[]{ + + AchievementPage.registerAchievementPage(new AchievementPage("Nuclear Tech", new Achievement[] { achSacrifice, achImpossible, achTOB, @@ -774,7 +780,7 @@ public class MainRegistry { digammaKnow, digammaKauaiMoho, digammaUpOnTop, - + achBurnerPress, achBlastFurnace, achAssembly, @@ -814,12 +820,6 @@ public class MainRegistry { IMCHandler.registerHandler("blastfurnace", new IMCBlastFurnace()); IMCHandler.registerHandler("crystallizer", new IMCCrystallizer()); IMCHandler.registerHandler("centrifuge", new IMCCentrifuge()); - if (Loader.isModLoaded("NotEnoughItems")){ - if (Loader.instance().getIndexedModList().get("NotEnoughItems").getVersion().contains("GTNH")) { - IMCHandlerNHNEI.IMCSender(); - } - } - } @EventHandler @@ -837,7 +837,6 @@ public class MainRegistry { MainRegistry.logger.error("Could not process unknown IMC type \"" + message.key + "\""); } } - } @EventHandler @@ -891,6 +890,7 @@ public class MainRegistry { Compat.handleRailcraftNonsense(); SuicideThreadDump.register(); + //ExplosionTests.runTest(); } @@ -926,7 +926,7 @@ public class MainRegistry { FMLCommonHandler.instance().bus().register(keyHandler); } } - + //yes kids, this is where we would usually register commands @EventHandler public void serverStart(FMLServerStartingEvent event) { diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 0fdff6386..d97c3e50f 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -1,15 +1,12 @@ package com.hbm.main; -import java.util.ArrayList; import java.util.List; -import codechicken.nei.recipe.*; import com.hbm.blocks.ModBlocks; import com.hbm.blocks.generic.BlockMotherOfAllOres.TileEntityRandomOre; import com.hbm.config.CustomMachineConfigJSON; import com.hbm.config.CustomMachineConfigJSON.MachineConfiguration; import com.hbm.config.VersatileConfig; -import com.hbm.handler.imc.IMCHandlerNHNEI; import com.hbm.handler.nei.*; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemBattery; @@ -19,6 +16,10 @@ import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.api.IHighlightHandler; import codechicken.nei.api.ItemInfo.Layout; +import codechicken.nei.recipe.GuiCraftingRecipe; +import codechicken.nei.recipe.GuiUsageRecipe; +import codechicken.nei.recipe.ICraftingHandler; +import codechicken.nei.recipe.IUsageHandler; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -26,6 +27,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; public class NEIConfig implements IConfigureNEI { + @Override public void loadConfig() { registerHandler(new AlloyFurnaceRecipeHandler()); From 17a9d824aa9d0604d3a4e154a745de1988722174 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 17 Apr 2024 11:32:41 +0200 Subject: [PATCH 38/48] some fixes, smeltable diamonds and emeralds --- README.md | 21 +++ changelog | 16 +- .../hbm/blocks/machine/FoundrySlagtap.java | 2 - .../blocks/machine/MachineStrandCaster.java | 1 - .../java/com/hbm/config/GeneralConfig.java | 2 - src/main/java/com/hbm/config/WorldConfig.java | 2 + .../com/hbm/handler/nei/ChunkyHandler.java | 79 --------- .../hbm/inventory/gui/GUIMachineBattery.java | 1 + .../java/com/hbm/inventory/material/Mats.java | 2 + .../hbm/render/entity/mob/RenderRADBeast.java | 153 +++++++++--------- .../bomb/TileEntityCompactLauncher.java | 15 +- .../bomb/TileEntityLaunchTable.java | 15 +- .../machine/TileEntityFoundrySlagtap.java | 1 - .../turret/TileEntityTurretHIMARS.java | 4 + .../com/hbm/world/feature/BedrockOre.java | 1 + 15 files changed, 140 insertions(+), 175 deletions(-) delete mode 100644 src/main/java/com/hbm/handler/nei/ChunkyHandler.java diff --git a/README.md b/README.md index 2506c1a64..087a2c6e4 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,21 @@ If you want to make some changes to the mod, follow this guide: ## Compatibility notice NTM has certain behaviors intended to fix vanilla code or to increase compatibility in certain cases where it otherwise would not be possible. These behaviors have the potential of not playing well with other mods, and while no such cases are currently known, here's a list of them. +### Thermos +Thermos servers (along with its forks such as Crucible) have a "performance" feature that causes all tile entity ticking to slow down if there's no player present in the same chunk. For obvious reasons, this will heavily impact machines and cause phantom issues that, not having knowledge of this "performance" feature, are near impossible to diagnose. By default, NTM will crash on servers running the Thermos base code and print a lengthy message informing server owners about this "performance" feature as well as how to fix the issues it causes. The error message is printed in plain English on the top of the crash log, failure to read (as well as understand) it will leave the server inoperable. + +### Optifine +One of the most common "performance" mods on 1.7.10, Optifine, achieves an increase in performance by breaking small things in spots that are usually hard to notice, although this can cause severe issues with NTM. A short list of problems, along with some solutions, follows: +* Get rid of Optifine and use one of the many [other, less intrusive performance mods](https://gist.github.com/makamys/7cb74cd71d93a4332d2891db2624e17c). +* Blocks with connected textures may become invisible. This can be fixed by toggling triangulation (I do not know what or where this setting is, I just have been told that it exists and that it can fix the problem) or multicore chunk rendering (same here). +* Entity "optimization" has a tendency to break chunkloading, this is especially noticeable with missiles which rely heavily on chunkloading to work, causing them to freeze mid-air. It's unclear what setting might fix this, and analysis of Optifine's source code (or rather, lack thereof) has not proven useful either. + +### Angelica +Like most performance mods, Angelica also does deep-rooted changes to the game's rendering to improve performance, changes which have unintended side effects with mods that otherwise rely on the vanilla functionality that was changed. Unlike with Optifine, Angelica's source code is accessible and the mod is still in active development, so the list of issues might be outdated: +* 3D models in inventories might render with no texture, this issue apparently also breaks font rendering for item tooltips +* 3D models for tile entities have a tendency to render with blend enabled (i.e. semi-transparent), especially models that are separated into multiple parts which use display lists (i.e. an older system for rendering larger models more efficiently) +* Blocks with connected textures once again become invisible (exact fix for Angelica is unknown) + ### Skybox chainloader NTM adds a few small things to the skybox using a custom skybox renderer. Minecraft can only have a single skybox renderer loaded, so setting the skybox to the NTM custom one would break compatibility with other mods' skyboxes. To mend this, NTM employs a **chainloader**. This chainloader will detect if a different skybox is loaded, save a reference to that skybox and then use NTM's skybox, which when used will also make sure to run the previous modded skybox renderer. In the event that NTM's skybox were to cause trouble, it can be disabled with the config option `1.31_enableSkyboxes`. @@ -106,5 +121,11 @@ An often overlooked aspect of Minecraft is its stats, the game keeps track of ho ### Keybind overlap An often annoying aspect of modded Minecraft is its keybinds. Even though multiple binds can be assigned the same key, all but one will show up as "conflicting" and only the non-conflicting one will work. Which one this is is usually arbitrary, and there is no reason to have such limitation. Often times keybinds are only applicable in certain scenarios, and a commonly found degree of overlap is within reason. Therefore, NTM will run its own key handling code which allows conflicting keybinds to work. If there should be any issues with this behavior, it can be disabled with the config option `1.34_enableKeybindOverlap`. +### Render distance capping +There is a common crash caused by Minecraft's render distance slider going out of bounds, this usually happens when uninstalling a mod that extends the render distance (like Optifine) or when downgrading the Minecraft version (newer versions have higher render distance caps). To prevent crashes, the mod will attempt to decrease the render distance if it's above 16 unless Optifine is installed. If this behavior is not desired (for example, because another mod that allows higher render distance is being used), it can be disabled with the config option `1.25_enableRenderDistCheck`. + +### Log spam caused by ComparableStack +In some modpacks (exact mods needed to replicate this are unknown), it's possible that invalid registered items may cause problems for NEI handlers. To prevent crashes, the ComparableStack class used to represent stacks will default to a safe registered item, and print a log message. In certain situations, this may cause dozens of errors to be printed at once, potentially even lagging the game. If that happens, the log message (but not the error handling) can be disabled with the config option `1.28_enableSilentCompStackErrors`. + # License This software is licensed under the GNU Lesser General Public License version 3. In short: This software is free, you may run the software freely, create modified versions, distribute this software and distribute modified versions, as long as the modified software too has a free software license (with an exception for linking to this software, as stated by the "Lesser" part of the LGPL, where this may not be required). You win this round, Stallman. The full license can be found in the `LICENSE` and `LICENSE.LESSER` files. diff --git a/changelog b/changelog index 2ae8aa9c2..dba353fb3 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,17 @@ ## Changed * All pylons and electrical connectors are now dyeable, using any dye (even modded ones, based on ore dict) to change the color of the cable - * Colors are based on the connecting pylon, not the cables themselves, meaning that using one dye will change all wires connected to that pylon right up to the half way point \ No newline at end of file + * Colors are based on the connecting pylon, not the cables themselves, meaning that using one dye will change all wires connected to that pylon right up to the half way point +* Glyphid behemoths now spew sulfuric acid instead of hydrogen peroxide +* Glyphid brawlers can now leap at nearby players +* The structure config has changed + * Instead of a central toggle for enabling/disabling structures, there's now three possible settings, enabling structures, disabling structures or making structure spawn respect the setting from the world creation menu +* Pressurized gauges like for the vacuum refinery and hydrotreater no longer have slots for item barrels (as those would logically not work), instead they show a pressure symbol +* Auditory geiger counters in armors will now click based on the radiation level *inside* the suit, i.e. the effective exposure for the player +* Diamonds are now a valid crucible material, turning into carbon at a 1:1 ratio (like graphite) +* Emerald is also a valid crucible material now, turning into beryllium at a 4:3 ratio +* Emeralds can now be mined as bedrock ores with a weight of 50 (half as common as iron, as common as redstone) + +## Fixed +* Fixed rocket artillery turret not saving loaded ammo type/count +* Fixed crash caused by custom missile launchers operating without designator +* Fixed meltdown elementals rendering their beam in the NEI spawner screen, causing extreme lag or the game to freeze \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/machine/FoundrySlagtap.java b/src/main/java/com/hbm/blocks/machine/FoundrySlagtap.java index da54714cf..e2543deaf 100644 --- a/src/main/java/com/hbm/blocks/machine/FoundrySlagtap.java +++ b/src/main/java/com/hbm/blocks/machine/FoundrySlagtap.java @@ -6,10 +6,8 @@ import com.hbm.tileentity.machine.TileEntityFoundrySlagtap; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import net.minecraftforge.client.event.RenderGameOverlayEvent.Pre; public class FoundrySlagtap extends FoundryOutlet { diff --git a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java index 84adc2375..89435b761 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java +++ b/src/main/java/com/hbm/blocks/machine/MachineStrandCaster.java @@ -7,7 +7,6 @@ import com.hbm.blocks.ILookOverlay; import com.hbm.handler.MultiblockHandlerXR; import com.hbm.inventory.material.Mats; import com.hbm.items.ModItems; -import com.hbm.items.machine.ItemMold; import com.hbm.items.machine.ItemScraps; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineStrandCaster; diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 13f5e37dd..3aedd78bc 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -26,7 +26,6 @@ public class GeneralConfig { public static boolean enableRenderDistCheck = true; public static boolean enableReEval = true; public static boolean enableSilentCompStackErrors = true; - public static boolean enableChunkyNEIHandler = true; public static boolean enableSkyboxes = true; public static boolean enableImpactWorldProvider = true; public static boolean enableStatReRegistering = true; @@ -94,7 +93,6 @@ public class GeneralConfig { enableReEval = config.get(CATEGORY_GENERAL, "1.27_enableReEval", true, "Allows re-evaluating power networks on link remove instead of destroying and recreating").getBoolean(true); enableSilentCompStackErrors = config.get(CATEGORY_GENERAL, "1.28_enableSilentCompStackErrors", false, "Enabling this will disable log spam created by unregistered items in ComparableStack instances.").getBoolean(false); hintPos = CommonConfig.createConfigInt(config, CATEGORY_GENERAL, "1.29_hudOverlayPosition", "0: Top left\n1: Top right\n2: Center right\n3: Center Left", 0); - enableChunkyNEIHandler = config.get(CATEGORY_GENERAL, "1.30_enableChunkyNEIHandler", true, "If enabled, registers a NEI handler that will show the chosen item in a larger view.").getBoolean(true); enableSkyboxes = config.get(CATEGORY_GENERAL, "1.31_enableSkyboxes", true, "If enabled, will try to use NTM's custom skyboxes.").getBoolean(true); enableImpactWorldProvider = config.get(CATEGORY_GENERAL, "1.32_enableImpactWorldProvider", true, "If enabled, registers custom world provider which modifies lighting and sky colors for post impact effects.").getBoolean(true); enableStatReRegistering = config.get(CATEGORY_GENERAL, "1.33_enableStatReRegistering", true, "If enabled, will re-register item crafting/breaking/usage stats in order to fix a forge bug where modded items just won't show up.").getBoolean(true); diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index d8c9b2e9a..f3f3e51c9 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -51,6 +51,7 @@ public class WorldConfig { public static int bedrockRedstoneSpawn = 50; public static int bedrockRareEarthSpawn = 50; public static int bedrockBauxiteSpawn = 100; + public static int bedrockEmeraldSpawn = 50; public static int bedrockGlowstoneSpawn = 100; public static int bedrockPhosphorusSpawn = 50; public static int bedrockQuartzSpawn = 100; @@ -171,6 +172,7 @@ public class WorldConfig { bedrockNeodymiumSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B15_bedrockNeodymiumWeight", "Spawn weight for neodymium bedrock ore", 50); bedrockRareEarthSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B16_bedrockRareEarthWeight", "Spawn weight for rare earth bedrock ore", 50); bedrockBauxiteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B17_bedrockBauxiteWeight", "Spawn weight for bauxite bedrock ore", 100); + bedrockEmeraldSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B18_bedrockEmeraldWeight", "Spawn weight for emerald bedrock ore", 50); bedrockGlowstoneSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN00_bedrockGlowstoneWeight", "Spawn weight for glowstone bedrock ore", 100); bedrockPhosphorusSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN01_bedrockPhosphorusWeight", "Spawn weight for phosphorus bedrock ore", 50); diff --git a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java b/src/main/java/com/hbm/handler/nei/ChunkyHandler.java deleted file mode 100644 index 02ff171c1..000000000 --- a/src/main/java/com/hbm/handler/nei/ChunkyHandler.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.hbm.handler.nei; - -import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; - -import org.lwjgl.opengl.GL11; - -import com.hbm.config.GeneralConfig; -import com.hbm.lib.RefStrings; - -import codechicken.nei.PositionedStack; -import codechicken.nei.guihook.GuiContainerManager; -import codechicken.nei.recipe.TemplateRecipeHandler; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.renderer.RenderHelper; -import net.minecraft.item.ItemStack; - -public class ChunkyHandler extends TemplateRecipeHandler { - - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { - - ItemStack stack; - - public RecipeSet(ItemStack stack) { - this.stack = stack.copy(); - this.stack.stackSize = 1; - } - - @Override - public PositionedStack getResult() { - return null; - } - } - - @Override - public String getRecipeName() { - return ""; - } - - @Override - public String getGuiTexture() { - return RefStrings.MODID + ":textures/gui/nei/gui_nei.png"; - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - if(GeneralConfig.enableChunkyNEIHandler) - this.arecipes.add(new RecipeSet(result)); - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - if(GeneralConfig.enableChunkyNEIHandler) - this.arecipes.add(new RecipeSet(ingredient)); - } - - @Override - public void drawExtras(int recipe) { - RecipeSet rec = (RecipeSet) this.arecipes.get(recipe); - drawTexturedModalRect(145, 0, 20, 20, 20, 20); - GL11.glPushMatrix(); - GL11.glTranslated(83, 50, 0); - double scale = 5D; - GL11.glScaled(scale, scale, scale); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glTranslated(-8, -8, 0); - GuiContainerManager.drawItem(0, 0, rec.stack); - GL11.glPopMatrix(); - RenderHelper.enableGUIStandardItemLighting(); - - FontRenderer font = Minecraft.getMinecraft().fontRenderer; - - int w = 83; - String top = "The same thing but in big"; - String bottom = "so you can really stare at it"; - font.drawString(top, w - font.getStringWidth(top) / 2, 100, 0x404040); - font.drawString(bottom, w - font.getStringWidth(bottom) / 2, 110, 0x404040); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java index f350f477d..11480d37d 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java +++ b/src/main/java/com/hbm/inventory/gui/GUIMachineBattery.java @@ -33,6 +33,7 @@ public class GUIMachineBattery extends GuiInfoContainer { this.ySize = 166; } + @SuppressWarnings("incomplete-switch") @Override public void drawScreen(int mouseX, int mouseY, float f) { super.drawScreen(mouseX, mouseY, f); diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index e346213d3..c2ba22236 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -54,6 +54,7 @@ public class Mats { public static final NTMMaterial MAT_PETCOKE = make( 1411, PETCOKE) .setConversion(MAT_CARBON, 4, 3); public static final NTMMaterial MAT_LIGCOKE = make( 1412, LIGCOKE) .setConversion(MAT_CARBON, 4, 3); public static final NTMMaterial MAT_GRAPHITE = make( 1420, GRAPHITE) .setConversion(MAT_CARBON, 1, 1); + public static final NTMMaterial MAT_DIAMOND = make( 1430, DIAMOND) .setConversion(MAT_CARBON, 1, 1); public static final NTMMaterial MAT_IRON = makeSmeltable(2600, IRON, 0xFFFFFF, 0x353535, 0xFFA259).setShapes(PIPE, CASTPLATE, WELDEDPLATE); public static final NTMMaterial MAT_GOLD = makeSmeltable(7900, GOLD, 0xFFFF8B, 0xC26E00, 0xE8D754).setShapes(DENSEWIRE, CASTPLATE); public static final NTMMaterial MAT_REDSTONE = makeSmeltable(_VS + 01, REDSTONE, 0xE3260C, 0x700E06, 0xFF1000); @@ -105,6 +106,7 @@ public class Mats { public static final NTMMaterial MAT_NEODYMIUM = makeSmeltable(6000, ND, 0xE6E6B6, 0x1C1C00, 0x8F8F5F).setShapes(NUGGET, DUSTTINY, INGOT, DUST, DENSEWIRE, BLOCK); public static final NTMMaterial MAT_NIOBIUM = makeSmeltable(4100, NB, 0xB76EC9, 0x2F2D42, 0xD576B1).setShapes(NUGGET, DUSTTINY, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_BERYLLIUM = makeSmeltable(400, BE, 0xB2B2A6, 0x0F0F03, 0xAE9572).setShapes(NUGGET, INGOT, DUST, BLOCK); + public static final NTMMaterial MAT_EMERALD = make( 401, EMERALD) .setConversion(MAT_BERYLLIUM, 4, 3); public static final NTMMaterial MAT_COBALT = makeSmeltable(2700, CO, 0xC2D1EE, 0x353554, 0x8F72AE).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_BORON = makeSmeltable(500, B, 0xBDC8D2, 0x29343E, 0xAD72AE).setShapes(DUSTTINY, INGOT, DUST, BLOCK); public static final NTMMaterial MAT_ZIRCONIUM = makeSmeltable(4000, ZR, 0xE3DCBE, 0x3E3719, 0xADA688).setShapes(NUGGET, DUSTTINY, BILLET, INGOT, DUST, CASTPLATE, WELDEDPLATE, BLOCK); diff --git a/src/main/java/com/hbm/render/entity/mob/RenderRADBeast.java b/src/main/java/com/hbm/render/entity/mob/RenderRADBeast.java index 068ce2365..8e37a801f 100644 --- a/src/main/java/com/hbm/render/entity/mob/RenderRADBeast.java +++ b/src/main/java/com/hbm/render/entity/mob/RenderRADBeast.java @@ -20,95 +20,86 @@ import net.minecraft.util.Vec3; public class RenderRADBeast extends RenderLiving { - private static final ResourceLocation blazeTextures = new ResourceLocation(RefStrings.MODID, "textures/entity/radbeast.png"); - private static final ResourceLocation mask = new ResourceLocation(RefStrings.MODID, "textures/models/ModelM65Blaze.png"); - private int field_77068_a; + private static final ResourceLocation blazeTextures = new ResourceLocation(RefStrings.MODID, "textures/entity/radbeast.png"); + private static final ResourceLocation mask = new ResourceLocation(RefStrings.MODID, "textures/models/ModelM65Blaze.png"); + private int blazeModel; - public RenderRADBeast() - { - super(new ModelBlaze(), 0.5F); - this.field_77068_a = ((ModelBlaze)this.mainModel).func_78104_a(); - } - - public void doRender(EntityRADBeast entity, double x, double y, double z, float r0, float r1) - { - int i = ((ModelBlaze)this.mainModel).func_78104_a(); + public RenderRADBeast() { + super(new ModelBlaze(), 0.5F); + this.blazeModel = ((ModelBlaze) this.mainModel).func_78104_a(); + } - if (i != this.field_77068_a) - { - this.field_77068_a = i; - this.mainModel = new ModelBlaze(); - } - - Entity victim = entity.getUnfortunateSoul(); - - if(victim != null) { + public void doRender(EntityRADBeast entity, double x, double y, double z, float r0, float r1) { + int i = ((ModelBlaze) this.mainModel).func_78104_a(); - GL11.glPushMatrix(); - - GL11.glTranslated(x, y + 1.25, z); - - double sx = entity.posX; - double sy = entity.posY + 1.25; - double sz = entity.posZ; - - double tX = victim.posX; - double tY = victim.posY + victim.height / 2; - double tZ = victim.posZ; - - if(victim == Minecraft.getMinecraft().thePlayer) - tY -= 1.5; - - double length = Math.sqrt(Math.pow(tX - sx, 2) + Math.pow(tY - sy, 2) + Math.pow(tZ - sz, 2)); - BeamPronter.prontBeam(Vec3.createVectorHelper(tX - sx, tY - sy, tZ - sz), EnumWaveType.RANDOM, EnumBeamType.SOLID, 0x004000, 0x004000, (int) (entity.worldObj.getTotalWorldTime() % 1000 + 1), (int) (length * 5), 0.125F, 2, 0.03125F); - - GL11.glPopMatrix(); + if(i != this.blazeModel) { + this.blazeModel = i; + this.mainModel = new ModelBlaze(); } - super.doRender((EntityLiving)entity, x, y, z, r0, r1); - } - - protected ResourceLocation getEntityTexture(EntityRADBeast p_110775_1_) - { - return blazeTextures; - } - - public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) - { - this.doRender((EntityRADBeast)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); - } - - public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) - { - this.doRender((EntityRADBeast)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); - } - - protected ResourceLocation getEntityTexture(Entity p_110775_1_) - { - return this.getEntityTexture((EntityRADBeast)p_110775_1_); - } - - public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) - { - this.doRender((EntityRADBeast)p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); - } + Entity victim = entity.getUnfortunateSoul(); + + if(victim != null && entity.posY > 0.1) { + + GL11.glPushMatrix(); + + GL11.glTranslated(x, y + 1.25, z); + + double sx = entity.posX; + double sy = entity.posY + 1.25; + double sz = entity.posZ; + + double tX = victim.posX; + double tY = victim.posY + victim.height / 2; + double tZ = victim.posZ; + + if(victim == Minecraft.getMinecraft().thePlayer) + tY -= 1.5; + + double length = Math.sqrt(Math.pow(tX - sx, 2) + Math.pow(tY - sy, 2) + Math.pow(tZ - sz, 2)); + if(length < 200) BeamPronter.prontBeam(Vec3.createVectorHelper(tX - sx, tY - sy, tZ - sz), EnumWaveType.RANDOM, EnumBeamType.SOLID, 0x004000, 0x004000, (int) (entity.worldObj.getTotalWorldTime() % 1000 + 1), (int) (length * 5), 0.125F, 2, 0.03125F); + + GL11.glPopMatrix(); + } + + super.doRender((EntityLiving) entity, x, y, z, r0, r1); + } + + protected ResourceLocation getEntityTexture(EntityRADBeast p_110775_1_) { + return blazeTextures; + } + + public void doRender(EntityLiving p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + this.doRender((EntityRADBeast) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } + + public void doRender(EntityLivingBase p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + this.doRender((EntityRADBeast) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } + + protected ResourceLocation getEntityTexture(Entity p_110775_1_) { + return this.getEntityTexture((EntityRADBeast) p_110775_1_); + } + + public void doRender(Entity p_76986_1_, double p_76986_2_, double p_76986_4_, double p_76986_6_, float p_76986_8_, float p_76986_9_) { + this.doRender((EntityRADBeast) p_76986_1_, p_76986_2_, p_76986_4_, p_76986_6_, p_76986_8_, p_76986_9_); + } private ModelM65Blaze modelM65; - protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) - { - - if(p_77032_2_ == 0) { - this.bindTexture(mask); - - if (this.modelM65 == null) { + protected int shouldRenderPass(EntityLivingBase p_77032_1_, int p_77032_2_, float p_77032_3_) { + + if(p_77032_2_ == 0) { + this.bindTexture(mask); + + if(this.modelM65 == null) { this.modelM65 = new ModelM65Blaze(); } - - this.setRenderPassModel(modelM65); - return 1; - } - - return super.shouldRenderPass(p_77032_1_, p_77032_2_, p_77032_3_); - } + + this.setRenderPassModel(modelM65); + return 1; + } + + return super.shouldRenderPass(p_77032_1_, p_77032_2_, p_77032_3_); + } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java index 8e60ce228..3266a973f 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityCompactLauncher.java @@ -284,10 +284,17 @@ public class TileEntityCompactLauncher extends TileEntityLoadedBase implements I public void launchFromDesignator() { - int tX = slots[1].stackTagCompound.getInteger("xCoord"); - int tZ = slots[1].stackTagCompound.getInteger("zCoord"); - - this.launchTo(tX, tZ); + if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { + IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); + + if(designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { + Vec3 coords = designator.getCoords(worldObj, slots[1], xCoord, yCoord, zCoord); + int tX = (int) Math.floor(coords.xCoord); + int tZ = (int) Math.floor(coords.zCoord); + + this.launchTo(tX, tZ); + } + } } public void launchTo(int tX, int tZ) { diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java index 5c2846be8..3259452ce 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchTable.java @@ -279,10 +279,17 @@ public class TileEntityLaunchTable extends TileEntityLoadedBase implements ISide public void launchFromDesignator() { - int tX = slots[1].stackTagCompound.getInteger("xCoord"); - int tZ = slots[1].stackTagCompound.getInteger("zCoord"); - - this.launchTo(tX, tZ); + if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { + IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); + + if(designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord)) { + Vec3 coords = designator.getCoords(worldObj, slots[1], xCoord, yCoord, zCoord); + int tX = (int) Math.floor(coords.xCoord); + int tZ = (int) Math.floor(coords.zCoord); + + this.launchTo(tX, tZ); + } + } } public void launchTo(int tX, int tZ) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java index 5d8fa4656..ba297333f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFoundrySlagtap.java @@ -11,7 +11,6 @@ import api.hbm.block.ICrucibleAcceptor; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.Vec3; import net.minecraft.world.World; diff --git a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java index fcfc1d074..4cd07246e 100644 --- a/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java +++ b/src/main/java/com/hbm/tileentity/turret/TileEntityTurretHIMARS.java @@ -350,6 +350,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem super.readFromNBT(nbt); this.mode = nbt.getShort("mode"); + this.typeLoaded = nbt.getShort("type"); + this.ammo = nbt.getInteger("ammo"); } @Override @@ -357,6 +359,8 @@ public class TileEntityTurretHIMARS extends TileEntityTurretBaseArtillery implem super.writeToNBT(nbt); nbt.setShort("mode", this.mode); + nbt.setInteger("type", this.typeLoaded); + nbt.setInteger("ammo", this.ammo); } @Override diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index fa162e6dd..2f4258234 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -46,6 +46,7 @@ public class BedrockOre { registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 8), 1, 0x202020), WorldConfig.bedrockCoalSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.emerald, 4), 1, 0x3FDD85), WorldConfig.bedrockEmeraldSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE), 2, 0x8F9999, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockRareEarthSpawn); registerBedrockOre(weightedOres, new BedrockOreDefinition(DictFrame.fromOne(ModBlocks.stone_resource, EnumStoneType.BAUXITE, 2),1, 0xEF7213), WorldConfig.bedrockBauxiteSpawn); From efa001ad28db1b5363c7a6e70e727a11a14fd6ce Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 17 Apr 2024 16:13:36 +0200 Subject: [PATCH 39/48] sound engine bullshittery --- README.md | 3 +++ changelog | 2 ++ src/main/java/com/hbm/config/GeneralConfig.java | 2 ++ src/main/java/com/hbm/main/ClientProxy.java | 7 +++++++ src/main/java/com/hbm/main/CraftingManager.java | 4 ++-- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 087a2c6e4..f5aff7230 100644 --- a/README.md +++ b/README.md @@ -127,5 +127,8 @@ There is a common crash caused by Minecraft's render distance slider going out o ### Log spam caused by ComparableStack In some modpacks (exact mods needed to replicate this are unknown), it's possible that invalid registered items may cause problems for NEI handlers. To prevent crashes, the ComparableStack class used to represent stacks will default to a safe registered item, and print a log message. In certain situations, this may cause dozens of errors to be printed at once, potentially even lagging the game. If that happens, the log message (but not the error handling) can be disabled with the config option `1.28_enableSilentCompStackErrors`. +### Sound system limit +By default, the sound system only allows a limited amount of sounds to run at once (28 regular sounds and 4 streaming sounds), this causes issues when there's many machines running at once, since their looped sounds will constantly interrupt each other, causing them to immediately restart, which in some isolated cases has proven to cause massive lagspikes. To prevent this, NTM will increase the sound limit to 1000 regular sounds and 50 streaming sounds, this can be disabled with the config option `1.39_enableSoundExtension`. + # License This software is licensed under the GNU Lesser General Public License version 3. In short: This software is free, you may run the software freely, create modified versions, distribute this software and distribute modified versions, as long as the modified software too has a free software license (with an exception for linking to this software, as stated by the "Lesser" part of the LGPL, where this may not be required). You win this round, Stallman. The full license can be found in the `LICENSE` and `LICENSE.LESSER` files. diff --git a/changelog b/changelog index dba353fb3..3665cedcf 100644 --- a/changelog +++ b/changelog @@ -10,6 +10,8 @@ * Diamonds are now a valid crucible material, turning into carbon at a 1:1 ratio (like graphite) * Emerald is also a valid crucible material now, turning into beryllium at a 4:3 ratio * Emeralds can now be mined as bedrock ores with a weight of 50 (half as common as iron, as common as redstone) +* Tritium lamps are now substantially cheaper +* Glyphid scouts can now spawn during the day when rampant glyphid spawning is enabled (artificial light however will still prevent them from spawning, keeping them out of bases) ## Fixed * Fixed rocket artillery turret not saving loaded ammo type/count diff --git a/src/main/java/com/hbm/config/GeneralConfig.java b/src/main/java/com/hbm/config/GeneralConfig.java index 3aedd78bc..75c61aed1 100644 --- a/src/main/java/com/hbm/config/GeneralConfig.java +++ b/src/main/java/com/hbm/config/GeneralConfig.java @@ -34,6 +34,7 @@ public class GeneralConfig { public static boolean enableMOTD = true; public static boolean enableGuideBook = true; public static boolean enableSteamParticles = true; + public static boolean enableSoundExtension = true; public static int hintPos = 0; public static boolean enableExpensiveMode = false; @@ -101,6 +102,7 @@ public class GeneralConfig { enableMOTD = config.get(CATEGORY_GENERAL, "1.36_enableMOTD", true, "If enabled, shows the 'Loaded mod!' chat message as well as update notifications when joining a world").getBoolean(true); enableGuideBook = config.get(CATEGORY_GENERAL, "1.37_enableGuideBook", true, "If enabled, gives players the guide book when joining the world for the first time").getBoolean(true); enableSteamParticles = config.get(CATEGORY_GENERAL, "1.38_enableSteamParticles",true, "If disabled, auxiliary cooling towers and large cooling towers will not emit steam particles when in use.").getBoolean(true); + enableSoundExtension = config.get(CATEGORY_GENERAL, "1.39_enableSoundExtension",true, "If enabled, will change the limit for how many sounds can play at once.").getBoolean(true); enableExpensiveMode = config.get(CATEGORY_GENERAL, "1.99_enableExpensiveMode", false, "It does what the name implies.").getBoolean(false); diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index 6b984dd85..ad0831044 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -33,6 +33,7 @@ import net.minecraft.world.World; import net.minecraftforge.client.MinecraftForgeClient; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.common.MinecraftForge; +import paulscode.sound.SoundSystemConfig; import java.awt.Color; import java.awt.Desktop; @@ -55,6 +56,7 @@ import com.hbm.blocks.generic.BlockSnowglobe.TileEntitySnowglobe; import com.hbm.blocks.machine.MachineFan.TileEntityFan; import com.hbm.blocks.machine.PistonInserter.TileEntityPistonInserter; import com.hbm.blocks.machine.WatzPump.TileEntityWatzPump; +import com.hbm.config.GeneralConfig; import com.hbm.entity.cart.*; import com.hbm.entity.effect.*; import com.hbm.entity.grenade.*; @@ -147,6 +149,11 @@ public class ClientProxy extends ServerProxy { registerBlockRenderer(); Jars.initJars(); + + if(GeneralConfig.enableSoundExtension) { + SoundSystemConfig.setNumberNormalChannels(1000); + SoundSystemConfig.setNumberStreamingChannels(50); + } } private void registerClientEventHandler(Object handler) { diff --git a/src/main/java/com/hbm/main/CraftingManager.java b/src/main/java/com/hbm/main/CraftingManager.java index a3896a2fe..cb9013f34 100644 --- a/src/main/java/com/hbm/main/CraftingManager.java +++ b/src/main/java/com/hbm/main/CraftingManager.java @@ -453,8 +453,8 @@ public class CraftingManager { addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.reinforced_lamp_off), 1), new Object[] { "FFF", "FBF", "FFF", 'F', Blocks.iron_bars, 'B', Blocks.redstone_lamp }); addRecipeAuto(new ItemStack(Item.getItemFromBlock(ModBlocks.reinforced_sand), 4), new Object[] { "FBF", "BFB", "FBF", 'F', Blocks.iron_bars, 'B', Blocks.sandstone }); - addRecipeAuto(new ItemStack(ModBlocks.lamp_tritium_green_off, 1), new Object[] { "GPG", "1T2", "GPG", 'G', KEY_ANYGLASS, 'P', P_RED.dust(), 'T', ModItems.cell_tritium, '1', "dustSulfur", '2', CU.dust() }); - addRecipeAuto(new ItemStack(ModBlocks.lamp_tritium_blue_off, 1), new Object[] { "GPG", "1T2", "GPG", 'G', KEY_ANYGLASS, 'P',P_RED.dust(), 'T', ModItems.cell_tritium, '1', AL.dust(), '2', ST.dust() }); + addShapelessAuto(new ItemStack(ModBlocks.lamp_tritium_green_off, 1), new Object[] { KEY_ANYGLASS, P_RED.dust(), Fluids.TRITIUM.getDict(1_000), S.dust() }); + addShapelessAuto(new ItemStack(ModBlocks.lamp_tritium_blue_off, 1), new Object[] { KEY_ANYGLASS, P_RED.dust(), Fluids.TRITIUM.getDict(1_000), AL.dust() }); addRecipeAuto(new ItemStack(ModBlocks.lantern, 1), new Object[] { "PGP", " S ", " S ", 'P', KEY_ANYPANE, 'G', Items.glowstone_dust, 'S', ModBlocks.steel_beam }); addRecipeAuto(new ItemStack(ModBlocks.spotlight_incandescent, 8), new Object[] { " G ", " T ", " I ", 'G', KEY_ANYPANE, 'T', ModItems.wire_tungsten, 'I', Items.iron_ingot }); addRecipeAuto(new ItemStack(ModBlocks.spotlight_fluoro, 8), new Object[] { " G ", " M ", " A ", 'G', KEY_ANYPANE, 'M', ModItems.ingot_mercury, 'A', ModItems.plate_aluminium }); From 24001a0ae8ca8235e273e5052373c0bf4397b6fe Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 18 Apr 2024 14:26:20 +1000 Subject: [PATCH 40/48] Replace DisplayLists with VBOs! Gotta fix the door rendering though, elided for now --- .../java/com/hbm/main/ResourceManager.java | 162 +++++++++--------- .../hbm/render/loader/HFRWavefrontObject.java | 4 + .../hbm/render/loader/WavefrontObjVBO.java | 150 ++++++++++++++++ .../render/tileentity/RenderDoorGeneric.java | 44 ++--- .../render/tileentity/RenderSnowglobe.java | 2 +- .../com/hbm/render/util/HorsePronter.java | 2 +- .../java/com/hbm/tileentity/DoorDecl.java | 6 +- 7 files changed, 264 insertions(+), 106 deletions(-) create mode 100644 src/main/java/com/hbm/render/loader/WavefrontObjVBO.java diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 2e4d78e50..b97cbd31d 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -25,35 +25,35 @@ public class ResourceManager { ////Obj TEs //Turrets - public static final IModelCustom turret_chekhov = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_chekhov.obj")).asDisplayList(); - public static final IModelCustom turret_jeremy = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_jeremy.obj")).asDisplayList(); - public static final IModelCustom turret_tauon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_tauon.obj")).asDisplayList(); - public static final IModelCustom turret_richard = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_richard.obj")).asDisplayList(); - public static final IModelCustom turret_howard = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard.obj")).asDisplayList(); - public static final IModelCustom turret_maxwell = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_microwave.obj")).asDisplayList(); - public static final IModelCustom turret_fritz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_fritz.obj")).asDisplayList(); - public static final IModelCustom turret_brandon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_brandon.obj")).asDisplayList(); - public static final IModelCustom turret_arty = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_arty.obj")).asDisplayList(); - public static final IModelCustom turret_himars = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_himars.obj")).asDisplayList(); - public static final IModelCustom turret_sentry = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_sentry.obj")).asDisplayList(); + public static final IModelCustom turret_chekhov = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_chekhov.obj")).asVBO(); + public static final IModelCustom turret_jeremy = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_jeremy.obj")).asVBO(); + public static final IModelCustom turret_tauon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_tauon.obj")).asVBO(); + public static final IModelCustom turret_richard = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_richard.obj")).asVBO(); + public static final IModelCustom turret_howard = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard.obj")).asVBO(); + public static final IModelCustom turret_maxwell = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_microwave.obj")).asVBO(); + public static final IModelCustom turret_fritz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_fritz.obj")).asVBO(); + public static final IModelCustom turret_brandon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_brandon.obj")).asVBO(); + public static final IModelCustom turret_arty = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_arty.obj")).asVBO(); + public static final IModelCustom turret_himars = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_himars.obj")).asVBO(); + public static final IModelCustom turret_sentry = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_sentry.obj")).asVBO(); - public static final IModelCustom turret_howard_damaged = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard_damaged.obj")).asDisplayList(); + public static final IModelCustom turret_howard_damaged = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/turrets/turret_howard_damaged.obj")).asVBO(); //Heaters - public static final IModelCustom heater_firebox = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj"), false).asDisplayList(); - public static final IModelCustom heater_oven = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heating_oven.obj"), false).asDisplayList(); - public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")).asDisplayList(); - public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false).asDisplayList(); - public static final IModelCustom heater_heatex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heatex.obj")).asDisplayList(); + public static final IModelCustom heater_firebox = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/firebox.obj"), false).asVBO(); + public static final IModelCustom heater_oven = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heating_oven.obj"), false).asVBO(); + public static final IModelCustom heater_oilburner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/oilburner.obj")).asVBO(); + public static final IModelCustom heater_electric = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/electric_heater.obj"), false).asVBO(); + public static final IModelCustom heater_heatex = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/heatex.obj")).asVBO(); //Heat Engines public static final IModelCustom stirling = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/stirling.obj")); public static final IModelCustom sawmill = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/sawmill.obj")); public static final IModelCustom crucible_heat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/crucible.obj")); - public static final IModelCustom boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler.obj")).asDisplayList(); - public static final IModelCustom boiler_burst = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler_burst.obj")).asDisplayList(); - public static final IModelCustom boiler_industrial = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/industrial_boiler.obj")).asDisplayList(); - public static final IModelCustom hephaestus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/hephaestus.obj")).asDisplayList(); + public static final IModelCustom boiler = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler.obj")).asVBO(); + public static final IModelCustom boiler_burst = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/boiler_burst.obj")).asVBO(); + public static final IModelCustom boiler_industrial = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/industrial_boiler.obj")).asVBO(); + public static final IModelCustom hephaestus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/hephaestus.obj")).asVBO(); //Caster o' Strands public static final IModelCustom strand_caster = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/strand_caster.obj")); @@ -70,53 +70,53 @@ public class ResourceManager { public static final IModelCustom mine_fat = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/mine_fat.obj")); //Oil Pumps - public static final IModelCustom derrick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/derrick.obj")).asDisplayList(); - public static final IModelCustom pumpjack = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pumpjack.obj")).asDisplayList(); - public static final IModelCustom fracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fracking_tower.obj")).asDisplayList(); + public static final IModelCustom derrick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/derrick.obj")).asVBO(); + public static final IModelCustom pumpjack = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pumpjack.obj")).asVBO(); + public static final IModelCustom fracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/fracking_tower.obj")).asVBO(); //Refinery - public static final IModelCustom refinery = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery.obj")).asDisplayList(); - public static final IModelCustom vacuum_distill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/vacuum_distill.obj")).asDisplayList(); - public static final IModelCustom refinery_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery_exploded.obj")).asDisplayList(); + public static final IModelCustom refinery = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery.obj")).asVBO(); + public static final IModelCustom vacuum_distill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/vacuum_distill.obj")).asVBO(); + public static final IModelCustom refinery_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/refinery_exploded.obj")).asVBO(); public static final IModelCustom fraction_tower = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fraction_tower.obj")); public static final IModelCustom fraction_spacer = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/machines/fraction_spacer.obj")); - public static final IModelCustom cracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/cracking_tower.obj")).asDisplayList(); - public static final IModelCustom catalytic_reformer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/catalytic_reformer.obj")).asDisplayList(); - public static final IModelCustom hydrotreater = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/hydrotreater.obj")).asDisplayList(); - public static final IModelCustom liquefactor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/liquefactor.obj")).asDisplayList(); - public static final IModelCustom solidifier = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/solidifier.obj")).asDisplayList(); - public static final IModelCustom compressor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/compressor.obj")).asDisplayList(); - public static final IModelCustom coker = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/coker.obj")).asDisplayList(); + public static final IModelCustom cracking_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/cracking_tower.obj")).asVBO(); + public static final IModelCustom catalytic_reformer = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/catalytic_reformer.obj")).asVBO(); + public static final IModelCustom hydrotreater = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/hydrotreater.obj")).asVBO(); + public static final IModelCustom liquefactor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/liquefactor.obj")).asVBO(); + public static final IModelCustom solidifier = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/solidifier.obj")).asVBO(); + public static final IModelCustom compressor = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/compressor.obj")).asVBO(); + public static final IModelCustom coker = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/coker.obj")).asVBO(); //Flare Stack - public static final IModelCustom oilflare = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/flare_stack.obj")).asDisplayList(); - public static final IModelCustom chimney_brick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chimney_brick.obj")).asDisplayList(); - public static final IModelCustom chimney_industrial = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chimney_industrial.obj")).asDisplayList(); + public static final IModelCustom oilflare = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/flare_stack.obj")).asVBO(); + public static final IModelCustom chimney_brick = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chimney_brick.obj")).asVBO(); + public static final IModelCustom chimney_industrial = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chimney_industrial.obj")).asVBO(); //Tank - public static final IModelCustom fluidtank = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/fluidtank.obj")).asDisplayList(); - public static final IModelCustom fluidtank_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/fluidtank_exploded.obj")).asDisplayList(); - public static final IModelCustom bat9000 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/bat9000.obj")).asDisplayList(); - public static final IModelCustom orbus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/orbus.obj")).asDisplayList(); + public static final IModelCustom fluidtank = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/fluidtank.obj")).asVBO(); + public static final IModelCustom fluidtank_exploded = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/fluidtank_exploded.obj")).asVBO(); + public static final IModelCustom bat9000 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/bat9000.obj")).asVBO(); + public static final IModelCustom orbus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/orbus.obj")).asVBO(); //Turbofan - public static final IModelCustom turbofan = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbofan.obj")).asDisplayList(); + public static final IModelCustom turbofan = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbofan.obj")).asVBO(); //Gas Turbine - public static final IModelCustom turbinegas = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbinegas.obj")).asDisplayList(); + public static final IModelCustom turbinegas = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbinegas.obj")).asVBO(); //Pumps - public static final IModelCustom pump = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pump.obj")).asDisplayList(); + public static final IModelCustom pump = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/pump.obj")).asVBO(); //Large Turbine - public static final IModelCustom steam_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/steam_engine.obj")).asDisplayList(); + public static final IModelCustom steam_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/steam_engine.obj")).asVBO(); public static final IModelCustom turbine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/turbine.obj")); - public static final IModelCustom chungus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chungus.obj")).asDisplayList(); + public static final IModelCustom chungus = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/chungus.obj")).asVBO(); //Cooling Tower - public static final IModelCustom tower_small = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_small.obj")).asDisplayList(); - public static final IModelCustom tower_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_large.obj")).asDisplayList(); - public static final IModelCustom condenser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/condenser.obj")).asDisplayList(); + public static final IModelCustom tower_small = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_small.obj")).asVBO(); + public static final IModelCustom tower_large = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/tower_large.obj")).asVBO(); + public static final IModelCustom condenser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/condenser.obj")).asVBO(); //Wood burner public static final IModelCustom wood_burner = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/wood_burner.obj")); @@ -131,7 +131,7 @@ public class ResourceManager { //Combustion Engine public static final IModelCustom dieselgen = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/dieselgen.obj")); - public static final IModelCustom combustion_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/combustion_engine.obj")).asDisplayList(); + public static final IModelCustom combustion_engine = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/combustion_engine.obj")).asVBO(); //Press public static final IModelCustom press_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/press_body.obj")); @@ -179,7 +179,7 @@ public class ResourceManager { //Mining Drill public static final IModelCustom drill_body = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/drill_main.obj")); public static final IModelCustom drill_bolt = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/drill_bolt.obj")); - public static final IModelCustom mining_drill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mining_drill.obj")).asDisplayList(); + public static final IModelCustom mining_drill = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mining_drill.obj")).asVBO(); //Laser Miner public static final IModelCustom mining_laser = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/mining_laser.obj")); @@ -263,11 +263,11 @@ public class ResourceManager { public static final IModelCustom shredder = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/machines/shredder.obj")); //Bombs - public static final IModelCustom bomb_gadget = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/gadget.obj")).asDisplayList(); + public static final IModelCustom bomb_gadget = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/gadget.obj")).asVBO(); public static final IModelCustom bomb_boy = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/LilBoy1.obj")); - public static final IModelCustom bomb_man = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/FatMan.obj")).asDisplayList(); + public static final IModelCustom bomb_man = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/FatMan.obj")).asVBO(); public static final IModelCustom bomb_mike = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/ivymike.obj")); - public static final IModelCustom bomb_tsar = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/tsar.obj")).asDisplayList(); + public static final IModelCustom bomb_tsar = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/bombs/tsar.obj")).asVBO(); public static final IModelCustom bomb_prototype = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/Prototype.obj")); public static final IModelCustom bomb_fleija = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/Fleija.obj")); public static final IModelCustom bomb_solinium = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/bombs/ufp.obj")); @@ -327,7 +327,7 @@ public class ResourceManager { //Doors public static AnimatedModel transition_seal = ColladaLoader.load(new ResourceLocation(RefStrings.MODID, "models/doors/seal.dae"), true); public static Animation transition_seal_anim = ColladaLoader.loadAnim(24040, new ResourceLocation(RefStrings.MODID, "models/doors/seal.dae")); - public static final WavefrontObjDisplayList fire_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/fire_door.obj")).asDisplayList(); + public static final IModelCustom fire_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/fire_door.obj")).asVBO(); //Secure Access Door public static final ResourceLocation secure_access_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/secure_access_door.png"); @@ -846,17 +846,17 @@ public class ResourceManager { public static final IModelCustom nightmare_dark = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/nightmare_dark.obj")); public static final IModelCustom glass_cannon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/glass_cannon.obj")); public static final IModelCustom bio_revolver = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/bio_revolver.obj")); - public static final IModelCustom chemthrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chemthrower.obj")).asDisplayList(); + public static final IModelCustom chemthrower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/chemthrower.obj")).asVBO(); public static final IModelCustom novac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/novac.obj")); - public static final IModelCustom m2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/m2_browning.obj")).asDisplayList(); //large fella should be a display list - public static final IModelCustom lunatic_sniper = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lunatic_sniper.obj")).asDisplayList(); + public static final IModelCustom m2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/m2_browning.obj")).asVBO(); //large fella should be a display list + public static final IModelCustom lunatic_sniper = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lunatic_sniper.obj")).asVBO(); public static final IModelCustom tau = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/tau.obj")); - public static final IModelCustom benelli = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/benelli_new.obj")).asDisplayList(); - public static final IModelCustom coilgun = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/coilgun.obj")).asDisplayList(); - public static final IModelCustom cryocannon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/cryo_cannon.obj")).asDisplayList(); - public static final IModelCustom uac_pistol = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/UAC pistol.obj")).asDisplayList(); - public static final IModelCustom congolake = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/congolake.obj")).asDisplayList(); - public static final IModelCustom lilmac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lilmac.obj")).asDisplayList(); + public static final IModelCustom benelli = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/benelli_new.obj")).asVBO(); + public static final IModelCustom coilgun = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/coilgun.obj")).asVBO(); + public static final IModelCustom cryocannon = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/cryo_cannon.obj")).asVBO(); + public static final IModelCustom uac_pistol = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/UAC pistol.obj")).asVBO(); + public static final IModelCustom congolake = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/congolake.obj")).asVBO(); + public static final IModelCustom lilmac = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/lilmac.obj")).asVBO(); public static final HashMap python_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/python.json")); public static final HashMap cursed_anim = AnimationLoader.load(new ResourceLocation(RefStrings.MODID, "models/weapons/animations/cursed.json")); @@ -1082,30 +1082,30 @@ public class ResourceManager { public static final IModelCustom b29 = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/b29.obj")); //Missiles - public static final IModelCustom missileV2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_v2.obj")).asDisplayList(); - public static final IModelCustom missileABM = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_abm.obj")).asDisplayList(); - public static final IModelCustom missileStealth = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_stealth.obj"), false).asDisplayList(); - public static final IModelCustom missileStrong = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_strong.obj")).asDisplayList(); - public static final IModelCustom missileHuge = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_huge.obj")).asDisplayList(); - public static final IModelCustom missileNuclear = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_atlas.obj")).asDisplayList(); - public static final IModelCustom missileMicro = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_micro.obj")).asDisplayList(); + public static final IModelCustom missileV2 = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_v2.obj")).asVBO(); + public static final IModelCustom missileABM = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_abm.obj")).asVBO(); + public static final IModelCustom missileStealth = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_stealth.obj"), false).asVBO(); + public static final IModelCustom missileStrong = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_strong.obj")).asVBO(); + public static final IModelCustom missileHuge = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_huge.obj")).asVBO(); + public static final IModelCustom missileNuclear = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_atlas.obj")).asVBO(); + public static final IModelCustom missileMicro = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/missile_micro.obj")).asVBO(); public static final IModelCustom missileShuttle = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileShuttle.obj")); public static final IModelCustom missileCarrier = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileCarrier.obj")); public static final IModelCustom missileBooster = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missileBooster.obj")); public static final IModelCustom minerRocket = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/minerRocket.obj")); - public static final IModelCustom soyuz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz.obj")).asDisplayList(); - public static final IModelCustom soyuz_lander = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz_lander.obj")).asDisplayList(); - public static final IModelCustom soyuz_module = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz_module.obj")).asDisplayList(); - public static final IModelCustom soyuz_launcher_legs = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_legs.obj"), false).asDisplayList(); - public static final IModelCustom soyuz_launcher_table = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_table.obj"), false).asDisplayList(); - public static final IModelCustom soyuz_launcher_tower_base = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_tower_base.obj"), false).asDisplayList(); - public static final IModelCustom soyuz_launcher_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_tower.obj"), false).asDisplayList(); - public static final IModelCustom soyuz_launcher_support_base = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support_base.obj"), false).asDisplayList(); - public static final IModelCustom soyuz_launcher_support = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support.obj"), false).asDisplayList(); + public static final IModelCustom soyuz = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz.obj")).asVBO(); + public static final IModelCustom soyuz_lander = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz_lander.obj")).asVBO(); + public static final IModelCustom soyuz_module = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/soyuz_module.obj")).asVBO(); + public static final IModelCustom soyuz_launcher_legs = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_legs.obj"), false).asVBO(); + public static final IModelCustom soyuz_launcher_table = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_table.obj"), false).asVBO(); + public static final IModelCustom soyuz_launcher_tower_base = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_tower_base.obj"), false).asVBO(); + public static final IModelCustom soyuz_launcher_tower = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_tower.obj"), false).asVBO(); + public static final IModelCustom soyuz_launcher_support_base = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support_base.obj"), false).asVBO(); + public static final IModelCustom soyuz_launcher_support = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support.obj"), false).asVBO(); //Missile Parts public static final IModelCustom missile_pad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_silo.obj")); - public static final IModelCustom missile_erector = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_erector.obj")).asDisplayList(); + public static final IModelCustom missile_erector = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_erector.obj")).asVBO(); public static final IModelCustom missile_assembly = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_assembly.obj")); public static final IModelCustom strut = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/strut.obj")); public static final IModelCustom compact_launcher = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/compact_launcher.obj")); diff --git a/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java b/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java index 3b27a781c..ddaae7ff7 100644 --- a/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java +++ b/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java @@ -482,6 +482,10 @@ public class HFRWavefrontObject implements IModelCustom { public String getType() { return "obj"; } + + public WavefrontObjVBO asVBO() { + return new WavefrontObjVBO(this); + } public WavefrontObjDisplayList asDisplayList() { return new WavefrontObjDisplayList(this); diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java new file mode 100644 index 000000000..b0d4302d3 --- /dev/null +++ b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java @@ -0,0 +1,150 @@ +package com.hbm.render.loader; + +import java.nio.FloatBuffer; +import java.util.ArrayList; +import java.util.List; + +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.*; + +import net.minecraftforge.client.model.IModelCustom; +import net.minecraftforge.client.model.obj.TextureCoordinate; +import net.minecraftforge.client.model.obj.Vertex; + +public class WavefrontObjVBO implements IModelCustom { + + class VBOBufferData { + + String name; + int vertices = 0; + int vertexHandle; + int uvHandle; + int normalHandle; + + } + + List groups = new ArrayList(); + + static int VERTEX_SIZE = 3; + static int UV_SIZE = 3; + + public WavefrontObjVBO(HFRWavefrontObject obj) { + for(S_GroupObject g : obj.groupObjects) { + VBOBufferData data = new VBOBufferData(); + data.name = g.name; + + FloatBuffer vertexData = BufferUtils.createFloatBuffer(g.faces.size() * 3 * VERTEX_SIZE); + FloatBuffer uvData = BufferUtils.createFloatBuffer(g.faces.size() * 3 * UV_SIZE); + FloatBuffer normalData = BufferUtils.createFloatBuffer(g.faces.size() * 3 * VERTEX_SIZE); + + for(S_Face face : g.faces) { + for(int i = 0; i < face.vertices.length; i++) { + Vertex vert = face.vertices[i]; + TextureCoordinate tex = new TextureCoordinate(0, 0); + Vertex normal = face.vertexNormals[i]; + + if(face.textureCoordinates != null && face.textureCoordinates.length > 0) { + tex = face.textureCoordinates[i]; + } + + data.vertices++; + vertexData.put(new float[] { vert.x, vert.y, vert.z }); + uvData.put(new float[] { tex.u, tex.v, tex.w }); + normalData.put(new float[] { normal.x, normal.y, normal.z }); + } + } + vertexData.flip(); + uvData.flip(); + normalData.flip(); + + data.vertexHandle = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.vertexHandle); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, vertexData, GL15.GL_STATIC_DRAW); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + data.uvHandle = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.uvHandle); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, uvData, GL15.GL_STATIC_DRAW); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + data.normalHandle = GL15.glGenBuffers(); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.normalHandle); + GL15.glBufferData(GL15.GL_ARRAY_BUFFER, normalData, GL15.GL_STATIC_DRAW); + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + + groups.add(data); + } + } + + @Override + public String getType() { + return "obj_vbo"; + } + + private void renderVBO(VBOBufferData data) { + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.vertexHandle); + GL11.glVertexPointer(VERTEX_SIZE, GL11.GL_FLOAT, 0, 0l); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.uvHandle); + GL11.glTexCoordPointer(UV_SIZE, GL11.GL_FLOAT, 0, 0l); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, data.normalHandle); + GL11.glNormalPointer(GL11.GL_FLOAT, 0, 0l); + + GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY); + GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GL11.glEnableClientState(GL11.GL_NORMAL_ARRAY); + + GL11.glDrawArrays(GL11.GL_TRIANGLES, 0, data.vertices); + + GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY); + GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY); + GL11.glDisableClientState(GL11.GL_NORMAL_ARRAY); + + GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0); + } + + @Override + public void renderAll() { + for(VBOBufferData data : groups) { + renderVBO(data); + } + } + + @Override + public void renderOnly(String... groupNames) { + for(VBOBufferData data : groups) { + for(String name : groupNames) { + if(data.name.equalsIgnoreCase(name)) { + renderVBO(data); + } + } + } + } + + @Override + public void renderPart(String partName) { + for(VBOBufferData data : groups) { + if(data.name.equalsIgnoreCase(partName)) { + renderVBO(data); + } + } + } + + @Override + public void renderAllExcept(String... excludedGroupNames) { + for(VBOBufferData data : groups) { + boolean skip = false; + for(String name : excludedGroupNames) { + if(data.name.equalsIgnoreCase(name)) { + skip = true; + break; + } + } + if(!skip) { + renderVBO(data); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java index 080be2114..c72b78c24 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java +++ b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java @@ -19,6 +19,7 @@ import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; +import net.minecraftforge.client.model.IModelCustom; public class RenderDoorGeneric extends TileEntitySpecialRenderer { @@ -75,28 +76,29 @@ public class RenderDoorGeneric extends TileEntitySpecialRenderer { animModel.controller.setAnim(w); animModel.renderAnimated(System.currentTimeMillis()); } else { - WavefrontObjDisplayList model = door.getModel(); + // IModelCustom model = door.getModel(); - long ms = System.currentTimeMillis()-te.animStartTime; - float openTicks = MathHelper.clamp_float(te.state == 2 || te.state == 0 ? door.timeToOpen()*50-ms : ms, 0, door.timeToOpen()*50)*0.02F; - for(Pair p : model.nameToCallList){ - if(!door.doesRender(p.getLeft(), false)) - continue; - GL11.glPushMatrix(); - bindTexture(door.getTextureForPart(te.getSkinIndex(), p.getLeft())); - doPartTransform(door, p.getLeft(), openTicks, false); - GL11.glCallList(p.getRight()); - for(String name : door.getChildren(p.getLeft())){ - if(!door.doesRender(name, true)) - continue; - GL11.glPushMatrix(); - bindTexture(door.getTextureForPart(te.getSkinIndex(), name)); - doPartTransform(door, name, openTicks, true); - model.renderPart(name); - GL11.glPopMatrix(); - } - GL11.glPopMatrix(); - } + // long ms = System.currentTimeMillis()-te.animStartTime; + // float openTicks = MathHelper.clamp_float(te.state == 2 || te.state == 0 ? door.timeToOpen()*50-ms : ms, 0, door.timeToOpen()*50)*0.02F; + + // for(Pair p : model.nameToCallList){ + // if(!door.doesRender(p.getLeft(), false)) + // continue; + // GL11.glPushMatrix(); + // bindTexture(door.getTextureForPart(te.getSkinIndex(), p.getLeft())); + // doPartTransform(door, p.getLeft(), openTicks, false); + // GL11.glCallList(p.getRight()); + // for(String name : door.getChildren(p.getLeft())){ + // if(!door.doesRender(name, true)) + // continue; + // GL11.glPushMatrix(); + // bindTexture(door.getTextureForPart(te.getSkinIndex(), name)); + // doPartTransform(door, name, openTicks, true); + // model.renderPart(name); + // GL11.glPopMatrix(); + // } + // GL11.glPopMatrix(); + // } } for(int i = 0; i < clip.length; i ++){ diff --git a/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java b/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java index 76f23bc5a..5a87ce681 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java +++ b/src/main/java/com/hbm/render/tileentity/RenderSnowglobe.java @@ -24,7 +24,7 @@ import net.minecraftforge.client.model.IModelCustom; public class RenderSnowglobe extends TileEntitySpecialRenderer implements IItemRendererProvider { - public static final IModelCustom snowglobe = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/snowglobe.obj"), false).asDisplayList(); + public static final IModelCustom snowglobe = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/trinkets/snowglobe.obj"), false).asVBO(); public static final ResourceLocation socket = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/snowglobe.png"); public static final ResourceLocation glass = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/snowglobe_glass.png"); public static final ResourceLocation features = new ResourceLocation(RefStrings.MODID, "textures/models/trinkets/snowglobe_features.png"); diff --git a/src/main/java/com/hbm/render/util/HorsePronter.java b/src/main/java/com/hbm/render/util/HorsePronter.java index 6cba0146c..bec1e9ef6 100644 --- a/src/main/java/com/hbm/render/util/HorsePronter.java +++ b/src/main/java/com/hbm/render/util/HorsePronter.java @@ -11,7 +11,7 @@ import net.minecraftforge.client.model.IModelCustom; public class HorsePronter { - public static final IModelCustom horse = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/horse.obj"), false).asDisplayList(); + public static final IModelCustom horse = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/mobs/horse.obj"), false).asVBO(); public static final ResourceLocation tex_demohorse = new ResourceLocation(RefStrings.MODID, "textures/models/horse/horse_demo.png"); diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index 5844fcded..c8471327c 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -10,6 +10,8 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.IModelCustom; + import org.lwjgl.opengl.GL11; public abstract class DoorDecl { @@ -179,7 +181,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustom getModel() { return ResourceManager.fire_door; } }; @@ -1110,7 +1112,7 @@ public abstract class DoorDecl { public abstract ResourceLocation getTextureForPart(int skinIndex, String partName); @SideOnly(Side.CLIENT) - public abstract WavefrontObjDisplayList getModel(); + public abstract IModelCustom getModel(); @SideOnly(Side.CLIENT) public AnimatedModel getAnimatedModel() { From b9fa9464406a6f4c8a7daffdf5566e3f47cee303 Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 18 Apr 2024 16:05:22 +1000 Subject: [PATCH 41/48] Fix connected texture blocks not rendering --- .../hbm/render/block/ct/RenderBlocksCT.java | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java index bbd2655ee..498e81e3a 100644 --- a/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java +++ b/src/main/java/com/hbm/render/block/ct/RenderBlocksCT.java @@ -26,11 +26,8 @@ public class RenderBlocksCT extends RenderBlocks { VertInfo bc; VertInfo br; - Tessellator tess; - public RenderBlocksCT() { super(); - this.tess = Tessellator.instance; } public void prepWorld(IBlockAccess acc) { @@ -240,13 +237,13 @@ public class RenderBlocksCT extends RenderBlocks { boolean debugColor = false; /// ORDER: ROTATIONAL /// - if(debugColor) tess.setColorOpaque_F(1F, 1F, 0F); + if(debugColor) Tessellator.instance.setColorOpaque_F(1F, 1F, 0F); drawVert(ftr, icon.getMaxU(), icon.getMinV(), ntr); - if(debugColor) tess.setColorOpaque_F(1F, 0F, 0F); + if(debugColor) Tessellator.instance.setColorOpaque_F(1F, 0F, 0F); drawVert(ftl, icon.getMinU(), icon.getMinV(), ntl); - if(debugColor) tess.setColorOpaque_F(0F, 0F, 1F); + if(debugColor) Tessellator.instance.setColorOpaque_F(0F, 0F, 1F); drawVert(fbl, icon.getMinU(), icon.getMaxV(), nbl); - if(debugColor) tess.setColorOpaque_F(0F, 1F, 0F); + if(debugColor) Tessellator.instance.setColorOpaque_F(0F, 1F, 0F); drawVert(fbr, icon.getMaxU(), icon.getMaxV(), nbr); } @@ -257,11 +254,11 @@ public class RenderBlocksCT extends RenderBlocks { private void drawVert(double x, double y, double z, double u, double v, VertInfo info) { if(this.enableAO) { - tess.setColorOpaque_F(info.red, info.green, info.blue); - tess.setBrightness(info.brightness); + Tessellator.instance.setColorOpaque_F(info.red, info.green, info.blue); + Tessellator.instance.setBrightness(info.brightness); } - tess.addVertexWithUV(x, y, z, u, v); + Tessellator.instance.addVertexWithUV(x, y, z, u, v); } private double[] avgCoords(double[] first, double[] second) { @@ -315,32 +312,32 @@ public class RenderBlocksCT extends RenderBlocks { GL11.glRotatef(90.0F, 0.0F, 1.0F, 0.0F); GL11.glTranslatef(-0.5F, -0.5F, -0.5F); - tess.startDrawingQuads(); - tess.setNormal(0.0F, -1.0F, 0.0F); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(0.0F, -1.0F, 0.0F); super.renderFaceYNeg(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 0, meta)); - tess.draw(); - tess.startDrawingQuads(); - tess.setNormal(0.0F, 1.0F, 0.0F); + Tessellator.instance.draw(); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(0.0F, 1.0F, 0.0F); super.renderFaceYPos(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 1, meta)); - tess.draw(); + Tessellator.instance.draw(); - tess.startDrawingQuads(); - tess.setNormal(0.0F, 0.0F, -1.0F); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(0.0F, 0.0F, -1.0F); super.renderFaceZNeg(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 2, meta)); - tess.draw(); - tess.startDrawingQuads(); - tess.setNormal(0.0F, 0.0F, 1.0F); + Tessellator.instance.draw(); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(0.0F, 0.0F, 1.0F); super.renderFaceZPos(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 3, meta)); - tess.draw(); + Tessellator.instance.draw(); - tess.startDrawingQuads(); - tess.setNormal(-1.0F, 0.0F, 0.0F); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(-1.0F, 0.0F, 0.0F); super.renderFaceXNeg(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 4, meta)); - tess.draw(); - tess.startDrawingQuads(); - tess.setNormal(1.0F, 0.0F, 0.0F); + Tessellator.instance.draw(); + Tessellator.instance.startDrawingQuads(); + Tessellator.instance.setNormal(1.0F, 0.0F, 0.0F); super.renderFaceXPos(block, 0.0D, 0.0D, 0.0D, this.getBlockIconFromSideAndMetadata(block, 5, meta)); - tess.draw(); + Tessellator.instance.draw(); GL11.glTranslatef(0.5F, 0.5F, 0.5F); } From 3c760ba95d9ed28de5d53ef6ffbeec6158ad354f Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 18 Apr 2024 17:14:04 +1000 Subject: [PATCH 42/48] Fix up door rendering, moving it to a more generic interface --- .../java/com/hbm/main/ResourceManager.java | 3 +- .../hbm/render/loader/HFRWavefrontObject.java | 13 ++++- .../hbm/render/loader/IModelCustomNamed.java | 13 +++++ .../loader/WavefrontObjDisplayList.java | 12 ++++- .../hbm/render/loader/WavefrontObjVBO.java | 16 ++++-- .../render/tileentity/RenderDoorGeneric.java | 53 ++++++++++--------- .../java/com/hbm/tileentity/DoorDecl.java | 29 +++++----- 7 files changed, 91 insertions(+), 48 deletions(-) create mode 100644 src/main/java/com/hbm/render/loader/IModelCustomNamed.java diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index b97cbd31d..027f33180 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -9,6 +9,7 @@ import com.hbm.lib.RefStrings; import com.hbm.render.anim.AnimationLoader; import com.hbm.render.anim.BusAnimation; import com.hbm.render.loader.HFRWavefrontObject; +import com.hbm.render.loader.IModelCustomNamed; import com.hbm.render.loader.WavefrontObjDisplayList; import net.minecraft.util.ResourceLocation; @@ -327,7 +328,7 @@ public class ResourceManager { //Doors public static AnimatedModel transition_seal = ColladaLoader.load(new ResourceLocation(RefStrings.MODID, "models/doors/seal.dae"), true); public static Animation transition_seal_anim = ColladaLoader.loadAnim(24040, new ResourceLocation(RefStrings.MODID, "models/doors/seal.dae")); - public static final IModelCustom fire_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/fire_door.obj")).asVBO(); + public static final IModelCustomNamed fire_door = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/doors/fire_door.obj")).asVBO(); //Secure Access Door public static final ResourceLocation secure_access_door_tex = new ResourceLocation(RefStrings.MODID, "textures/models/doors/secure_access_door.png"); diff --git a/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java b/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java index ddaae7ff7..a3e443e99 100644 --- a/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java +++ b/src/main/java/com/hbm/render/loader/HFRWavefrontObject.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; +import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -16,12 +17,11 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.resources.IResource; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.ModelFormatException; import net.minecraftforge.client.model.obj.TextureCoordinate; import net.minecraftforge.client.model.obj.Vertex; -public class HFRWavefrontObject implements IModelCustom { +public class HFRWavefrontObject implements IModelCustomNamed { private static Pattern vertexPattern = Pattern.compile("(v( (\\-){0,1}\\d+(\\.\\d+)?){3,4} *\\n)|(v( (\\-){0,1}\\d+(\\.\\d+)?){3,4} *$)"); private static Pattern vertexNormalPattern = Pattern.compile("(vn( (\\-){0,1}\\d+(\\.\\d+)?){3,4} *\\n)|(vn( (\\-){0,1}\\d+(\\.\\d+)?){3,4} *$)"); private static Pattern textureCoordinatePattern = Pattern.compile("(vt( (\\-){0,1}\\d+\\.\\d+){2,3} *\\n)|(vt( (\\-){0,1}\\d+(\\.\\d+)?){2,3} *$)"); @@ -483,6 +483,15 @@ public class HFRWavefrontObject implements IModelCustom { return "obj"; } + @Override + public List getPartNames() { + List names = new ArrayList(); + for(S_GroupObject data : groupObjects) { + names.add(data.name); + } + return names; + } + public WavefrontObjVBO asVBO() { return new WavefrontObjVBO(this); } diff --git a/src/main/java/com/hbm/render/loader/IModelCustomNamed.java b/src/main/java/com/hbm/render/loader/IModelCustomNamed.java new file mode 100644 index 000000000..a12e1bdb4 --- /dev/null +++ b/src/main/java/com/hbm/render/loader/IModelCustomNamed.java @@ -0,0 +1,13 @@ +package com.hbm.render.loader; + +import java.util.List; + +import net.minecraftforge.client.model.IModelCustom; + +public interface IModelCustomNamed extends IModelCustom { + + // A little messy, but this is the cleanest refactor, and can be useful in the future + + public List getPartNames(); + +} diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java index 99eef4360..b797be151 100644 --- a/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java +++ b/src/main/java/com/hbm/render/loader/WavefrontObjDisplayList.java @@ -7,11 +7,10 @@ import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import net.minecraft.client.renderer.Tessellator; -import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.obj.GroupObject; import net.minecraftforge.client.model.obj.WavefrontObject; -public class WavefrontObjDisplayList implements IModelCustom { +public class WavefrontObjDisplayList implements IModelCustomNamed { public List> nameToCallList = new ArrayList<>(); @@ -95,4 +94,13 @@ public class WavefrontObjDisplayList implements IModelCustom { } } } + + @Override + public List getPartNames() { + List names = new ArrayList(); + for(Pair data : nameToCallList) { + names.add(data.getLeft()); + } + return names; + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java index b0d4302d3..f852ba4ee 100644 --- a/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java +++ b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java @@ -7,13 +7,12 @@ import java.util.List; import org.lwjgl.BufferUtils; import org.lwjgl.opengl.*; -import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.client.model.obj.TextureCoordinate; import net.minecraftforge.client.model.obj.Vertex; -public class WavefrontObjVBO implements IModelCustom { +public class WavefrontObjVBO implements IModelCustomNamed { - class VBOBufferData { + public class VBOBufferData { String name; int vertices = 0; @@ -23,7 +22,7 @@ public class WavefrontObjVBO implements IModelCustom { } - List groups = new ArrayList(); + public List groups = new ArrayList(); static int VERTEX_SIZE = 3; static int UV_SIZE = 3; @@ -147,4 +146,13 @@ public class WavefrontObjVBO implements IModelCustom { } } + @Override + public List getPartNames() { + List names = new ArrayList(); + for(VBOBufferData data : groups) { + names.add(data.name); + } + return names; + } + } \ No newline at end of file diff --git a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java index c72b78c24..33bdb32d9 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java +++ b/src/main/java/com/hbm/render/tileentity/RenderDoorGeneric.java @@ -2,7 +2,6 @@ package com.hbm.render.tileentity; import java.nio.DoubleBuffer; -import org.apache.commons.lang3.tuple.Pair; import org.lwjgl.opengl.GL11; import com.hbm.animloader.AnimatedModel; @@ -11,7 +10,7 @@ import com.hbm.animloader.AnimationWrapper; import com.hbm.animloader.AnimationWrapper.EndResult; import com.hbm.animloader.AnimationWrapper.EndType; import com.hbm.blocks.BlockDummyable; -import com.hbm.render.loader.WavefrontObjDisplayList; +import com.hbm.render.loader.IModelCustomNamed; import com.hbm.tileentity.DoorDecl; import com.hbm.tileentity.TileEntityDoorGeneric; @@ -19,7 +18,6 @@ import net.minecraft.client.renderer.GLAllocation; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MathHelper; -import net.minecraftforge.client.model.IModelCustom; public class RenderDoorGeneric extends TileEntitySpecialRenderer { @@ -76,29 +74,36 @@ public class RenderDoorGeneric extends TileEntitySpecialRenderer { animModel.controller.setAnim(w); animModel.renderAnimated(System.currentTimeMillis()); } else { - // IModelCustom model = door.getModel(); + IModelCustomNamed model = door.getModel(); - // long ms = System.currentTimeMillis()-te.animStartTime; - // float openTicks = MathHelper.clamp_float(te.state == 2 || te.state == 0 ? door.timeToOpen()*50-ms : ms, 0, door.timeToOpen()*50)*0.02F; + long ms = System.currentTimeMillis()-te.animStartTime; + float openTicks = MathHelper.clamp_float(te.state == 2 || te.state == 0 ? door.timeToOpen()*50-ms : ms, 0, door.timeToOpen()*50)*0.02F; - // for(Pair p : model.nameToCallList){ - // if(!door.doesRender(p.getLeft(), false)) - // continue; - // GL11.glPushMatrix(); - // bindTexture(door.getTextureForPart(te.getSkinIndex(), p.getLeft())); - // doPartTransform(door, p.getLeft(), openTicks, false); - // GL11.glCallList(p.getRight()); - // for(String name : door.getChildren(p.getLeft())){ - // if(!door.doesRender(name, true)) - // continue; - // GL11.glPushMatrix(); - // bindTexture(door.getTextureForPart(te.getSkinIndex(), name)); - // doPartTransform(door, name, openTicks, true); - // model.renderPart(name); - // GL11.glPopMatrix(); - // } - // GL11.glPopMatrix(); - // } + for(String partName : model.getPartNames()) { + if(!door.doesRender(partName, false)) + continue; + + GL11.glPushMatrix(); + { + bindTexture(door.getTextureForPart(te.getSkinIndex(), partName)); + doPartTransform(door, partName, openTicks, false); + model.renderPart(partName); + + for(String innerPartName : door.getChildren(partName)) { + if(!door.doesRender(innerPartName, true)) + continue; + + GL11.glPushMatrix(); + { + bindTexture(door.getTextureForPart(te.getSkinIndex(), innerPartName)); + doPartTransform(door, innerPartName, openTicks, true); + model.renderPart(innerPartName); + } + GL11.glPopMatrix(); + } + } + GL11.glPopMatrix(); + } } for(int i = 0; i < clip.length; i ++){ diff --git a/src/main/java/com/hbm/tileentity/DoorDecl.java b/src/main/java/com/hbm/tileentity/DoorDecl.java index c8471327c..d28ae1e22 100644 --- a/src/main/java/com/hbm/tileentity/DoorDecl.java +++ b/src/main/java/com/hbm/tileentity/DoorDecl.java @@ -4,13 +4,12 @@ import com.hbm.animloader.AnimatedModel; import com.hbm.animloader.Animation; import com.hbm.lib.Library; import com.hbm.main.ResourceManager; -import com.hbm.render.loader.WavefrontObjDisplayList; +import com.hbm.render.loader.IModelCustomNamed; import com.hbm.util.BobMathUtil; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; @@ -92,7 +91,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return null; } }; @@ -181,7 +180,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public IModelCustom getModel() { + public IModelCustomNamed getModel() { return ResourceManager.fire_door; } }; @@ -269,7 +268,7 @@ public abstract class DoorDecl { } @Override - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return null; } @@ -360,7 +359,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.sliding_seal_door; } }; @@ -459,7 +458,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.secure_access_door; } }; @@ -548,7 +547,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.round_airlock_door; } }; @@ -631,7 +630,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.qe_sliding_door; } @@ -717,7 +716,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.qe_containment; } @@ -858,7 +857,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.water_door; } @@ -920,7 +919,7 @@ public abstract class DoorDecl { @Override public int[] getDimensions() { return new int[] { 0, 0, 2, 2, 2, 2 }; } @Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_tex; } @Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_tex; } - @Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch; } + @Override @SideOnly(Side.CLIENT) public IModelCustomNamed getModel() { return ResourceManager.silo_hatch; } }; @@ -980,7 +979,7 @@ public abstract class DoorDecl { @Override public int[] getDimensions() { return new int[] { 0, 0, 3, 3, 3, 3 }; } @Override @SideOnly(Side.CLIENT) public ResourceLocation getTextureForPart(String partName) { return ResourceManager.silo_hatch_large_tex; } @Override public ResourceLocation getTextureForPart(int skinIndex, String partName) { return ResourceManager.silo_hatch_large_tex; } - @Override @SideOnly(Side.CLIENT) public WavefrontObjDisplayList getModel() { return ResourceManager.silo_hatch_large; } + @Override @SideOnly(Side.CLIENT) public IModelCustomNamed getModel() { return ResourceManager.silo_hatch_large; } }; @@ -1058,7 +1057,7 @@ public abstract class DoorDecl { @Override @SideOnly(Side.CLIENT) - public WavefrontObjDisplayList getModel() { + public IModelCustomNamed getModel() { return ResourceManager.large_vehicle_door; } @@ -1112,7 +1111,7 @@ public abstract class DoorDecl { public abstract ResourceLocation getTextureForPart(int skinIndex, String partName); @SideOnly(Side.CLIENT) - public abstract IModelCustom getModel(); + public abstract IModelCustomNamed getModel(); @SideOnly(Side.CLIENT) public AnimatedModel getAnimatedModel() { From dc8ec31ccddecb5fcdd89634f1609879dffcabb9 Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 18 Apr 2024 17:17:29 +1000 Subject: [PATCH 43/48] Allow render distances greater than 16 with Angelica installed --- src/main/java/com/hbm/main/ModEventHandlerClient.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 899a3b118..d8bf978c2 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -86,6 +86,7 @@ import com.hbm.sound.MovingSoundPlayerLoop.EnumHbmSound; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.InputEvent; @@ -925,14 +926,16 @@ public class ModEventHandlerClient { Minecraft mc = Minecraft.getMinecraft(); ArmorNo9.updateWorldHook(mc.theWorld); + + boolean supportsHighRenderDistance = FMLClientHandler.instance().hasOptifine() || Loader.isModLoaded("angelica"); - if(mc.gameSettings.renderDistanceChunks > 16 && GeneralConfig.enableRenderDistCheck && ! FMLClientHandler.instance().hasOptifine()) { + if(mc.gameSettings.renderDistanceChunks > 16 && GeneralConfig.enableRenderDistCheck && !supportsHighRenderDistance) { mc.gameSettings.renderDistanceChunks = 16; LoggingUtil.errorWithHighlight("========================== WARNING =========================="); - LoggingUtil.errorWithHighlight("Dangerous render distance detected: Values over 16 only work on 1.8+ or with Optifine installed!!"); + LoggingUtil.errorWithHighlight("Dangerous render distance detected: Values over 16 only work on 1.8+ or with Optifine/Angelica installed!!"); LoggingUtil.errorWithHighlight("Set '1.25_enableRenderDistCheck' in hbm.cfg to 'false' to disable this check."); LoggingUtil.errorWithHighlight("========================== WARNING =========================="); - LoggingUtil.errorWithHighlight("If you got this error after removing Optifine: Consider deleting your option files after removing mods."); + LoggingUtil.errorWithHighlight("If you got this error after removing Optifine/Angelica: Consider deleting your option files after removing mods."); LoggingUtil.errorWithHighlight("If you got this error after downgrading your Minecraft version: Consider using a launcher that doesn't reuse the same folders for every game instance. MultiMC for example, it's really good and it comes with a dedicated cat button. You like cats, right? Are you using the Microsoft launcher? The one launcher that turns every version switch into a tightrope act because all the old config and options files are still here because different instances all use the same folder structure instead of different folders like a competent launcher would, because some MO-RON thought that this was an acceptable way of doing things? Really? The launcher that circumcises every crashlog into indecipherable garbage, tricking oblivious people into posting that as a \"crash report\", effectively wasting everyone's time? The launcher made by the company that thought it would be HI-LA-RI-OUS to force everyone to use Microsoft accounts, effectively breaking every other launcher until they implement their terrible auth system?"); LoggingUtil.errorWithHighlight("========================== WARNING =========================="); } From 8d244baf12c27ef9b48ceb6994821fd24bc72925 Mon Sep 17 00:00:00 2001 From: George Paton Date: Thu, 18 Apr 2024 17:26:15 +1000 Subject: [PATCH 44/48] Reduce visibility of VBOBufferData --- src/main/java/com/hbm/render/loader/WavefrontObjVBO.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java index f852ba4ee..fe7eb985f 100644 --- a/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java +++ b/src/main/java/com/hbm/render/loader/WavefrontObjVBO.java @@ -12,7 +12,7 @@ import net.minecraftforge.client.model.obj.Vertex; public class WavefrontObjVBO implements IModelCustomNamed { - public class VBOBufferData { + class VBOBufferData { String name; int vertices = 0; @@ -22,7 +22,7 @@ public class WavefrontObjVBO implements IModelCustomNamed { } - public List groups = new ArrayList(); + List groups = new ArrayList(); static int VERTEX_SIZE = 3; static int UV_SIZE = 3; From 3460e8dceff2fcd429af23053254bd695ad3b13c Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 18 Apr 2024 14:56:08 +0200 Subject: [PATCH 45/48] and some more fixes --- changelog | 13 +++- gradle.properties | 63 +++++++++++++------ .../java/api/hbm/energymk2/PowerNetMK2.java | 17 ++++- .../java/com/hbm/blocks/bomb/Balefire.java | 62 ++++++++++-------- .../machine/pile/BlockGraphiteFuel.java | 2 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../machine/TileEntityStirling.java | 2 +- 7 files changed, 111 insertions(+), 50 deletions(-) diff --git a/changelog b/changelog index 3665cedcf..35fc33e98 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,7 @@ ## Changed +* Large models no longer use display lists, instead their rendering makes use of the more modern VBO system + * Models using VBOs should now render slightly faster + * This also fixes an issue with Angelica where certain parts of the model would render transparently * All pylons and electrical connectors are now dyeable, using any dye (even modded ones, based on ore dict) to change the color of the cable * Colors are based on the connecting pylon, not the cables themselves, meaning that using one dye will change all wires connected to that pylon right up to the half way point * Glyphid behemoths now spew sulfuric acid instead of hydrogen peroxide @@ -12,8 +15,16 @@ * Emeralds can now be mined as bedrock ores with a weight of 50 (half as common as iron, as common as redstone) * Tritium lamps are now substantially cheaper * Glyphid scouts can now spawn during the day when rampant glyphid spawning is enabled (artificial light however will still prevent them from spawning, keeping them out of bases) +* Balefire now has a much higher ignition radius +* Balefire becomes darker the more it spreads, making it possible to gauge how much further or if at all the balefire will spread +* The comparator output range of the pile fuel rods has been adjusted, allowing rods to be ejected exactly when they turn into bred uranium rods ## Fixed * Fixed rocket artillery turret not saving loaded ammo type/count * Fixed crash caused by custom missile launchers operating without designator -* Fixed meltdown elementals rendering their beam in the NEI spawner screen, causing extreme lag or the game to freeze \ No newline at end of file +* Fixed meltdown elementals rendering their beam in the NEI spawner screen, causing extreme lag or the game to freeze +* Fixed certain incompatibilities with Angelica, like machine models being transparent and connected texture blocks not rendering at all +* (Hopefully) fixed the issue of balefire spreading forever for good +* Fixed stirling engines not outputting into cables +* Power buffers (i.e. things that act as both providers and receivers in the same network) now have the lowest sending priority (sending priority didn't exist until now), preventing them from wasting transfer capacity by ping-ponging before all other relevant parts of the network are done transferring +* Fixed potential issue causing diodes to consume negative energy \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index b4ec7f1af..8892f2442 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,21 +1,48 @@ mod_version=1.0.27 # Empty build number makes a release type -mod_build_number=4936 +mod_build_number=4939 -credits=HbMinecraft, rodolphito (explosion algorithms), grangerave (explosion algorithms),\ - \ Hoboy (textures, models), Doctor17 (russian localization), Drillgon200 (effects, models,\ - \ porting), UFFR (RTGs, guns, casings, euphemium capacitor), Pu-238 (Tom impact effects), Bismarck\ - \ (chinese localization), Frooz (models), Minecreep (models), VT-6/24 (models, textures), Pheo (textures,\ - \ various machines, models, weapons), Vr (gas centrifuges, better worldgen, ZIRNOX, CP-1 parts, starter guide),\ - \ Adam29 (liquid petroleum, ethanol, electric furnace), Pashtet (russian localization), MartinTheDragon\ - \ (calculator, chunk-based fallout, bendable cranes, pipe improvements), haru315 (spiral point algorithm),\ - \ Sten89 (models), Pixelguru26 (textures), TheBlueHat (textures), Alcater (GUI textures, porting), impbk2002\ - \ (project settings), Nos (models), Burningwater202 (laminate glass), OvermindDL1 (project settings), TehTemmie\ - \ (reacher radiation function), Toshayo (satellite loot system, project settings, gradle curse task), Silly541\ - \ (config for safe ME drives), Voxelstice (OpenComputers integration, turbine spinup), BallOfEnergy1\ - \ (OpenComputers integration), martemen (project settings), Pvndols (thorium fuel recipe, gas turbine),\ - \ JamesH2 (blood mechanics, nitric acid, particle emitter), sdddddf80 (recipe configs, chinese localization,\ - \ custom machine holograms, I18n improvements), SuperCraftAlex (tooltips) LePeep (coilgun model, BDCL QC),\ - \ 70k (textures, glyphid AI, strand caster), Maksymisio (polish localization) Ice-Arrow (research reactor tweaks),\ - \ 245tt (anvil GUI improvements), MellowArpeggiation (new animation system, turbine sounds, sound fixes,\ - \ industrial lights, better particle diodes), FOlkvangrField (custom machine parts), KoblizekXD (doors) +credits=HbMinecraft,\ + \ rodolphito (explosion algorithms),\ + \ grangerave (explosion algorithms),\ + \ Hoboy (textures, models),\ + \ Drillgon200 (effects, models, porting),\ + \ MartinTheDragon (calculator, chunk-based fallout, bendable cranes, pipe improvements, PWR sounds),\ + \ Alcater (GUI textures, porting),\ + \ MellowArpeggiation (new animation system, turbine sounds, sound fixes, industrial lights, better particle diodes),\ + \ Pheo (textures, various machines, models, weapons),\ + \ Vr (gas centrifuges, better worldgen, ZIRNOX, CP-1 parts, starter guide),\ + \ LePeep (coilgun model, BDCL QC),\ + \ Adam29 (liquid petroleum, ethanol, electric furnace),\ + \ Pvndols (thorium fuel recipe, gas turbine),\ + \ JamesH2 (blood mechanics, nitric acid, particle emitter),\ + \ Doctor17 (russian localization)),\ + \ Pashtet (russian localization),\ + \ Bismarck (chinese localization),\ + \ Maksymisio (polish localization)\ + \ Pu-238 (Tom impact effects),\ + \ UFFR (RTGs, guns, casings, euphemium capacitor),\ + \ Frooz (models),\ + \ VT-6/24 (models, textures),\ + \ Nos (models),\ + \ Minecreep (models),\ + \ 70k (textures, glyphid AI, strand caster),\ + \ haru315 (spiral point algorithm),\ + \ Sten89 (models),\ + \ Pixelguru26 (textures),\ + \ TheBlueHat (textures),\ + \ Burningwater202 (laminate glass),\ + \ TehTemmie (reacher radiation function),\ + \ Silly541 (config for safe ME drives),\ + \ Voxelstice (OpenComputers integration, turbine spinup),\ + \ BallOfEnergy1 (OpenComputers integration),\ + \ martemen (project settings),\ + \ sdddddf80 (recipe configs, chinese localization, custom machine holograms),\ + \ SuperCraftAlex (tooltips)\ + \ Ice-Arrow (research reactor tweaks),\ + \ 245tt (anvil GUI improvements),\ + \ KoblizekXD (doors),\ + \ FOlkvangrField (custom machine parts),\ + \ Toshayo (satellite loot system, project settings, gradle curse task),\ + \ OvermindDL1 (project settings),\ + \ impbk2002 (project settings),\ diff --git a/src/main/java/api/hbm/energymk2/PowerNetMK2.java b/src/main/java/api/hbm/energymk2/PowerNetMK2.java index c41ff9e9b..51cfaf810 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -150,8 +150,19 @@ public class PowerNetMK2 { if(toTransfer > transferCap) toTransfer = transferCap; if(toTransfer <= 0) return; - List providers = new ArrayList() {{ addAll(providerEntries.keySet()); }}; - List receivers = new ArrayList() {{ addAll(receiverEntries.keySet()); }}; + List buffers = new ArrayList(); + List providers = new ArrayList(); + Set receiverSet = receiverEntries.keySet(); + for(IEnergyProviderMK2 provider : providerEntries.keySet()) { + if(receiverSet.contains(provider)) { + buffers.add(provider); + } else { + providers.add(provider); + } + } + providers.addAll(buffers); //makes buffers go last + List receivers = new ArrayList() {{ addAll(receiverSet); }}; + receivers.sort(COMP); int maxIteration = 1000; @@ -237,7 +248,7 @@ public class PowerNetMK2 { for(IEnergyReceiverMK2 dest : receiverEntries.keySet()) { long pd = priorityDemand[dest.getPriority().ordinal()]; long toFill = Math.min((long) ((double) (Math.min(dest.getMaxPower() - dest.getPower(), dest.getReceiverSpeed())) * (double) power / (double) pd), dest.getReceiverSpeed()); - toFill = Math.min(toFill, power); + toFill = Math.min(toFill, finalRemainder); long remainder = dest.transferPower(toFill); long transferred = toFill - remainder; finalRemainder -= transferred; diff --git a/src/main/java/com/hbm/blocks/bomb/Balefire.java b/src/main/java/com/hbm/blocks/bomb/Balefire.java index ecf7f579f..4a282e861 100644 --- a/src/main/java/com/hbm/blocks/bomb/Balefire.java +++ b/src/main/java/com/hbm/blocks/bomb/Balefire.java @@ -7,8 +7,10 @@ import static net.minecraftforge.common.util.ForgeDirection.SOUTH; import static net.minecraftforge.common.util.ForgeDirection.UP; import static net.minecraftforge.common.util.ForgeDirection.WEST; +import java.awt.Color; import java.util.Random; +import com.hbm.blocks.ModBlocks; import com.hbm.potion.HbmPotion; import cpw.mods.fml.relauncher.Side; @@ -47,9 +49,9 @@ public class Balefire extends BlockFire { return icon; } + @Override public void updateTick(World world, int x, int y, int z, Random rand) { if(world.getGameRules().getGameRuleBooleanValue("doFireTick")) { - boolean onNetherrack = world.getBlock(x, y - 1, z).isFireSource(world, x, y - 1, z, UP); if(!this.canPlaceBlockAt(world, x, y, z)) { world.setBlockToAir(x, y, z); @@ -57,12 +59,10 @@ public class Balefire extends BlockFire { int meta = world.getBlockMetadata(x, y, z); - world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + rand.nextInt(10)); + if(meta < 15) world.scheduleBlockUpdate(x, y, z, this, this.tickRate(world) + rand.nextInt(10)); - if(!onNetherrack && !this.canNeighborBurn(world, x, y, z)) { - if(!World.doesBlockHaveSolidTopSurface(world, x, y - 1, z)) { - world.setBlockToAir(x, y, z); - } + if(!this.canNeighborBurn(world, x, y, z) && !World.doesBlockHaveSolidTopSurface(world, x, y - 1, z)) { + world.setBlockToAir(x, y, z); } else { if(meta < 15) { this.tryCatchFire(world, x + 1, y, z, 500, rand, meta, WEST); @@ -71,31 +71,33 @@ public class Balefire extends BlockFire { this.tryCatchFire(world, x, y + 1, z, 300, rand, meta, DOWN); this.tryCatchFire(world, x, y, z - 1, 500, rand, meta, SOUTH); this.tryCatchFire(world, x, y, z + 1, 500, rand, meta, NORTH); - } + + int h = 3; - for(int i1 = x - 1; i1 <= x + 1; ++i1) { - for(int j1 = z - 1; j1 <= z + 1; ++j1) { - for(int k1 = y - 1; k1 <= y + 4; ++k1) { - if(i1 != x || k1 != y || j1 != z) { - int l1 = 100; + for(int ix = x - h; ix <= x + h; ++ix) { + for(int iz = z - h; iz <= z + h; ++iz) { + for(int iy = y - 1; iy <= y + 4; ++iy) { + + if(ix != x || iy != y || iz != z) { + int fireLimit = 100; - if(k1 > y + 1) { - l1 += (k1 - (y + 1)) * 100; - } + if(iy > y + 1) { + fireLimit += (iy - (y + 1)) * 100; + } + + if(world.getBlock(ix, iy, iz) == ModBlocks.balefire && world.getBlockMetadata(ix, iy, iz) > meta + 1) { + world.setBlock(ix, iy, iz, this, meta + 1, 3); + continue; + } - int i2 = this.getChanceOfNeighborsEncouragingFire(world, i1, k1, j1); + int neighborFireChance = this.getChanceOfNeighborsEncouragingFire(world, ix, iy, iz); - if(i2 > 0) { - int j2 = (i2 + 40 + world.difficultySetting.getDifficultyId() * 7) / (meta + 30); + if(neighborFireChance > 0) { + int adjustedFireChance = (neighborFireChance + 40 + world.difficultySetting.getDifficultyId() * 7) / (meta + 30); - if(j2 > 0 && rand.nextInt(l1) <= j2) { - int k2 = meta + rand.nextInt(5) / 4; - - if(k2 > 15) { - k2 = 15; + if(adjustedFireChance > 0 && rand.nextInt(fireLimit) <= adjustedFireChance) { + world.setBlock(ix, iy, iz, this, meta + 1, 3); } - - world.setBlock(i1, k1, j1, this, k2, 3); } } } @@ -156,5 +158,15 @@ public class Balefire extends BlockFire { if(entity instanceof EntityLivingBase) ((EntityLivingBase) entity).addPotionEffect(new PotionEffect(HbmPotion.radiation.id, 5 * 20, 9)); } + + @SideOnly(Side.CLIENT) + public int colorMultiplier(IBlockAccess world, int x, int y, int z) { + int meta = world.getBlockMetadata(x, y, z); + return Color.HSBtoRGB(0F, 0F, 1F - meta / 30F); + } + @Override + public int getRenderType() { + return 1; + } } diff --git a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java index 3e827f3a3..7b3b892ca 100644 --- a/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java +++ b/src/main/java/com/hbm/blocks/machine/pile/BlockGraphiteFuel.java @@ -47,7 +47,7 @@ public class BlockGraphiteFuel extends BlockGraphiteDrilledTE implements IToolab @Override public int getComparatorInputOverride(World world, int x, int y, int z, int side) { TileEntityPileFuel pile = (TileEntityPileFuel)world.getTileEntity(x, y, z); - return MathHelper.clamp_int((pile.progress * 16) / (pile.maxProgress - 1000), 0, 15); //potentially wip + return MathHelper.clamp_int((pile.progress * 15) / (pile.maxProgress - 1000), 0, 15); } @Override diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 0d5894efa..477c52bb5 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4936)"; + public static final String VERSION = "1.0.27 BETA (4939)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java index 610ba487d..d59a5e933 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityStirling.java @@ -46,6 +46,7 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack if(!worldObj.isRemote) { if(hasCog) { + this.powerBuffer = 0; tryPullHeat(); this.powerBuffer = (long) (this.heat * (this.isCreative() ? 1 : this.efficiency)); @@ -97,7 +98,6 @@ public class TileEntityStirling extends TileEntityLoadedBase implements INBTPack for(DirPos pos : getConPos()) { this.tryProvide(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir()); } - this.powerBuffer = 0; } else { if(this.powerBuffer > 0) From d7664c79dadebc00c76ca9923232f14d08b42e75 Mon Sep 17 00:00:00 2001 From: Boblet Date: Fri, 19 Apr 2024 15:21:43 +0200 Subject: [PATCH 46/48] power net: compromise edition --- README.md | 5 +- changelog | 30 +------- .../java/api/hbm/energymk2/PowerNetMK2.java | 66 ++++++++++++++++++ .../TileEntityMachineAssemblerBase.java | 4 ++ .../hbm/textures/items/item_secret.canister | Bin 0 -> 299 bytes 5 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/items/item_secret.canister diff --git a/README.md b/README.md index f5aff7230..54734a685 100644 --- a/README.md +++ b/README.md @@ -104,10 +104,7 @@ One of the most common "performance" mods on 1.7.10, Optifine, achieves an incre * Entity "optimization" has a tendency to break chunkloading, this is especially noticeable with missiles which rely heavily on chunkloading to work, causing them to freeze mid-air. It's unclear what setting might fix this, and analysis of Optifine's source code (or rather, lack thereof) has not proven useful either. ### Angelica -Like most performance mods, Angelica also does deep-rooted changes to the game's rendering to improve performance, changes which have unintended side effects with mods that otherwise rely on the vanilla functionality that was changed. Unlike with Optifine, Angelica's source code is accessible and the mod is still in active development, so the list of issues might be outdated: -* 3D models in inventories might render with no texture, this issue apparently also breaks font rendering for item tooltips -* 3D models for tile entities have a tendency to render with blend enabled (i.e. semi-transparent), especially models that are separated into multiple parts which use display lists (i.e. an older system for rendering larger models more efficiently) -* Blocks with connected textures once again become invisible (exact fix for Angelica is unknown) +In older versions, Angelica caused issues regarding model rendering, often times making 3D models transparent. Ever since the switch to VBOs, models work fine. Another issue was blocks with connected textures not rendering at all, but this too was fixed, meaning as of time of writing there are no major incompatibilities known with Angelica. ### Skybox chainloader NTM adds a few small things to the skybox using a custom skybox renderer. Minecraft can only have a single skybox renderer loaded, so setting the skybox to the NTM custom one would break compatibility with other mods' skyboxes. To mend this, NTM employs a **chainloader**. This chainloader will detect if a different skybox is loaded, save a reference to that skybox and then use NTM's skybox, which when used will also make sure to run the previous modded skybox renderer. In the event that NTM's skybox were to cause trouble, it can be disabled with the config option `1.31_enableSkyboxes`. diff --git a/changelog b/changelog index 35fc33e98..0369d2ac3 100644 --- a/changelog +++ b/changelog @@ -1,30 +1,2 @@ -## Changed -* Large models no longer use display lists, instead their rendering makes use of the more modern VBO system - * Models using VBOs should now render slightly faster - * This also fixes an issue with Angelica where certain parts of the model would render transparently -* All pylons and electrical connectors are now dyeable, using any dye (even modded ones, based on ore dict) to change the color of the cable - * Colors are based on the connecting pylon, not the cables themselves, meaning that using one dye will change all wires connected to that pylon right up to the half way point -* Glyphid behemoths now spew sulfuric acid instead of hydrogen peroxide -* Glyphid brawlers can now leap at nearby players -* The structure config has changed - * Instead of a central toggle for enabling/disabling structures, there's now three possible settings, enabling structures, disabling structures or making structure spawn respect the setting from the world creation menu -* Pressurized gauges like for the vacuum refinery and hydrotreater no longer have slots for item barrels (as those would logically not work), instead they show a pressure symbol -* Auditory geiger counters in armors will now click based on the radiation level *inside* the suit, i.e. the effective exposure for the player -* Diamonds are now a valid crucible material, turning into carbon at a 1:1 ratio (like graphite) -* Emerald is also a valid crucible material now, turning into beryllium at a 4:3 ratio -* Emeralds can now be mined as bedrock ores with a weight of 50 (half as common as iron, as common as redstone) -* Tritium lamps are now substantially cheaper -* Glyphid scouts can now spawn during the day when rampant glyphid spawning is enabled (artificial light however will still prevent them from spawning, keeping them out of bases) -* Balefire now has a much higher ignition radius -* Balefire becomes darker the more it spreads, making it possible to gauge how much further or if at all the balefire will spread -* The comparator output range of the pile fuel rods has been adjusted, allowing rods to be ejected exactly when they turn into bred uranium rods - ## Fixed -* Fixed rocket artillery turret not saving loaded ammo type/count -* Fixed crash caused by custom missile launchers operating without designator -* Fixed meltdown elementals rendering their beam in the NEI spawner screen, causing extreme lag or the game to freeze -* Fixed certain incompatibilities with Angelica, like machine models being transparent and connected texture blocks not rendering at all -* (Hopefully) fixed the issue of balefire spreading forever for good -* Fixed stirling engines not outputting into cables -* Power buffers (i.e. things that act as both providers and receivers in the same network) now have the lowest sending priority (sending priority didn't exist until now), preventing them from wasting transfer capacity by ping-ponging before all other relevant parts of the network are done transferring -* Fixed potential issue causing diodes to consume negative energy \ No newline at end of file +* Limited assembler input to up to 10 attempts per ingredient, fixing a rare issue where the assembler freezes the server when pulling items \ 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 51cfaf810..beb91ecf8 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -7,6 +7,9 @@ import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; + +import com.hbm.util.Tuple.Pair; + import java.util.Map.Entry; import api.hbm.energymk2.IEnergyReceiverMK2.ConnectionPriority; @@ -119,6 +122,68 @@ public class PowerNetMK2 { if(providerEntries.isEmpty()) return; if(receiverEntries.isEmpty()) return; + long timestamp = System.currentTimeMillis(); + long transferCap = 100_000_000_000_000_00L; + + List> providers = new ArrayList(); + long powerAvailable = 0; + + Iterator> provIt = providerEntries.entrySet().iterator(); + while(provIt.hasNext()) { + Entry entry = provIt.next(); + if(timestamp - entry.getValue() > timeout) { provIt.remove(); continue; } + long src = Math.min(entry.getKey().getPower(), entry.getKey().getProviderSpeed()); + providers.add(new Pair(entry.getKey(), src)); + if(powerAvailable < transferCap) powerAvailable += src; + } + + powerAvailable = Math.min(powerAvailable, transferCap); + + List>[] receivers = new ArrayList[ConnectionPriority.values().length]; + for(int i = 0; i < receivers.length; i++) receivers[i] = new ArrayList(); + long[] demand = new long[ConnectionPriority.values().length]; + long totalDemand = 0; + + Iterator> recIt = receiverEntries.entrySet().iterator(); + + while(recIt.hasNext()) { + Entry entry = recIt.next(); + if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } + long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); + int p = entry.getKey().getPriority().ordinal(); + receivers[p].add(new Pair(entry.getKey(), rec)); + demand[p] += rec; + totalDemand += rec; + } + + long receiveAmount = Math.min(powerAvailable, totalDemand); + long sendAmount = receiveAmount; + + double receiveScale = (Math.min(1D, (double) receiveAmount / (double) totalDemand)); //if receiveAmount and totalDemand are not equal, scale the effective demand down (i.e. due to insufficient supply) + + for(int i = ConnectionPriority.values().length - 1; i <= 0; i--) { + List> list = receivers[i]; + double priorityDemand = demand[i]; + + for(Pair entry : list) { + double weight = (double) entry.getValue() / (double) (priorityDemand * receiveScale); + long toSend = (long) (receiveAmount * weight); + sendAmount -= entry.getKey().transferPower(toSend); //leftovers are subtracted from the intended amount to use up + } + } + + for(Pair entry : providers) { + double weight = (double) entry.getValue() / (double) powerAvailable; + long toUse = (long) (sendAmount * weight); + entry.getKey().usePower(toUse); + } + } + + @Deprecated public void transferPowerOld() { + + 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 @@ -226,6 +291,7 @@ public class PowerNetMK2 { } } + //TODO: revise, use new code and hit it with a hammer until it yields public long sendPowerDiode(long power) { long timestamp = System.currentTimeMillis(); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java index 525df1eda..be6f29afa 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAssemblerBase.java @@ -184,8 +184,12 @@ public abstract class TileEntityMachineAssemblerBase extends TileEntityMachineBa if(recipe != null) { for(AStack ingredient : recipe) { + + int tracker = 0; outer: while(!InventoryUtil.doesArrayHaveIngredients(slots, indices[0], indices[1], ingredient)) { + + if(tracker++ > 10) break; boolean found = false; diff --git a/src/main/resources/assets/hbm/textures/items/item_secret.canister b/src/main/resources/assets/hbm/textures/items/item_secret.canister new file mode 100644 index 0000000000000000000000000000000000000000..5f648f819464e73cad50b9e72464afeedeadabc7 GIT binary patch literal 299 zcmV+`0o4A9P)oFwH$B-6sZ xb`l)c2UK;Q9ZAyg-Y@Bi*M*mV;S`3!(IRY002ovPDHLkV1gdzdxHP~ literal 0 HcmV?d00001 From 9eaeddca322ebdeec066d9ad21e6792bc97d3b6c Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 20 Apr 2024 17:30:33 +0200 Subject: [PATCH 47/48] that oughta do it --- changelog | 3 +- .../java/api/hbm/energymk2/PowerNetMK2.java | 66 +++++++++++-------- .../hbm/entity/effect/EntityFalloutRain.java | 9 ++- .../entity/logic/EntityNukeExplosionMK5.java | 3 - .../storage/TileEntityMachineBattery.java | 20 ++++-- .../storage/TileEntityMachineFENSU.java | 13 +++- 6 files changed, 70 insertions(+), 44 deletions(-) diff --git a/changelog b/changelog index 0369d2ac3..0e92e2213 100644 --- a/changelog +++ b/changelog @@ -1,2 +1,3 @@ ## Fixed -* Limited assembler input to up to 10 attempts per ingredient, fixing a rare issue where the assembler freezes the server when pulling items \ No newline at end of file +* Limited assembler input to up to 10 attempts per ingredient, fixing a rare issue where the assembler freezes the server when pulling items +* Fixed fallout effects not loading chunks \ 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 beb91ecf8..b10c928d6 100644 --- a/src/main/java/api/hbm/energymk2/PowerNetMK2.java +++ b/src/main/java/api/hbm/energymk2/PowerNetMK2.java @@ -156,25 +156,25 @@ public class PowerNetMK2 { totalDemand += rec; } - long receiveAmount = Math.min(powerAvailable, totalDemand); - long sendAmount = receiveAmount; + long toTransfer = Math.min(powerAvailable, totalDemand); + long energyUsed = 0; - double receiveScale = (Math.min(1D, (double) receiveAmount / (double) totalDemand)); //if receiveAmount and totalDemand are not equal, scale the effective demand down (i.e. due to insufficient supply) - - for(int i = ConnectionPriority.values().length - 1; i <= 0; i--) { + for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) { List> list = receivers[i]; - double priorityDemand = demand[i]; + long priorityDemand = demand[i]; for(Pair entry : list) { - double weight = (double) entry.getValue() / (double) (priorityDemand * receiveScale); - long toSend = (long) (receiveAmount * weight); - sendAmount -= entry.getKey().transferPower(toSend); //leftovers are subtracted from the intended amount to use up + double weight = (double) entry.getValue() / (double) (priorityDemand); + long toSend = (long) Math.max(toTransfer * weight, 0D); + energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up } + + toTransfer -= energyUsed; } for(Pair entry : providers) { double weight = (double) entry.getValue() / (double) powerAvailable; - long toUse = (long) (sendAmount * weight); + long toUse = (long) Math.max(energyUsed * weight, 0D); entry.getKey().usePower(toUse); } } @@ -291,38 +291,46 @@ public class PowerNetMK2 { } } - //TODO: revise, use new code and hit it with a hammer until it yields public long sendPowerDiode(long power) { + if(receiverEntries.isEmpty()) return power; + long timestamp = System.currentTimeMillis(); - long demand = 0; - long[] priorityDemand = new long[ConnectionPriority.values().length]; + + List>[] receivers = new ArrayList[ConnectionPriority.values().length]; + for(int i = 0; i < receivers.length; i++) receivers[i] = new ArrayList(); + long[] demand = new long[ConnectionPriority.values().length]; + long totalDemand = 0; Iterator> recIt = receiverEntries.entrySet().iterator(); + while(recIt.hasNext()) { Entry entry = recIt.next(); if(timestamp - entry.getValue() > timeout) { recIt.remove(); continue; } long rec = Math.min(entry.getKey().getMaxPower() - entry.getKey().getPower(), entry.getKey().getReceiverSpeed()); - demand += rec; - for(int i = 0; i <= entry.getKey().getPriority().ordinal(); i++) priorityDemand[i] += rec; + int p = entry.getKey().getPriority().ordinal(); + receivers[p].add(new Pair(entry.getKey(), rec)); + demand[p] += rec; + totalDemand += rec; } - - if(demand <= 0) return power; - - long finalRemainder = power; - for(IEnergyReceiverMK2 dest : receiverEntries.keySet()) { - long pd = priorityDemand[dest.getPriority().ordinal()]; - long toFill = Math.min((long) ((double) (Math.min(dest.getMaxPower() - dest.getPower(), dest.getReceiverSpeed())) * (double) power / (double) pd), dest.getReceiverSpeed()); - toFill = Math.min(toFill, finalRemainder); - long remainder = dest.transferPower(toFill); - long transferred = toFill - remainder; - finalRemainder -= transferred; - this.energyTracker += transferred; - if(finalRemainder <= 0) break; + long toTransfer = Math.min(power, totalDemand); + long energyUsed = 0; + + for(int i = ConnectionPriority.values().length - 1; i >= 0; i--) { + List> list = receivers[i]; + long priorityDemand = demand[i]; + + for(Pair entry : list) { + double weight = (double) entry.getValue() / (double) (priorityDemand); + long toSend = (long) Math.max(toTransfer * weight, 0D); + energyUsed += (toSend - entry.getKey().transferPower(toSend)); //leftovers are subtracted from the intended amount to use up + } + + toTransfer -= energyUsed; } - return finalRemainder; + return power - energyUsed; } public static final ReceiverComparator COMP = new ReceiverComparator(); diff --git a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java index 0647627b4..519e21fa1 100644 --- a/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java +++ b/src/main/java/com/hbm/entity/effect/EntityFalloutRain.java @@ -6,13 +6,13 @@ import com.hbm.config.FalloutConfigJSON; import com.hbm.config.FalloutConfigJSON.FalloutEntry; import com.hbm.config.WorldConfig; import com.hbm.entity.item.EntityFallingBlockNT; +import com.hbm.entity.logic.EntityExplosionChunkloading; import com.hbm.saveddata.AuxSavedData; import com.hbm.world.WorldUtil; import com.hbm.world.biome.BiomeGenCraterBase; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.entity.Entity; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Vec3; @@ -24,7 +24,8 @@ import net.minecraftforge.common.util.ForgeDirection; import java.util.*; -public class EntityFalloutRain extends Entity { +public class EntityFalloutRain extends EntityExplosionChunkloading { + private boolean firstTick = true; // Of course Vanilla has it private in Entity... public EntityFalloutRain(World p_i1582_1_) { @@ -98,7 +99,8 @@ public class EntityFalloutRain extends Entity { if(biomeModified) WorldUtil.syncBiomeChange(worldObj, chunkPosX << 4, chunkPosZ << 4); } else { - setDead(); + this.clearChunkLoader(); + this.setDead(); break; } } @@ -240,6 +242,7 @@ public class EntityFalloutRain extends Entity { @Override protected void entityInit() { + super.entityInit(); this.dataWatcher.addObject(16, 0); } diff --git a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java index 918594e0c..dee4a3d91 100644 --- a/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java +++ b/src/main/java/com/hbm/entity/logic/EntityNukeExplosionMK5.java @@ -127,9 +127,6 @@ public class EntityNukeExplosionMK5 extends EntityExplosionChunkloading { } } - @Override - protected void entityInit() { } - @Override protected void readEntityFromNBT(NBTTagCompound nbt) { this.ticksExisted = nbt.getInteger("ticksExisted"); 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 b021eca59..84e40e47b 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -167,7 +167,7 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I priority = ConnectionPriority.LOW; } - int mode = this.getRelevantMode(); + int mode = this.getRelevantMode(false); if(this.node == null || this.node.expired) { @@ -238,8 +238,15 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I } } - @Override public long getProviderSpeed() { return this.getMaxPower() / 20; } - @Override public long getReceiverSpeed() { return this.getMaxPower() / 20; } + @Override public long getProviderSpeed() { + int mode = this.getRelevantMode(true); + return mode == mode_output || mode == mode_buffer ? this.getMaxPower() / 20 : 0; + } + + @Override public long getReceiverSpeed() { + int mode = this.getRelevantMode(true); + return mode == mode_input || mode == mode_buffer ? this.getMaxPower() / 20 : 0; + } @Override public void networkUnpack(NBTTagCompound nbt) { @@ -257,8 +264,11 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I return power; } - public short getRelevantMode() { - return worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) ? this.redHigh : this.redLow; + private short modeCache = 0; + public short getRelevantMode(boolean useCache) { + if(useCache) return this.modeCache; + this.modeCache = worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) ? this.redHigh : this.redLow; + return this.modeCache; } private long bufferedMax; 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 138b12693..bef292604 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineFENSU.java @@ -20,15 +20,22 @@ public class TileEntityMachineFENSU extends TileEntityMachineBattery { public static final long maxTransfer = 10_000_000_000_000_000L; - @Override public long getProviderSpeed() { return maxTransfer; } - @Override public long getReceiverSpeed() { return maxTransfer; } + @Override public long getProviderSpeed() { + int mode = this.getRelevantMode(true); + return mode == mode_output || mode == mode_buffer ? maxTransfer : 0; + } + + @Override public long getReceiverSpeed() { + int mode = this.getRelevantMode(true); + return mode == mode_input || mode == mode_buffer ? maxTransfer : 0; + } @Override public void updateEntity() { if(!worldObj.isRemote) { - int mode = this.getRelevantMode(); + int mode = this.getRelevantMode(false); if(this.node == null || this.node.expired) { From 13aaa627b243ad1b3aa7dc13c07882396fbdbfbb Mon Sep 17 00:00:00 2001 From: Bob Date: Sat, 20 Apr 2024 23:41:49 +0200 Subject: [PATCH 48/48] bronze --- changelog | 12 +++- src/main/java/com/hbm/blocks/ModBlocks.java | 53 +++++++++--------- .../java/com/hbm/blocks/machine/NTMAnvil.java | 9 +++ .../com/hbm/inventory/OreDictManager.java | 9 +++ .../java/com/hbm/inventory/material/Mats.java | 2 + .../inventory/recipes/ChemplantRecipes.java | 7 --- .../inventory/recipes/CrucibleRecipes.java | 8 +++ .../recipes/CrystallizerRecipes.java | 1 + .../inventory/recipes/anvil/AnvilRecipes.java | 17 +++--- src/main/java/com/hbm/items/ModItems.java | 7 ++- src/main/java/com/hbm/main/MainRegistry.java | 6 ++ src/main/resources/assets/hbm/lang/de_DE.lang | 14 ++++- src/main/resources/assets/hbm/lang/en_US.lang | 10 ++++ .../textures/blocks/anvil_arsenic_bronze.png | Bin 0 -> 516 bytes .../textures/blocks/anvil_bismuth_bronze.png | Bin 0 -> 516 bytes .../assets/hbm/textures/blocks/anvil_desh.png | Bin 0 -> 534 bytes .../hbm/textures/blocks/anvil_saturnite.png | Bin 0 -> 513 bytes .../textures/items/ingot_arsenic_bronze.png | Bin 0 -> 512 bytes .../textures/items/ingot_bismuth_bronze.png | Bin 0 -> 529 bytes 19 files changed, 111 insertions(+), 44 deletions(-) create mode 100644 src/main/resources/assets/hbm/textures/blocks/anvil_arsenic_bronze.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/anvil_bismuth_bronze.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/anvil_desh.png create mode 100644 src/main/resources/assets/hbm/textures/blocks/anvil_saturnite.png create mode 100644 src/main/resources/assets/hbm/textures/items/ingot_arsenic_bronze.png create mode 100644 src/main/resources/assets/hbm/textures/items/ingot_bismuth_bronze.png diff --git a/changelog b/changelog index 0e92e2213..324262095 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,13 @@ +## Added +* Bismuth bronze and arsenic bronze + * Kind of self-explanatory + * Can be made into anvils, allows for an alternative that doesn't involve 10 entire ingots of bismuth for a single anvil + +## Changed +* Arsenic is now made from only 16 oils scrap (instead of 256) in an ore acidizer using high-performance solvent (instead of chemical plant using sulfuric acid) +* Meteorite and starmetal anvils have been replaced with desh and saturnite ones + ## Fixed * Limited assembler input to up to 10 attempts per ingredient, fixing a rare issue where the assembler freezes the server when pulling items -* Fixed fallout effects not loading chunks \ No newline at end of file +* Fixed fallout effects not loading chunks +* Fixed RBMK steam channel recycling recipe \ No newline at end of file diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 17ca86aa7..899843fef 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -1079,10 +1079,11 @@ public class ModBlocks { public static Block anvil_iron; public static Block anvil_lead; public static Block anvil_steel; - public static Block anvil_meteorite; - public static Block anvil_starmetal; + public static Block anvil_desh; + public static Block anvil_saturnite; public static Block anvil_ferrouranium; - public static Block anvil_bismuth; + public static Block anvil_bismuth_bronze; + public static Block anvil_arsenic_bronze; public static Block anvil_schrabidate; public static Block anvil_dnt; public static Block anvil_osmiridium; @@ -2127,7 +2128,7 @@ public class ModBlocks { tesla = new MachineTesla(Material.iron).setBlockName("tesla").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":tesla"); launch_pad = new LaunchPad(Material.iron).setBlockName("launch_pad").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":launch_pad"); - launch_pad_rusted = new LaunchPadRusted(Material.iron).setBlockName("launch_pad_rusted").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":launch_pad_rusted"); + launch_pad_rusted = new LaunchPadRusted(Material.iron).setBlockName("launch_pad_rusted").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_rust"); launch_pad_large = new LaunchPadLarge(Material.iron).setBlockName("launch_pad_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_radar = new MachineRadar(Material.iron).setBlockName("machine_radar").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":machine_radar"); machine_radar_large = new MachineRadarLarge(Material.iron).setBlockName("machine_radar_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); @@ -2293,16 +2294,17 @@ public class ModBlocks { machine_autocrafter = new MachineAutocrafter().setBlockName("machine_autocrafter").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab); machine_funnel = new MachineFunnel().setBlockName("machine_funnel").setHardness(10.0F).setResistance(20.0F).setCreativeTab(MainRegistry.machineTab); - anvil_iron = new NTMAnvil(Material.iron, 1).setBlockName("anvil_iron").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_iron"); - anvil_lead = new NTMAnvil(Material.iron, 1).setBlockName("anvil_lead").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_lead"); - anvil_steel = new NTMAnvil(Material.iron, 2).setBlockName("anvil_steel").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_steel"); - anvil_meteorite = new NTMAnvil(Material.iron, 3).setBlockName("anvil_meteorite").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_meteorite"); - anvil_starmetal = new NTMAnvil(Material.iron, 3).setBlockName("anvil_starmetal").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_starmetal"); - anvil_ferrouranium = new NTMAnvil(Material.iron, 4).setBlockName("anvil_ferrouranium").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_ferrouranium"); - anvil_bismuth = new NTMAnvil(Material.iron, 5).setBlockName("anvil_bismuth").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_bismuth"); - anvil_schrabidate = new NTMAnvil(Material.iron, 6).setBlockName("anvil_schrabidate").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_schrabidate"); - anvil_dnt = new NTMAnvil(Material.iron, 7).setBlockName("anvil_dnt").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_dnt"); - anvil_osmiridium = new NTMAnvil(Material.iron, 8).setBlockName("anvil_osmiridium").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_osmiridium"); + anvil_iron = new NTMAnvil(Material.iron, NTMAnvil.TIER_IRON).setBlockName("anvil_iron").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_iron"); + anvil_lead = new NTMAnvil(Material.iron, NTMAnvil.TIER_IRON).setBlockName("anvil_lead").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_lead"); + anvil_steel = new NTMAnvil(Material.iron, NTMAnvil.TIER_STEEL).setBlockName("anvil_steel").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_steel"); + anvil_desh = new NTMAnvil(Material.iron, NTMAnvil.TIER_OIL).setBlockName("anvil_desh").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_desh"); + anvil_saturnite = new NTMAnvil(Material.iron, NTMAnvil.TIER_OIL).setBlockName("anvil_saturnite").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_saturnite"); + anvil_ferrouranium = new NTMAnvil(Material.iron, NTMAnvil.TIER_NUCLEAR).setBlockName("anvil_ferrouranium").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_ferrouranium"); + anvil_bismuth_bronze = new NTMAnvil(Material.iron, NTMAnvil.TIER_RBMK).setBlockName("anvil_bismuth_bronze").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_bismuth_bronze"); + anvil_arsenic_bronze = new NTMAnvil(Material.iron, NTMAnvil.TIER_RBMK).setBlockName("anvil_arsenic_bronze").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_arsenic_bronze"); + anvil_schrabidate = new NTMAnvil(Material.iron, NTMAnvil.TIER_FUSION).setBlockName("anvil_schrabidate").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_schrabidate"); + anvil_dnt = new NTMAnvil(Material.iron, NTMAnvil.TIER_PARTICLE).setBlockName("anvil_dnt").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_dnt"); + anvil_osmiridium = new NTMAnvil(Material.iron, NTMAnvil.TIER_GERALD).setBlockName("anvil_osmiridium").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_osmiridium"); anvil_murky = new NTMAnvil(Material.iron, 1916169).setBlockName("anvil_murky").setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":anvil_steel"); machine_waste_drum = new WasteDrum(Material.iron).setBlockName("machine_waste_drum").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.machineTab).setBlockTextureName(RefStrings.MODID + ":waste_drum"); @@ -3058,17 +3060,18 @@ public class ModBlocks { register(machine_autocrafter); register(machine_funnel); - GameRegistry.registerBlock(anvil_iron, ItemBlockBase.class, anvil_iron.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_lead, ItemBlockBase.class, anvil_lead.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_steel, ItemBlockBase.class, anvil_steel.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_meteorite, ItemBlockBase.class, anvil_meteorite.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_starmetal, ItemBlockBase.class, anvil_starmetal.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_ferrouranium, ItemBlockBase.class, anvil_ferrouranium.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_bismuth, ItemBlockBase.class, anvil_bismuth.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_schrabidate, ItemBlockBase.class, anvil_schrabidate.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_dnt, ItemBlockBase.class, anvil_dnt.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_osmiridium, ItemBlockBase.class, anvil_osmiridium.getUnlocalizedName()); - GameRegistry.registerBlock(anvil_murky, ItemBlockBase.class, anvil_murky.getUnlocalizedName()); + register(anvil_iron); + register(anvil_lead); + register(anvil_steel); + register(anvil_desh); + register(anvil_saturnite); + register(anvil_ferrouranium); + register(anvil_bismuth_bronze); + register(anvil_arsenic_bronze); + register(anvil_schrabidate); + register(anvil_dnt); + register(anvil_osmiridium); + register(anvil_murky); GameRegistry.registerBlock(press_preheater, press_preheater.getUnlocalizedName()); GameRegistry.registerBlock(machine_press, machine_press.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/blocks/machine/NTMAnvil.java b/src/main/java/com/hbm/blocks/machine/NTMAnvil.java index c71865430..16623e7b1 100644 --- a/src/main/java/com/hbm/blocks/machine/NTMAnvil.java +++ b/src/main/java/com/hbm/blocks/machine/NTMAnvil.java @@ -39,6 +39,15 @@ import net.minecraft.world.World; import net.minecraftforge.client.model.obj.WavefrontObject; public class NTMAnvil extends BlockFallingNT implements ITooltipProvider, IGUIProvider { + + public static final int TIER_IRON = 1; + public static final int TIER_STEEL = 2; + public static final int TIER_OIL = 3; + public static final int TIER_NUCLEAR = 4; + public static final int TIER_RBMK = 5; + public static final int TIER_FUSION = 6; + public static final int TIER_PARTICLE = 7; + public static final int TIER_GERALD = 8; public final int tier; diff --git a/src/main/java/com/hbm/inventory/OreDictManager.java b/src/main/java/com/hbm/inventory/OreDictManager.java index 9bdb12bcd..c5bd346ff 100644 --- a/src/main/java/com/hbm/inventory/OreDictManager.java +++ b/src/main/java/com/hbm/inventory/OreDictManager.java @@ -164,6 +164,10 @@ public class OreDictManager { public static final DictFrame TCALLOY = new DictFrame("TcAlloy"); /** CADMIUM STEEL */ public static final DictFrame CDALLOY = new DictFrame("CdAlloy"); + /** BISMUTH BRONZE */ + public static final DictFrame BBRONZE = new DictFrame("BismuthBronze"); + /** ARSENIC BRONZE */ + public static final DictFrame ABRONZE = new DictFrame("ArsenicBronze"); /** LEAD */ public static final DictFrame PB = new DictFrame("Lead"); public static final DictFrame BI = new DictFrame("Bismuth"); @@ -290,6 +294,8 @@ public class OreDictManager { public static final DictGroup ANY_HARDPLASTIC = new DictGroup("AnyHardPlastic", PC, PVC); /** Any post nuclear steel like TCA or CDA */ public static final DictGroup ANY_RESISTANTALLOY = new DictGroup("AnyResistantAlloy", TCALLOY, CDALLOY); + /** Any post nuclear steel like TCA or CDA */ + public static final DictGroup ANY_BISMOIDBRONZE = new DictGroup("AnyBismoidBronze", BBRONZE, ABRONZE); /** Any "powder" propellant like gunpowder, ballistite and cordite */ public static final DictFrame ANY_GUNPOWDER = new DictFrame("AnyPropellant"); /** Any smokeless powder like ballistite and cordite */ @@ -363,6 +369,8 @@ public class OreDictManager { STEEL .ingot(ingot_steel) .dustSmall(powder_steel_tiny) .dust(powder_steel) .plate(plate_steel) .block(block_steel); TCALLOY .ingot(ingot_tcalloy) .dust(powder_tcalloy) .block(block_tcalloy); CDALLOY .ingot(ingot_cdalloy) .block(block_cdalloy); + BBRONZE .ingot(ingot_bismuth_bronze); + ABRONZE .ingot(ingot_arsenic_bronze); PB .nugget(nugget_lead) .ingot(ingot_lead) .dust(powder_lead) .plate(plate_lead) .block(block_lead) .ore(ore_lead, ore_meteor_lead); BI .nugget(nugget_bismuth) .billet(billet_bismuth) .ingot(ingot_bismuth) .dust(powder_bismuth) .block(block_bismuth); AS .nugget(nugget_arsenic) .ingot(ingot_arsenic); @@ -627,6 +635,7 @@ public class OreDictManager { ANY_PLASTIC.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(BLOCK, true); ANY_HARDPLASTIC.addPrefix(INGOT, true); ANY_RESISTANTALLOY.addPrefix(INGOT, true).addPrefix(DUST, true).addPrefix(PLATECAST, true).addPrefix(PLATEWELDED, true).addPrefix(HEAVY_COMPONENT, true).addPrefix(BLOCK, true); + ANY_BISMOIDBRONZE.addPrefix(INGOT, true).addPrefix(PLATECAST, true); ANY_TAR.addPrefix(ANY, false); } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index c2ba22236..f2abc4a72 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -125,6 +125,8 @@ public class Mats { public static final NTMMaterial MAT_FERRO = makeSmeltable(_AS + 7, FERRO, 0xB7B7C9, 0x101022, 0x6B6B8B).setShapes(INGOT); public static final NTMMaterial MAT_TCALLOY = makeSmeltable(_AS + 6, TCALLOY, 0xD4D6D6, 0x323D3D, 0x9CA6A6).setShapes(INGOT, DUST, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT); public static final NTMMaterial MAT_CDALLOY = makeSmeltable(_AS + 13, CDALLOY, 0xF7DF8F, 0x604308, 0xFBD368).setShapes(INGOT, CASTPLATE, WELDEDPLATE, HEAVY_COMPONENT); + public static final NTMMaterial MAT_BBRONZE = makeSmeltable(_AS + 16, BBRONZE, 0xE19A69, 0x485353, 0x987D65).setShapes(INGOT, CASTPLATE); + public static final NTMMaterial MAT_ABRONZE = makeSmeltable(_AS + 17, ABRONZE, 0xDB9462, 0x203331, 0x77644D).setShapes(INGOT, CASTPLATE); public static final NTMMaterial MAT_MAGTUNG = makeSmeltable(_AS + 8, MAGTUNG, 0x22A2A2, 0x0F0F0F, 0x22A2A2).setShapes(INGOT, DUST, DENSEWIRE, BLOCK); public static final NTMMaterial MAT_CMB = makeSmeltable(_AS + 9, CMB, 0x6F6FB4, 0x000011, 0x6F6FB4).setShapes(INGOT, DUST, PLATE, CASTPLATE, WELDEDPLATE, BLOCK); public static final NTMMaterial MAT_DNT = makeSmeltable(_AS + 15, DNT, 0x7582B9, 0x16000E, 0x455289).setShapes(INGOT, DUST, DENSEWIRE, BLOCK); diff --git a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java index 319d12250..75af426bc 100644 --- a/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/ChemplantRecipes.java @@ -286,13 +286,6 @@ public class ChemplantRecipes extends SerializableRecipe { new ItemStack(ModItems.gem_tantalium), new ItemStack(ModItems.dust, 3)) .outputFluids(new FluidStack(Fluids.WATER, 250))); - recipes.add(new ChemRecipe(91, "ARSENIC", 1200) - .inputItems(new ComparableStack(ModItems.scrap_oil, 256)) - .inputFluids(new FluidStack(Fluids.SULFURIC_ACID, 1000)) - .outputItems( - new ItemStack(ModItems.nugget_arsenic), - new ItemStack(ModItems.sulfur, 2)) - .outputFluids(new FluidStack(Fluids.HEAVYOIL, 1500))); recipes.add(new ChemRecipe(68, "VIT_LIQUID", 100) .inputItems(new ComparableStack(ModBlocks.sand_lead)) .inputFluids(new FluidStack(Fluids.WASTEFLUID, 1000)) diff --git a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java index fecbd9e20..903d07e1f 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrucibleRecipes.java @@ -96,6 +96,14 @@ public class CrucibleRecipes extends SerializableRecipe { .inputs(new MaterialStack(Mats.MAT_STEEL, n * 8), new MaterialStack(Mats.MAT_CADMIUM, n)) .outputs(new MaterialStack(Mats.MAT_CDALLOY, i))); + recipes.add(new CrucibleRecipe(14, "crucible.bbronze", 9, new ItemStack(ModItems.ingot_bismuth_bronze)) + .inputs(new MaterialStack(Mats.MAT_COPPER, n * 8), new MaterialStack(Mats.MAT_BISMUTH, n), new MaterialStack(Mats.MAT_FLUX, n * 3)) + .outputs(new MaterialStack(Mats.MAT_BBRONZE, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); + + recipes.add(new CrucibleRecipe(15, "crucible.abronze", 9, new ItemStack(ModItems.ingot_arsenic_bronze)) + .inputs(new MaterialStack(Mats.MAT_COPPER, n * 8), new MaterialStack(Mats.MAT_ARSENIC, n), new MaterialStack(Mats.MAT_FLUX, n * 3)) + .outputs(new MaterialStack(Mats.MAT_ABRONZE, i), new MaterialStack(Mats.MAT_SLAG, n * 3))); + recipes.add(new CrucibleRecipe(13, "crucible.cmb", 3, new ItemStack(ModItems.ingot_combine_steel)) .inputs(new MaterialStack(Mats.MAT_MAGTUNG, n * 6), new MaterialStack(Mats.MAT_MUD, n * 3)) .outputs(new MaterialStack(Mats.MAT_CMB, i))); diff --git a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java index 05282e9bd..e73b9d47e 100644 --- a/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CrystallizerRecipes.java @@ -97,6 +97,7 @@ public class CrystallizerRecipes extends SerializableRecipe { registerRecipe(new ComparableStack(Items.dye, 1, 15), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 4), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 250)); registerRecipe(new ComparableStack(Items.bone), new CrystallizerRecipe(new ItemStack(Items.slime_ball, 16), mixingTime), new FluidStack(Fluids.SULFURIC_ACID, 1_000)); registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.plant_item, EnumPlantType.MUSTARDWILLOW)), new CrystallizerRecipe(new ItemStack(ModItems.powder_cadmium), 100).setReq(10), new FluidStack(Fluids.RADIOSOLVENT, 250)); + registerRecipe(new ComparableStack(ModItems.scrap_oil), new CrystallizerRecipe(new ItemStack(ModItems.nugget_arsenic), 100).setReq(16), new FluidStack(Fluids.RADIOSOLVENT, 100)); registerRecipe(new ComparableStack(DictFrame.fromOne(ModItems.powder_ash, EnumAshType.FULLERENE)), new CrystallizerRecipe(new ItemStack(ModItems.ingot_cft), baseTime).setReq(4), new FluidStack(Fluids.XYLENE, 1_000)); registerRecipe(DIAMOND.dust(), new CrystallizerRecipe(Items.diamond, utilityTime)); diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index 8a295eea5..79bd5571e 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -53,13 +53,14 @@ public class AnvilRecipes { Block[] anvils = new Block[]{ModBlocks.anvil_iron, ModBlocks.anvil_lead}; for(Block anvil : anvils) { - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_bismuth, 1), new ComparableStack(anvil), new ComparableStack(ModItems.ingot_bismuth, 10))); - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_dnt, 1), new ComparableStack(anvil), new OreDictStack(DNT.ingot(), 10))); - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_ferrouranium, 1), new ComparableStack(anvil), new ComparableStack(ModItems.ingot_ferrouranium, 10))); - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_meteorite, 1), new ComparableStack(anvil), new ComparableStack(ModItems.ingot_meteorite, 10))); - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_schrabidate, 1), new ComparableStack(anvil), new OreDictStack(SBD.ingot(), 10))); - smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_starmetal, 1), new ComparableStack(anvil), new OreDictStack(STAR.ingot(), 10))); smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_steel, 1), new ComparableStack(anvil), new OreDictStack(STEEL.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_desh, 1), new ComparableStack(anvil), new OreDictStack(DESH.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_saturnite, 1), new ComparableStack(anvil), new OreDictStack(BIGMT.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_ferrouranium, 1), new ComparableStack(anvil), new ComparableStack(ModItems.ingot_ferrouranium, 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_bismuth_bronze, 1), new ComparableStack(anvil), new OreDictStack(BBRONZE.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_arsenic_bronze, 1), new ComparableStack(anvil), new OreDictStack(ABRONZE.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_schrabidate, 1), new ComparableStack(anvil), new OreDictStack(SBD.ingot(), 10))); + smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_dnt, 1), new ComparableStack(anvil), new OreDictStack(DNT.ingot(), 10))); smithingRecipes.add(new AnvilSmithingRecipe(1, new ItemStack(ModBlocks.anvil_osmiridium, 1), new ComparableStack(anvil), new OreDictStack(OSMIRIDIUM.ingot(), 10))); } @@ -1034,8 +1035,8 @@ public class AnvilRecipes { constructionRecipes.add(new AnvilConstructionRecipe( new ComparableStack(ModBlocks.rbmk_boiler), new AnvilOutput[] { new AnvilOutput(new ItemStack(ModBlocks.rbmk_blank, 1)), - new AnvilOutput(new ItemStack(ModItems.plate_cast, 6, Mats.MAT_COPPER.id)), - new AnvilOutput(new ItemStack(ModItems.pipes_steel, 2)) + new AnvilOutput(new ItemStack(ModItems.pipe, 6, Mats.MAT_COPPER.id)), + new AnvilOutput(new ItemStack(ModItems.shell, 2, Mats.MAT_COPPER.id)) }).setTier(4)); constructionRecipes.add(new AnvilConstructionRecipe( new ComparableStack(ModBlocks.rbmk_cooler), new AnvilOutput[] { diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index fbae0fe16..e9a83ed93 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -144,6 +144,8 @@ public class ModItems { public static Item ingot_advanced_alloy; public static Item ingot_tcalloy; public static Item ingot_cdalloy; + public static Item ingot_bismuth_bronze; + public static Item ingot_arsenic_bronze; public static Item lithium; public static Item ingot_zirconium; public static Item ingot_hes; @@ -2553,6 +2555,8 @@ public class ModItems { ingot_advanced_alloy = new Item().setUnlocalizedName("ingot_advanced_alloy").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_advanced_alloy"); ingot_tcalloy = new Item().setUnlocalizedName("ingot_tcalloy").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_tcalloy"); ingot_cdalloy = new Item().setUnlocalizedName("ingot_cdalloy").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_cdalloy"); + ingot_bismuth_bronze = new Item().setUnlocalizedName("ingot_bismuth_bronze").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_bismuth_bronze"); + ingot_arsenic_bronze = new Item().setUnlocalizedName("ingot_arsenic_bronze").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_arsenic_bronze"); niter = new Item().setUnlocalizedName("niter").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":salpeter"); ingot_copper = new Item().setUnlocalizedName("ingot_copper").setCreativeTab(MainRegistry.partsTab).setTextureName(RefStrings.MODID + ":ingot_copper"); @@ -5636,6 +5640,8 @@ public class ModItems { GameRegistry.registerItem(ingot_steel, ingot_steel.getUnlocalizedName()); GameRegistry.registerItem(ingot_tcalloy, ingot_tcalloy.getUnlocalizedName()); GameRegistry.registerItem(ingot_cdalloy, ingot_cdalloy.getUnlocalizedName()); + GameRegistry.registerItem(ingot_bismuth_bronze, ingot_bismuth_bronze.getUnlocalizedName()); + GameRegistry.registerItem(ingot_arsenic_bronze, ingot_arsenic_bronze.getUnlocalizedName()); GameRegistry.registerItem(ingot_lead, ingot_lead.getUnlocalizedName()); GameRegistry.registerItem(ingot_bismuth, ingot_bismuth.getUnlocalizedName()); GameRegistry.registerItem(ingot_arsenic, ingot_arsenic.getUnlocalizedName()); @@ -5653,7 +5659,6 @@ public class ModItems { GameRegistry.registerItem(ingot_bakelite, ingot_bakelite.getUnlocalizedName()); GameRegistry.registerItem(ingot_biorubber, ingot_biorubber.getUnlocalizedName()); GameRegistry.registerItem(ingot_rubber, ingot_rubber.getUnlocalizedName()); - //GameRegistry.registerItem(ingot_pet, ingot_pet.getUnlocalizedName()); GameRegistry.registerItem(ingot_pc, ingot_pc.getUnlocalizedName()); GameRegistry.registerItem(ingot_pvc, ingot_pvc.getUnlocalizedName()); GameRegistry.registerItem(ingot_mud, ingot_mud.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index cc6778d93..1f45289b3 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -1291,12 +1291,18 @@ public class MainRegistry { ignoreMappings.add("hbm:item.rotor_steel"); ignoreMappings.add("hbm:item.generator_steel"); ignoreMappings.add("hbm:item.bolt_compound"); + ignoreMappings.add("hbm:tile.anvil_meteorite"); + ignoreMappings.add("hbm:tile.anvil_starmetal"); + ignoreMappings.add("hbm:tile.anvil_bismuth"); /// REMAP /// remapItems.put("hbm:item.gadget_explosive8", ModItems.early_explosive_lenses); remapItems.put("hbm:item.man_explosive8", ModItems.explosive_lenses); remapItems.put("hbm:item.briquette_lignite", ModItems.briquette); remapItems.put("hbm:item.antiknock", ModItems.fuel_additive); + remapItems.put("hbm:tile.anvil_meteorite", Item.getItemFromBlock(ModBlocks.anvil_desh)); + remapItems.put("hbm:tile.anvil_starmetal", Item.getItemFromBlock(ModBlocks.anvil_saturnite)); + remapItems.put("hbm:tile.anvil_bismuth", Item.getItemFromBlock(ModBlocks.anvil_bismuth_bronze)); for(MissingMapping mapping : event.get()) { diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index fe3f47e99..0c131ddb2 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -450,8 +450,10 @@ container.watzPowerplant=Watzkraftwerk container.zirnox=ZIRNOX Atomreaktor crucible.aa=Herstellung - Fortgeschrittene Legierung -crucible.cdalloy=Herstellung Cadmiumstahl -crucible.cmb=Herstellung CMB-Stahl +crucible.abronze=Herstellung - Arsennronze +crucible.bbronze=Herstellung - Bismutbronze +crucible.cdalloy=Herstellung - Cadmiumstahl +crucible.cmb=Herstellung - CMB-Stahl crucible.ferro=Herstellung - Ferrouran crucible.hematite=Herstellung - Eisen aus Hämatit crucible.hss=Herstellung - Schnellarbeitsstahl @@ -791,10 +793,12 @@ hbmmat.americiumrg=Reaktorfähiges Armericium hbmmat.americium241=Americium-241 hbmmat.americium242=Americium-242 hbmmat.arsenic=Arsen +hbmmat.arsenicbronze=Arsenbronze hbmmat.asbestos=Asbest hbmmat.bakelite=Bakelit hbmmat.beryllium=Beryllium hbmmat.bismuth=Bismut +hbmmat.bismuthbronze=Bismutbronze hbmmat.borax=Borax hbmmat.boron=Bor hbmmat.cadmium=Cadmium @@ -2114,6 +2118,7 @@ item.ingot_am241.name=Americium-241-Barren item.ingot_am242.name=Americium-242-Barren item.ingot_americium_fuel.name=Americiumkernbrennstoffbarren item.ingot_arsenic.name=Arsenbarren +item.ingot_arsenic_bronze.name=Arsenbronzebarren item.ingot_asbestos.name=Asbestplatte item.ingot_au198.name=Gold-198-Barren item.ingot_australium.name=Australiumbarren @@ -2121,6 +2126,7 @@ item.ingot_bakelite.name=Bakelittafel item.ingot_beryllium.name=Berylliumbarren item.ingot_biorubber.name=Latextafel item.ingot_bismuth.name=Bismutbarren +item.ingot_bismuth_bronze.name=Bismutbronzebarren item.ingot_boron.name=Borbarren item.ingot_c4.name=C4-Tafel item.ingot_cadmium.name=Cadmiumbarren @@ -3551,7 +3557,10 @@ tile.ams_base.name=AMS-Basis (Deko) tile.ams_emitter.name=AMS-Emitter (Deko) tile.ams_limiter.name=AMS-Stabilisator (Deko) tile.ancient_scrap.name=Antikes Altmetall +tile.anvil_arsenic_bronze.name=Arsenbronzeamboss tile.anvil_bismuth.name=Bismutamboss +tile.anvil_bismuth_bronze.name=Bismuthbronzeamboss +tile.anvil_desh.name=Deshamboss tile.anvil_dnt.name=Dineutroniumamboss tile.anvil_ferrouranium.name=Ferrouranamboss tile.anvil_iron.name=Eisenamboss @@ -3559,6 +3568,7 @@ tile.anvil_lead.name=Bleiamboss tile.anvil_meteorite.name=Meteoritenamboss tile.anvil_murky.name=Düsteramboss tile.anvil_osmiridium.name=Osmiridiumamboss +tile.anvil_saturnite.name=Saturnitamboss tile.anvil_schrabidate.name=Eisenschrabidatamboss tile.anvil_starmetal.name=Sternenmetallamboss tile.anvil_steel.name=Stahlamboss diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index d742e6715..872fd2161 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -845,6 +845,8 @@ container.watzPowerplant=Watz Power Plant container.zirnox=ZIRNOX Nuclear Reactor crucible.aa=Advanced Alloy Production +crucible.abronze=Arsenic Bronze Production +crucible.bbronze=Bismuth Bronze Production crucible.cdalloy=Cadmium Steel Production crucible.cmb=CMB Steel Production crucible.ferro=Ferrouranium Production @@ -1482,10 +1484,12 @@ hbmmat.americiumrg=Reactor-Grade Americium hbmmat.americium241=Americium-241 hbmmat.americium242=Americium-242 hbmmat.arsenic=Arsenic +hbmmat.arsenicbronze=Arsenic Bronze hbmmat.asbestos=Asbestos hbmmat.bakelite=Bakelite hbmmat.beryllium=Beryllium hbmmat.bismuth=Bismuth +hbmmat.bismuthbronze=Bismuth Bronze hbmmat.borax=Borax hbmmat.boron=Boron hbmmat.cadmium=Cadmium @@ -2889,6 +2893,7 @@ item.ingot_am241.name=Americium-241 Ingot item.ingot_am242.name=Americium-242 Ingot item.ingot_americium_fuel.name=Ingot of Americium Fuel item.ingot_arsenic.name=Arsenic Ingot +item.ingot_arsenic_bronze.name=Arsenic Bronze Ingot item.ingot_asbestos.name=Asbestos Sheet item.ingot_asbestos.desc=§o"Filled with life, self-doubt and asbestos. That comes with the air."§r item.ingot_au198.name=Gold-198 Ingot @@ -2897,6 +2902,7 @@ item.ingot_bakelite.name=Bakelite Bar item.ingot_beryllium.name=Beryllium Ingot item.ingot_biorubber.name=Latex Bar item.ingot_bismuth.name=Bismuth Ingot +item.ingot_bismuth_bronze.name=Bismuth Bronze Ingot item.ingot_boron.name=Boron Ingot item.ingot_c4.name=Bar of Composition C-4 item.ingot_cadmium.name=Cadmium Ingot @@ -4560,7 +4566,10 @@ tile.ams_base.name=AMS Base (Deco) tile.ams_emitter.name=AMS Emitter (Deco) tile.ams_limiter.name=AMS Stabilizer (Deco) tile.ancient_scrap.name=Ancient Scrap Metal +tile.anvil_arsenic_bronze.name=Arsenic Bronze Anvil tile.anvil_bismuth.name=Bismuth Anvil +tile.anvil_bismuth_bronze.name=Bismuth Bronze Anvil +tile.anvil_desh.name=Desh Anvil tile.anvil_dnt.name=Dineutronium Anvil tile.anvil_ferrouranium.name=Ferrouranium Anvil tile.anvil_iron.name=Iron Anvil @@ -4568,6 +4577,7 @@ tile.anvil_lead.name=Lead Anvil tile.anvil_meteorite.name=Meteorite Anvil tile.anvil_murky.name=Murky Anvil tile.anvil_osmiridium.name=Osmiridium Anvil +tile.anvil_saturnite.name=Saturnite Anvil tile.anvil_schrabidate.name=Ferric Schrabidate Anvil tile.anvil_starmetal.name=Starmetal Anvil tile.anvil_steel.name=Steel Anvil diff --git a/src/main/resources/assets/hbm/textures/blocks/anvil_arsenic_bronze.png b/src/main/resources/assets/hbm/textures/blocks/anvil_arsenic_bronze.png new file mode 100644 index 0000000000000000000000000000000000000000..8f27fa83f22af2b2750fb5b3bbe7feb31257d1f3 GIT binary patch literal 516 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 TM`lkJ00000NkvXXu0mjfM(y9r literal 0 HcmV?d00001