From cf605508ab3c086f310ef9f16b4da4719e7f5f45 Mon Sep 17 00:00:00 2001 From: Christian Weeks Date: Fri, 27 Jan 2012 19:07:39 -0500 Subject: [PATCH] Working GUIs and Containers --- .../cpw/mods/ironchest/client/GUIChest.java | 77 ++++++++++++++++++ .../net/minecraft/src/mod_IronChest.java | 7 ++ .../cpw/mods/ironchest/BlockIronChest.java | 23 ++++++ .../mods/ironchest/ContainerDiamondChest.java | 46 +++++++++++ .../mods/ironchest/ContainerGoldChest.java | 50 ++++++++++++ .../mods/ironchest/IronChestContainer.java | 64 +++++++++++++++ .../cpw/mods/ironchest/IronChestType.java | 27 +++++- .../ironchest/TileEntityDiamondChest.java | 7 ++ .../resources/ic2/sprites/diamondchest.png | Bin 0 -> 4094 bytes .../ic2/sprites/diamondcontainer.png | Bin 0 -> 3826 bytes .../resources/ic2/sprites/goldcontainer.png | Bin 0 -> 4242 bytes 11 files changed, 297 insertions(+), 4 deletions(-) create mode 100644 IronChests2/client/cpw/mods/ironchest/client/GUIChest.java create mode 100644 IronChests2/common/cpw/mods/ironchest/ContainerDiamondChest.java create mode 100644 IronChests2/common/cpw/mods/ironchest/ContainerGoldChest.java create mode 100644 IronChests2/common/cpw/mods/ironchest/IronChestContainer.java create mode 100644 IronChests2/common/cpw/mods/ironchest/TileEntityDiamondChest.java create mode 100644 IronChests2/resources/ic2/sprites/diamondchest.png create mode 100644 IronChests2/resources/ic2/sprites/diamondcontainer.png create mode 100644 IronChests2/resources/ic2/sprites/goldcontainer.png diff --git a/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java b/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java new file mode 100644 index 0000000..36a2d5b --- /dev/null +++ b/IronChests2/client/cpw/mods/ironchest/client/GUIChest.java @@ -0,0 +1,77 @@ +package cpw.mods.ironchest.client; + +import java.lang.reflect.InvocationTargetException; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.ironchest.ContainerDiamondChest; +import cpw.mods.ironchest.ContainerGoldChest; +import cpw.mods.ironchest.IronChestContainer; +import cpw.mods.ironchest.IronChestType; +import cpw.mods.ironchest.TileEntityIronChest; +import net.minecraft.src.Container; +import net.minecraft.src.EntityPlayer; +import net.minecraft.src.GuiContainer; +import net.minecraft.src.IInventory; +import net.minecraft.src.ModLoader; + +public class GUIChest extends GuiContainer { + public enum GUI { + GOLD(ContainerGoldChest.class,184,256,"/ic2/sprites/goldcontainer.png",IronChestType.GOLD), + DIAMOND(ContainerDiamondChest.class,238,256,"/ic2/sprites/diamondcontainer.png",IronChestType.DIAMOND); + + private Class clazz; + private int xSize; + private int ySize; + private String guiTexture; + private IronChestType mainType; + + private GUI(Class clazz, int xSize, int ySize, String guiTexture, IronChestType mainType) { + this.clazz=clazz; + this.xSize=xSize; + this.ySize=ySize; + this.guiTexture=guiTexture; + this.mainType=mainType; + } + + protected Container makeContainer(IInventory player, IInventory chest) { + try { + return clazz.getConstructor(IInventory.class,IInventory.class).newInstance(player,chest); + } catch (Exception e) { + // unpossible + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + public static void showGUI(TileEntityIronChest te, EntityPlayer player) { + for (GUI gui : values()) { + if (te.getType()==gui.mainType) { + ModLoader.OpenGUI(player, new GUIChest(gui,player.inventory,te)); + return; + } + } + player.displayGUIChest(te); + } + } + + private GUI type; + + private GUIChest(GUI type, IInventory player, IInventory chest) { + super(type.makeContainer(player,chest)); + this.type=type; + this.xSize=type.xSize; + this.ySize=type.ySize; + this.allowUserInput=false; + } + + @Override + protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { + int tex = mc.renderEngine.getTexture(type.guiTexture); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.renderEngine.bindTexture(tex); + int x = (width - xSize) / 2; + int y = (height - ySize) / 2; + drawTexturedModalRect(x, y, 0, 0, xSize, ySize); + } +} diff --git a/IronChests2/client/net/minecraft/src/mod_IronChest.java b/IronChests2/client/net/minecraft/src/mod_IronChest.java index 9c2fcfc..aba0b61 100644 --- a/IronChests2/client/net/minecraft/src/mod_IronChest.java +++ b/IronChests2/client/net/minecraft/src/mod_IronChest.java @@ -5,6 +5,8 @@ import java.io.File; import cpw.mods.ironchest.BlockIronChest; import cpw.mods.ironchest.IronChestType; import cpw.mods.ironchest.ItemIronChest; +import cpw.mods.ironchest.TileEntityIronChest; +import cpw.mods.ironchest.client.GUIChest; import cpw.mods.ironchest.client.IronChestRenderHelper; import cpw.mods.ironchest.client.TileEntityIronChestRenderer; import net.minecraft.client.Minecraft; @@ -34,6 +36,7 @@ public class mod_IronChest extends BaseModMp { compatibilityMode = Boolean.parseBoolean(cfg.getOrCreateBooleanProperty("compatibilityMode", Configuration.GENERAL_PROPERTY, defaultCompatibility).value); ironChestBlock = new BlockIronChest(Integer.parseInt(cfg.getOrCreateBlockIdProperty("blockVeryLargeChest", 181).value)); + IronChestType.initGUIs(cfg); } catch (Exception e) { ModLoader.getLogger().severe("IronChest was unable to load it's configuration successfully"); e.printStackTrace(System.err); @@ -51,4 +54,8 @@ public class mod_IronChest extends BaseModMp { MinecraftForgeClient.preloadTexture("ic2/sprites/ironchest_block_tex.png"); } + public static void openGUI(EntityPlayer player, TileEntityIronChest te) { + GUIChest.GUI.showGUI(te, player); + } + } diff --git a/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java b/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java index e516a68..f4de1c9 100644 --- a/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java +++ b/IronChests2/common/cpw/mods/ironchest/BlockIronChest.java @@ -2,11 +2,13 @@ package cpw.mods.ironchest; import net.minecraft.src.BlockContainer; import net.minecraft.src.EntityLiving; +import net.minecraft.src.EntityPlayer; import net.minecraft.src.IBlockAccess; import net.minecraft.src.Material; import net.minecraft.src.MathHelper; import net.minecraft.src.TileEntity; import net.minecraft.src.World; +import net.minecraft.src.mod_IronChest; import net.minecraft.src.forge.ITextureProvider; public class BlockIronChest extends BlockContainer implements ITextureProvider { @@ -73,6 +75,27 @@ public class BlockIronChest extends BlockContainer implements ITextureProvider { return typ.getTextureRow()*16; } } + @Override + public boolean blockActivated(World world, int i, int j, int k, EntityPlayer player) { + TileEntity te = world.getBlockTileEntity(i, j, k); + + if(te == null || !(te instanceof TileEntityIronChest)) + { + return true; + } + + if(world.isBlockSolidOnSide(i, j + 1, k, 0)) + { + return true; + } + + if (world.isRemote) { + return true; + } + + mod_IronChest.openGUI(player, (TileEntityIronChest)te); + return true; + } @Override public void onBlockAdded(World world, int i, int j, int k) { diff --git a/IronChests2/common/cpw/mods/ironchest/ContainerDiamondChest.java b/IronChests2/common/cpw/mods/ironchest/ContainerDiamondChest.java new file mode 100644 index 0000000..dd9d8dd --- /dev/null +++ b/IronChests2/common/cpw/mods/ironchest/ContainerDiamondChest.java @@ -0,0 +1,46 @@ +package cpw.mods.ironchest; + +import net.minecraft.src.IInventory; +import net.minecraft.src.Slot; + +public class ContainerDiamondChest extends IronChestContainer { + public ContainerDiamondChest(IInventory playerInventory, IInventory chestInventory) { + super(playerInventory, chestInventory); + } + + private static final int NUM_ROWS = 9; + private static final int ROW_LENGTH = 12; + + + @Override + protected void layoutContainer(IInventory playerInventory, IInventory chestInventory) { + for(int i = 0; i < NUM_ROWS; i++) + { + for(int l = 0; l < ROW_LENGTH; l++) + { + addSlot(new Slot(chestInventory, l + i * ROW_LENGTH, 12 + l * 18, 8 + i * 18)); + } + + } + + for(int j = 0; j < 3; j++) + { + for(int i1 = 0; i1 < 9; i1++) + { + addSlot(new Slot(playerInventory, i1 + j * 9 + 9, 39 + i1 * 18, 174 + j * 18)); + } + + } + + for(int k = 0; k < 9; k++) + { + addSlot(new Slot(playerInventory, k, 39 + k * 18, 232)); + } + } + + @Override + protected int getRowLength() { + return ROW_LENGTH; + } + +} diff --git a/IronChests2/common/cpw/mods/ironchest/ContainerGoldChest.java b/IronChests2/common/cpw/mods/ironchest/ContainerGoldChest.java new file mode 100644 index 0000000..301a547 --- /dev/null +++ b/IronChests2/common/cpw/mods/ironchest/ContainerGoldChest.java @@ -0,0 +1,50 @@ +// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov. +// Jad home page: http://www.kpdus.com/jad.html +// Decompiler options: packimports(3) braces deadcode + +package cpw.mods.ironchest; + +import net.minecraft.src.IInventory; +import net.minecraft.src.Slot; + +public class ContainerGoldChest extends IronChestContainer +{ + + private static final int NUM_ROWS = 9; + private static final int ROW_LENGTH = 9; + + public ContainerGoldChest(IInventory playerInventory, IInventory chestInventory) { + super(playerInventory,chestInventory); + } + + @Override + protected int getRowLength() { + return ROW_LENGTH; + } + + protected void layoutContainer(IInventory playerInventory, IInventory chestInventory) { + for(int i = 0; i < NUM_ROWS; i++) + { + for(int l = 0; l < NUM_ROWS; l++) + { + addSlot(new Slot(chestInventory, l + i * ROW_LENGTH, 12 + l * 18, 8 + i * 18)); + } + + } + + for(int j = 0; j < 3; j++) + { + for(int i1 = 0; i1 < 9; i1++) + { + addSlot(new Slot(playerInventory, i1 + j * 9 + 9, 12 + i1 * 18, 174 + j * 18)); + } + + } + + for(int k = 0; k < 9; k++) + { + addSlot(new Slot(playerInventory, k, 12 + k * 18, 232)); + } + } + +} diff --git a/IronChests2/common/cpw/mods/ironchest/IronChestContainer.java b/IronChests2/common/cpw/mods/ironchest/IronChestContainer.java new file mode 100644 index 0000000..7a5ab1a --- /dev/null +++ b/IronChests2/common/cpw/mods/ironchest/IronChestContainer.java @@ -0,0 +1,64 @@ +package cpw.mods.ironchest; + +import net.minecraft.src.Container; +import net.minecraft.src.EntityPlayer; +import net.minecraft.src.IInventory; +import net.minecraft.src.ItemStack; +import net.minecraft.src.Slot; + +public abstract class IronChestContainer extends Container { + public IronChestContainer(IInventory playerInventory, IInventory chestInventory) { + numRows = chestInventory.getSizeInventory() / getRowLength(); + chest = chestInventory; + chestInventory.openChest(); + layoutContainer(playerInventory, chestInventory); + + } + + protected abstract void layoutContainer(IInventory playerInventory, IInventory chestInventory); + protected abstract int getRowLength(); + + public boolean canInteractWith(EntityPlayer player) + { + return chest.isUseableByPlayer(player); + } + + public ItemStack transferStackInSlot(int i) + { + ItemStack itemstack = null; + Slot slot = (Slot)inventorySlots.get(i); + if(slot != null && slot.getHasStack()) + { + ItemStack itemstack1 = slot.getStack(); + itemstack = itemstack1.copy(); + if(i < numRows * getRowLength()) + { + if(!mergeItemStack(itemstack1, numRows * getRowLength(), inventorySlots.size(), true)) + { + return null; + } + } else + if(!mergeItemStack(itemstack1, 0, numRows * getRowLength(), false)) + { + return null; + } + if(itemstack1.stackSize == 0) + { + slot.putStack(null); + } else + { + slot.onSlotChanged(); + } + } + return itemstack; + } + + public void onCraftGuiClosed(EntityPlayer entityplayer) + { + super.onCraftGuiClosed(entityplayer); + chest.closeChest(); + } + + private IInventory chest; + private int numRows; +} diff --git a/IronChests2/common/cpw/mods/ironchest/IronChestType.java b/IronChests2/common/cpw/mods/ironchest/IronChestType.java index 40bc2a0..b13da64 100644 --- a/IronChests2/common/cpw/mods/ironchest/IronChestType.java +++ b/IronChests2/common/cpw/mods/ironchest/IronChestType.java @@ -7,22 +7,26 @@ import net.minecraft.src.ModLoader; import net.minecraft.src.TileEntity; import net.minecraft.src.TileEntitySpecialRenderer; import net.minecraft.src.mod_IronChest; +import net.minecraft.src.forge.Configuration; public enum IronChestType { - IRON(54, "Iron Chest", "ironchest.png", 0, Item.ingotIron, TileEntityIronChest.class, "mmmmPmmmm"), - GOLD(81, "Gold Chest", "goldchest.png", 1, Item.ingotGold, TileEntityGoldChest.class, "mmmmPmmmm"); - // DIAMOND(108,"DiamondChest","diamondchest.png",2); + IRON(54, "Iron Chest", null, "ironchest.png", 0, Item.ingotIron, TileEntityIronChest.class, "mmmmPmmmm"), + GOLD(81, "Gold Chest", "guiGoldChest", "goldchest.png", 1, Item.ingotGold, TileEntityGoldChest.class, "mmmmPmmmm"), + DIAMOND(108,"Diamond Chest","guiDiamondChest", "diamondchest.png", 2, Item.diamond, TileEntityDiamondChest.class, "mmmmPmmmm"); int size; String friendlyName; private String modelTexture; + private String guiName; private int textureRow; private Class clazz; private Item mat; private String[] recipes; + private int guiId; - IronChestType(int size, String friendlyName, String modelTexture, int textureRow, Item mat, Class clazz, String... recipes) { + IronChestType(int size, String friendlyName, String guiName, String modelTexture, int textureRow, Item mat, Class clazz, String... recipes) { this.size = size; this.friendlyName = friendlyName; + this.guiName=guiName; this.modelTexture = "/ic2/sprites/"+modelTexture; this.textureRow = textureRow; this.clazz = clazz; @@ -99,4 +103,19 @@ public enum IronChestType { private static void addRecipe(ItemStack is, Object... parts) { ModLoader.AddRecipe(is, parts); } + + public int getGUI() { + return guiId; + } + + public static void initGUIs(Configuration cfg) { + int defGUI=51; + for (IronChestType typ : values()) { + if (typ.guiName!=null) { + typ.guiId=Integer.parseInt(cfg.getOrCreateIntProperty(typ.guiName, Configuration.GENERAL_PROPERTY, defGUI++).value); + } else { + typ.guiId=-1; + } + } + } } \ No newline at end of file diff --git a/IronChests2/common/cpw/mods/ironchest/TileEntityDiamondChest.java b/IronChests2/common/cpw/mods/ironchest/TileEntityDiamondChest.java new file mode 100644 index 0000000..c75b686 --- /dev/null +++ b/IronChests2/common/cpw/mods/ironchest/TileEntityDiamondChest.java @@ -0,0 +1,7 @@ +package cpw.mods.ironchest; + +public class TileEntityDiamondChest extends TileEntityIronChest { + public TileEntityDiamondChest() { + super(IronChestType.DIAMOND); + } +} diff --git a/IronChests2/resources/ic2/sprites/diamondchest.png b/IronChests2/resources/ic2/sprites/diamondchest.png new file mode 100644 index 0000000000000000000000000000000000000000..64020b5770d6e290ef6339a7ec4a30e46f83a0fc GIT binary patch literal 4094 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