From c4105e06bf33c3d0920b7a29e0dd67d32c8b1f8e Mon Sep 17 00:00:00 2001 From: Henry Mao Date: Thu, 27 Dec 2012 20:05:15 +0800 Subject: [PATCH] Attempted to make autocrafting --- .../assemblyline/language/en_US.properties | 4 + .../assemblyline/textures/gui_stamper.png | Bin 3813 -> 3863 bytes .../assemblyline/client/gui/GuiStamper.java | 1 + .../machine/filter/ContainerStamper.java | 183 ++++++++++++++---- .../common/machine/filter/ItemFilter.java | 4 +- .../machine/filter/SlotCraftingResult.java | 54 ++++++ 6 files changed, 208 insertions(+), 38 deletions(-) create mode 100644 src/minecraft/assemblyline/common/machine/filter/SlotCraftingResult.java diff --git a/resources/assemblyline/language/en_US.properties b/resources/assemblyline/language/en_US.properties index 96e27771..c75be015 100644 --- a/resources/assemblyline/language/en_US.properties +++ b/resources/assemblyline/language/en_US.properties @@ -1,6 +1,10 @@ # Assembly Line Language Properties # @author Calclavia +# Gui +assemblyline.gui.crafting=Crafting + + # Blocks tile.crate.name=Crate tile.conveyorBelt.name=Conveyor Belt diff --git a/resources/assemblyline/textures/gui_stamper.png b/resources/assemblyline/textures/gui_stamper.png index 5681bc24e1c5898fa0433ab37641e296fcae9c31..93640b36ba8c45f9abdaec84448e652f80bd908c 100644 GIT binary patch delta 886 zcmaDVJ6&$W0j_!{PZ!6Kid%2)-Yr~gAkuJgwa+S}+zTD)FPfbe@D@a#a&9}juKW>u zT~6ZM;D&3;(eVP`x&b7ujfy$$p{u|oLdv|XU%n}6J9*}toi6^`*Wb~RC=tW?rhql!V>1H-69Wf>0z(6sF}a>kuwLZlWswa#;?}qS zm(IQIcG*NNnn5G*_O|xE`=xV>)pHmb7#VUH=WR5nbq8rTP*X;j0 zb^DJ(Rs}T$1~Ge%hNJcU3^SOzAN%=xT4~Vwn25ARwB-fq@~Kf$ygFZEj@-(f3nr zWki77hd=UJ99Vpqm=u^47?c=*)CcqXOd*>xYONcz83GOKIXN8G#xN#ue|Xk?^{`_h zYs1lghJ=sG5ZCcDfdVb!&x7m(p*9Z8j4S@EU(>9+5#*W;tPh^txh=q;_3U1oE<8wK zj5*g2%QLN5_A@xB{gKgVqX@2acRiAL<9cHLu5}J$#tO^Vct#de1<~%z7(87v&aSX7IYCP4kQ+GY>u zi;#rJQw+}iU3tJp6Kq0oelO4j^W{K4z`fuH^@8GZCh6rr3N8AA8!cs*Gu>taC%db$ z|2FrZ@9@xEYIA<`$yTrR440l38A{JNX22tO-+bfE2X#!FH6QxSzxz~LC(LgVC(Gms zJhGE#^9Vt)05c?{WUz@T0b`$$f$K9X1H=FS%nbM9U9;`}tPx`X0#8>zmvv4FO#pn2 BRg3@t delta 754 zcmbO(_f&Sn0j_!hPZ!6Kid%2)#^xv-mTHq$rfoVfqsmZI4|LYQ{Aey+bbrBr|RV1=^*(}%IBz!!4f6n>m zXYUxA-)An^8B=q(!1exjK|wb_F#B22U}2j)tTBObH*G86y5DFo@azd8cd7=A-F)Zs)A- z0HAHY>2WZ8@CyHL z5^=q>J6>U_$YYCH$>;7C-`ch{=)PdXPwoh%=Q2>SKef)$lNa*IxC$^#XJBEtv2gWs z#wAmfp6~hLdd9Hb%2Y7WOH)wLo-eLIX@aHcnU!x{7VLYktdu0trm@sy_Fm>0`x{i} zR3x9fWa-E9iD&XgJ{e7x1F8&+3}q)e9iD~Qw?8igYP@>BQ0c<#cMQ+;6FAlH&DdPh zC){YmJlT;?#)+|j(}AHuwg{~1Vdc7c94vpfEER6dVLV{W0F;T{`Agu!$^*}?7%blw z+*mFQa{i%}+n?#oef)3>*z1!Gxh29l8oYra@Mc1AYfb&cr;A5h%KQ z_uuL`!sXgatXLY{)Za28RFtnHj!Ya7{YcyR@AF2s~Z= KT-G@yGywoy!a+O$ diff --git a/src/minecraft/assemblyline/client/gui/GuiStamper.java b/src/minecraft/assemblyline/client/gui/GuiStamper.java index 413a418d..70062e23 100644 --- a/src/minecraft/assemblyline/client/gui/GuiStamper.java +++ b/src/minecraft/assemblyline/client/gui/GuiStamper.java @@ -28,6 +28,7 @@ public class GuiStamper extends GuiContainer protected void drawGuiContainerForegroundLayer(int par1, int par2) { this.fontRenderer.drawString(TranslationHelper.getLocal("tile.stamper.name"), 68, 6, 4210752); + this.fontRenderer.drawString(TranslationHelper.getLocal("assemblyline.gui.crafting")+":", 25, 55, 4210752); } /** diff --git a/src/minecraft/assemblyline/common/machine/filter/ContainerStamper.java b/src/minecraft/assemblyline/common/machine/filter/ContainerStamper.java index 8dfd8064..14185307 100644 --- a/src/minecraft/assemblyline/common/machine/filter/ContainerStamper.java +++ b/src/minecraft/assemblyline/common/machine/filter/ContainerStamper.java @@ -8,26 +8,35 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.item.crafting.ShapelessRecipes; import net.minecraft.world.World; import universalelectricity.core.vector.Vector3; public class ContainerStamper extends Container implements IInventory { - private ItemStack[] containingItems = new ItemStack[3]; + private ItemStack[] containingItems = new ItemStack[5]; private World worldObj; private Vector3 position; + private InventoryPlayer inventoryPlayer; - public ContainerStamper(InventoryPlayer par1InventoryPlayer, World worldObj, Vector3 position) + public ContainerStamper(InventoryPlayer inventoryPlayer, World worldObj, Vector3 position) { this.worldObj = worldObj; this.position = position; + this.inventoryPlayer = inventoryPlayer; // Paper Input - this.addSlotToContainer(new SlotFilter(this, 0, 30, 35)); + this.addSlotToContainer(new SlotFilter(this, 0, 42, 24)); // Item Stamp - this.addSlotToContainer(new Slot(this, 1, 66, 35)); + this.addSlotToContainer(new Slot(this, 1, 78, 24)); // Output Filter - this.addSlotToContainer(new SlotFilterResult(this, 2, 124, 35)); + this.addSlotToContainer(new SlotFilterResult(this, 2, 136, 24)); + // Crafting Slot + this.addSlotToContainer(new SlotFilter(this, 3, 78, 53)); + this.addSlotToContainer(new SlotCraftingResult(this, this, 4, 136, 53)); int var3; @@ -35,13 +44,13 @@ public class ContainerStamper extends Container implements IInventory { for (int var4 = 0; var4 < 9; ++var4) { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); + this.addSlotToContainer(new Slot(inventoryPlayer, var4 + var3 * 9 + 9, 8 + var4 * 18, 84 + var3 * 18)); } } for (var3 = 0; var3 < 9; ++var3) { - this.addSlotToContainer(new Slot(par1InventoryPlayer, var3, 8 + var3 * 18, 142)); + this.addSlotToContainer(new Slot(inventoryPlayer, var3, 8 + var3 * 18, 142)); } } @@ -50,32 +59,6 @@ public class ContainerStamper extends Container implements IInventory { super.updateCraftingResults(); - if (this.getStackInSlot(0) != null && this.getStackInSlot(1) != null) - { - if (this.getStackInSlot(0).getItem() instanceof ItemFilter) - { - ItemStack outputStack = this.getStackInSlot(0).copy(); - outputStack.stackSize = 1; - ArrayList filters = ItemFilter.getFilters(outputStack); - - for (ItemStack filteredStack : filters) - { - if (filteredStack.isItemEqual(this.getStackInSlot(1))) - { - this.setInventorySlotContents(2, null); - return; - } - } - - filters.add(this.getStackInSlot(1)); - ItemFilter.setFilters(outputStack, filters); - this.setInventorySlotContents(2, outputStack); - return; - } - } - - this.setInventorySlotContents(2, null); - } @Override @@ -98,7 +81,7 @@ public class ContainerStamper extends Container implements IInventory ItemStack itemStack2 = itemStack.getStack(); itemStack3 = itemStack2.copy(); - if (par1 > 2) + if (par1 > 4) { if (this.getSlot(0).isItemValid(itemStack2)) { @@ -106,7 +89,7 @@ public class ContainerStamper extends Container implements IInventory } else if (!this.mergeItemStack(itemStack2, 1, 2, false)) { return null; } } - else if (!this.mergeItemStack(itemStack2, 3, 37, false)) { return null; } + else if (!this.mergeItemStack(itemStack2, this.containingItems.length, 37, false)) { return null; } if (itemStack2.stackSize == 0) { @@ -200,7 +183,137 @@ public class ContainerStamper extends Container implements IInventory @Override public void onInventoryChanged() { + /** + * Makes the stamping recipe for filters + */ + boolean didStamp = false; + if (this.getStackInSlot(0) != null && this.getStackInSlot(1) != null) + { + if (this.getStackInSlot(0).getItem() instanceof ItemFilter) + { + ItemStack outputStack = this.getStackInSlot(0).copy(); + outputStack.stackSize = 1; + ArrayList filters = ItemFilter.getFilters(outputStack); + boolean failedCheck = false; + + for (ItemStack filteredStack : filters) + { + if (filteredStack.isItemEqual(this.getStackInSlot(1))) + { + failedCheck = true; + } + } + + if (!failedCheck) + { + filters.add(this.getStackInSlot(1)); + ItemFilter.setFilters(outputStack, filters); + this.setInventorySlotContents(2, outputStack); + didStamp = true; + } + } + } + + if (!didStamp) + { + this.setInventorySlotContents(2, null); + } + + /** + * TODO WORK IN PROGRESS. Make filters able to autocraft into its item based on what is in the player's inventory + + boolean didCraft = false; + + if (this.getStackInSlot(3) != null) + { + if (this.getStackInSlot(3).getItem() instanceof ItemFilter) + { + ArrayList filters = ItemFilter.getFilters(this.getStackInSlot(3)); + + if (filters.size() > 0) + { + ItemStack outputStack = filters.get(0); + + if (outputStack != null) + { + if (this.getIdealRecipe(outputStack) != null) + { + this.setInventorySlotContents(4, outputStack); + didCraft = true; + } + } + } + } + } + + if (!didCraft) + { + this.setInventorySlotContents(4, null); + } */ + } + + /** + * Does this player's inventory contain the required resources to craft this item? + * + * @return Required Items + */ + public ItemStack[] getIdealRecipe(ItemStack outputItem) + { + for (Object object : CraftingManager.getInstance().getRecipeList()) + { + if (object instanceof IRecipe) + { + if (((IRecipe) object).getRecipeOutput() != null) + { + if (outputItem.isItemEqual(((IRecipe) object).getRecipeOutput())) + { + if (object instanceof ShapedRecipes) + { + if (this.doesMatch(((ShapedRecipes) object).recipeItems, outputItem)) { return ((ShapedRecipes) object).recipeItems; } + } + else if (object instanceof ShapelessRecipes) + { + if (this.doesMatch(((ShapelessRecipes) object).recipeItems.toArray(), outputItem)) { return (ItemStack[]) ((ShapelessRecipes) object).recipeItems.toArray(); } + } + } + } + } + } + + return null; + } + + private boolean doesMatch(Object[] recipeItems, ItemStack outputItem) + { + int itemMatch = 0; + + for (Object obj : recipeItems) + { + if (obj instanceof ItemStack) + { + ItemStack recipeItem = (ItemStack) obj; + + if (recipeItem != null) + { + for (int i = 0; i < this.inventoryPlayer.getSizeInventory(); i++) + { + ItemStack checkStack = this.inventoryPlayer.getStackInSlot(i); + + if (checkStack != null) + { + if (recipeItem.isItemEqual(checkStack)) + { + // TODO Do NBT CHecking + itemMatch++; + } + } + } + } + } + } + + return itemMatch >= recipeItems.length; } @Override diff --git a/src/minecraft/assemblyline/common/machine/filter/ItemFilter.java b/src/minecraft/assemblyline/common/machine/filter/ItemFilter.java index 4fcd3e11..7832c1cb 100644 --- a/src/minecraft/assemblyline/common/machine/filter/ItemFilter.java +++ b/src/minecraft/assemblyline/common/machine/filter/ItemFilter.java @@ -28,8 +28,6 @@ public class ItemFilter extends Item if (filterItems.size() > 0) { - list.add("Filters:"); - for (ItemStack filterItem : filterItems) { list.add(filterItem.getDisplayName()); @@ -50,7 +48,7 @@ public class ItemFilter extends Item { itemStack.setTagCompound(new NBTTagCompound()); } - + NBTTagList nbt = new NBTTagList(); for (int i = 0; i < filterStacks.size(); ++i) diff --git a/src/minecraft/assemblyline/common/machine/filter/SlotCraftingResult.java b/src/minecraft/assemblyline/common/machine/filter/SlotCraftingResult.java new file mode 100644 index 00000000..5bbca25c --- /dev/null +++ b/src/minecraft/assemblyline/common/machine/filter/SlotCraftingResult.java @@ -0,0 +1,54 @@ +package assemblyline.common.machine.filter; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotCraftingResult extends Slot +{ + private ContainerStamper container; + + public SlotCraftingResult(ContainerStamper container, IInventory par1iInventory, int par2, int par3, int par4) + { + super(par1iInventory, par2, par3, par4); + this.container = container; + } + + @Override + public boolean isItemValid(ItemStack par1ItemStack) + { + return false; + } + + @Override + public void onPickupFromSlot(EntityPlayer entityPlayer, ItemStack par2ItemStack) + { + super.onPickupFromSlot(entityPlayer, par2ItemStack); + + if (this.getStack() != null) + { + ItemStack[] requiredItems = this.container.getIdealRecipe(this.getStack()).clone(); + + if (requiredItems != null) + { + for (ItemStack searchStack : requiredItems) + { + for (int i = 0; i < entityPlayer.inventory.getSizeInventory(); i++) + { + ItemStack checkStack = entityPlayer.inventory.getStackInSlot(i); + + if (checkStack != null) + { + if (searchStack.isItemEqual(checkStack)) + { + entityPlayer.inventory.decrStackSize(i, 1); + break; + } + } + } + } + } + } + } +}