From 269459c5c56ebf2cd40ef649e4304a6881ccd294 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Tue, 12 Jan 2016 17:05:56 -0500 Subject: [PATCH] Added a lot more framework for the node routing. --- .../WayofTime/bloodmagic/api/Constants.java | 6 + .../block/BlockInputRoutingNode.java | 85 ++++++++ .../block/BlockMasterRoutingNode.java | 6 + .../block/BlockOutputRoutingNode.java | 86 ++++++++ .../item/routing/ItemNodeRouter.java | 206 ++++++++++++++++++ .../bloodmagic/registry/ModBlocks.java | 10 + .../bloodmagic/registry/ModItems.java | 5 + .../bloodmagic/routing/IRoutingNode.java | 8 + .../routing/TileMasterRoutingNode.java | 148 +++++++++++-- .../tile/routing/TileRoutingNode.java | 91 ++++++++ .../blockstates/BlockInputRoutingNode.json | 7 + .../blockstates/BlockMasterRoutingNode.json | 7 + .../blockstates/BlockOutputRoutingNode.json | 6 + .../models/block/BlockInputRoutingNode.json | 7 + .../models/block/BlockMasterRoutingNode.json | 8 + .../models/block/BlockOutputRoutingNode.json | 7 + .../textures/blocks/InputRoutingNode.png | Bin 0 -> 191 bytes .../textures/blocks/MasterRoutingNode.png | Bin 0 -> 220 bytes .../textures/blocks/OutputRoutingNode.png | Bin 0 -> 217 bytes 19 files changed, 677 insertions(+), 16 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java create mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockInputRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockMasterRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/models/block/BlockOutputRoutingNode.json create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/InputRoutingNode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/MasterRoutingNode.png create mode 100644 src/main/resources/assets/bloodmagic/textures/blocks/OutputRoutingNode.png diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index 5f2c971a..8a476262 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -84,6 +84,12 @@ public class Constants public static final String SOUL_FORGE_BURN = "burnTime"; public static final String SOUL_FORGE_CONSUMED = "consumedSouls"; + + public static final String ROUTING_MASTER = "master"; + public static final String ROUTING_CONNECTION = "connections"; + public static final String ROUTING_MASTER_GENERAL = "generalList"; + public static final String ROUTING_MASTER_INPUT = "inputList"; + public static final String ROUTING_MASTER_OUTPUT = "outputList"; } public static class Mod diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java new file mode 100644 index 00000000..df4c78d1 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/block/BlockInputRoutingNode.java @@ -0,0 +1,85 @@ +package WayofTime.bloodmagic.block; + +import java.util.LinkedList; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; +import WayofTime.bloodmagic.util.ChatUtil; + +public class BlockInputRoutingNode extends BlockContainer +{ + public BlockInputRoutingNode() + { + super(Material.rock); + + setUnlocalizedName(Constants.Mod.MODID + ".inputRouting"); + setCreativeTab(BloodMagic.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + setHarvestLevel("pickaxe", 2); + } + + @Override + public int getRenderType() + { + return 3; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) + { + return new TileInputRoutingNode(); + } + + @Override + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof IRoutingNode) + { + ((IRoutingNode) tile).removeAllConnections(); + } + super.breakBlock(world, pos, state); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) + { + if (world.isRemote) + { + return false; + } + + TileEntity tile = world.getTileEntity(pos); + IRoutingNode node = (IRoutingNode) tile; + ChatUtil.sendChat(player, "Master: " + node.getMasterPos().toString()); + for (BlockPos connPos : node.getConnected()) + { + ChatUtil.sendChat(player, "Connected to: " + connPos.toString()); + } + + BlockPos masterPos = node.getMasterPos(); + TileEntity testTile = world.getTileEntity(masterPos); + if (testTile instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) testTile; + if (master.isConnected(new LinkedList(), pos)) + { + ChatUtil.sendChat(player, "Can find the path to the master"); + } + } + + return false; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java index 081e9599..28c4ff14 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockMasterRoutingNode.java @@ -21,6 +21,12 @@ public class BlockMasterRoutingNode extends BlockContainer setHarvestLevel("pickaxe", 2); } + @Override + public int getRenderType() + { + return 3; + } + @Override public TileEntity createNewTileEntity(World worldIn, int meta) { diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java new file mode 100644 index 00000000..0788daf5 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -0,0 +1,86 @@ +package WayofTime.bloodmagic.block; + +import java.util.LinkedList; + +import net.minecraft.block.BlockContainer; +import net.minecraft.block.material.Material; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; +import WayofTime.bloodmagic.util.ChatUtil; + +public class BlockOutputRoutingNode extends BlockContainer +{ + public BlockOutputRoutingNode() + { + super(Material.rock); + + setUnlocalizedName(Constants.Mod.MODID + ".outputRouting"); + setCreativeTab(BloodMagic.tabBloodMagic); + setHardness(2.0F); + setResistance(5.0F); + setHarvestLevel("pickaxe", 2); + } + + @Override + public int getRenderType() + { + return 3; + } + + @Override + public TileEntity createNewTileEntity(World worldIn, int meta) + { + return new TileOutputRoutingNode(); + } + + @Override + //TODO: Combine BlockOutputRoutingNode and BlockInputRoutingNode so they have the same superclass + public void breakBlock(World world, BlockPos pos, IBlockState state) + { + TileEntity tile = world.getTileEntity(pos); + if (tile instanceof IRoutingNode) + { + ((IRoutingNode) tile).removeAllConnections(); + } + super.breakBlock(world, pos, state); + } + + @Override + public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) + { + if (world.isRemote) + { + return false; + } + + TileEntity tile = world.getTileEntity(pos); + IRoutingNode node = (IRoutingNode) tile; + ChatUtil.sendChat(player, "Master: " + node.getMasterPos().toString()); + for (BlockPos connPos : node.getConnected()) + { + ChatUtil.sendChat(player, "Connected to: " + connPos.toString()); + } + + BlockPos masterPos = node.getMasterPos(); + TileEntity testTile = world.getTileEntity(masterPos); + if (testTile instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) testTile; + if (master.isConnected(new LinkedList(), pos)) + { + ChatUtil.sendChat(player, "Can find the path to the master"); + } + } + + return false; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java new file mode 100644 index 00000000..a4d476de --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/item/routing/ItemNodeRouter.java @@ -0,0 +1,206 @@ +package WayofTime.bloodmagic.item.routing; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.BlockPos; +import net.minecraft.util.EnumFacing; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; +import WayofTime.bloodmagic.routing.IMasterRoutingNode; +import WayofTime.bloodmagic.routing.IRoutingNode; +import WayofTime.bloodmagic.util.ChatUtil; +import WayofTime.bloodmagic.util.helper.TextHelper; + +public class ItemNodeRouter extends Item +{ + public ItemNodeRouter() + { + setUnlocalizedName(Constants.Mod.MODID + ".nodeRouter"); + setMaxStackSize(1); + setCreativeTab(BloodMagic.tabBloodMagic); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List tooltip, boolean advanced) + { + stack = NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + BlockPos coords = getBlockPos(stack); + + if (coords != null && tag != null) + { + tooltip.add(TextHelper.localizeEffect("tooltip.BloodMagic.telepositionFocus.coords", coords.getX(), coords.getY(), coords.getZ())); + } + } + + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ) + { + if (world.isRemote) + { + return true; + } + + TileEntity tileHit = world.getTileEntity(pos); + + if (!(tileHit instanceof IRoutingNode)) + { + // TODO: Remove contained position? + BlockPos containedPos = getBlockPos(stack); + if (!containedPos.equals(BlockPos.ORIGIN)) + { + this.setBlockPos(stack, BlockPos.ORIGIN); + ChatUtil.sendChat(player, "Removing contained location"); + return false; + } + return false; + } + IRoutingNode node = (IRoutingNode) tileHit; + BlockPos containedPos = getBlockPos(stack); + if (containedPos.equals(BlockPos.ORIGIN)) + { + this.setBlockPos(stack, pos); + ChatUtil.sendChat(player, "Setting node location"); + return true; + } else + { + TileEntity pastTile = world.getTileEntity(containedPos); + if (pastTile instanceof IRoutingNode) + { + IRoutingNode pastNode = (IRoutingNode) pastTile; + if (pastNode instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) pastNode; + + if (!node.isMaster(master)) + { + if (node.getMasterPos().equals(BlockPos.ORIGIN)) + { + node.connectMasterToRemainingNode(world, new LinkedList(), master); + master.addConnection(pos, containedPos); + master.addNodeToList(node); + node.addConnection(containedPos); + ChatUtil.sendChat(player, "Linked node to master!"); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } + } else + { + master.addConnection(pos, containedPos); + node.addConnection(containedPos); + ChatUtil.sendChat(player, "Linked node to master!"); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } + + } else if (node instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) node; + + if (!pastNode.isMaster(master)) + { + if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) + { + pastNode.connectMasterToRemainingNode(world, new LinkedList(), master); + master.addConnection(pos, containedPos); + pastNode.addConnection(pos); + master.addNodeToList(pastNode); + ChatUtil.sendChat(player, "Linked node to master!"); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } + } else + { + master.addConnection(pos, containedPos); + pastNode.addConnection(pos); + ChatUtil.sendChat(player, "Linked node to master!"); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } + } else + { + //Both nodes are not master nodes, so normal linking + if (pastNode.getMasterPos().equals(node.getMasterPos())) + { + if (!pastNode.getMasterPos().equals(BlockPos.ORIGIN)) + { + TileEntity testTile = world.getTileEntity(pastNode.getMasterPos()); + if (testTile instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) testTile; + master.addConnection(pos, containedPos); + } + } + pastNode.addConnection(pos); + node.addConnection(containedPos); + ChatUtil.sendChat(player, "Linked nodes together."); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } else if (pastNode.getMasterPos().equals(BlockPos.ORIGIN)) //pastNode is not connected to a master, but node is + { + TileEntity tile = world.getTileEntity(node.getMasterPos()); + if (tile instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) tile; + master.addConnection(pos, containedPos); + master.addNodeToList(pastNode); + pastNode.connectMasterToRemainingNode(world, new LinkedList(), master); + } + pastNode.addConnection(pos); + node.addConnection(containedPos); + ChatUtil.sendChat(player, "Linked nodes together."); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } else if (node.getMasterPos().equals(BlockPos.ORIGIN)) //node is not connected to a master, but pastNode is + { + TileEntity tile = world.getTileEntity(pastNode.getMasterPos()); + if (tile instanceof IMasterRoutingNode) + { + IMasterRoutingNode master = (IMasterRoutingNode) tile; + master.addConnection(pos, containedPos); + master.addNodeToList(node); + node.connectMasterToRemainingNode(world, new LinkedList(), master); + } + pastNode.addConnection(pos); + node.addConnection(containedPos); + ChatUtil.sendChat(player, "Linked nodes together."); + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } else + { + this.setBlockPos(stack, BlockPos.ORIGIN); + return true; + } + } + } + } + + return false; + } + + public BlockPos getBlockPos(ItemStack stack) + { + stack = NBTHelper.checkNBT(stack); + return new BlockPos(stack.getTagCompound().getInteger(Constants.NBT.X_COORD), stack.getTagCompound().getInteger(Constants.NBT.Y_COORD), stack.getTagCompound().getInteger(Constants.NBT.Z_COORD)); + } + + public ItemStack setBlockPos(ItemStack stack, BlockPos pos) + { + NBTHelper.checkNBT(stack); + NBTTagCompound itemTag = stack.getTagCompound(); + itemTag.setInteger(Constants.NBT.X_COORD, pos.getX()); + itemTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); + itemTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + return stack; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java index 82270780..1a747b04 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModBlocks.java @@ -13,8 +13,10 @@ import WayofTime.bloodmagic.block.BlockBloodLight; import WayofTime.bloodmagic.block.BlockBloodRune; import WayofTime.bloodmagic.block.BlockBloodStoneBrick; import WayofTime.bloodmagic.block.BlockCrystal; +import WayofTime.bloodmagic.block.BlockInputRoutingNode; import WayofTime.bloodmagic.block.BlockLifeEssence; import WayofTime.bloodmagic.block.BlockMasterRoutingNode; +import WayofTime.bloodmagic.block.BlockOutputRoutingNode; import WayofTime.bloodmagic.block.BlockPedestal; import WayofTime.bloodmagic.block.BlockPhantom; import WayofTime.bloodmagic.block.BlockRitualController; @@ -39,6 +41,8 @@ import WayofTime.bloodmagic.tile.TilePlinth; import WayofTime.bloodmagic.tile.TileSoulForge; import WayofTime.bloodmagic.tile.TileSpectralBlock; import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; import WayofTime.bloodmagic.util.helper.InventoryRenderHelper; public class ModBlocks @@ -62,6 +66,8 @@ public class ModBlocks public static Block bloodStoneBrick; public static Block masterRoutingNode; + public static Block inputRoutingNode; + public static Block outputRoutingNode; public static void init() { @@ -83,6 +89,8 @@ public class ModBlocks crystal = registerBlock(new BlockCrystal(), ItemBlockCrystal.class); bloodStoneBrick = registerBlock(new BlockBloodStoneBrick(), ItemBlockBloodStoneBrick.class); masterRoutingNode = registerBlock(new BlockMasterRoutingNode()); + inputRoutingNode = registerBlock(new BlockInputRoutingNode()); + outputRoutingNode = registerBlock(new BlockOutputRoutingNode()); initTiles(); } @@ -99,6 +107,8 @@ public class ModBlocks 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()); + GameRegistry.registerTileEntity(TileInputRoutingNode.class, Constants.Mod.MODID + ":" + TileInputRoutingNode.class.getSimpleName()); + GameRegistry.registerTileEntity(TileOutputRoutingNode.class, Constants.Mod.MODID + ":" + TileOutputRoutingNode.class.getSimpleName()); } public static void initRenders() diff --git a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java index b84cf4c1..8e9d9ebf 100644 --- a/src/main/java/WayofTime/bloodmagic/registry/ModItems.java +++ b/src/main/java/WayofTime/bloodmagic/registry/ModItems.java @@ -32,6 +32,7 @@ import WayofTime.bloodmagic.item.armour.ItemLivingArmour; import WayofTime.bloodmagic.item.armour.ItemSentientArmour; import WayofTime.bloodmagic.item.gear.ItemPackSacrifice; import WayofTime.bloodmagic.item.gear.ItemPackSelfSacrifice; +import WayofTime.bloodmagic.item.routing.ItemNodeRouter; import WayofTime.bloodmagic.item.sigil.ItemSigilAir; import WayofTime.bloodmagic.item.sigil.ItemSigilBloodLight; import WayofTime.bloodmagic.item.sigil.ItemSigilCompression; @@ -131,6 +132,8 @@ public class ModItems public static Item sentientBow; public static Item sentientArmourGem; + public static Item nodeRouter; + public static Item.ToolMaterial boundToolMaterial = EnumHelper.addToolMaterial("BoundToolMaterial", 4, 0, 10, 8, 50); public static Item.ToolMaterial soulToolMaterial = EnumHelper.addToolMaterial("SoulToolMaterial", 4, 520, 7, 8, 50); @@ -215,6 +218,8 @@ public class ModItems sentientSword = registerItem(new ItemSentientSword()); sentientBow = registerItem(new ItemSentientBow()); sentientArmourGem = registerItem(new ItemSentientArmourGem()); + + nodeRouter = registerItem(new ItemNodeRouter()); } public static void initRenders() diff --git a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java index c9e50f48..3fe0a449 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/IRoutingNode.java @@ -16,4 +16,12 @@ public interface IRoutingNode public BlockPos getMasterPos(); public boolean isConnectionEnabled(BlockPos testPos); + + public boolean isMaster(IMasterRoutingNode master); + + public void addConnection(BlockPos pos1); + + public void removeConnection(BlockPos pos1); + + public void removeAllConnections(); } diff --git a/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java index 131f9356..3121c314 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java @@ -4,52 +4,136 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; +import net.minecraft.util.ITickable; import net.minecraft.world.World; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.tile.routing.TileInputRoutingNode; +import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; -public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingNode +public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingNode, ITickable { // A list of connections private HashMap> connectionMap = new HashMap>(); private List generalNodeList = new LinkedList(); + private List outputNodeList = new LinkedList(); + private List inputNodeList = new LinkedList(); + + @Override + public void update() + { + + } + + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + + NBTTagList tags = new NBTTagList(); + for (BlockPos pos : generalNodeList) + { + NBTTagCompound posTag = new NBTTagCompound(); + posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); + posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); + posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + tags.appendTag(posTag); + } + tag.setTag(Constants.NBT.ROUTING_MASTER_GENERAL, tags); + + tags = new NBTTagList(); + for (BlockPos pos : inputNodeList) + { + NBTTagCompound posTag = new NBTTagCompound(); + posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); + posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); + posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + tags.appendTag(posTag); + } + tag.setTag(Constants.NBT.ROUTING_MASTER_INPUT, tags); + + tags = new NBTTagList(); + for (BlockPos pos : outputNodeList) + { + NBTTagCompound posTag = new NBTTagCompound(); + posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); + posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); + posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + tags.appendTag(posTag); + } + tag.setTag(Constants.NBT.ROUTING_MASTER_OUTPUT, tags); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + + NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_GENERAL, 10); + for (int i = 0; i < tags.tagCount(); i++) + { + NBTTagCompound blockTag = tags.getCompoundTagAt(i); + BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + generalNodeList.add(newPos); + } + + tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_INPUT, 10); + for (int i = 0; i < tags.tagCount(); i++) + { + NBTTagCompound blockTag = tags.getCompoundTagAt(i); + BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + inputNodeList.add(newPos); + } + + tags = tag.getTagList(Constants.NBT.ROUTING_MASTER_OUTPUT, 10); + for (int i = 0; i < tags.tagCount(); i++) + { + NBTTagCompound blockTag = tags.getCompoundTagAt(i); + BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + outputNodeList.add(newPos); + } + } @Override public boolean isConnected(List path, BlockPos nodePos) { - if (!connectionMap.containsKey(nodePos)) - { - return false; - } + //TODO: Figure out how to make it so the path is obtained +// if (!connectionMap.containsKey(nodePos)) +// { +// return false; +// } TileEntity tile = worldObj.getTileEntity(nodePos); if (!(tile instanceof IRoutingNode)) { - connectionMap.remove(nodePos); +// connectionMap.remove(nodePos); return false; } IRoutingNode node = (IRoutingNode) tile; List connectionList = node.getConnected(); - List testPath = path.subList(0, path.size()); - testPath.add(nodePos); +// List testPath = path.subList(0, path.size()); + path.add(nodePos); for (BlockPos testPos : connectionList) { - if (testPath.contains(testPos)) + if (path.contains(testPos)) { continue; } if (testPos.equals(this.getPos()) && node.isConnectionEnabled(testPos)) { - path.clear(); - path.addAll(testPath); +// path.clear(); +// path.addAll(testPath); return true; } else if (NodeHelper.isNodeConnectionEnabled(worldObj, node, testPos)) { - if (isConnected(testPath, testPos)) + if (isConnected(path, testPos)) { - path.clear(); - path.addAll(testPath); +// path.clear(); +// path.addAll(testPath); return true; } } @@ -72,8 +156,14 @@ public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingN { generalNodeList.add(newPos); } - - //TODO: make more node lists so that you can more easily differentiate the different types of nodes + if (node instanceof TileInputRoutingNode && !inputNodeList.contains(newPos)) + { + inputNodeList.add(newPos); + } + if (node instanceof TileOutputRoutingNode && !outputNodeList.contains(newPos)) + { + outputNodeList.add(newPos); + } } @Override @@ -156,4 +246,30 @@ public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingN { return this.getPos(); } + + @Override + public boolean isMaster(IMasterRoutingNode master) + { + return false; + } + + @Override + public void addConnection(BlockPos pos1) + { + // Empty + } + + @Override + public void removeConnection(BlockPos pos1) + { + generalNodeList.remove(pos1); + inputNodeList.remove(pos1); + outputNodeList.remove(pos1); + } + + @Override + public void removeAllConnections() + { + // Empty + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index 529eb5ed..e424a1ad 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -3,9 +3,12 @@ package WayofTime.bloodmagic.tile.routing; import java.util.LinkedList; import java.util.List; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.world.World; +import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; @@ -14,9 +17,67 @@ public class TileRoutingNode extends TileEntity implements IRoutingNode private BlockPos masterPos = BlockPos.ORIGIN; private List connectionList = new LinkedList(); + @Override + public void writeToNBT(NBTTagCompound tag) + { + super.writeToNBT(tag); + NBTTagCompound masterTag = new NBTTagCompound(); + masterTag.setInteger(Constants.NBT.X_COORD, masterPos.getX()); + masterTag.setInteger(Constants.NBT.Y_COORD, masterPos.getY()); + masterTag.setInteger(Constants.NBT.Z_COORD, masterPos.getZ()); + tag.setTag(Constants.NBT.ROUTING_MASTER, masterTag); + + NBTTagList tags = new NBTTagList(); + for (BlockPos pos : connectionList) + { + NBTTagCompound posTag = new NBTTagCompound(); + posTag.setInteger(Constants.NBT.X_COORD, pos.getX()); + posTag.setInteger(Constants.NBT.Y_COORD, pos.getY()); + posTag.setInteger(Constants.NBT.Z_COORD, pos.getZ()); + tags.appendTag(posTag); + } + tag.setTag(Constants.NBT.ROUTING_CONNECTION, tags); + } + + @Override + public void readFromNBT(NBTTagCompound tag) + { + super.readFromNBT(tag); + NBTTagCompound masterTag = tag.getCompoundTag(Constants.NBT.ROUTING_MASTER); + masterPos = new BlockPos(masterTag.getInteger(Constants.NBT.X_COORD), masterTag.getInteger(Constants.NBT.Y_COORD), masterTag.getInteger(Constants.NBT.Z_COORD)); + + NBTTagList tags = tag.getTagList(Constants.NBT.ROUTING_CONNECTION, 10); + for (int i = 0; i < tags.tagCount(); i++) + { + NBTTagCompound blockTag = tags.getCompoundTagAt(i); + BlockPos newPos = new BlockPos(blockTag.getInteger(Constants.NBT.X_COORD), blockTag.getInteger(Constants.NBT.Y_COORD), blockTag.getInteger(Constants.NBT.Z_COORD)); + connectionList.add(newPos); + } + } + + @Override + public void removeAllConnections() + { + TileEntity testTile = worldObj.getTileEntity(getMasterPos()); + if (testTile instanceof IMasterRoutingNode) + { + ((IMasterRoutingNode) testTile).removeConnection(pos); // Remove this node from the master + } + for (BlockPos testPos : connectionList) + { + this.removeConnection(testPos); + TileEntity tile = worldObj.getTileEntity(testPos); + if (tile instanceof IRoutingNode) + { + ((IRoutingNode) tile).removeConnection(pos); + } + } + } + @Override public void connectMasterToRemainingNode(World world, List alreadyChecked, IMasterRoutingNode master) { + this.masterPos = master.getBlockPos(); List connectedList = this.getConnected(); for (BlockPos testPos : connectedList) { @@ -59,9 +120,39 @@ public class TileRoutingNode extends TileEntity implements IRoutingNode return masterPos; } + @Override + public boolean isMaster(IMasterRoutingNode master) + { + BlockPos checkPos = master.getBlockPos(); + if (checkPos.equals(getMasterPos())) + { + return true; + } + + return false; + } + @Override public boolean isConnectionEnabled(BlockPos testPos) { return true; } + + @Override + public void addConnection(BlockPos pos1) + { + if (!connectionList.contains(pos1)) + { + connectionList.add(pos1); + } + } + + @Override + public void removeConnection(BlockPos pos1) + { + if (connectionList.contains(pos1)) + { + connectionList.remove(pos1); + } + } } diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json new file mode 100644 index 00000000..917817b1 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/BlockInputRoutingNode.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { "model": "bloodmagic:BlockInputRoutingNode" } + } +} + + diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json new file mode 100644 index 00000000..18502530 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/BlockMasterRoutingNode.json @@ -0,0 +1,7 @@ +{ + "variants": { + "normal": { "model": "bloodmagic:BlockMasterRoutingNode" } + } +} + + diff --git a/src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json b/src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json new file mode 100644 index 00000000..e293146b --- /dev/null +++ b/src/main/resources/assets/bloodmagic/blockstates/BlockOutputRoutingNode.json @@ -0,0 +1,6 @@ +{ + "variants": { + "normal": { "model": "bloodmagic:BlockOutputRoutingNode" } + } +} + diff --git a/src/main/resources/assets/bloodmagic/models/block/BlockInputRoutingNode.json b/src/main/resources/assets/bloodmagic/models/block/BlockInputRoutingNode.json new file mode 100644 index 00000000..18ceed9e --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/BlockInputRoutingNode.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "bloodmagic:blocks/InputRoutingNode" + } +} + diff --git a/src/main/resources/assets/bloodmagic/models/block/BlockMasterRoutingNode.json b/src/main/resources/assets/bloodmagic/models/block/BlockMasterRoutingNode.json new file mode 100644 index 00000000..947efbf5 --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/BlockMasterRoutingNode.json @@ -0,0 +1,8 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "bloodmagic:blocks/MasterRoutingNode" + } +} + + diff --git a/src/main/resources/assets/bloodmagic/models/block/BlockOutputRoutingNode.json b/src/main/resources/assets/bloodmagic/models/block/BlockOutputRoutingNode.json new file mode 100644 index 00000000..96f86dbf --- /dev/null +++ b/src/main/resources/assets/bloodmagic/models/block/BlockOutputRoutingNode.json @@ -0,0 +1,7 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "bloodmagic:blocks/OutputRoutingNode" + } +} + diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/InputRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/blocks/InputRoutingNode.png new file mode 100644 index 0000000000000000000000000000000000000000..11bc2f099a232aff3b514264364e886f1d2032f2 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0V9u~k&Nf&XTd-r+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vl+<>EaloaX$Ia|Nr*Pnhl+eE(e-4kDNHck)C|3|0vrIr8VnRZ+b44Vq42ramm3? enIm%6@-T)H4}R(VTj8o8lRaJiT-G@yGywo>)-^u> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/MasterRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/blocks/MasterRoutingNode.png new file mode 100644 index 0000000000000000000000000000000000000000..f716f8648cd3e95f252e181eac67d22cdefd8c4f GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0V9u~k=Y~;{Z^omY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$ z4ipdaba4#PIDd7LBNu}L2TS?V|Miu-T_U;yE-3aJF|YITw9q`9$lI85*7rct>ILGC zL9Zr!v7F9x@#YJaE#*qQ3yw-Io1C|2sb=@%JNF)DH=f_WmHDceqH^l$#Q7j=Jzf1= J);T3K0RZFtL+Ahi literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodmagic/textures/blocks/OutputRoutingNode.png b/src/main/resources/assets/bloodmagic/textures/blocks/OutputRoutingNode.png new file mode 100644 index 0000000000000000000000000000000000000000..9be36cef84d6d04d915d7ed38913cb4a49569274 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#0V9u~KId(wyd^*(+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9VqVa>EaloaX$Ia|Nr*Pnhl+eE(e-4kDNHck)C|(eA7yiNI@|{i}r~V1*g|fSnBbO zS=jNhqF+;WPmFZNdd8bmL-M`+O%W$>CSn%xD^rav>Jzf1=);T3K F0RVD#Ku-Vw literal 0 HcmV?d00001