From ed5162104eb05081e8353f115da34ae9c5afd1ea Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Tue, 2 Jun 2015 00:46:23 -0400 Subject: [PATCH] Fix reversion upgrade implementation --- .../tileentity/TileEntityAutoChisel.java | 128 +++++------------- .../chisel/inventory/ContainerAutoChisel.java | 14 +- .../assets/chisel/textures/autochisel-gui.png | Bin 10024 -> 1050910 bytes 3 files changed, 43 insertions(+), 99 deletions(-) diff --git a/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java index 18c147d3..359998be 100644 --- a/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java @@ -2,8 +2,6 @@ package com.cricketcraft.chisel.block.tileentity; import java.util.List; -import com.cricketcraft.chisel.api.carving.CarvingUtils; -import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; @@ -112,7 +110,7 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory @Override public void updateEntity() { - ItemStack base = inventory[BASE], target = inventory[TARGET], output = inventory[OUTPUT]; + ItemStack base = inventory[BASE], target = getTarget(), output = inventory[OUTPUT]; if (!worldObj.isRemote && hasChisel() && base != null && target != null) { if (canBeMadeFrom(base, target)) { @@ -137,8 +135,9 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory return; } - // result will always be a copy of the target, of course + // result will always be a copy of the target ItemStack chiseled = target.copy(); + // if we have the stack upgrade, boost the stack size to the max possible, otherwise just one chiseled.stackSize = hasUpgrade(Upgrade.STACK) ? canBeMade : 1; @@ -152,66 +151,7 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory slotChanged(OUTPUT); } - chiselItem(chiseled.stackSize); - - // remove what we made from the stack - base.stackSize -= chiseled.stackSize; - if (base.stackSize <= 0) { - setInventorySlotContents(BASE, null); // clear out 0 size itemstacks - } - } - } else if (worldObj.getTotalWorldTime() % 10 == 0) { - progress++; - } - } - } else if(!worldObj.isRemote && hasChisel() && base != null && hasUpgrade(Upgrade.REVERSION)){ - if(Carving.chisel.getItemsForChiseling(base) != null){ - if (progress >= (hasUpgrade(Upgrade.SPEED) ? FAST_SPEED : SLOW_SPEED)) { - - // reset progress - progress = 0; - - // the max possible for this craft - int canBeMade = base.getMaxStackSize(); - - // if there are items in the output, they count towards the max we can make - if (output != null) { - canBeMade -= output.stackSize; - } - - // can't make more than we have - canBeMade = Math.min(base.stackSize, canBeMade); - - // if we can't make any, forget it - if (canBeMade <= 0) { - return; - } - ItemStack chiseled; - if(Carving.chisel.getItemsForChiseling(inventory[TARGET]).get(0) != null){ - - // result will always be a copy of the target, of course - chiseled = inventory[TARGET].copy(); - // if we have the stack upgrade, boost the stack size to the max possible, otherwise just one - chiseled.stackSize = hasUpgrade(Upgrade.STACK) ? canBeMade : 1; - } else { - // result will always be a copy of the target, of course - chiseled = base.copy(); - // if we have the stack upgrade, boost the stack size to the max possible, otherwise just one - chiseled.stackSize = hasUpgrade(Upgrade.STACK) ? canBeMade : 1; - } - - - if (canChisel(chiseled)) { - // if our output is empty, just use the current result - if (output == null) { - setInventorySlotContents(OUTPUT, chiseled); - } else { - // otherwise just add our result to the existing stack - inventory[OUTPUT].stackSize += chiseled.stackSize; - slotChanged(OUTPUT); - } - - chiselItem(chiseled.stackSize); + chiselItem(chiseled.stackSize, target); // remove what we made from the stack base.stackSize -= chiseled.stackSize; @@ -227,7 +167,7 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory if (chiseling) { chiselRot += rotAmnt; if (chiselRot >= maxRot) { - chiselItem(0); + chiselItem(0, getTarget()); } } else { chiselRot = Math.max(chiselRot - rotAmnt, 0); @@ -235,6 +175,15 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory } } + private ItemStack getTarget() { + if (inventory[BASE] != null && hasUpgrade(Upgrade.REVERSION)) { + // if we have a reversion upgrade, use that for the target + return Carving.chisel.getItemsForChiseling(inventory[BASE]).get(0); + } else { + return inventory[TARGET]; + } + } + // lets make sure the user isn't trying to make something from a block that doesn't have this as a valid target private boolean canBeMadeFrom(ItemStack from, ItemStack to) { List results = Carving.chisel.getItemsForChiseling(from); @@ -251,17 +200,18 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory if (inventory[OUTPUT] == null) { return true; } + // need to check NBT as well as item - if (toMerge.isItemEqual(inventory[OUTPUT]) && ItemStack.areItemStackTagsEqual(toMerge, inventory[OUTPUT])) { - // we only care about metadata if the item has subtypes - return !toMerge.getHasSubtypes() || toMerge.getItemDamage() == inventory[OUTPUT].getItemDamage(); + if (!toMerge.isItemEqual(inventory[OUTPUT]) || !ItemStack.areItemStackTagsEqual(toMerge, inventory[OUTPUT])) { + return false; } - if(inventory[TARGET] == null){ - return ((IChiselItem)inventory[CHISEL].getItem()).canChisel(worldObj, inventory[CHISEL], General.getVariation(inventory[BASE])); - } else { - return ((IChiselItem)inventory[CHISEL].getItem()).canChisel(worldObj, inventory[CHISEL], General.getVariation(inventory[TARGET])); + // we only care about metadata if the item has subtypes + if (toMerge.getHasSubtypes() && toMerge.getItemDamage() != inventory[OUTPUT].getItemDamage()) { + return false; } + + return ((IChiselItem) inventory[CHISEL].getItem()).canChisel(worldObj, inventory[CHISEL], General.getVariation(getTarget())); } private boolean hasChisel() { @@ -269,30 +219,17 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory } /** Calls IChiselItem#onChisel() and sends the chisel packet for sound/animation */ - private void chiselItem(int chiseled) { + private void chiselItem(int chiseled, ItemStack target) { if (!worldObj.isRemote) { boolean breakChisel = false; - if(inventory[TARGET] == null){ - if (((IChiselItem) inventory[CHISEL].getItem()).onChisel(worldObj, inventory[CHISEL], CarvingUtils.getDefaultVariationFor(Block.getBlockFromItem(inventory[TARGET].getItem()), inventory[TARGET].getItemDamage(), General.getVariation(inventory[TARGET]).getOrder()))) { - inventory[CHISEL].setItemDamage(inventory[CHISEL].getItemDamage() + 1); - if (inventory[CHISEL].getItemDamage() >= inventory[CHISEL].getMaxDamage()) { - setInventorySlotContents(CHISEL, null); - breakChisel = true; - } + if (((IChiselItem) inventory[CHISEL].getItem()).onChisel(worldObj, inventory[CHISEL], General.getVariation(target))) { + inventory[CHISEL].setItemDamage(inventory[CHISEL].getItemDamage() + 1); + if (inventory[CHISEL].getItemDamage() >= inventory[CHISEL].getMaxDamage()) { + setInventorySlotContents(CHISEL, null); + breakChisel = true; } - PacketHandler.INSTANCE.sendToDimension(new MessageAutoChisel(this, chiseled, true, breakChisel), worldObj.provider.dimensionId); - } else { - if (((IChiselItem) inventory[CHISEL].getItem()).onChisel(worldObj, inventory[CHISEL], General.getVariation(inventory[TARGET]))) { - inventory[CHISEL].setItemDamage(inventory[CHISEL].getItemDamage() + 1); - if (inventory[CHISEL].getItemDamage() >= inventory[CHISEL].getMaxDamage()) { - setInventorySlotContents(CHISEL, null); - breakChisel = true; - } - } - PacketHandler.INSTANCE.sendToDimension(new MessageAutoChisel(this, chiseled, true, breakChisel), worldObj.provider.dimensionId); } - - + PacketHandler.INSTANCE.sendToDimension(new MessageAutoChisel(this, chiseled, true, breakChisel), worldObj.provider.dimensionId); } else { if (breakChisel) { worldObj.playSound(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "random.break", 0.8F, 0.8F + worldObj.rand.nextFloat() * 0.4F, false); @@ -445,6 +382,13 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory if (slot == BASE && lastBase != null) { ghostItem.setEntityItemStack(lastBase.copy()); return ghostItem; + } else if (slot == TARGET) { + ItemStack target = getTarget(); + if (target != null) { + ghostItem.setEntityItemStack(target); + return ghostItem; + } + return null; } else if (inventory[slot] == null) { return null; } else { diff --git a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java index 72e04d9f..6a6f409e 100644 --- a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java @@ -25,10 +25,10 @@ public class ContainerAutoChisel extends Container { addSlot(tileEntityAutoChisel, 1, 78, 52); addSlot(tileEntityAutoChisel, 2, 103, 15); addSlot(tileEntityAutoChisel, 3, 8, 62); - addSlot(tileEntityAutoChisel, 4, 151, 5); - addSlot(tileEntityAutoChisel, 5, 151, 25); - addSlot(tileEntityAutoChisel, 6, 151, 45); - addSlot(tileEntityAutoChisel, 7, 151, 65); + addSlot(tileEntityAutoChisel, 4, 152, 5); + addSlot(tileEntityAutoChisel, 5, 152, 25); + addSlot(tileEntityAutoChisel, 6, 152, 45); + addSlot(tileEntityAutoChisel, 7, 152, 65); bindPlayerInventory(player); } @@ -70,12 +70,12 @@ public class ContainerAutoChisel extends Container { itemStack = itemStack1.copy(); // if we are in the auto chisel - if (slotNumber <= 6) { - if (!this.mergeItemStack(itemStack1, 7, 42, false)) { + if (slotNumber <= 7) { + if (!this.mergeItemStack(itemStack1, 8, 42, false)) { return null; } // otherwise just put it in one of the machine slots - } else if (!this.mergeItemStack(itemStack1, 0, 7, false)) { + } else if (!this.mergeItemStack(itemStack1, 0, 8, false)) { return null; } diff --git a/src/main/resources/assets/chisel/textures/autochisel-gui.png b/src/main/resources/assets/chisel/textures/autochisel-gui.png index 12ff701c0e86bb47817c5031281f798899d965b4..fde7d47c0a248c19da84a79b96f2dd4fbabc453e 100644 GIT binary patch literal 1050910 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 literal 10024 zcmeHNYgAKb);>=_2cG#Gv%lx)B4D)34Bh^Todn~6eQVu=hEqF% zX?f-+k(uGdq)hVO^h79i@4l2w_msrUw>P+Zx^GPU?t?@KTK)IXk3af6D{fTWUU=v! zNxN6Fz3k(E{2@Bs>8MNl2a&I>ac)`h?V@0b*kt>52q*>{LJ{5|b*tlim=^~a_PIfqA|dw)~%?!Lxma1=wJ+aM}A%`(=aT*8R@%O{A@skK-}WErOQZy@Np)4b&8eK&650{Pi zeYu3y_Rc6w%ctmNm1IY}aZHIARFc3ko{jL1;oc_4?Z*icvV_XE!{ww>B)Vd?T9&qJ zRY&nT9CE2iRl(m;z6pQE!Ei)Y8&guU-y1vJU;VhhH-JQKA_?AP=@rZ zzhYtqw+3ft8WEEvB^1TghKd#>f~$X^6mgLWC7EjwD@|I7#AF=CGaNYAp#E$XN3EV* z3j&ng7-iQMnSuO*_*Mq#25m}#`|}zq83IguZV^_{Z$ue zB9sps`E0zQ4&P^zF%X$D40#e(VFMeLFuZ8_u^)YOt&cCb61gXnwnafBzhG;3Ih?m| z$Bx;_GWye#IYDGGNu=pU80Zv3)odCihEWyKl5?fc88~EoRlM6`5IVBed5M^dYwdYk zd=KiMp3{H>Bpag;U93r0f_ihOI%H!w!GeOkW)N1X0o&@09XQ-~$m)&Lwz*6Y)2Fqv zq61xQaC3DCBn?LMVO{-D4wF?Xe(&yV}uy38!wCM21%uXHe=kmESk6DV%}B{&IT$O_0cHUMt&W3BEm*7 zh~v8Ayq4ys`Bd`zSY<210V7<8uAFYEATUE!ofN7oRdZi_%%j=I^aW3?MfrD7j*3bo zgVYN12=NwY3N>VuZ{YKf({X4F#gbyPUMk!lFiI%bdYqiT^IN9YujBBKRgJ@?ed6@? zb!@(C_Cf9cz7@93gUFfa5!VTV{HguG3jto914X}ySYC-Cf9ityRS8UiE{!M6#wfvy zWFi3`HFih7)+#XJ@~I}+rl6D}uh#ig&kr}PaW%((QlDc~^M!&RaUOgH14gDa`Yhi# z^jV#tLWDPIgbJjQRRdg5=?;D2_r&pxgLYFn+Og@l&9{f@W?fRq2_o^}=WT05oS?W) zg5($M&hnO^GY(Uq>m@#0r?ETj^#qmxK;F~kxipazRJuera)}OhGLE _CWeC^JgB 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 IjsNEV0HBZ&5dZ)H