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; } }