From 8b0756e9da4c93d9058d3a75f9a2834a136f8bf9 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 12 Jan 2016 12:23:26 -0500 Subject: [PATCH] Added routing nodes and a bit of infrastructure - not even working yet. --- .../block/BlockMasterRoutingNode.java | 29 ++++ .../bloodmagic/registry/ModBlocks.java | 47 +++++- .../routing/IMasterRoutingNode.java | 18 ++ .../bloodmagic/routing/IRoutingNode.java | 19 +++ .../bloodmagic/routing/NodeHelper.java | 25 +++ .../routing/TileMasterRoutingNode.java | 159 ++++++++++++++++++ .../tile/routing/TileRoutingNode.java | 67 ++++++++ 7 files changed, 357 insertions(+), 7 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java create mode 100644 src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java new file mode 100644 index 00000000..081e9599 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -0,0 +1,29 @@ +package WayofTime.bloodmagic.block; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.routing.TileMasterRoutingNode; + +public class BlockMasterRoutingNode extends BlockContainer +{ + public BlockMasterRoutingNode() + { + super(Material.rock); + + setUnlocalizedName(Constants.Mod.MODID + ".masterRouting"); + setCreativeTab(BloodMagic.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + setHarvestLevel("pickaxe", 2); + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) + { + return new TileMasterRoutingNode(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java index d1d1fa89..82270780 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java @@ -1,16 +1,45 @@ package WayofTime.bloodmagic.registry; -import WayofTime.bloodmagic.BloodMagic; -import WayofTime.bloodmagic.ConfigHandler; -import WayofTime.bloodmagic.api.Constants; -import WayofTime.bloodmagic.block.*; -import WayofTime.bloodmagic.item.block.*; -import WayofTime.bloodmagic.tile.*; -import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fml.common.registry.GameRegistry; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.ConfigHandler; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.block.BlockAlchemyArray; +import WayofTime.bloodmagic.block.BlockAltar; +import WayofTime.bloodmagic.block.BlockBloodLight; +import WayofTime.bloodmagic.block.BlockBloodRune; +import WayofTime.bloodmagic.block.BlockBloodStoneBrick; +import WayofTime.bloodmagic.block.BlockCrystal; +import WayofTime.bloodmagic.block.BlockLifeEssence; +import WayofTime.bloodmagic.block.BlockMasterRoutingNode; +import WayofTime.bloodmagic.block.BlockPedestal; +import WayofTime.bloodmagic.block.BlockPhantom; +import WayofTime.bloodmagic.block.BlockRitualController; +import WayofTime.bloodmagic.block.BlockRitualStone; +import WayofTime.bloodmagic.block.BlockSoulForge; +import WayofTime.bloodmagic.block.BlockSpectral; +import WayofTime.bloodmagic.block.BlockTeleposer; +import WayofTime.bloodmagic.block.BlockTestSpellBlock; +import WayofTime.bloodmagic.item.block.ItemBlockBloodRune; +import WayofTime.bloodmagic.item.block.ItemBlockBloodStoneBrick; +import WayofTime.bloodmagic.item.block.ItemBlockCrystal; +import WayofTime.bloodmagic.item.block.ItemBlockPedestal; +import WayofTime.bloodmagic.item.block.ItemBlockRitualController; +import WayofTime.bloodmagic.item.block.ItemBlockRitualStone; +import WayofTime.bloodmagic.routing.TileMasterRoutingNode; +import WayofTime.bloodmagic.tile.TileAlchemyArray; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.tile.TileImperfectRitualStone; +import WayofTime.bloodmagic.tile.TileMasterRitualStone; +import WayofTime.bloodmagic.tile.TilePhantomBlock; +import WayofTime.bloodmagic.tile.TilePlinth; +import WayofTime.bloodmagic.tile.TileSoulForge; +import WayofTime.bloodmagic.tile.TileSpectralBlock; +import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; public class ModBlocks { @@ -32,6 +61,8 @@ public class ModBlocks public static Block crystal; public static Block bloodStoneBrick; + public static Block masterRoutingNode; + public static void init() { FluidRegistry.registerFluid(BlockLifeEssence.getLifeEssence()); @@ -51,6 +82,7 @@ public class ModBlocks soulForge = registerBlock(new BlockSoulForge()); crystal = registerBlock(new BlockCrystal(), ItemBlockCrystal.class); bloodStoneBrick = registerBlock(new BlockBloodStoneBrick(), ItemBlockBloodStoneBrick.class); + masterRoutingNode = registerBlock(new BlockMasterRoutingNode()); initTiles(); } @@ -66,6 +98,7 @@ public class ModBlocks GameRegistry.registerTileEntity(TilePhantomBlock.class, Constants.Mod.MODID + ":" + TilePhantomBlock.class.getSimpleName()); GameRegistry.registerTileEntity(TileTeleposer.class, Constants.Mod.MODID + ":" + TileTeleposer.class.getSimpleName()); GameRegistry.registerTileEntity(TileSoulForge.class, Constants.Mod.MODID + ":" + TileSoulForge.class.getSimpleName()); + GameRegistry.registerTileEntity(TileMasterRoutingNode.class, Constants.Mod.MODID + ":" + TileMasterRoutingNode.class.getSimpleName()); } public static void initRenders() diff --git a/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java new file mode 100644 index 00000000..0b32c3dc --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IMasterRoutingNode.java @@ -0,0 +1,18 @@ +package WayofTime.bloodmagic.routing; + +import java.util.List; + +import net.minecraft.util.BlockPos; + +public interface IMasterRoutingNode extends IRoutingNode +{ + public boolean isConnected(List path, BlockPos nodePos); + + public void addNodeToList(IRoutingNode node); + + public void addConnections(BlockPos pos, List connectionList); + + public void addConnection(BlockPos pos1, BlockPos pos2); + + public void removeConnection(BlockPos pos1, BlockPos pos2); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java new file mode 100644 index 00000000..c9e50f48 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java @@ -0,0 +1,19 @@ +package WayofTime.bloodmagic.routing; + +import java.util.List; + +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; + +public interface IRoutingNode +{ + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master); + + public BlockPos getBlockPos(); + + public List getConnected(); + + public BlockPos getMasterPos(); + + public boolean isConnectionEnabled(BlockPos testPos); +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java b/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java new file mode 100644 index 00000000..f64a4785 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/NodeHelper.java @@ -0,0 +1,25 @@ +package WayofTime.bloodmagic.routing; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; + +public class NodeHelper +{ + public static boolean isNodeConnectionEnabled(World world, IRoutingNode node, BlockPos testPos) + { + if (!node.isConnectionEnabled(testPos)) + { + return false; + } + TileEntity tile = world.getTileEntity(testPos); + if (!(tile instanceof IRoutingNode)) + { + return false; + } + + IRoutingNode testNode = (IRoutingNode) tile; + + return testNode.isConnectionEnabled(node.getBlockPos()); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java new file mode 100644 index 00000000..131f9356 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java @@ -0,0 +1,159 @@ +package WayofTime.bloodmagic.routing; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; + +public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingNode +{ + // A list of connections + private HashMap> connectionMap = new HashMap>(); + private List generalNodeList = new LinkedList(); + + @Override + public boolean isConnected(List path, BlockPos nodePos) + { + if (!connectionMap.containsKey(nodePos)) + { + return false; + } + TileEntity tile = worldObj.getTileEntity(nodePos); + if (!(tile instanceof IRoutingNode)) + { + connectionMap.remove(nodePos); + return false; + } + + IRoutingNode node = (IRoutingNode) tile; + List connectionList = node.getConnected(); + List testPath = path.subList(0, path.size()); + testPath.add(nodePos); + for (BlockPos testPos : connectionList) + { + if (testPath.contains(testPos)) + { + continue; + } + + if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) + { + path.clear(); + path.addAll(testPath); + return true; + } else if (NodeHelper.isNodeConnectionEnabled(worldObj, node, testPos)) + { + if (isConnected(testPath, testPos)) + { + path.clear(); + path.addAll(testPath); + return true; + } + } + } + + return false; + } + + @Override + public boolean isConnectionEnabled(BlockPos testPos) + { + return true; + } + + @Override + public void addNodeToList(IRoutingNode node) + { + BlockPos newPos = node.getBlockPos(); + if (!generalNodeList.contains(newPos)) + { + generalNodeList.add(newPos); + } + + //TODO: make more node lists so that you can more easily differentiate the different types of nodes + } + + @Override + public void addConnections(BlockPos pos, List connectionList) + { + for (BlockPos testPos : connectionList) + { + addConnection(pos, testPos); + } + } + + @Override + public void addConnection(BlockPos pos1, BlockPos pos2) + { + if (connectionMap.containsKey(pos1) && !connectionMap.get(pos1).contains(pos2)) + { + connectionMap.get(pos1).add(pos2); + } else + { + List list = new LinkedList(); + list.add(pos2); + connectionMap.put(pos1, list); + } + + if (connectionMap.containsKey(pos2) && !connectionMap.get(pos2).contains(pos1)) + { + connectionMap.get(pos2).add(pos1); + } else + { + List list = new LinkedList(); + list.add(pos1); + connectionMap.put(pos2, list); + } + } + + @Override + public void removeConnection(BlockPos pos1, BlockPos pos2) + { + if (connectionMap.containsKey(pos1)) + { + List posList = connectionMap.get(pos1); + posList.remove(pos2); + if (posList.isEmpty()) + { + connectionMap.remove(pos1); + } + } + + if (connectionMap.containsKey(pos2)) + { + List posList = connectionMap.get(pos2); + posList.remove(pos1); + if (posList.isEmpty()) + { + connectionMap.remove(pos2); + } + } + } + + @Override + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) + { + return; + } + + @Override + public BlockPos getBlockPos() + { + return this.getPos(); + } + + @Override + public List getConnected() + { + return new LinkedList(); + } + + @Override + public BlockPos getMasterPos() + { + return this.getPos(); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java new file mode 100644 index 00000000..529eb5ed --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -0,0 +1,67 @@ +package WayofTime.bloodmagic.tile.routing; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.world.World; +import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IRoutingNode; + +public class TileRoutingNode extends TileEntity implements IRoutingNode +{ + private BlockPos masterPos = BlockPos.ORIGIN; + private List connectionList = new LinkedList(); + + @Override + public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) + { + List connectedList = this.getConnected(); + for (BlockPos testPos : connectedList) + { + if (alreadyChecked.contains(testPos)) + { + continue; + } + alreadyChecked.add(testPos); + TileEntity tile = world.getTileEntity(testPos); + if (!(tile instanceof IRoutingNode)) + { + continue; + } + IRoutingNode node = (IRoutingNode) tile; + if (node.getMasterPos().equals(BlockPos.ORIGIN)) //If getMasterPos() returns the origin, the node is not connected to any master. + { + master.addNodeToList(node); + node.connectMasterToRemainingNode(world, alreadyChecked, master); + } + } + + master.addConnections(this.getBlockPos(), connectedList); + } + + @Override + public BlockPos getBlockPos() + { + return this.getPos(); + } + + @Override + public List getConnected() + { + return connectionList; + } + + @Override + public BlockPos getMasterPos() + { + return masterPos; + } + + @Override + public boolean isConnectionEnabled(BlockPos testPos) + { + return true; + } +}