From 779c2c49e7fbb455951407f706b6ebe1986ebdcc Mon Sep 17 00:00:00 2001 From: aidancbrady Date: Tue, 15 Mar 2016 17:34:17 -0400 Subject: [PATCH] Lots of work on Formulaic Assemblicators, still need to do a good bit of polishing --- .../client/gui/GuiFormulaicAssemblicator.java | 138 +++++++++++++++++- src/main/java/mekanism/common/Mekanism.java | 7 +- .../ContainerFormulaicAssemblicator.java | 12 +- .../common/item/ItemCraftingFormula.java | 15 +- .../TileEntityFormulaicAssemblicator.java | 107 ++++++++++---- .../gui/GuiFormulaicAssemblicator.png | Bin 6824 -> 6885 bytes 6 files changed, 246 insertions(+), 33 deletions(-) diff --git a/src/main/java/mekanism/client/gui/GuiFormulaicAssemblicator.java b/src/main/java/mekanism/client/gui/GuiFormulaicAssemblicator.java index c4fa8aedc..28ab40490 100644 --- a/src/main/java/mekanism/client/gui/GuiFormulaicAssemblicator.java +++ b/src/main/java/mekanism/client/gui/GuiFormulaicAssemblicator.java @@ -1,7 +1,9 @@ package mekanism.client.gui; +import java.util.ArrayList; import java.util.List; +import mekanism.api.Coord4D; import mekanism.api.util.ListUtils; import mekanism.client.gui.element.GuiElement.IInfoHandler; import mekanism.client.gui.element.GuiEnergyInfo; @@ -12,7 +14,9 @@ import mekanism.client.gui.element.GuiSlot; import mekanism.client.gui.element.GuiSlot.SlotOverlay; import mekanism.client.gui.element.GuiSlot.SlotType; import mekanism.client.gui.element.GuiTransporterConfigTab; +import mekanism.common.Mekanism; import mekanism.common.inventory.container.ContainerFormulaicAssemblicator; +import mekanism.common.network.PacketTileEntity.TileEntityMessage; import mekanism.common.tile.TileEntityFormulaicAssemblicator; import mekanism.common.util.LangUtils; import mekanism.common.util.MekanismUtils; @@ -36,7 +40,7 @@ public class GuiFormulaicAssemblicator extends GuiMekanism guiElements.add(new GuiRedstoneControl(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"))); guiElements.add(new GuiSideConfigurationTab(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"))); guiElements.add(new GuiTransporterConfigTab(this, 34, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"))); - guiElements.add(new GuiPowerBar(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"), 159, 16)); + guiElements.add(new GuiPowerBar(this, tileEntity, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"), 159, 15)); guiElements.add(new GuiEnergyInfo(new IInfoHandler() { @Override public List getInfo() @@ -45,7 +49,7 @@ public class GuiFormulaicAssemblicator extends GuiMekanism return ListUtils.asList(LangUtils.localize("gui.using") + ": " + multiplier + "/t", LangUtils.localize("gui.needed") + ": " + MekanismUtils.getEnergyDisplay(tileEntity.getMaxEnergy()-tileEntity.getEnergy())); } }, this, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"))); - guiElements.add(new GuiSlot(SlotType.POWER, this, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"), 154, 75).with(SlotOverlay.POWER)); + guiElements.add(new GuiSlot(SlotType.POWER, this, MekanismUtils.getResource(ResourceType.GUI, "GuiFormulaicAssemblicator.png"), 151, 75).with(SlotOverlay.POWER)); ySize+=64; } @@ -53,9 +57,38 @@ public class GuiFormulaicAssemblicator extends GuiMekanism @Override protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + fontRendererObj.drawString(tileEntity.getInventoryName(), (xSize/2)-(fontRendererObj.getStringWidth(tileEntity.getInventoryName())/2), 6, 0x404040); fontRendererObj.drawString(LangUtils.localize("container.inventory"), 8, (ySize - 96) + 2, 0x404040); - + + if(!tileEntity.autoMode) + { + /*if(xAxis >= 7 && xAxis <= 21 && yAxis >= 45 && yAxis <= 59) + { + drawTexturedModalRect(guiWidth + 7, guiHeight + 45, 176, 0, 14, 14); + } + + if(xAxis >= 71 && xAxis <= 87 && yAxis >= 75 && yAxis <= 91) + { + drawTexturedModalRect(guiWidth + 71, guiHeight + 75, 176 + 14, 0, 16, 16); + } + + if(xAxis >= 89 && xAxis <= 105 && yAxis >= 75 && yAxis <= 91) + { + drawTexturedModalRect(guiWidth + 89, guiHeight + 75, 176 + 30, 0, 16, 16); + }*/ + } + + if(tileEntity.formula != null) + { + if(xAxis >= 107 && xAxis <= 123 && yAxis >= 75 && yAxis <= 91) + { + + } + } + super.drawGuiContainerForegroundLayer(mouseX, mouseY); } @@ -67,7 +100,106 @@ public class GuiFormulaicAssemblicator extends GuiMekanism int guiWidth = (width - xSize) / 2; int guiHeight = (height - ySize) / 2; drawTexturedModalRect(guiWidth, guiHeight, 0, 0, xSize, ySize); + + int xAxis = mouseX - guiWidth; + int yAxis = mouseY - guiHeight; + + if(!tileEntity.autoMode) + { + if(xAxis >= 7 && xAxis <= 21 && yAxis >= 45 && yAxis <= 59) + { + drawTexturedModalRect(guiWidth + 7, guiHeight + 45, 176, 0, 14, 14); + } + else { + drawTexturedModalRect(guiWidth + 7, guiHeight + 45, 176, 14, 14, 14); + } + + if(xAxis >= 71 && xAxis <= 87 && yAxis >= 75 && yAxis <= 91) + { + drawTexturedModalRect(guiWidth + 71, guiHeight + 75, 176 + 14, 0, 16, 16); + } + else { + drawTexturedModalRect(guiWidth + 71, guiHeight + 75, 176 + 14, 16, 16, 16); + } + + if(xAxis >= 89 && xAxis <= 105 && yAxis >= 75 && yAxis <= 91) + { + drawTexturedModalRect(guiWidth + 89, guiHeight + 75, 176 + 30, 0, 16, 16); + } + else { + drawTexturedModalRect(guiWidth + 89, guiHeight + 75, 176 + 30, 16, 16, 16); + } + } + else { + drawTexturedModalRect(guiWidth + 7, guiHeight + 45, 176, 28, 14, 14); + drawTexturedModalRect(guiWidth + 71, guiHeight + 75, 176 + 14, 32, 16, 16); + drawTexturedModalRect(guiWidth + 89, guiHeight + 75, 176 + 30, 32, 16, 16); + } + + if(tileEntity.formula != null) + { + if(xAxis >= 107 && xAxis <= 123 && yAxis >= 75 && yAxis <= 91) + { + drawTexturedModalRect(guiWidth + 107, guiHeight + 75, 176 + 46, 0, 16, 16); + } + else { + drawTexturedModalRect(guiWidth + 107, guiHeight + 75, 176 + 46, 16, 16, 16); + } + } + else { + drawTexturedModalRect(guiWidth + 107, guiHeight + 75, 176 + 46, 32, 16, 16); + } super.drawGuiContainerBackgroundLayer(partialTick, mouseX, mouseY); } + + @Override + protected void mouseClicked(int mouseX, int mouseY, int button) + { + super.mouseClicked(mouseX, mouseY, button); + + if(button == 0) + { + int xAxis = (mouseX - (width - xSize) / 2); + int yAxis = (mouseY - (height - ySize) / 2); + + if(!tileEntity.autoMode) + { + if(xAxis >= 7 && xAxis <= 21 && yAxis >= 45 && yAxis <= 59) + { + ArrayList data = new ArrayList(); + data.add(1); + + Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); + } + + if(xAxis >= 71 && xAxis <= 87 && yAxis >= 75 && yAxis <= 91) + { + ArrayList data = new ArrayList(); + data.add(2); + + Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); + } + + if(xAxis >= 89 && xAxis <= 105 && yAxis >= 75 && yAxis <= 91) + { + ArrayList data = new ArrayList(); + data.add(3); + + Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); + } + } + + if(tileEntity.formula != null) + { + if(xAxis >= 107 && xAxis <= 123 && yAxis >= 75 && yAxis <= 91) + { + ArrayList data = new ArrayList(); + data.add(0); + + Mekanism.packetHandler.sendToServer(new TileEntityMessage(Coord4D.get(tileEntity), data)); + } + } + } + } } diff --git a/src/main/java/mekanism/common/Mekanism.java b/src/main/java/mekanism/common/Mekanism.java index b2256dbe5..15b58abdb 100644 --- a/src/main/java/mekanism/common/Mekanism.java +++ b/src/main/java/mekanism/common/Mekanism.java @@ -76,6 +76,7 @@ import mekanism.common.tile.TileEntityAdvancedBoundingBlock; import mekanism.common.tile.TileEntityBoundingBlock; import mekanism.common.tile.TileEntityCardboardBox; import mekanism.common.tile.TileEntityElectricBlock; +import mekanism.common.tile.TileEntityFormulaicAssemblicator; import mekanism.common.tile.TileEntityPressureDisperser; import mekanism.common.tile.TileEntityQuantumEntangloporter; import mekanism.common.tile.TileEntitySuperheatingElement; @@ -518,6 +519,9 @@ public class Mekanism MachineType.QUANTUM_ENTANGLOPORTER.addRecipe(new ShapedMekanismRecipe(new ItemStack(MekanismBlocks.MachineBlock3, 1, 0), new Object[] { "OCO", "ATA", "OCO", Character.valueOf('O'), "ingotRefinedObsidian", Character.valueOf('C'), MekanismUtils.getControlCircuit(BaseTier.ULTIMATE), Character.valueOf('A'), "alloyUltimate", Character.valueOf('T'), MekanismItems.TeleportationCore })); + MachineType.FORMULAIC_ASSEMBLICATOR.addRecipe(new ShapedMekanismRecipe(new ItemStack(MekanismBlocks.MachineBlock3, 1, 5), new Object[] { + "STS", "BIB", "SCS", Character.valueOf('S'), "ingotSteel", Character.valueOf('T'), Blocks.crafting_table, Character.valueOf('B'), MekanismUtils.getControlCircuit(BaseTier.BASIC), Character.valueOf('I'), new ItemStack(MekanismBlocks.MachineBlock, 1, 8), Character.valueOf('C'), Blocks.chest + })); //Energy Cube recipes CraftingManager.getInstance().getRecipeList().add(new ShapedMekanismRecipe(MekanismUtils.getEnergyCube(EnergyCubeTier.BASIC), new Object[] { @@ -1118,9 +1122,10 @@ public class Mekanism GameRegistry.registerTileEntity(TileEntityCardboardBox.class, "CardboardBox"); GameRegistry.registerTileEntity(TileEntityThermalEvaporationValve.class, "SalinationValve"); //TODO rename GameRegistry.registerTileEntity(TileEntityThermalEvaporationBlock.class, "SalinationTank"); //TODO rename - GameRegistry.registerTileEntity(TileEntityQuantumEntangloporter.class, "EntangledBlock"); + GameRegistry.registerTileEntity(TileEntityQuantumEntangloporter.class, "QuantumEntangloporter"); GameRegistry.registerTileEntity(TileEntityPressureDisperser.class, "PressureDisperser"); GameRegistry.registerTileEntity(TileEntitySuperheatingElement.class, "SuperheatingElement"); + GameRegistry.registerTileEntity(TileEntityFormulaicAssemblicator.class, "FormulaicAssemblicator"); //Load tile entities that have special renderers. proxy.registerSpecialTileEntities(); diff --git a/src/main/java/mekanism/common/inventory/container/ContainerFormulaicAssemblicator.java b/src/main/java/mekanism/common/inventory/container/ContainerFormulaicAssemblicator.java index 0961058bd..14415b18e 100644 --- a/src/main/java/mekanism/common/inventory/container/ContainerFormulaicAssemblicator.java +++ b/src/main/java/mekanism/common/inventory/container/ContainerFormulaicAssemblicator.java @@ -25,7 +25,7 @@ public class ContainerFormulaicAssemblicator extends Container public ContainerFormulaicAssemblicator(InventoryPlayer inventory, TileEntityFormulaicAssemblicator tentity) { tileEntity = tentity; - addSlotToContainer(new SlotDischarge(tentity, 1, 155, 76)); + addSlotToContainer(new SlotDischarge(tentity, 1, 152, 76)); addSlotToContainer(new SlotSpecific(tentity, 2, 6, 26, ItemCraftingFormula.class)); int slotY; @@ -42,13 +42,19 @@ public class ContainerFormulaicAssemblicator extends Container { for(int slotX = 0; slotX < 3; slotX++) { - addSlotToContainer(new Slot(tentity, slotX + slotY * 9 + 27, 26 + slotX * 18, 17 + slotY * 18) { + addSlotToContainer(new Slot(tentity, slotX + slotY * 3 + 27, 26 + slotX * 18, 17 + slotY * 18) { @Override public boolean isItemValid(ItemStack stack) { return !tileEntity.autoMode; } + @Override + public boolean canTakeStack(EntityPlayer player) + { + return !tileEntity.autoMode; + } + @SideOnly(Side.CLIENT) public boolean func_111238_b() { @@ -77,7 +83,7 @@ public class ContainerFormulaicAssemblicator extends Container { for(int slotX = 0; slotX < 2; slotX++) { - addSlotToContainer(new SlotOutput(tentity, slotX + slotY * 9 + 21, 116 + slotX * 18, 17 + slotY * 18)); + addSlotToContainer(new SlotOutput(tentity, slotX + slotY * 2 + 21, 116 + slotX * 18, 17 + slotY * 18)); } } diff --git a/src/main/java/mekanism/common/item/ItemCraftingFormula.java b/src/main/java/mekanism/common/item/ItemCraftingFormula.java index 0bfdff07b..846aaafef 100644 --- a/src/main/java/mekanism/common/item/ItemCraftingFormula.java +++ b/src/main/java/mekanism/common/item/ItemCraftingFormula.java @@ -43,6 +43,13 @@ public class ItemCraftingFormula extends ItemMekanism return getInventory(stack) == null ? icons[0] : (isInvalid(stack) ? icons[1] : icons[2]); } + @Override + @SideOnly(Side.CLIENT) + public boolean requiresMultipleRenderPasses() + { + return true; + } + @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack itemstack, EntityPlayer entityplayer, List list, boolean flag) @@ -145,7 +152,7 @@ public class ItemCraftingFormula extends ItemMekanism public ItemStack[] getInventory(ItemStack stack) { - if(stack.stackTagCompound == null) + if(stack.stackTagCompound == null || !stack.stackTagCompound.hasKey("Items")) { return null; } @@ -174,6 +181,12 @@ public class ItemCraftingFormula extends ItemMekanism stack.setTagCompound(new NBTTagCompound()); } + if(inv == null) + { + stack.stackTagCompound.removeTag("Items"); + return; + } + NBTTagList tagList = new NBTTagList(); for(int slotCount = 0; slotCount < 9; slotCount++) diff --git a/src/main/java/mekanism/common/tile/TileEntityFormulaicAssemblicator.java b/src/main/java/mekanism/common/tile/TileEntityFormulaicAssemblicator.java index 08e20f50a..884ac2ba5 100644 --- a/src/main/java/mekanism/common/tile/TileEntityFormulaicAssemblicator.java +++ b/src/main/java/mekanism/common/tile/TileEntityFormulaicAssemblicator.java @@ -18,9 +18,6 @@ import mekanism.common.base.IUpgradeTile; import mekanism.common.block.BlockMachine.MachineType; import mekanism.common.content.assemblicator.RecipeFormula; import mekanism.common.item.ItemCraftingFormula; -import mekanism.common.recipe.RecipeHandler; -import mekanism.common.recipe.RecipeHandler.Recipe; -import mekanism.common.recipe.inputs.InfusionInput; import mekanism.common.tile.component.TileComponentConfig; import mekanism.common.tile.component.TileComponentEjector; import mekanism.common.tile.component.TileComponentUpgrade; @@ -47,6 +44,8 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im public boolean autoMode = false; + public boolean isRecipe = false; + public int pulseOperations; public RecipeFormula formula; @@ -72,7 +71,7 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im configComponent.setConfig(TransmissionType.ITEM, new byte[] {0, 0, 0, 3, 1, 2}); configComponent.setInputConfig(TransmissionType.ENERGY); - inventory = new ItemStack[35]; + inventory = new ItemStack[36]; upgradeComponent = new TileComponentUpgrade(this, 0); @@ -131,16 +130,20 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im formula = null; } + if(autoMode && formula == null) + { + toggleAutoMode(); + } + else if(formula != null) + { + moveItemsToGrid(); + } + if(autoMode && formula != null && ((controlType == RedstoneControl.PULSE && pulseOperations > 0) || MekanismUtils.canFunction(this))) { boolean canOperate = true; - if(!formula.matches(worldObj, inventory, 27)) - { - canOperate = moveItemsToGrid(); - } - - if(canOperate) + if(formula.matches(worldObj, inventory, 27)) { if(operatingTicks == ticksRequired) { @@ -187,11 +190,44 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im for(int i = 27; i <= 35; i++) { - inventory[i].stackSize--; - - if(inventory[i].stackSize == 0) + if(inventory[i] != null) { - inventory[i] = null; + ItemStack stack = inventory[i]; + + inventory[i].stackSize--; + + if(inventory[i].stackSize == 0) + { + inventory[i] = null; + } + + if(stack.stackSize == 0 && stack.getItem().hasContainerItem(stack)) + { + ItemStack container = stack.getItem().getContainerItem(stack); + + if(container != null && container.isItemStackDamageable() && container.getItemDamage() > container.getMaxDamage()) + { + container = null; + } + + if(container != null && !stack.getItem().doesContainerItemLeaveCraftingGrid(stack)) + { + if(!stack.getItem().doesContainerItemLeaveCraftingGrid(stack)) + { + inventory[i] = container.copy(); + } + else { + boolean move = tryMoveToOutput(container.copy(), false); + + if(move) + { + tryMoveToOutput(container.copy(), true); + } + + inventory[i] = move ? null : container.copy(); + } + } + } } } @@ -216,11 +252,11 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im if(canOperate) { - doSingleCraft(); + return doSingleCraft(); } } else { - doSingleCraft(); + return doSingleCraft(); } return false; @@ -282,6 +318,17 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im while(craftSingle()); } + private void moveItemsToInput() + { + for(int i = 27; i <= 35; i++) + { + if(inventory[i] != null && formula != null && !formula.isIngredientInPos(worldObj, inventory[i], i-27)) + { + inventory[i] = tryMoveToInput(inventory[i]); + } + } + } + private void toggleAutoMode() { if(autoMode) @@ -289,15 +336,13 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im operatingTicks = 0; autoMode = false; } - else { - for(int i = 27; i <= 35; i++) - { - inventory[i] = tryMoveToInput(inventory[i]); - } - - markDirty(); + else if(formula != null) + { + moveItemsToInput(); autoMode = true; } + + markDirty(); } private ItemStack tryMoveToInput(ItemStack stack) @@ -485,6 +530,7 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im autoMode = dataStream.readBoolean(); operatingTicks = dataStream.readInt(); controlType = RedstoneControl.values()[dataStream.readInt()]; + isRecipe = dataStream.readBoolean(); if(dataStream.readBoolean()) { @@ -492,7 +538,10 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im for(int i = 0; i < 9; i++) { - inv[i] = PacketHandler.readStack(dataStream); + if(dataStream.readBoolean()) + { + inv[i] = PacketHandler.readStack(dataStream); + } } formula = new RecipeFormula(inv); @@ -510,6 +559,7 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im data.add(autoMode); data.add(operatingTicks); data.add(controlType.ordinal()); + data.add(isRecipe); if(formula != null) { @@ -517,7 +567,14 @@ public class TileEntityFormulaicAssemblicator extends TileEntityElectricBlock im for(int i = 0; i < 9; i++) { - data.add(formula.input[i]); + if(formula.input[i] != null) + { + data.add(true); + data.add(formula.input[i]); + } + else { + data.add(false); + } } } else { diff --git a/src/main/resources/assets/mekanism/gui/GuiFormulaicAssemblicator.png b/src/main/resources/assets/mekanism/gui/GuiFormulaicAssemblicator.png index ccf63f296e3ebd3d9b565e6ed8c8ac3f9ebbe6fb..e9e58907d6ee546140a0dfdd8bdc309c844a5045 100644 GIT binary patch delta 5355 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