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(); + } }