From 29683fb76320a78a79b23583f0ae9e89854d4baf Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Wed, 7 Jan 2015 21:39:51 -0500 Subject: [PATCH 1/4] Add shift clicking to chisel GUI --- .../chisel/inventory/ContainerChisel.java | 47 ++++++++++++++++++- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/cricketcraft/chisel/inventory/ContainerChisel.java b/src/main/java/com/cricketcraft/chisel/inventory/ContainerChisel.java index 9dc41c2b..aeca0159 100644 --- a/src/main/java/com/cricketcraft/chisel/inventory/ContainerChisel.java +++ b/src/main/java/com/cricketcraft/chisel/inventory/ContainerChisel.java @@ -88,8 +88,51 @@ public class ContainerChisel extends Container { } @Override - public ItemStack transferStackInSlot(EntityPlayer entity, int i) { - return null; + public ItemStack transferStackInSlot(EntityPlayer entity, int slotIdx) { + ItemStack itemstack = null; + Slot slot = (Slot) this.inventorySlots.get(slotIdx); + + if (slot != null && slot.getHasStack()) { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + + if (slotIdx > 24) { + if (!this.mergeItemStack(itemstack1, 24, 25, false)) { + return null; + } + } else { + if (slotIdx < 24 && itemstack1 != null) { + entity.inventory.setItemStack(itemstack1.copy()); + slot.onPickupFromSlot(entity, itemstack1); + itemstack1 = entity.inventory.getItemStack(); + entity.inventory.setItemStack(null); + } + + if (!this.mergeItemStack(itemstack1, 52, 61, false)) { + if (!this.mergeItemStack(itemstack1, 25, 52, false)) { + return null; + } + } + } + slot.onSlotChange(itemstack1, itemstack); + + if (itemstack1.stackSize == 0) { + slot.putStack((ItemStack) null); + } else { + slot.onSlotChanged(); + } + if (itemstack1.stackSize == itemstack.stackSize) { + return null; + } + if (slotIdx >= 24) { + slot.onPickupFromSlot(entity, itemstack1); + } + if (itemstack1.stackSize == 0) { + slot.putStack(null); + return null; + } + } + return itemstack; } public void onChiselSlotChanged() { From ca46d3c653d6107afda1c6bdbc2c0e79af7be06d Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Wed, 7 Jan 2015 21:47:45 -0500 Subject: [PATCH 2/4] Actually fix #9. Some other cleanup in CTM. --- .../com/cricketcraft/chisel/api/IFacade.java | 39 ++++++++++++++++--- .../chisel/carving/CarvableHelper.java | 16 +++----- .../chisel/client/render/CTM.java | 33 ++++------------ .../client/render/RenderBlocksColumn.java | 2 +- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/cricketcraft/chisel/api/IFacade.java b/src/main/java/com/cricketcraft/chisel/api/IFacade.java index ed8b5189..1e4f16d6 100644 --- a/src/main/java/com/cricketcraft/chisel/api/IFacade.java +++ b/src/main/java/com/cricketcraft/chisel/api/IFacade.java @@ -3,10 +3,37 @@ package com.cricketcraft.chisel.api; import net.minecraft.block.Block; import net.minecraft.world.IBlockAccess; -public interface IFacade { +/** + * To be implemented on blocks that "hide" another block inside, so connected textuers can still be + * accomplished. + */ +public interface IFacade +{ + /** + * Gets the block this facade is acting as. + * + * @param world {@link World} + * @param x X coord of your block + * @param y Y coord of your block + * @param z Z coord of your block + * @param side The side being rendered, NOT the side being connected from. + *

+ * This value can be -1 if no side is specified. Please handle this appropriately. + * @return The block inside of your facade block. + */ + Block getFacade(IBlockAccess world, int x, int y, int z, int side); - int getFacadeMetadata(IBlockAccess world, int x, int y, int z, int side); - - Block getFacade(IBlockAccess world, int x, int y, int z, int side); - -} + /** + * Gets the metadata of the block that this facade is acting as. + * + * @param world {@link World} + * @param x X coord of your block + * @param y Y coord of your block + * @param z Z coord of your block + * @param side The side being rendered, NOT the side being connected from. + *

+ * This value can be -1 if no side is specified. Please handle this appropriately. + * @return The metadata of your facade block. + */ + int getFacadeMetadata(IBlockAccess world, int x, int y, int z, int side); +} \ No newline at end of file diff --git a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java index 787365e4..ffa38c97 100644 --- a/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java +++ b/src/main/java/com/cricketcraft/chisel/carving/CarvableHelper.java @@ -208,8 +208,8 @@ public class CarvableHelper { return variation.iconTop; Block block = world.getBlock(x, y, z); - boolean topConnected = block.equals(CTM.getBlockOrFacade(world, x, y + 1, z, side)) && metadata == CTM.getBlockOrFacadeMetadata(world, x, y + 1, z, side); - boolean botConnected = block.equals(CTM.getBlockOrFacade(world, x, y - 1, z, side)) && metadata == CTM.getBlockOrFacadeMetadata(world, x, y - 1, z, side); + boolean topConnected = CTM.isConnected(world, x, y + 1, z, side, block, metadata); + boolean botConnected = CTM.isConnected(world, x, y - 1, z, side, block, metadata); if (topConnected && botConnected) return variation.seamsCtmVert.icons[2]; @@ -230,11 +230,11 @@ public class CarvableHelper { boolean reverse = side == 2 || side == 4; if (side < 4) { - p = isSame(world, x - 1, y, z, block, metadata, side); - n = isSame(world, x + 1, y, z, block, metadata, side); + p = CTM.isConnected(world, x - 1, y, z, side, block, metadata); + n = CTM.isConnected(world, x + 1, y, z, side, block, metadata); } else { - p = isSame(world, x, y, z + 1, block, metadata, side); - n = isSame(world, x, y, z - 1, block, metadata, side); + p = CTM.isConnected(world, x, y, z - 1, side, block, metadata); + n = CTM.isConnected(world, x, y, z + 1, side, block, metadata); } if (p && n) @@ -381,10 +381,6 @@ public class CarvableHelper { } } - private boolean isSame(IBlockAccess world, int x, int y, int z, Block block, int meta, int side) { - return CTM.getBlockOrFacade(world, x, y, z, side).equals(block) && CTM.getBlockOrFacadeMetadata(world, x, y, z, side) == meta; - } - public void setChiselBlockName(String name) { blockName = name; } diff --git a/src/main/java/com/cricketcraft/chisel/client/render/CTM.java b/src/main/java/com/cricketcraft/chisel/client/render/CTM.java index 293e5d94..b066cc83 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/CTM.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/CTM.java @@ -2,6 +2,7 @@ package com.cricketcraft.chisel.client.render; import net.minecraft.block.Block; import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; import com.cricketcraft.chisel.api.IFacade; @@ -187,34 +188,16 @@ public class CTM { return texture; } - protected static boolean isConnected(IBlockAccess world, int x, int y, int z, int side, Block block, int meta) { - int x2 = x, y2 = y, z2 = z; + public static boolean isConnected(IBlockAccess world, int x, int y, int z, int side, Block block, int meta) { - switch (side) { - case 0: - y2--; - break; - case 1: - y2++; - break; - case 2: - z2--; - break; - case 3: - z2++; - break; - case 4: - x2--; - break; - case 5: - x2++; - break; - } - if (getBlockOrFacade(world, x2, y2, z2, side) == null || getBlockOrFacade(world, x, y, z, side) == null || block == null) - return false; + ForgeDirection dir = ForgeDirection.VALID_DIRECTIONS[side]; + + int x2 = x + dir.offsetX; + int y2 = y + dir.offsetY; + int z2 = z + dir.offsetZ; return getBlockOrFacade(world, x, y, z, side).equals(block) && getBlockOrFacadeMetadata(world, x, y, z, side) == meta - && (!getBlockOrFacade(world, x2, y2, z2, side).equals(block) || getBlockOrFacadeMetadata(world, x2, y2, z2, side) != meta); + && !(getBlockOrFacade(world, x2, y2, z2, side).equals(block) && getBlockOrFacadeMetadata(world, x2, y2, z2, side) == meta); } public static int getBlockOrFacadeMetadata(IBlockAccess world, int x, int y, int z, int side) { diff --git a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksColumn.java b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksColumn.java index 0c13c97d..e901e88a 100644 --- a/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksColumn.java +++ b/src/main/java/com/cricketcraft/chisel/client/render/RenderBlocksColumn.java @@ -16,7 +16,7 @@ public class RenderBlocksColumn extends RenderBlocks { } boolean connected(IBlockAccess world, int x, int y, int z, Block block, int meta) { - return world.getBlock(x, y, z).equals(block) && world.getBlockMetadata(x, y, z) == meta; + return CTM.getBlockOrFacade(world, x, y, z, -1).equals(block) && CTM.getBlockOrFacadeMetadata(world, x, y, z, -1) == meta; } @Override From 7d801f69b55642d9cbf12dcf352c3e22d8a8f70d Mon Sep 17 00:00:00 2001 From: tterrag1098 Date: Wed, 7 Jan 2015 22:45:20 -0500 Subject: [PATCH 3/4] Fix auto chisel functionality. Massively clean up and comment TE code. --- .../tileentity/TileEntityAutoChisel.java | 151 ++++++++++-------- .../chisel/inventory/ContainerAutoChisel.java | 4 +- .../cricketcraft/chisel/item/ItemUpgrade.java | 25 ++- .../assets/chisel/textures/autochisel-gui.png | Bin 9997 -> 1050910 bytes ...gradeItem_1.png => upgrade_automation.png} | Bin .../{upgradeItem_0.png => upgrade_speed.png} | Bin .../{upgradeItem_2.png => upgrade_stack.png} | Bin 7 files changed, 92 insertions(+), 88 deletions(-) rename src/main/resources/assets/chisel/textures/items/{upgradeItem_1.png => upgrade_automation.png} (100%) rename src/main/resources/assets/chisel/textures/items/{upgradeItem_0.png => upgrade_speed.png} (100%) rename src/main/resources/assets/chisel/textures/items/{upgradeItem_2.png => upgrade_stack.png} (100%) 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 d180d9f0..ebed6e68 100644 --- a/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java @@ -1,9 +1,10 @@ package com.cricketcraft.chisel.block.tileentity; +import java.util.ArrayList; + import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -12,6 +13,7 @@ import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; +import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.init.ModItems; import cpw.mods.fml.relauncher.Side; @@ -19,8 +21,11 @@ import cpw.mods.fml.relauncher.SideOnly; public class TileEntityAutoChisel extends TileEntity implements ISidedInventory { - private final int BASE = 0, TARGET = 1, OUTPUT = 2, AUTOMATION = 3, STACK = 4, SPEED = 5; - private boolean isAutomated, isStackMode, isFaster; + public enum Upgrade { + SPEED, AUTOMATION, STACK + } + + private final int BASE = 0, TARGET = 1, OUTPUT = 2, MIN_UPGRADE = 3; private static EntityItem ghostItem; boolean equal = false; private ItemStack[] inventory = new ItemStack[6]; @@ -72,81 +77,79 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory @Override public void updateEntity() { - if (inventory[SPEED] == new ItemStack(ModItems.upgrade, 1, 0)) { - isFaster = true; - } else { - isFaster = false; - } + int checkPeriod = hasUpgrade(Upgrade.SPEED) ? 10 : 40; - if (inventory[AUTOMATION] == new ItemStack(ModItems.upgrade, 1, 1)) { - isAutomated = true; - } else { - isAutomated = false; - } + ItemStack base = inventory[BASE], target = inventory[TARGET], output = inventory[OUTPUT]; - if (inventory[STACK] == new ItemStack(ModItems.upgrade, 1, 2)) { - isStackMode = true; - } else { - isStackMode = false; - } + if (!worldObj.isRemote && worldObj.getWorldTime() % checkPeriod == 0) { + if (base != null && target != null) { + if (canBeMadeFrom(base, target)) { + // the max possible for this craft + int canBeMade = target.getMaxStackSize(); - if (isFaster) { - if (!worldObj.isRemote && worldObj.getWorldTime() % 10 == 0) { - if (inventory[BASE] != null && inventory[TARGET] != null) { - if (inventory[BASE].getItem() instanceof ItemBlock && inventory[TARGET].getItem() instanceof ItemBlock) { - if (inventory[BASE].getUnlocalizedName().equalsIgnoreCase(inventory[TARGET].getUnlocalizedName())) { - if (isStackMode) { - if (inventory[BASE].stackSize == inventory[BASE].getMaxStackSize()) { - if (inventory[OUTPUT] == null) { - inventory[OUTPUT] = new ItemStack(inventory[TARGET].getItem(), 64, inventory[TARGET].getItemDamage()); - inventory[BASE] = null; - } - } - } else { - if (inventory[OUTPUT] == null) { - inventory[OUTPUT] = new ItemStack(inventory[TARGET].getItem(), 1, inventory[TARGET].getItemDamage()); - inventory[BASE].stackSize--; - } else if (inventory[BASE].stackSize != 0) { - inventory[OUTPUT].stackSize++; - inventory[BASE].stackSize--; - } else { - inventory[BASE] = null; - } - } - } + // if there are items in the output, they count towards the max we can make + if (output != null) { + canBeMade -= output.stackSize; } - } - } - } else { - if (!worldObj.isRemote && worldObj.getWorldTime() % 40 == 0) { - if (inventory[BASE] != null && inventory[TARGET] != null) { - if (inventory[BASE].getItem() instanceof ItemBlock && inventory[TARGET].getItem() instanceof ItemBlock) { - if (inventory[BASE].getUnlocalizedName().equalsIgnoreCase(inventory[TARGET].getUnlocalizedName())) { - if (isStackMode) { - if (inventory[BASE].stackSize == inventory[BASE].getMaxStackSize()) { - if (inventory[OUTPUT] == null) { - inventory[OUTPUT] = new ItemStack(inventory[TARGET].getItem(), 64, inventory[TARGET].getItemDamage()); - inventory[BASE] = null; - } - } - } else { - if (inventory[OUTPUT] == null) { - inventory[OUTPUT] = new ItemStack(inventory[TARGET].getItem(), 1, inventory[TARGET].getItemDamage()); - inventory[BASE].stackSize--; - } else if (inventory[BASE].stackSize != 0) { - inventory[OUTPUT].stackSize++; - inventory[BASE].stackSize--; - } else { - inventory[BASE] = null; - } - } + + // 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; + } + + // result will always be a copy of the target, of course + 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; + + // if we can place the result in the output + if (canMerge(chiseled)) { + // if our output is empty, just use the current result + if (output == null) { + inventory[OUTPUT] = chiseled; + } else { + // otherwise just add our result to the existing stack + inventory[OUTPUT].stackSize += chiseled.stackSize; } + // remove what we made from the stack + base.stackSize -= chiseled.stackSize; + if (base.stackSize <= 0) { + inventory[BASE] = null; // clear out 0 size itemstacks + } + // we changed something, so we need to tell the chunk to save + markDirty(); } } } } + } - markDirty(); + // 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) { + ArrayList results = Carving.chisel.getItems(from); + for (ItemStack s : results) { + if (s.getItem() == to.getItem() && s.getItemDamage() == to.getItemDamage()) { + return true; + } + } + return false; + } + + private boolean canMerge(ItemStack toMerge) { + // if the output slot is empty we can merge without checking + 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(); + } + + return false; } @Override @@ -232,7 +235,7 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory @Override public boolean canInsertItem(int slot, ItemStack itemStack, int side) { - if (isAutomated) { + if (hasUpgrade(Upgrade.AUTOMATION)) { if (side != 0 || side != 1 && slot == BASE) { return true; } @@ -242,7 +245,7 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory @Override public boolean canExtractItem(int slot, ItemStack itemStack, int side) { - if (isAutomated) { + if (hasUpgrade(Upgrade.AUTOMATION)) { if (side == 0 || side == 1 && slot == OUTPUT) { return true; } @@ -286,4 +289,12 @@ public class TileEntityAutoChisel extends TileEntity implements ISidedInventory public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet) { readFromNBT(packet.func_148857_g()); } + + public boolean hasUpgrade(Upgrade upgrade) { + ItemStack stack = inventory[MIN_UPGRADE + upgrade.ordinal()]; + if (stack != null) { + return stack.getItem() == ModItems.upgrade && stack.getItemDamage() == upgrade.ordinal(); + } + return false; + } } diff --git a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java index fb23f808..0afdae85 100644 --- a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java @@ -21,9 +21,9 @@ public class ContainerAutoChisel extends Container { addSlotToContainer(new Slot(tileEntityAutoChisel, 0, 53, 15)); addSlotToContainer(new Slot(tileEntityAutoChisel, 1, 78, 51)); addSlotToContainer(new Slot(tileEntityAutoChisel, 2, 103, 15)); - addSlotToContainer(new Slot(tileEntityAutoChisel, 3, 151, 51)); + addSlotToContainer(new Slot(tileEntityAutoChisel, 3, 151, 11)); addSlotToContainer(new Slot(tileEntityAutoChisel, 4, 151, 31)); - addSlotToContainer(new Slot(tileEntityAutoChisel, 5, 151, 11)); + addSlotToContainer(new Slot(tileEntityAutoChisel, 5, 151, 51)); bindPlayerInventory(player); } diff --git a/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java b/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java index a018d504..a6932e0b 100644 --- a/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java +++ b/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java @@ -13,6 +13,7 @@ import net.minecraft.world.World; import com.cricketcraft.chisel.Chisel; import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel; +import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel.Upgrade; public class ItemUpgrade extends BaseItem { @@ -22,6 +23,7 @@ public class ItemUpgrade extends BaseItem { super(); this.setUnlocalizedName(unlocalizedName); this.setCreativeTab(CreativeTabs.tabMaterials); + setHasSubtypes(true); } @Override @@ -36,16 +38,15 @@ public class ItemUpgrade extends BaseItem { @Override public IIcon getIconFromDamage(int meta) { - if (meta > 3) - meta = 0; - - return this.icons[meta]; + // using modulo throughout to prevent AIOB + return this.icons[meta % Upgrade.values().length]; } @Override public void registerIcons(IIconRegister reg) { - for (int i = 0; i < 3; i++) { - this.icons[i] = reg.registerIcon(Chisel.MOD_ID + ":upgradeItem_" + i); + Upgrade[] upgrades = Upgrade.values(); + for (int i = 0; i < upgrades.length; i++) { + this.icons[i] = reg.registerIcon(Chisel.MOD_ID + ":upgrade_" + upgrades[i].name().toLowerCase()); } } @@ -59,15 +60,7 @@ public class ItemUpgrade extends BaseItem { @Override public String getUnlocalizedName(ItemStack stack) { - switch (stack.getItemDamage()) { - case 0: - return this.getUnlocalizedName() + "_speed"; - case 1: - return this.getUnlocalizedName() + "_automation"; - case 2: - return this.getUnlocalizedName() + "_stack"; - default: - return this.getUnlocalizedName(); - } + Upgrade[] upgrades = Upgrade.values(); + return getUnlocalizedName() + "_" + upgrades[stack.getItemDamage() % upgrades.length].name().toLowerCase(); } } diff --git a/src/main/resources/assets/chisel/textures/autochisel-gui.png b/src/main/resources/assets/chisel/textures/autochisel-gui.png index 563c58388ae39adaaab91f4f947d8c3f1aa0fbf3..a17ef8bc1d4980eaece45165cad09b29be649dc2 100644 GIT binary patch literal 1050910 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 literal 9997 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 D# Date: Wed, 7 Jan 2015 23:36:27 -0500 Subject: [PATCH 4/4] Fix AutoChisel shift clicking and add tooltips --- .../tileentity/TileEntityAutoChisel.java | 11 +++- .../chisel/client/gui/GuiAutoChisel.java | 29 ++++++++++ .../chisel/inventory/ContainerAutoChisel.java | 57 +++++++++++++------ .../cricketcraft/chisel/item/ItemUpgrade.java | 2 +- .../resources/assets/chisel/lang/en_US.lang | 1 + 5 files changed, 80 insertions(+), 20 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 ebed6e68..40016b8f 100644 --- a/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/block/tileentity/TileEntityAutoChisel.java @@ -12,6 +12,7 @@ import net.minecraft.network.NetworkManager; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.StatCollector; import com.cricketcraft.chisel.carving.Carving; import com.cricketcraft.chisel.init.ModItems; @@ -22,7 +23,15 @@ import cpw.mods.fml.relauncher.SideOnly; public class TileEntityAutoChisel extends TileEntity implements ISidedInventory { public enum Upgrade { - SPEED, AUTOMATION, STACK + SPEED, AUTOMATION, STACK; + + public String getUnlocalizedName() { + return ModItems.upgrade.getUnlocalizedName() + "_" + this.name().toLowerCase(); + } + + public String getLocalizedName() { + return StatCollector.translateToLocal(getUnlocalizedName() + ".name"); + } } private final int BASE = 0, TARGET = 1, OUTPUT = 2, MIN_UPGRADE = 3; diff --git a/src/main/java/com/cricketcraft/chisel/client/gui/GuiAutoChisel.java b/src/main/java/com/cricketcraft/chisel/client/gui/GuiAutoChisel.java index 8097892d..9ecdcdb4 100644 --- a/src/main/java/com/cricketcraft/chisel/client/gui/GuiAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/client/gui/GuiAutoChisel.java @@ -1,13 +1,19 @@ package com.cricketcraft.chisel.client.gui; +import java.util.List; + import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Slot; import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel; import com.cricketcraft.chisel.inventory.ContainerAutoChisel; +import com.cricketcraft.chisel.inventory.ContainerAutoChisel.SlotUpgrade; +import com.google.common.collect.Lists; public class GuiAutoChisel extends GuiContainer { @@ -17,6 +23,29 @@ public class GuiAutoChisel extends GuiContainer { super(new ContainerAutoChisel(inventoryPlayer, tileEntityAutoChisel)); } + @SuppressWarnings("unchecked") + @Override + protected void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { + super.drawGuiContainerForegroundLayer(mouseX, mouseY); + + int x = (this.width - this.xSize) / 2; + int y = (this.height - this.ySize) / 2; + + for (Slot slot : (List) inventorySlots.inventorySlots) { + if (mouseInside(slot, mouseX - x, mouseY - y)) { + if (slot instanceof SlotUpgrade) { + this.func_146283_a(Lists.newArrayList(((SlotUpgrade) slot).upgradeType.getLocalizedName()), mouseX - x, mouseY - y); + } else if (slot.slotNumber == 1) { + this.func_146283_a(Lists.newArrayList(StatCollector.translateToLocal("autochisel.slot.target.tooltip")), mouseX - x, mouseY - y); + } + } + } + } + + private boolean mouseInside(Slot slot, int x, int y) { + return x >= slot.xDisplayPosition && x <= slot.xDisplayPosition + 16 && y >= slot.yDisplayPosition && y <= slot.yDisplayPosition + 16; + } + @Override protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); diff --git a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java index 0afdae85..98470c4a 100644 --- a/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java +++ b/src/main/java/com/cricketcraft/chisel/inventory/ContainerAutoChisel.java @@ -7,9 +7,26 @@ import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel; +import com.cricketcraft.chisel.block.tileentity.TileEntityAutoChisel.Upgrade; +import com.cricketcraft.chisel.init.ModItems; public class ContainerAutoChisel extends Container { + public static class SlotUpgrade extends Slot { + + public Upgrade upgradeType; + + public SlotUpgrade(TileEntityAutoChisel inv, int id, int x, int y, Upgrade upgrade) { + super(inv, id, x, y); + this.upgradeType = upgrade; + } + + @Override + public boolean isItemValid(ItemStack stack) { + return stack.getItem() == ModItems.upgrade && stack.getItemDamage() == upgradeType.ordinal(); + } + } + public static TileEntityAutoChisel autoChisel; public static EntityPlayer player; @@ -21,9 +38,9 @@ public class ContainerAutoChisel extends Container { addSlotToContainer(new Slot(tileEntityAutoChisel, 0, 53, 15)); addSlotToContainer(new Slot(tileEntityAutoChisel, 1, 78, 51)); addSlotToContainer(new Slot(tileEntityAutoChisel, 2, 103, 15)); - addSlotToContainer(new Slot(tileEntityAutoChisel, 3, 151, 11)); - addSlotToContainer(new Slot(tileEntityAutoChisel, 4, 151, 31)); - addSlotToContainer(new Slot(tileEntityAutoChisel, 5, 151, 51)); + addSlotToContainer(new SlotUpgrade(tileEntityAutoChisel, 3, 151, 11, Upgrade.SPEED)); + addSlotToContainer(new SlotUpgrade(tileEntityAutoChisel, 4, 151, 31, Upgrade.AUTOMATION)); + addSlotToContainer(new SlotUpgrade(tileEntityAutoChisel, 5, 151, 51, Upgrade.STACK)); bindPlayerInventory(player); } @@ -49,29 +66,33 @@ public class ContainerAutoChisel extends Container { public ItemStack transferStackInSlot(EntityPlayer player, int slotNumber) { ItemStack itemStack = null; Slot slot = (Slot) this.inventorySlots.get(slotNumber); + System.out.println(slotNumber); if (slot != null && slot.getHasStack()) { ItemStack itemStack1 = slot.getStack(); itemStack = itemStack1.copy(); - if (slotNumber == 2) { - if (!this.mergeItemStack(itemStack1, 3, 39, true)) { - return null; - } - - slot.onSlotChange(itemStack1, itemStack); - } else if (slotNumber != 1 && slotNumber != 0) { - if (!this.mergeItemStack(itemStack1, 0, 1, true)) { - return null; - } else if (slotNumber >= 3 && slotNumber < 30) { - if (this.mergeItemStack(itemStack1, 30, 39, false)) { + // if we are in the auto chisel + if (slotNumber <= 5) { + // merge hotbar + if (!this.mergeItemStack(itemStack1, 33, 42, false)) { + // merge rest of inventory + if (!this.mergeItemStack(itemStack1, 6, 33, false)) { + return null; + } + } + } else { + // if this is an upgrade, check the upgrade slots + if (itemStack1.getItem() == ModItems.upgrade) { + if (!this.mergeItemStack(itemStack1, 3, 6, false)) { + return null; + } + } else { + // otherwise just put it in one of the 3 other slots + if (!this.mergeItemStack(itemStack1, 1, 3, false)) { return null; } - } else if (slotNumber >= 30 && slotNumber < 39 && !this.mergeItemStack(itemStack1, 3, 30, false)) { - return null; } - } else if (this.mergeItemStack(itemStack1, 3, 39, false)) { - return null; } if (itemStack1.stackSize == 0) { diff --git a/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java b/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java index a6932e0b..ef4d1823 100644 --- a/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java +++ b/src/main/java/com/cricketcraft/chisel/item/ItemUpgrade.java @@ -61,6 +61,6 @@ public class ItemUpgrade extends BaseItem { @Override public String getUnlocalizedName(ItemStack stack) { Upgrade[] upgrades = Upgrade.values(); - return getUnlocalizedName() + "_" + upgrades[stack.getItemDamage() % upgrades.length].name().toLowerCase(); + return upgrades[stack.getItemDamage() % upgrades.length].getUnlocalizedName(); } } diff --git a/src/main/resources/assets/chisel/lang/en_US.lang b/src/main/resources/assets/chisel/lang/en_US.lang index b890915f..3080d76e 100644 --- a/src/main/resources/assets/chisel/lang/en_US.lang +++ b/src/main/resources/assets/chisel/lang/en_US.lang @@ -43,6 +43,7 @@ item.diamondChisel.desc=Left click and it changes blocks! #Auto Chisel tile.autoChisel.name=Auto Chisel +autochisel.slot.target.tooltip=Target Slot #Leaves tile.leaves.6.desc=Dead Leaves