From 7461f6a5173fdc5b3a20dc413ea7ce658fb820f2 Mon Sep 17 00:00:00 2001 From: Christina Berchtold Date: Sat, 9 Nov 2019 18:13:35 +0100 Subject: UI for Item Distribution Network Node --- .../java/blocks/Block_ItemDistributionNode.java | 15 ++ .../container/Container_ItemDistributionNode.java | 68 +++++++++ .../java/container/Gui_ItemDistributionNode.java | 49 +++++++ src/main/java/kekztech/GTRecipe.java | 104 -------------- src/main/java/kekztech/GuiHandler.java | 35 +++++ .../ItemDistributionNetworkController.java | 45 +++++- src/main/java/kekztech/KekzCore.java | 11 ++ .../java/kekztech/MultiBlockTooltipBuilder.java | 160 --------------------- src/main/java/kekztech/TFFTFluidHandler.java | 7 - .../java/tileentities/GTMTE_FluidMultiStorage.java | 2 +- .../tileentities/GTMTE_ModularNuclearReactor.java | 2 +- .../java/tileentities/GTMTE_SOFuelCellMK1.java | 2 +- .../java/tileentities/GTMTE_SOFuelCellMK2.java | 2 +- .../tileentities/TE_ItemDistributionCable.java | 20 ++- .../java/tileentities/TE_ItemDistributionNode.java | 48 +++++-- src/main/java/util/MultiBlockTooltipBuilder.java | 160 +++++++++++++++++++++ .../kekztech/textures/gui/ItemDistributorNode.png | Bin 0 -> 3659 bytes 17 files changed, 440 insertions(+), 290 deletions(-) create mode 100644 src/main/java/container/Container_ItemDistributionNode.java create mode 100644 src/main/java/container/Gui_ItemDistributionNode.java delete mode 100644 src/main/java/kekztech/GTRecipe.java create mode 100644 src/main/java/kekztech/GuiHandler.java delete mode 100644 src/main/java/kekztech/MultiBlockTooltipBuilder.java delete mode 100644 src/main/java/kekztech/TFFTFluidHandler.java create mode 100644 src/main/java/util/MultiBlockTooltipBuilder.java create mode 100644 src/main/resources/assets/kekztech/textures/gui/ItemDistributorNode.png (limited to 'src/main') diff --git a/src/main/java/blocks/Block_ItemDistributionNode.java b/src/main/java/blocks/Block_ItemDistributionNode.java index 11d9e22b39..07fd988445 100644 --- a/src/main/java/blocks/Block_ItemDistributionNode.java +++ b/src/main/java/blocks/Block_ItemDistributionNode.java @@ -6,6 +6,7 @@ import kekztech.KekzCore; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import tileentities.TE_ItemDistributionNode; @@ -32,6 +33,20 @@ public class Block_ItemDistributionNode extends BlockContainer { GameRegistry.registerBlock(getInstance(), IB_ItemDistributionNode.class, blockName); } + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float lx, float ly, float lz) { + if(world.isRemote) { + return true; + } + + final TileEntity te = world.getTileEntity(x, y, z); + if(te != null && te instanceof TE_ItemDistributionNode) { + player.openGui(KekzCore.instance, 0, world, x, y, z); + return true; + } + return false; + } + @Override public TileEntity createNewTileEntity(World world, int p_149915_2_) { return new TE_ItemDistributionNode(); diff --git a/src/main/java/container/Container_ItemDistributionNode.java b/src/main/java/container/Container_ItemDistributionNode.java new file mode 100644 index 0000000000..08096bc80f --- /dev/null +++ b/src/main/java/container/Container_ItemDistributionNode.java @@ -0,0 +1,68 @@ +package container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import tileentities.TE_ItemDistributionNode; + +public class Container_ItemDistributionNode extends Container { + + private final TE_ItemDistributionNode te; + + private int slotID = 0; + + public Container_ItemDistributionNode(TE_ItemDistributionNode te, EntityPlayer player) { + this.te = te; + + // Networked Storage + for(int i = 0; i < 4; i++) { + for(int j = 0; j < 4; j++) { + super.addSlotToContainer(new Slot(te, slotID++, 18 * j + 20, 19 * i + 20)); + } + } + + //Inventory + for (int i = 0; i < 3; i++) { + for (int j = 0; j < 9; j++) { + addSlotToContainer(new Slot(player.inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); + } + } + // Hotbar + for (int i = 0; i < 9; i++) { + addSlotToContainer(new Slot(player.inventory, i, 8 + i * 18, 142)); + } + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slotRaw) { + ItemStack stack = null; + final Slot slot = (Slot) inventorySlots.get(slotRaw); + + if (slot != null && slot.getHasStack()) { + final ItemStack stackInSlot = slot.getStack(); + stack = stackInSlot.copy(); + + if (slotRaw < 3 * 9) { + if (!mergeItemStack(stackInSlot, 3 * 9, inventorySlots.size(), true)) { + return null; + } + } else if (!mergeItemStack(stackInSlot, 0, 3 * 9, false)) { + return null; + } + + if (stackInSlot.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + } + return stack; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return te.isUseableByPlayer(player); + } + +} diff --git a/src/main/java/container/Gui_ItemDistributionNode.java b/src/main/java/container/Gui_ItemDistributionNode.java new file mode 100644 index 0000000000..08f530fce8 --- /dev/null +++ b/src/main/java/container/Gui_ItemDistributionNode.java @@ -0,0 +1,49 @@ +package container; + +import org.lwjgl.opengl.GL11; + +import kekztech.KekzCore; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import tileentities.TE_ItemDistributionNode; + +public class Gui_ItemDistributionNode extends GuiContainer { + + private final ResourceLocation texture = new ResourceLocation(KekzCore.MODID, "textures/gui/ItemDistributionNode.png"); + + private final InventoryPlayer inventory; + private final TE_ItemDistributionNode te; + + public Gui_ItemDistributionNode(TE_ItemDistributionNode te, EntityPlayer player) { + super(new Container_ItemDistributionNode(te, player)); + inventory = player.inventory; + this.te = te; + + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + + Minecraft.getMinecraft().renderEngine.bindTexture(texture); + GL11.glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + final int x = (super.width - super.xSize) / 2; + final int y = (super.height - super.ySize) / 2; + + super.drawTexturedModalRect(x, y, 0, 0, super.xSize, super.ySize); + } + + @Override + protected void drawGuiContainerForegroundLayer(int p1, int p2) { + super.fontRendererObj.drawString( + I18n.format(te.getInventoryName()), + (super.xSize / 2) - (fontRendererObj.getStringWidth(I18n.format(te.getInventoryName())) / 2), + 6, 4210752, false); + super.fontRendererObj.drawString( + I18n.format(inventory.getInventoryName()), 8, super.ySize - 96 + 2, 4210752); + } +} diff --git a/src/main/java/kekztech/GTRecipe.java b/src/main/java/kekztech/GTRecipe.java deleted file mode 100644 index 1939afc8ff..0000000000 --- a/src/main/java/kekztech/GTRecipe.java +++ /dev/null @@ -1,104 +0,0 @@ -package kekztech; - -import java.util.ArrayList; - -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; -import util.Util; - -public class GTRecipe { - - private int euPerTick = 0; - private int duration = 0; - - private ArrayList inputItems; - private ArrayList inputFluids; - private ArrayList outputItems; - private ArrayList outputFluids; - - public int getEuPerTick() { - return euPerTick; - } - public int getDuration() { - return duration; - } - public ItemStack[] getInputItems() { - return Util.toItemStackArray(inputItems); - } - public FluidStack[] getInputFluids() { - return Util.toFluidStackArray(inputFluids); - } - public ItemStack[] getOutputItems() { - return Util.toItemStackArray(outputItems); - } - public FluidStack[] getOutputFluids() { - return Util.toFluidStackArray(outputFluids); - } - public ItemStack getInputItem() { - final ItemStack[] s = Util.toItemStackArray(inputItems); - return s[0]; - } - public FluidStack getInputFluid() { - final FluidStack[] s = Util.toFluidStackArray(inputFluids); - return s[0]; - } - public ItemStack getOutputItem() { - final ItemStack[] s = Util.toItemStackArray(outputItems); - return s[0]; - } - public FluidStack getOutputFluid() { - final FluidStack[] s = Util.toFluidStackArray(outputFluids); - return s[0]; - } - - public GTRecipe addInputItem(ItemStack inputItem) { - if(inputItems == null) { - inputItems = new ArrayList(); - inputItems.add(inputItem); - } else { - inputItems.add(inputItem); - } - return this; - } - - public GTRecipe addOutputItem(ItemStack outputItem) { - if(outputItems == null) { - outputItems = new ArrayList(); - outputItems.add(outputItem); - } else { - outputItems.add(outputItem); - } - return this; - } - - public GTRecipe addInputFluid(FluidStack inputFluid) { - if(inputFluids == null) { - inputFluids = new ArrayList(); - inputFluids.add(inputFluid); - } else { - inputFluids.add(inputFluid); - } - return this; - } - - public GTRecipe addOutputFluid(FluidStack outputFluid) { - if(outputFluids == null) { - outputFluids = new ArrayList(); - outputFluids.add(outputFluid); - } else { - outputFluids.add(outputFluid); - } - return this; - } - - public GTRecipe setEUPerTick(int euPerTick) { - this.euPerTick = euPerTick; - return this; - } - - public GTRecipe setDuration(int duration) { - this.duration = duration; - return this; - } - -} diff --git a/src/main/java/kekztech/GuiHandler.java b/src/main/java/kekztech/GuiHandler.java new file mode 100644 index 0000000000..21ad5c95ae --- /dev/null +++ b/src/main/java/kekztech/GuiHandler.java @@ -0,0 +1,35 @@ +package kekztech; + +import container.Container_ItemDistributionNode; +import container.Gui_ItemDistributionNode; +import cpw.mods.fml.common.network.IGuiHandler; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import tileentities.TE_ItemDistributionNode; + +public class GuiHandler implements IGuiHandler { + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + final TileEntity te = world.getTileEntity(x, y, z); + if(te != null) { + if(ID == 0) { + return new Container_ItemDistributionNode((TE_ItemDistributionNode) te, player); + } + } + return null; + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + final TileEntity te = world.getTileEntity(x, y, z); + if(te != null) { + if(ID == 0) { + return new Gui_ItemDistributionNode((TE_ItemDistributionNode) te, player); + } + } + return null; + } + +} diff --git a/src/main/java/kekztech/ItemDistributionNetworkController.java b/src/main/java/kekztech/ItemDistributionNetworkController.java index e188cb0d26..bf976898e5 100644 --- a/src/main/java/kekztech/ItemDistributionNetworkController.java +++ b/src/main/java/kekztech/ItemDistributionNetworkController.java @@ -6,6 +6,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.UUID; +import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -15,7 +16,9 @@ public class ItemDistributionNetworkController implements Comparable conduits = new LinkedList<>(); - private final HashMap sources = new HashMap<>(); // k = resource name, v = source conduit + private final boolean[] slotDirections = new boolean[15]; + private final ItemStack[] networkedItemStacks = new ItemStack[15]; + //private final HashMap sources = new HashMap<>(); // k = resource name, v = source conduit public ItemDistributionNetworkController() { @@ -125,6 +128,46 @@ public class ItemDistributionNetworkController implements Comparable= slotDirections.length) { + return false; + } + return slotDirections[slot]; + } + + /** + * Return the ItemStack that is contained in the given slot number. + * + * Slots are numbered left to right, then top to bottom and start at zero. + * For example, the second slot in the second row, would have a slot number of five. + * + * @param slot: + * Slot number. + * @return ItemStack at given slot number. + */ + public ItemStack getStackInSlot(int slot) { + if(slot >= networkedItemStacks.length) { + return null; + } + return networkedItemStacks[slot]; + } + + public void setStackInSlot(int slot, ItemStack itemStack) { + if(slot < networkedItemStacks.length && isInputSlot(slot)) { + networkedItemStacks[slot] = itemStack; + } + } + /** * Register a new conduit to this network. * diff --git a/src/main/java/kekztech/KekzCore.java b/src/main/java/kekztech/KekzCore.java index 3b88a9074d..f93b5a9802 100644 --- a/src/main/java/kekztech/KekzCore.java +++ b/src/main/java/kekztech/KekzCore.java @@ -2,6 +2,8 @@ package kekztech; import blocks.Block_ControlRod; import blocks.Block_GDCUnit; +import blocks.Block_ItemDistributionCable; +import blocks.Block_ItemDistributionNode; import blocks.Block_ReactorChamber_OFF; import blocks.Block_ReactorChamber_ON; import blocks.Block_TFFTCasing; @@ -16,6 +18,7 @@ import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.enums.GT_Values; import gregtech.api.enums.ItemList; @@ -33,6 +36,8 @@ import tileentities.GTMTE_FluidMultiStorage; import tileentities.GTMTE_ModularNuclearReactor; import tileentities.GTMTE_SOFuelCellMK1; import tileentities.GTMTE_SOFuelCellMK2; +import tileentities.TE_ItemDistributionCable; +import tileentities.TE_ItemDistributionNode; import tileentities.TE_TFFTMultiHatch; import util.Util; @@ -82,8 +87,14 @@ public class KekzCore { Block_ReactorChamber_OFF.getInstance().registerBlock(); Block_ReactorChamber_ON.getInstance().registerBlock(); Block_ControlRod.getInstance().registerBlock(); + Block_ItemDistributionCable.getInstance().registerBlock(); + Block_ItemDistributionNode.getInstance().registerBlock(); // Register TileEntities GameRegistry.registerTileEntity(TE_TFFTMultiHatch.class, "kekztech_tfftmultihatch_tile"); + GameRegistry.registerTileEntity(TE_ItemDistributionCable.class, "kekztech_itemdistributioncable_tile"); + GameRegistry.registerTileEntity(TE_ItemDistributionNode.class, "kekztech_itemdistributionnode_tile"); + // Register a GUI? + NetworkRegistry.INSTANCE.registerGuiHandler(instance, new GuiHandler()); } @Mod.EventHandler diff --git a/src/main/java/kekztech/MultiBlockTooltipBuilder.java b/src/main/java/kekztech/MultiBlockTooltipBuilder.java deleted file mode 100644 index 6e2e7669a8..0000000000 --- a/src/main/java/kekztech/MultiBlockTooltipBuilder.java +++ /dev/null @@ -1,160 +0,0 @@ -package kekztech; - -import java.util.LinkedList; -import java.util.List; - -import net.minecraft.util.EnumChatFormatting; - -/** - * Have you ever felt like your tooltips just aren't enterprise enough? Use this! - * - * @author kekzdealer - * - */ -public class MultiBlockTooltipBuilder { - - private static final String TAB = " "; - - private final List iLines; - private final List sLines; - - private String[] iArray; - private String[] sArray; - - public MultiBlockTooltipBuilder() { - iLines = new LinkedList<>(); - sLines = new LinkedList<>(); - } - - /** - * Add a basic line of information about this structure - * - * @param line - * The line to be added. - * @return Instance this method was called on. - */ - public MultiBlockTooltipBuilder addInfo(String info) { - iLines.add(info); - return this; - } - - /** - * Add a separator line like this:
- * ------------------------------- - * - * @return Instance this method was called on. - */ - public MultiBlockTooltipBuilder addSeparator() { - iLines.add("-----------------------------------------"); - return this; - } - - /** - * Begin adding structural information by adding a line about the structure's dimensions - * and then inserting a "Structure:" line. - * - * @param w - * Structure width. - * @param h - * Structure height. - * @param l - * Structure depth/length. - * @return Instance this method was called on. - */ - public MultiBlockTooltipBuilder beginStructureBlock(int w, int h, int l) { - sLines.add("Dimensions: " + w + "x" + h + "x" + l + " (WxHxL)"); - sLines.add("Structure:"); - return this; - } - - public MultiBlockTooltipBuilder addController(String info) { - sLines.add(TAB + "Controller: " + info); - return this; - } - - public MultiBlockTooltipBuilder addCasingInfo(String casingName, int minCount) { - sLines.add(TAB + minCount +"x " + casingName + " (at least)"); - return this; - } - - public MultiBlockTooltipBuilder addEnergyHatch(String info) { - sLines.add(TAB + "Energy Hatch: " + info); - return this; - } - - public MultiBlockTooltipBuilder addDynamoHatch(String info) { - sLines.add(TAB + "Dynamo Hatch: " + info); - return this; - } - - public MultiBlockTooltipBuilder addMaintenanceHatch(String info) { - sLines.add(TAB + "Maintenance Hatch: " + info); - return this; - } - - public MultiBlockTooltipBuilder addIOHatches(String info) { - sLines.add(TAB + "I/O Hatches: " + info); - return this; - } - - public MultiBlockTooltipBuilder addInputBus(String info) { - sLines.add(TAB + "Input Bus/ses: " + info); - return this; - } - - public MultiBlockTooltipBuilder addInputHatch(String info) { - sLines.add(TAB + "Input Hatch/es: " + info); - return this; - } - - public MultiBlockTooltipBuilder addOutputBus(String info) { - sLines.add(TAB + "Output Bus/ses: " + info); - return this; - } - - public MultiBlockTooltipBuilder addOutputHatch(String info) { - sLines.add(TAB + "Output Hatch/es: " + info); - return this; - } - - /** - * Use this method to add a structural part that isn't covered by the builders capabilities. - * - * @param name - * Name of the hatch or other component. - * @param info - * Positional information. - * @return Instance this method was called on. - */ - public MultiBlockTooltipBuilder addOtherStructurePart(String name, String info) { - sLines.add(TAB + name + ": " + info); - return this; - } - - /** - * Call at the very end.
- * Adds a final line with the authors name and information on how to display the structure guidelines.
- * Ends the building process. - * - * @param author - * Name of the creator of this Machine - * - * @return The result of all build calls. - */ - public void signAndFinalize(String author) { - iLines.add("Hold " + EnumChatFormatting.BOLD + "[LSHIFT]" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY + " to display structure guidelines"); - iLines.add("Created by " + author); - iArray = new String[iLines.size()]; - sArray = new String[sLines.size()]; - iLines.toArray(iArray); - sLines.toArray(sArray); - } - - public String[] getInformation() { - return iArray; - } - - public String[] getStructureInformation() { - return sArray; - } -} diff --git a/src/main/java/kekztech/TFFTFluidHandler.java b/src/main/java/kekztech/TFFTFluidHandler.java deleted file mode 100644 index 2ed5eac798..0000000000 --- a/src/main/java/kekztech/TFFTFluidHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package kekztech; - -public class TFFTFluidHandler { - - - -} diff --git a/src/main/java/tileentities/GTMTE_FluidMultiStorage.java b/src/main/java/tileentities/GTMTE_FluidMultiStorage.java index e4ab4e574e..61b8e558f5 100644 --- a/src/main/java/tileentities/GTMTE_FluidMultiStorage.java +++ b/src/main/java/tileentities/GTMTE_FluidMultiStorage.java @@ -21,7 +21,6 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Input import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; import gregtech.api.objects.GT_RenderedTexture; -import kekztech.MultiBlockTooltipBuilder; import kekztech.MultiFluidHandler; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; @@ -32,6 +31,7 @@ import net.minecraft.util.ChatComponentText; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; +import util.MultiBlockTooltipBuilder; import util.Vector3i; import util.Vector3ic; diff --git a/src/main/java/tileentities/GTMTE_ModularNuclearReactor.java b/src/main/java/tileentities/GTMTE_ModularNuclearReactor.java index a6b91a60ca..14941e489d 100644 --- a/src/main/java/tileentities/GTMTE_ModularNuclearReactor.java +++ b/src/main/java/tileentities/GTMTE_ModularNuclearReactor.java @@ -15,11 +15,11 @@ import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_MultiBlockBase; import gregtech.api.objects.GT_RenderedTexture; -import kekztech.MultiBlockTooltipBuilder; import net.minecraft.block.Block; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; +import util.MultiBlockTooltipBuilder; public class GTMTE_ModularNuclearReactor extends GT_MetaTileEntity_MultiBlockBase { diff --git a/src/main/java/tileentities/GTMTE_SOFuelCellMK1.java b/src/main/java/tileentities/GTMTE_SOFuelCellMK1.java index 549bc19f72..9aa0a5c01d 100644 --- a/src/main/java/tileentities/GTMTE_SOFuelCellMK1.java +++ b/src/main/java/tileentities/GTMTE_SOFuelCellMK1.java @@ -19,13 +19,13 @@ import gregtech.api.objects.GT_RenderedTexture; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_Recipe; import gregtech.api.util.GT_Utility; -import kekztech.MultiBlockTooltipBuilder; import gregtech.api.util.GT_Recipe.GT_Recipe_Map; import net.minecraft.block.Block; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidStack; +import util.MultiBlockTooltipBuilder; import util.Vector3i; import util.Vector3ic; diff --git a/src/main/java/tileentities/GTMTE_SOFuelCellMK2.java b/src/main/java/tileentities/GTMTE_SOFuelCellMK2.java index 8d1f996cb8..3ecba204ce 100644 --- a/src/main/java/tileentities/GTMTE_SOFuelCellMK2.java +++ b/src/main/java/tileentities/GTMTE_SOFuelCellMK2.java @@ -19,13 +19,13 @@ import gregtech.api.objects.GT_RenderedTexture; import gregtech.api.util.GT_Recipe; import gregtech.api.util.GT_Utility; import gregtech.api.util.GT_Recipe.GT_Recipe_Map; -import kekztech.MultiBlockTooltipBuilder; import net.minecraft.block.Block; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; +import util.MultiBlockTooltipBuilder; import util.Vector3i; import util.Vector3ic; diff --git a/src/main/java/tileentities/TE_ItemDistributionCable.java b/src/main/java/tileentities/TE_ItemDistributionCable.java index 153ed139b5..325d04c211 100644 --- a/src/main/java/tileentities/TE_ItemDistributionCable.java +++ b/src/main/java/tileentities/TE_ItemDistributionCable.java @@ -1,7 +1,25 @@ package tileentities; +import kekztech.IConduit; +import kekztech.ItemDistributionNetworkController; import net.minecraft.tileentity.TileEntity; -public class TE_ItemDistributionCable extends TileEntity { +public class TE_ItemDistributionCable extends TileEntity implements IConduit { + + private ItemDistributionNetworkController network; + + public TE_ItemDistributionCable() { + ItemDistributionNetworkController.placeConduit(this); + } + + @Override + public void setNetwork(ItemDistributionNetworkController network) { + this.network = network; + } + + @Override + public ItemDistributionNetworkController getNetwork() { + return network; + } } diff --git a/src/main/java/tileentities/TE_ItemDistributionNode.java b/src/main/java/tileentities/TE_ItemDistributionNode.java index 4da94ea5f5..25d7b64680 100644 --- a/src/main/java/tileentities/TE_ItemDistributionNode.java +++ b/src/main/java/tileentities/TE_ItemDistributionNode.java @@ -5,7 +5,10 @@ import kekztech.ItemDistributionNetworkController; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.Constants; public class TE_ItemDistributionNode extends TileEntity implements IConduit, IInventory { @@ -31,38 +34,58 @@ private ItemDistributionNetworkController network; @Override public ItemStack getStackInSlot(int slot) { - // TODO Auto-generated method stub - return null; + return network.getStackInSlot(slot); } @Override public ItemStack decrStackSize(int slot, int amount) { - // TODO Auto-generated method stub + + if(network.getStackInSlot(slot) != null) { + if(network.getStackInSlot(slot).stackSize == amount) { + final ItemStack itemStack = network.getStackInSlot(slot); + network.setStackInSlot(slot, null); + super.markDirty(); + return itemStack; + } else { + final ItemStack itemStack = network.getStackInSlot(slot).splitStack(amount); + if(network.getStackInSlot(slot).stackSize == 0) { + network.setStackInSlot(slot, null); + } + super.markDirty(); + return itemStack; + } + } + return null; } @Override public ItemStack getStackInSlotOnClosing(int slot) { - // TODO Auto-generated method stub + if(network.getStackInSlot(slot) != null) { + final ItemStack itemStack = network.getStackInSlot(slot); + network.setStackInSlot(slot, null); + return itemStack; + } return null; } @Override public void setInventorySlotContents(int slot, ItemStack itemStack) { - // TODO Auto-generated method stub - + if(itemStack.stackSize > getInventoryStackLimit()) { + itemStack.stackSize = getInventoryStackLimit(); + } + network.setStackInSlot(slot, itemStack); + super.markDirty(); } @Override public String getInventoryName() { - // TODO Auto-generated method stub - return null; + return network.getUUID().toString(); } @Override public boolean hasCustomInventoryName() { - // TODO Auto-generated method stub - return false; + return true; } @Override @@ -88,9 +111,8 @@ private ItemDistributionNetworkController network; } @Override - public boolean isItemValidForSlot(int p_94041_1_, ItemStack p_94041_2_) { - // TODO Auto-generated method stub - return false; + public boolean isItemValidForSlot(int slot, ItemStack itemStack) { + return network.isInputSlot(slot) && network.getStackInSlot(slot).isItemEqual(itemStack); } } diff --git a/src/main/java/util/MultiBlockTooltipBuilder.java b/src/main/java/util/MultiBlockTooltipBuilder.java new file mode 100644 index 0000000000..329220272a --- /dev/null +++ b/src/main/java/util/MultiBlockTooltipBuilder.java @@ -0,0 +1,160 @@ +package util; + +import java.util.LinkedList; +import java.util.List; + +import net.minecraft.util.EnumChatFormatting; + +/** + * Have you ever felt like your tooltips just aren't enterprise enough? Use this! + * + * @author kekzdealer + * + */ +public class MultiBlockTooltipBuilder { + + private static final String TAB = " "; + + private final List iLines; + private final List sLines; + + private String[] iArray; + private String[] sArray; + + public MultiBlockTooltipBuilder() { + iLines = new LinkedList<>(); + sLines = new LinkedList<>(); + } + + /** + * Add a basic line of information about this structure + * + * @param line + * The line to be added. + * @return Instance this method was called on. + */ + public MultiBlockTooltipBuilder addInfo(String info) { + iLines.add(info); + return this; + } + + /** + * Add a separator line like this:
+ * ------------------------------- + * + * @return Instance this method was called on. + */ + public MultiBlockTooltipBuilder addSeparator() { + iLines.add("-----------------------------------------"); + return this; + } + + /** + * Begin adding structural information by adding a line about the structure's dimensions + * and then inserting a "Structure:" line. + * + * @param w + * Structure width. + * @param h + * Structure height. + * @param l + * Structure depth/length. + * @return Instance this method was called on. + */ + public MultiBlockTooltipBuilder beginStructureBlock(int w, int h, int l) { + sLines.add("Dimensions: " + w + "x" + h + "x" + l + " (WxHxL)"); + sLines.add("Structure:"); + return this; + } + + public MultiBlockTooltipBuilder addController(String info) { + sLines.add(TAB + "Controller: " + info); + return this; + } + + public MultiBlockTooltipBuilder addCasingInfo(String casingName, int minCount) { + sLines.add(TAB + minCount +"x " + casingName + " (at least)"); + return this; + } + + public MultiBlockTooltipBuilder addEnergyHatch(String info) { + sLines.add(TAB + "Energy Hatch: " + info); + return this; + } + + public MultiBlockTooltipBuilder addDynamoHatch(String info) { + sLines.add(TAB + "Dynamo Hatch: " + info); + return this; + } + + public MultiBlockTooltipBuilder addMaintenanceHatch(String info) { + sLines.add(TAB + "Maintenance Hatch: " + info); + return this; + } + + public MultiBlockTooltipBuilder addIOHatches(String info) { + sLines.add(TAB + "I/O Hatches: " + info); + return this; + } + + public MultiBlockTooltipBuilder addInputBus(String info) { + sLines.add(TAB + "Input Bus/ses: " + info); + return this; + } + + public MultiBlockTooltipBuilder addInputHatch(String info) { + sLines.add(TAB + "Input Hatch/es: " + info); + return this; + } + + public MultiBlockTooltipBuilder addOutputBus(String info) { + sLines.add(TAB + "Output Bus/ses: " + info); + return this; + } + + public MultiBlockTooltipBuilder addOutputHatch(String info) { + sLines.add(TAB + "Output Hatch/es: " + info); + return this; + } + + /** + * Use this method to add a structural part that isn't covered by the builders capabilities. + * + * @param name + * Name of the hatch or other component. + * @param info + * Positional information. + * @return Instance this method was called on. + */ + public MultiBlockTooltipBuilder addOtherStructurePart(String name, String info) { + sLines.add(TAB + name + ": " + info); + return this; + } + + /** + * Call at the very end.
+ * Adds a final line with the authors name and information on how to display the structure guidelines.
+ * Ends the building process. + * + * @param author + * Name of the creator of this Machine + * + * @return The result of all build calls. + */ + public void signAndFinalize(String author) { + iLines.add("Hold " + EnumChatFormatting.BOLD + "[LSHIFT]" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY + " to display structure guidelines"); + iLines.add("Created by " + author); + iArray = new String[iLines.size()]; + sArray = new String[sLines.size()]; + iLines.toArray(iArray); + sLines.toArray(sArray); + } + + public String[] getInformation() { + return iArray; + } + + public String[] getStructureInformation() { + return sArray; + } +} diff --git a/src/main/resources/assets/kekztech/textures/gui/ItemDistributorNode.png b/src/main/resources/assets/kekztech/textures/gui/ItemDistributorNode.png new file mode 100644 index 0000000000..b01d9b444f Binary files /dev/null and b/src/main/resources/assets/kekztech/textures/gui/ItemDistributorNode.png differ -- cgit