From ac919c78829a77bcd6fe73dab2a1f32c487dfac7 Mon Sep 17 00:00:00 2001 From: WayofTime Date: Thu, 14 Jan 2016 08:27:09 -0500 Subject: [PATCH] Implemented ghost items for the inventory - will be adjusted. --- .../WayofTime/bloodmagic/api/Constants.java | 3 + .../block/BlockOutputRoutingNode.java | 53 ++-- .../bloodmagic/client/gui/GuiHandler.java | 6 + .../client/gui/GuiItemRoutingNode.java | 40 ++++ .../routing/TileMasterRoutingNode.java | 63 +++-- .../container/ContainerItemRoutingNode.java | 226 ++++++++++++++++++ .../tile/routing/TileInputRoutingNode.java | 5 +- .../tile/routing/TileOutputRoutingNode.java | 5 +- .../tile/routing/TileRoutingNode.java | 8 +- .../bloodmagic/util/GhostItemHelper.java | 50 ++++ .../util/handler/ClientEventHandler.java | 31 ++- .../bloodmagic/textures/gui/routingNode.png | Bin 0 -> 1740 bytes 12 files changed, 424 insertions(+), 66 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java create mode 100644 src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java create mode 100644 src/main/resources/assets/bloodmagic/textures/gui/routingNode.png diff --git a/src/main/java/WayofTime/bloodmagic/api/Constants.java b/src/main/java/WayofTime/bloodmagic/api/Constants.java index d8f1bd52..c9bc3a16 100644 --- a/src/main/java/WayofTime/bloodmagic/api/Constants.java +++ b/src/main/java/WayofTime/bloodmagic/api/Constants.java @@ -91,6 +91,8 @@ public class Constants 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 final String GHOST_STACK_SIZE = "stackSize"; } public static class Mod @@ -106,6 +108,7 @@ public class Constants { public static final int TELEPOSER_GUI = 0; public static final int SOUL_FORGE_GUI = 1; + public static final int ROUTING_NODE_GUI = 2; } public static class Compat diff --git a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java index 0788daf5..d9f366e7 100644 --- a/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/block/BlockOutputRoutingNode.java @@ -1,7 +1,5 @@ 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; @@ -12,10 +10,8 @@ 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 { @@ -57,30 +53,37 @@ public class BlockOutputRoutingNode extends BlockContainer @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumFacing side, float hitX, float hitY, float hitZ) { - if (world.isRemote) + if (world.getTileEntity(pos) instanceof TileOutputRoutingNode) { - return false; + player.openGui(BloodMagic.instance, Constants.Gui.ROUTING_NODE_GUI, world, pos.getX(), pos.getY(), pos.getZ()); } - 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()); - } + return true; - 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; +// 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/client/gui/GuiHandler.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java index 6e2e6c07..9b6092c6 100644 --- a/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiHandler.java @@ -8,8 +8,10 @@ import net.minecraftforge.fml.common.network.IGuiHandler; import WayofTime.bloodmagic.api.Constants; import WayofTime.bloodmagic.tile.TileSoulForge; import WayofTime.bloodmagic.tile.TileTeleposer; +import WayofTime.bloodmagic.tile.container.ContainerItemRoutingNode; import WayofTime.bloodmagic.tile.container.ContainerSoulForge; import WayofTime.bloodmagic.tile.container.ContainerTeleposer; +import WayofTime.bloodmagic.tile.routing.TileOutputRoutingNode; public class GuiHandler implements IGuiHandler { @@ -24,6 +26,8 @@ public class GuiHandler implements IGuiHandler return new ContainerTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos)); case Constants.Gui.SOUL_FORGE_GUI: return new ContainerSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos)); + case Constants.Gui.ROUTING_NODE_GUI: + return new ContainerItemRoutingNode(player.inventory, (TileOutputRoutingNode) world.getTileEntity(pos)); } return null; @@ -42,6 +46,8 @@ public class GuiHandler implements IGuiHandler return new GuiTeleposer(player.inventory, (TileTeleposer) world.getTileEntity(pos)); case Constants.Gui.SOUL_FORGE_GUI: return new GuiSoulForge(player.inventory, (TileSoulForge) world.getTileEntity(pos)); + case Constants.Gui.ROUTING_NODE_GUI: + return new GuiItemRoutingNode(player.inventory, (TileOutputRoutingNode) world.getTileEntity(pos)); } } diff --git a/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java new file mode 100644 index 00000000..fa0e4a94 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/gui/GuiItemRoutingNode.java @@ -0,0 +1,40 @@ +package WayofTime.bloodmagic.client.gui; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.tile.container.ContainerItemRoutingNode; + +@SideOnly(Side.CLIENT) +public class GuiItemRoutingNode extends GuiContainer +{ + public GuiItemRoutingNode(InventoryPlayer playerInventory, IInventory tileRoutingNode) + { + super(new ContainerItemRoutingNode(playerInventory, tileRoutingNode)); + this.xSize = 176; + this.ySize = 169; + } + + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) + { +// this.fontRendererObj.drawString(TextHelper.localize("tile.BloodMagic.soulForge.name"), 8, 5, 4210752); +// this.fontRendererObj.drawString(TextHelper.localize("container.inventory"), 8, 111, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float partialTicks, int mouseX, int mouseY) + { + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + ResourceLocation soulForgeGuiTextures = new ResourceLocation(Constants.Mod.MODID + ":textures/gui/routingNode.png"); + this.mc.getTextureManager().bindTexture(soulForgeGuiTextures); + int i = (this.width - this.xSize) / 2; + int j = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(i, j, 0, 0, this.xSize, this.ySize); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java index 45e937b6..3a670eb8 100644 --- a/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/routing/TileMasterRoutingNode.java @@ -3,14 +3,11 @@ package WayofTime.bloodmagic.routing; import java.util.HashMap; import java.util.LinkedList; import java.util.List; -import java.util.Map; -import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ITickable; import net.minecraft.world.World; import WayofTime.bloodmagic.api.Constants; @@ -30,36 +27,36 @@ public class TileMasterRoutingNode extends TileEntity implements IMasterRoutingN @Override public void update() { - if (worldObj.isRemote || worldObj.getTotalWorldTime() % tickRate != 0) //Temporary tick rate solver - { - return; - } - - Map> outputMap = new HashMap>(); - - for (BlockPos outputPos : outputNodeList) - { - TileEntity outputTile = worldObj.getTileEntity(outputPos); - if (outputTile instanceof TileOutputRoutingNode && this.isConnected(new LinkedList(), outputPos)) - { - TileOutputRoutingNode outputNode = (TileOutputRoutingNode) outputTile; - - for (EnumFacing facing : EnumFacing.VALUES) - { - if (!outputNode.isInventoryConnectedToSide(facing)) - { - continue; - } - - TileEntity tile = worldObj.getTileEntity(outputPos.offset(facing)); - if (!(tile instanceof IInventory)) - { - continue; - } - - } - } - } +// if (worldObj.isRemote || worldObj.getTotalWorldTime() % tickRate != 0) //Temporary tick rate solver +// { +// return; +// } +// +// Map> outputMap = new HashMap>(); +// +// for (BlockPos outputPos : outputNodeList) +// { +// TileEntity outputTile = worldObj.getTileEntity(outputPos); +// if (outputTile instanceof TileOutputRoutingNode && this.isConnected(new LinkedList(), outputPos)) +// { +// TileOutputRoutingNode outputNode = (TileOutputRoutingNode) outputTile; +// +// for (EnumFacing facing : EnumFacing.VALUES) +// { +// if (!outputNode.isInventoryConnectedToSide(facing)) +// { +// continue; +// } +// +// TileEntity tile = worldObj.getTileEntity(outputPos.offset(facing)); +// if (!(tile instanceof IInventory)) +// { +// continue; +// } +// +// } +// } +// } } @Override diff --git a/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java new file mode 100644 index 00000000..f3b8ea83 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/tile/container/ContainerItemRoutingNode.java @@ -0,0 +1,226 @@ +package WayofTime.bloodmagic.tile.container; + +import WayofTime.bloodmagic.util.GhostItemHelper; +import WayofTime.bloodmagic.util.Utils; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerItemRoutingNode extends Container +{ + private final IInventory tileItemRoutingNode; + private int slotsOccupied; + + public ContainerItemRoutingNode(InventoryPlayer inventoryPlayer, IInventory tileItemRoutingNode) + { + this.tileItemRoutingNode = tileItemRoutingNode; +// this.addSlotToContainer(new Slot(tileItemRoutingNode, 0, 8, 15)); +// this.addSlotToContainer(new Slot(tileItemRoutingNode, 1, 80, 15)); +// this.addSlotToContainer(new Slot(tileItemRoutingNode, 2, 80, 87)); +// this.addSlotToContainer(new Slot(tileItemRoutingNode, 3, 8, 87)); + this.addSlotToContainer(new SlotGhostItem(tileItemRoutingNode, 0, 8, 33)); + slotsOccupied = 1; +// this.addSlotToContainer(new SlotOutput(tileItemRoutingNode, TileSoulForge.outputSlot, 44, 51)); + + for (int i = 0; i < 3; i++) + { + for (int j = 0; j < 9; j++) + { + addSlotToContainer(new Slot(inventoryPlayer, j + i * 9 + 9, 8 + j * 18, 87 + i * 18)); + } + } + + for (int i = 0; i < 9; i++) + { + addSlotToContainer(new Slot(inventoryPlayer, i, 8 + i * 18, 145)); + } + } + + /** + * Overridden in order to handle ghost item slots. + */ + @Override + public ItemStack slotClick(int slotId, int clickedButton, int mode, EntityPlayer player) + { + InventoryPlayer inventoryPlayer = player.inventory; + if (!player.worldObj.isRemote) + { + if (slotId >= 0) + { + Slot slot = (Slot) this.inventorySlots.get(slotId); + + if (slot instanceof SlotGhostItem) //TODO: make the slot clicking work! + { + if ((mode == 0 || mode == 1) && (clickedButton == 0 || clickedButton == 1)) + { + System.out.println("Clicked button: " + clickedButton + ", mode: " + mode); + + ItemStack slotStack = slot.getStack(); + ItemStack heldStack = inventoryPlayer.getItemStack(); + + if (mode == 0) + { + if (clickedButton == 0) + { + if (heldStack == null && slotStack != null) + { + GhostItemHelper.incrementGhostAmout(slotStack, 1); + slot.putStack(slotStack); + } else if (heldStack != null) + { + if (slotStack != null && Utils.canCombine(slotStack, heldStack)) + { + GhostItemHelper.incrementGhostAmout(slotStack, heldStack.stackSize); + slot.putStack(slotStack); + } else + { + ItemStack copyStack = heldStack.copy(); + GhostItemHelper.setItemGhostAmount(copyStack, copyStack.stackSize); + copyStack.stackSize = 1; + slot.putStack(copyStack); + } + } + } else + { + if (slotStack != null) + { + GhostItemHelper.setItemGhostAmount(slotStack, GhostItemHelper.getItemGhostAmount(slotStack) / 2); + if (GhostItemHelper.getItemGhostAmount(slotStack) <= 0) + { + slot.putStack(null); + } else + { + slot.putStack(slotStack); + } + } + } + } else + { + if (clickedButton == 0) + { + if (slotStack != null) + { + GhostItemHelper.decrementGhostAmout(slotStack, 1); + if (GhostItemHelper.getItemGhostAmount(slotStack) < 0) + { + slot.putStack(null); + } else + { + slot.putStack(slotStack); + } + } + } else + { + slot.putStack(null); + } + } + } + } + } + } + + return super.slotClick(slotId, clickedButton, mode, player); + } + + @Override + public void detectAndSendChanges() + { + super.detectAndSendChanges(); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) + { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(index); + + if (slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (index == 0) + { + if (!this.mergeItemStack(itemstack1, slotsOccupied, slotsOccupied + 36, true)) + { + return null; + } + + slot.onSlotChange(itemstack1, itemstack); + } else if (index > 0) + { +// return null; + if (true) // Change to check item is a filter + { + if (!this.mergeItemStack(itemstack1, 0, 1, false)) + { + return null; + } + } + } else if (!this.mergeItemStack(itemstack1, 0 + slotsOccupied, 36 + slotsOccupied, false)) + { + return null; + } + + if (itemstack1.stackSize == 0) + { + slot.putStack((ItemStack) null); + } else + { + slot.onSlotChanged(); + } + + if (itemstack1.stackSize == itemstack.stackSize) + { + return null; + } + + slot.onPickupFromSlot(playerIn, itemstack1); + } + + return itemstack; + } + + @Override + public boolean canInteractWith(EntityPlayer playerIn) + { + return this.tileItemRoutingNode.isUseableByPlayer(playerIn); + } + + private class SlotItemFilter extends Slot + { + public SlotItemFilter(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack itemStack) + { + return true; //TODO: Create a new Item that holds the filter. + } + } + + private class SlotGhostItem extends Slot + { + public SlotGhostItem(IInventory inventory, int slotIndex, int x, int y) + { + super(inventory, slotIndex, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack) + { + return false; + } + + @Override + public boolean canTakeStack(EntityPlayer playerIn) + { + return false; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java index 1b122cae..f606db62 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileInputRoutingNode.java @@ -2,5 +2,8 @@ package WayofTime.bloodmagic.tile.routing; public class TileInputRoutingNode extends TileRoutingNode { - + public TileInputRoutingNode() + { + super(1, "inputNode"); + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java index 539fc1e3..f825520b 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileOutputRoutingNode.java @@ -2,5 +2,8 @@ package WayofTime.bloodmagic.tile.routing; public class TileOutputRoutingNode extends TileRoutingNode { - + public TileOutputRoutingNode() + { + super(1, "outputNode"); + } } diff --git a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java index e25fd426..3e997436 100644 --- a/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java +++ b/src/main/java/WayofTime/bloodmagic/tile/routing/TileRoutingNode.java @@ -14,9 +14,15 @@ import WayofTime.bloodmagic.routing.IItemFilter; import WayofTime.bloodmagic.routing.IItemRoutingNode; import WayofTime.bloodmagic.routing.IMasterRoutingNode; import WayofTime.bloodmagic.routing.IRoutingNode; +import WayofTime.bloodmagic.tile.TileInventory; -public class TileRoutingNode extends TileEntity implements IRoutingNode, IItemRoutingNode +public class TileRoutingNode extends TileInventory implements IRoutingNode, IItemRoutingNode { + public TileRoutingNode(int size, String name) + { + super(size, name); + } + private BlockPos masterPos = BlockPos.ORIGIN; private List connectionList = new LinkedList(); diff --git a/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java new file mode 100644 index 00000000..e5c50015 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/util/GhostItemHelper.java @@ -0,0 +1,50 @@ +package WayofTime.bloodmagic.util; + +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import WayofTime.bloodmagic.api.Constants; +import WayofTime.bloodmagic.api.util.helper.NBTHelper; + +public class GhostItemHelper +{ + public static void setItemGhostAmount(ItemStack stack, int amount) + { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + + tag.setInteger(Constants.NBT.GHOST_STACK_SIZE, amount); + } + + public static int getItemGhostAmount(ItemStack stack) + { + NBTHelper.checkNBT(stack); + NBTTagCompound tag = stack.getTagCompound(); + + return tag.getInteger(Constants.NBT.GHOST_STACK_SIZE); + } + + public static boolean hasGhostAmount(ItemStack stack) + { + if (!stack.hasTagCompound()) + { + return false; + } + + NBTTagCompound tag = stack.getTagCompound(); + return tag.hasKey(Constants.NBT.GHOST_STACK_SIZE); + } + + public static void incrementGhostAmout(ItemStack stack, int value) + { + int amount = getItemGhostAmount(stack); + amount += value; + setItemGhostAmount(stack, amount); + } + + public static void decrementGhostAmout(ItemStack stack, int value) + { + int amount = getItemGhostAmount(stack); + amount -= value; + setItemGhostAmount(stack, amount); + } +} diff --git a/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java b/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java index 527d9385..d7bb982d 100644 --- a/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java +++ b/src/main/java/WayofTime/bloodmagic/util/handler/ClientEventHandler.java @@ -1,10 +1,31 @@ package WayofTime.bloodmagic.util.handler; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.ItemTooltipEvent; +import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; +import WayofTime.bloodmagic.util.GhostItemHelper; + public class ClientEventHandler { -// @SubscribeEvent -// public void onFOVUpdate(FOVUpdateEvent event) -// { -// event.newfov = event.fov; -// } + @SubscribeEvent + public void onTooltipEvent(ItemTooltipEvent event) + { + ItemStack stack = event.itemStack; + if (stack == null) + { + return; + } + + if (GhostItemHelper.hasGhostAmount(stack)) + { + int amount = GhostItemHelper.getItemGhostAmount(stack); + if (amount == 0) + { + event.toolTip.add("Everything"); + } else + { + event.toolTip.add("Ghost item amount: " + amount); + } + } + } } diff --git a/src/main/resources/assets/bloodmagic/textures/gui/routingNode.png b/src/main/resources/assets/bloodmagic/textures/gui/routingNode.png new file mode 100644 index 0000000000000000000000000000000000000000..70a5b278f0fbd6fdeef975b733a9578c6a90ec9e GIT binary patch literal 1740 zcmb_cdpML?96sL|gOO%D54tchiY2Y|P%1(&bzze;c$o5B~yT{+zb9EiGP~wgP$6WB24_^25*yi#w8%LLM zqo8b@2jjh8_>ZErh7Fx;q&%UE_Z=)9B}`-_6Nk+p2*{dZCzj1@kfA;?o)b|- zAWS3)b=U)oGr#9?wD)84qJUEHHge<1Xu z(J1;%-hzj%Qt;1#Vd+`!k-pY^!nId{S2B-ogObZfK zQFT8^UE{rh=O2>#5i~F#%BVL#qfc};9avhLDrHcSpy7B1CnIKdr0qB*|M0T8VL+W< z4?_6vMwVfr)pLjs*ojFDD&7Dv9<98@SnNQnwO!m;dzi^qz$1~K4 zQ%mvFAM&4Gs!~D#omgY}G9*aLKiOm048a`>smtQG#it>LU1|n@bpB&4vM^!W!dB>l zJHbX+*q&2j#GSUuj9$AJPelo{dB;+s&gBH~?hxA2c8ZS2*)efJFP1FnfH@|yY^3gF zF2oCVicTdgg^OKfQp2wjl1W6*F-d**29Pz@Tai{X%h3YZya`D~Z)lK|3DZhc16aTY zK&KIJFeGcldO`rPf*^r`d{d9{9$**(UTjf2KTy!$+!inJKO|w&G%qqmn&CAW1a6mC zursTulOM?K7#-fNe}8f!s@AiN-uBp|e@zT`VfIDwt>gz1B>rW3#(80Z&Wn{SAuJM571~y`m06yl1!1p zEip3>bQl;W*b%D2G)8(#Plm(Q5($VWXtr zD*r2e7UC0q1%w4D@OU{CgH#*{P`sXH%LRzf~W>~jJkK$M& z!Su}d3GcRxRiE92>Abw^s&q?EgQ~6hzLlLNX}SsBQC{(S`GW+{XthepGbq&Z?cf)P zx>&oerRU7+L2|Y3p49yW{x7`9G+N7C-J`Qc0uUj(<99n9)ffhL|C&2JXbZU|_Vjos zS+whj^Cx9<4?C@1nZ)&u-ltP|6{CCN&UDjRk`<9w85U?y!m^D0&%J2DCJzLw2B<4W t%d3a%247>5rC>h^dwu|x{y(p3b^>H5RS7SQt>MWhJ2_Cvg8hude*j`lnI-@L literal 0 HcmV?d00001