From 9a1aa77adf4d7172ba05ba665533d38da6c8825b Mon Sep 17 00:00:00 2001 From: Brian Ricketts Date: Sun, 20 Jan 2013 02:51:24 -0600 Subject: [PATCH] Implemented Auto Crafting with ArmBot USE command Also fixed some major crafting bugs in Imprinter Did *NOT* add *ANY* easter eggs. None. Zero. Zip. Nada. --- .../IUseable.java => api/IArmbotUseable.java} | 5 +- .../machine/armbot/TileEntityArmbot.java | 36 +++- .../common/machine/command/CommandDrop.java | 3 +- .../common/machine/command/CommandGrab.java | 5 +- .../common/machine/command/CommandUse.java | 32 +++- .../machine/imprinter/BlockImprinter.java | 7 + .../machine/imprinter/SlotCraftingResult.java | 2 +- .../imprinter/TileEntityImprinter.java | 161 +++++++++++++++--- 8 files changed, 217 insertions(+), 34 deletions(-) rename src/minecraft/assemblyline/{common/machine/armbot/IUseable.java => api/IArmbotUseable.java} (82%) diff --git a/src/minecraft/assemblyline/common/machine/armbot/IUseable.java b/src/minecraft/assemblyline/api/IArmbotUseable.java similarity index 82% rename from src/minecraft/assemblyline/common/machine/armbot/IUseable.java rename to src/minecraft/assemblyline/api/IArmbotUseable.java index 4a61142c..cd3daa41 100644 --- a/src/minecraft/assemblyline/common/machine/armbot/IUseable.java +++ b/src/minecraft/assemblyline/api/IArmbotUseable.java @@ -1,5 +1,6 @@ -package assemblyline.common.machine.armbot; +package assemblyline.api; +import assemblyline.common.machine.armbot.TileEntityArmbot; import net.minecraft.entity.Entity; /** @@ -9,7 +10,7 @@ import net.minecraft.entity.Entity; * @author Briman0094 * */ -public interface IUseable +public interface IArmbotUseable { /** diff --git a/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java b/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java index a29e727c..ceca0a2b 100644 --- a/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java +++ b/src/minecraft/assemblyline/common/machine/armbot/TileEntityArmbot.java @@ -30,6 +30,7 @@ import universalelectricity.prefab.TranslationHelper; import universalelectricity.prefab.multiblock.IMultiBlock; import universalelectricity.prefab.network.IPacketReceiver; import universalelectricity.prefab.network.PacketManager; +import assemblyline.api.IArmbotUseable; import assemblyline.common.AssemblyLine; import assemblyline.common.machine.TileEntityAssemblyNetwork; import assemblyline.common.machine.command.Command; @@ -102,8 +103,20 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult { if (Block.isNormalCube(block.blockID)) { - block.dropBlockAsItem(this.worldObj, this.xCoord, this.yCoord, this.zCoord, handPosition.getBlockMetadata(this.worldObj), 0); - handPosition.setBlockWithNotify(this.worldObj, 0); + TileEntity tileEntity = this.getHandPosition().getTileEntity(this.worldObj); + if (tileEntity == null) + { + block.dropBlockAsItem(this.worldObj, this.xCoord, this.yCoord, this.zCoord, handPosition.getBlockMetadata(this.worldObj), 0); + handPosition.setBlockWithNotify(this.worldObj, 0); + } + else + { + if (!(tileEntity instanceof IArmbotUseable)) + { + block.dropBlockAsItem(this.worldObj, this.xCoord, this.yCoord, this.zCoord, handPosition.getBlockMetadata(this.worldObj), 0); + handPosition.setBlockWithNotify(this.worldObj, 0); + } + } } } @@ -628,7 +641,24 @@ public class TileEntityArmbot extends TileEntityAssemblyNetwork implements IMult } case 6: { - this.commandManager.addCommand(this, CommandUse.class); + if (arguments.length > 0) + { + try + // try to cast to Float + { + int times = (Integer) arguments[0]; + this.commandManager.addCommand(this, CommandUse.class, new String[] { Integer.toString(times) }); + } + catch (Exception ex) + { + ex.printStackTrace(); + throw new IllegalArgumentException("expected number"); + } + } + else + { + this.commandManager.addCommand(this, CommandUse.class); + } break; } } diff --git a/src/minecraft/assemblyline/common/machine/command/CommandDrop.java b/src/minecraft/assemblyline/common/machine/command/CommandDrop.java index 3bad7982..96fc9c01 100644 --- a/src/minecraft/assemblyline/common/machine/command/CommandDrop.java +++ b/src/minecraft/assemblyline/common/machine/command/CommandDrop.java @@ -20,8 +20,7 @@ public class CommandDrop extends Command entity.worldObj = this.tileEntity.worldObj; if (entity instanceof EntityItem) world.spawnEntityInWorld(entity); //items don't move right, so we render them manually - if (this.world.isRemote) - Minecraft.getMinecraft().sndManager.playSound("random.pop", this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F); + this.world.playSound(this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, "random.pop", 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F, true); } } this.tileEntity.grabbedEntities.clear(); diff --git a/src/minecraft/assemblyline/common/machine/command/CommandGrab.java b/src/minecraft/assemblyline/common/machine/command/CommandGrab.java index d5b15295..792b843c 100644 --- a/src/minecraft/assemblyline/common/machine/command/CommandGrab.java +++ b/src/minecraft/assemblyline/common/machine/command/CommandGrab.java @@ -45,9 +45,8 @@ public class CommandGrab extends Command { this.tileEntity.grabbedEntities.add(found.get(i)); if (found.get(i) instanceof EntityItem) - this.tileEntity.worldObj.removeEntity(found.get(i)); // items don't move right, so we render them manually - if (this.world.isRemote) - Minecraft.getMinecraft().sndManager.playSound("random.pop", this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F); + this.tileEntity.worldObj.removeEntity(found.get(i)); // items don't move right, so we render them manually\ + this.world.playSound(this.tileEntity.xCoord, this.tileEntity.yCoord, this.tileEntity.zCoord, "random.pop", 0.2F, ((this.tileEntity.worldObj.rand.nextFloat() - this.tileEntity.worldObj.rand.nextFloat()) * 0.7F + 1.0F) * 1.0F, true); found.get(i).isDead = false; return false; } diff --git a/src/minecraft/assemblyline/common/machine/command/CommandUse.java b/src/minecraft/assemblyline/common/machine/command/CommandUse.java index accb2ffc..80b88f9f 100644 --- a/src/minecraft/assemblyline/common/machine/command/CommandUse.java +++ b/src/minecraft/assemblyline/common/machine/command/CommandUse.java @@ -2,10 +2,28 @@ package assemblyline.common.machine.command; import net.minecraft.entity.Entity; import net.minecraft.tileentity.TileEntity; -import assemblyline.common.machine.armbot.IUseable; +import assemblyline.api.IArmbotUseable; public class CommandUse extends Command { + private int times; + private int curTimes; + + @Override + public void onTaskStart() + { + times = 0; + curTimes = 0; + + if (this.getArgs().length > 0) + { + times = this.getIntArg(0); + } + + if (times <= 0) + times = 1; + } + @Override protected boolean doTask() { @@ -15,11 +33,17 @@ public class CommandUse extends Command handEntity = this.tileEntity.grabbedEntities.get(0); if (handTile != null) { - if (handTile instanceof IUseable) + if (handTile instanceof IArmbotUseable) { - ((IUseable) handTile).onUse(this.tileEntity, handEntity); + ((IArmbotUseable) handTile).onUse(this.tileEntity, handEntity); } } - return false; + + curTimes++; + + if (curTimes >= times) + return false; + + return true; } } diff --git a/src/minecraft/assemblyline/common/machine/imprinter/BlockImprinter.java b/src/minecraft/assemblyline/common/machine/imprinter/BlockImprinter.java index 0d47180d..c95e6c30 100644 --- a/src/minecraft/assemblyline/common/machine/imprinter/BlockImprinter.java +++ b/src/minecraft/assemblyline/common/machine/imprinter/BlockImprinter.java @@ -19,6 +19,13 @@ public class BlockImprinter extends BlockMachine this.setCreativeTab(TabAssemblyLine.INSTANCE); this.setTextureFile(AssemblyLine.BLOCK_TEXTURE_PATH); } + + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + super.onBlockAdded(world, x, y, z); + System.out.println(String.format("Initializing instance of 'Crafting Simulator 2014' at coordinates (%d, %d, %d)...", x, y, z)); + } /** * Returns the block texture based on the side being looked at. Args: side diff --git a/src/minecraft/assemblyline/common/machine/imprinter/SlotCraftingResult.java b/src/minecraft/assemblyline/common/machine/imprinter/SlotCraftingResult.java index fdba224c..9d6e3efa 100644 --- a/src/minecraft/assemblyline/common/machine/imprinter/SlotCraftingResult.java +++ b/src/minecraft/assemblyline/common/machine/imprinter/SlotCraftingResult.java @@ -46,7 +46,7 @@ public class SlotCraftingResult extends Slot if (checkStack != null) { - if (searchStack.isItemEqual(checkStack)) + if (searchStack.isItemEqual(checkStack) || (searchStack.itemID == checkStack.itemID && searchStack.getItemDamage() < 0)) { this.container.tileEntity.decrStackSize(i, 1); break; diff --git a/src/minecraft/assemblyline/common/machine/imprinter/TileEntityImprinter.java b/src/minecraft/assemblyline/common/machine/imprinter/TileEntityImprinter.java index f98fab09..9f2d4a37 100644 --- a/src/minecraft/assemblyline/common/machine/imprinter/TileEntityImprinter.java +++ b/src/minecraft/assemblyline/common/machine/imprinter/TileEntityImprinter.java @@ -3,6 +3,8 @@ package assemblyline.common.machine.imprinter; import java.util.ArrayList; import java.util.List; +import net.minecraft.entity.Entity; +import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; @@ -17,10 +19,13 @@ import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; import universalelectricity.prefab.TranslationHelper; import universalelectricity.prefab.tile.TileEntityAdvanced; +import assemblyline.api.IArmbotUseable; +import assemblyline.common.AssemblyLine; import assemblyline.common.Pair; +import assemblyline.common.machine.armbot.TileEntityArmbot; import cpw.mods.fml.relauncher.ReflectionHelper; -public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInventory +public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInventory, IArmbotUseable { public static final int START_INVENTORY = 5; public static final int INVENTORY_LENGTH = 9; @@ -47,7 +52,10 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv @Override public int getSizeInventorySide(ForgeDirection side) { - if (side == ForgeDirection.UP || side == ForgeDirection.DOWN) { return 1; } + if (side == ForgeDirection.UP || side == ForgeDirection.DOWN) + { + return 1; + } return INVENTORY_LENGTH; } @@ -64,8 +72,7 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv } /** - * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and - * returns them in a new stack. + * Removes from an inventory slot (first arg) up to a specified number (second arg) of items and returns them in a new stack. */ @Override public ItemStack decrStackSize(int i, int amount) @@ -99,8 +106,7 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv } /** - * When some containers are closed they call this on each slot, then drop whatever it returns as - * an EntityItem - like when you close a workbench GUI. + * When some containers are closed they call this on each slot, then drop whatever it returns as an EntityItem - like when you close a workbench GUI. */ @Override public ItemStack getStackInSlotOnClosing(int slot) @@ -118,8 +124,7 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv } /** - * Sets the given item stack to the specified slot in the inventory (can be crafting or armor - * sections). + * Sets the given item stack to the specified slot in the inventory (can be crafting or armor sections). */ @Override public void setInventorySlotContents(int par1, ItemStack par2ItemStack) @@ -258,11 +263,17 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv { if (object instanceof ShapedRecipes) { - if (this.hasResource(((ShapedRecipes) object).recipeItems) != null) { return new Pair(((IRecipe) object).getRecipeOutput().copy(), ((ShapedRecipes) object).recipeItems); } + if (this.hasResource(((ShapedRecipes) object).recipeItems) != null) + { + return new Pair(((IRecipe) object).getRecipeOutput().copy(), ((ShapedRecipes) object).recipeItems); + } } else if (object instanceof ShapelessRecipes) { - if (this.hasResource(((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])) != null) { return new Pair(((IRecipe) object).getRecipeOutput().copy(), (ItemStack[]) ((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])); } + if (this.hasResource(((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])) != null) + { + return new Pair(((IRecipe) object).getRecipeOutput().copy(), (ItemStack[]) ((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])); + } } else if (object instanceof ShapedOreRecipe) { @@ -271,7 +282,11 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv ArrayList hasResources = this.hasResource(oreRecipeInput); - if (hasResources != null) { return new Pair(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); } + if (hasResources != null) + { + + return new Pair(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); + } } else if (object instanceof ShapelessOreRecipe) { @@ -280,7 +295,10 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv List hasResources = this.hasResource(oreRecipeInput.toArray()); - if (hasResources != null) { return new Pair(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); } + if (hasResources != null) + { + return new Pair(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); + } } } } @@ -297,6 +315,10 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv */ public ArrayList hasResource(Object[] recipeItems) { + TileEntityImprinter test = new TileEntityImprinter(); + NBTTagCompound cloneData = new NBTTagCompound(); + this.writeToNBT(cloneData); + test.readFromNBT(cloneData); /** * The actual amount of resource required. Each ItemStack will only have stacksize of 1. */ @@ -312,15 +334,16 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv if (recipeItem != null) { - for (int i = START_INVENTORY; i < this.getSizeInventory(); i++) + for (int i = START_INVENTORY; i < test.getSizeInventory(); i++) { - ItemStack checkStack = this.getStackInSlot(i); + ItemStack checkStack = test.getStackInSlot(i); if (checkStack != null) { - if (recipeItem.isItemEqual(checkStack)) + if (recipeItem.isItemEqual(checkStack) || (recipeItem.itemID == checkStack.itemID && recipeItem.getItemDamage() < 0)) { - // TODO Do NBT CHecking + // TODO Do NBT Checking + test.decrStackSize(i, 1); itemMatch++; break; } @@ -343,15 +366,16 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv if (recipeItem != null) { - for (int i = START_INVENTORY; i < this.getSizeInventory(); i++) + for (int i = START_INVENTORY; i < test.getSizeInventory(); i++) { - ItemStack checkStack = this.getStackInSlot(i); + ItemStack checkStack = test.getStackInSlot(i); if (checkStack != null) { - if (recipeItem.isItemEqual(checkStack)) + if (recipeItem.isItemEqual(checkStack) || (recipeItem.itemID == checkStack.itemID && recipeItem.getItemDamage() < 0)) { // TODO Do NBT CHecking + test.decrStackSize(i, 1); itemMatch++; break optionsLoop; } @@ -414,4 +438,103 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv nbt.setTag("Items", var2); } + @Override + public boolean onUse(TileEntityArmbot tileEntity, Entity heldEntity) + { + if (heldEntity != null) + { + if (heldEntity instanceof EntityItem) + { + ItemStack stack = ((EntityItem) heldEntity).func_92014_d(); + if (this.getStackInSlot(3) == null && stack != null && stack.itemID == AssemblyLine.itemImprint.itemID) // no crafting imprint and stack not null and stack is imprint + { + this.setInventorySlotContents(3, stack); + this.onInventoryChanged(); + tileEntity.grabbedEntities.remove(0); + return true; + } + else if (this.getStackInSlot(3) != null && stack != null) + { + ItemStack result = this.getStackInSlot(4); // crafting result + if (result != null) + { + result = this.getStackInSlot(4); + if (stack.isItemEqual(result)) + { + if (result != null) + { + ItemStack[] requiredItems = this.getIdealRecipe(result).getValue().clone(); + + if (requiredItems != null) + { + for (ItemStack searchStack : requiredItems) + { + for (int i = 0; i < this.getSizeInventory(); i++) + { + ItemStack checkStack = this.getStackInSlot(i); + + if (checkStack != null) + { + if (searchStack.isItemEqual(checkStack)) + { + this.decrStackSize(i, 1); + break; + } + } + } + } + } + } + if (stack.isStackable()) + { + stack.stackSize += result.stackSize; + this.onInventoryChanged(); + tileEntity.grabbedEntities.remove(0); + tileEntity.grabbedEntities.add(new EntityItem(this.worldObj, this.xCoord, this.yCoord, this.zCoord, stack)); + return true; + } + } + } + } + } + } + else + { + ItemStack result = this.getStackInSlot(4); // crafting result + if (result != null) + { + result = this.getStackInSlot(4); + if (result != null) + { + ItemStack[] requiredItems = this.getIdealRecipe(result).getValue().clone(); + + if (requiredItems != null) + { + for (ItemStack searchStack : requiredItems) + { + for (int i = 0; i < this.getSizeInventory(); i++) + { + ItemStack checkStack = this.getStackInSlot(i); + + if (checkStack != null) + { + if (searchStack.isItemEqual(checkStack) || (searchStack.itemID == checkStack.itemID && searchStack.getItemDamage() < 0)) + { + this.decrStackSize(i, 1); + break; + } + } + } + } + } + } + this.onInventoryChanged(); + tileEntity.grabbedEntities.add(new EntityItem(this.worldObj, this.xCoord, this.yCoord, this.zCoord, result)); + return true; + } + } + + return false; + } + }