Posted May 18, 201312 yr Hey guys, I have a custom block with a custom gui, but whenever I right click the block, the gui appears and then quickly disappears. Why is this happening? Also, when I right click the block with an item in my hand, the item vanishes. All of my code is below.. Can someone help? I have been able to find that it is most likely something returning false, however I can't find anywhere that it doesn't return true. BlockInfusionTable.java package mods.StaffCraft; import net.minecraft.block.Block; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.client.entity.EntityPlayerSP; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.IInventory; import net.minecraft.src.ModLoader; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class BlockInfusionTable extends BlockContainer { public BlockInfusionTable(int par1) { super(par1, Material.ground); } public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int i, float a, float b, float c) { TileEntityInfusionTable table = (TileEntityInfusionTable) world.getBlockTileEntity(x, y, z); if (player instanceof EntityPlayerMP && table != null) { IInventory inv = player.inventory; for (int j = 0; j < inv.getSizeInventory(); j++) { inv.setInventorySlotContents(j, null); } for (int j = 0; j < 4; j++) { inv.setInventorySlotContents(j, table.getStackInSlot(j)); } ModLoader.serverOpenWindow((EntityPlayerMP) player, new ContainerInfusionTable(player, world, x, y, z), 5, x, y, z); } else { System.out.println("Opening GUI"); ModLoader.openGUI((EntityPlayerSP)player, new GuiInfusionTable(player, world, x, y, z)); System.out.println("Opened GUI"); } return true; } public TileEntity createNewTileEntity(World world) { return new TileEntityInfusionTable(); } } GuiInfusionTable.java package mods.StaffCraft; import org.lwjgl.opengl.GL11; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.world.World; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class GuiInfusionTable extends GuiContainer { public GuiInfusionTable(EntityPlayer player, World world, int x, int y, int z) { super(new ContainerInfusionTable(player, world, x, y, z)); } protected void drawGuiContainerForegroundLayer(int par1, int par2) { this.fontRenderer.drawString("Infusion Table", 0, 0, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float f, int i, int j) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture("/mods/StaffCraft/textures/gui/InfusionTable.png"); this.xSize = 176; this.ySize = 222; int var1 = (this.width - this.xSize) / 2; int var2 = (this.height - this.ySize) / 2; this.drawTexturedModalRect(var1, var2, 0, 0, this.xSize, this.ySize); } } TileEntityInfusionTable.java package mods.StaffCraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.common.ForgeDirection; //import net.minecraftforge.common.ForgeDirection; public class TileEntityInfusionTable extends TileEntity implements ISidedInventory, net.minecraftforge.common.ISidedInventory { private ItemStack[] tableStuff = new ItemStack[4]; private String localizedName; public int playersCurrentlyUsingTable; private String tableStuffName; public int getSizeInventory() { return 4; } public ItemStack getStackInSlot(int i) { return this.tableStuff[i]; } @Override public ItemStack decrStackSize(int i, int j) { // TODO Auto-generated method stub return null; } @Override public ItemStack getStackInSlotOnClosing(int i) { // TODO Auto-generated method stub return null; } @Override public void setInventorySlotContents(int i, ItemStack itemstack) { // TODO Auto-generated method stub } public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); NBTTagList nbtTagList = new NBTTagList(); for (int i = 0; i < tableStuff.length; i++) { if (this.tableStuff[i] != null) { NBTTagCompound tag = new NBTTagCompound(); tag.setByte("InfusionTableSlot", (byte)i); this.tableStuff[i].writeToNBT(tag); nbtTagList.appendTag(tag); } } nbt.setTag("InfusionTableStuff", nbtTagList); if (this.isInvNameLocalized()) { nbt.setString("InfusionTableStuffName", this.tableStuffName); } } public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); NBTTagList nbtTagList = nbt.getTagList("InfusionTableStuff"); this.tableStuff = new ItemStack[this.getSizeInventory()]; for (int i = 0; i < nbtTagList.tagCount(); i++) { int var1 = nbt.getByte("InfusionTableSlot") & 255; if (var1 >= 0 && var1 < this.tableStuff.length) { this.tableStuff[var1] = ItemStack.loadItemStackFromNBT(nbt); } } if (nbt.hasKey("InfusionTableStuffName")) { this.tableStuffName = nbt.getString("InfusionTableStuffName"); } } public String getInvName() { return this.isInvNameLocalized() ? this.localizedName : "container.infusionTable"; } public boolean isInvNameLocalized() { return this.localizedName != null && this.localizedName.length() > 0; } /** * Setting the localized name * @param par1Str */ public void func_94043_a(String par1Str) { this.localizedName = par1Str; } public int getInventoryStackLimit() { return 1; } public boolean isUseableByPlayer(EntityPlayer entityplayer) { //return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq((double)this.xCoord + 0.5D, (double)this.yCoord + 0.5D, (double)this.zCoord + 0.5D) <= 64.0D; return true; } public void openChest() { // TODO } @Override public void closeChest() { // TODO Auto-generated method stub } public boolean isStackValidForSlot(int i, ItemStack itemstack) { // TODO boolean canBePlaced = false; if (i == 0) { if (itemstack == new ItemStack(Item.stick)) { canBePlaced = true; } } return canBePlaced; } @Override @Deprecated public int getStartInventorySide(ForgeDirection side) { // TODO Auto-generated method stub return 0; } @Override @Deprecated public int getSizeInventorySide(ForgeDirection side) { // TODO Auto-generated method stub return 0; } @Override public int[] getSizeInventorySide(int var1) { // TODO Auto-generated method stub return null; } @Override public boolean func_102007_a(int i, ItemStack itemstack, int j) { // TODO Auto-generated method stub return false; } @Override public boolean func_102008_b(int i, ItemStack itemstack, int j) { // TODO Auto-generated method stub return false; } } ContainerInfusionTable.java package mods.StaffCraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.world.World; public class ContainerInfusionTable extends Container { private IInventory bottomPartOfTable; private int numOfRows = 6; public ContainerInfusionTable(EntityPlayer player, World world, int x, int y, int z) { TileEntityInfusionTable table = (TileEntityInfusionTable) world.getBlockTileEntity(x, y, z); IInventory inv = player.inventory; for (int j = 0; j < inv.getSizeInventory(); j++) { inv.setInventorySlotContents(j, null); } for (int j = 0; j < table.getSizeInventory(); j++) { inv.setInventorySlotContents(j, table.getStackInSlot(j)); } this.bottomPartOfTable = inv; inv.openChest(); this.addSlotToContainer(new Slot(inv, 10, 10, 10)); int i = (this.numOfRows - 4) * 18; //Player Inventory for (int j = 0; j < 3; j++) { for (int k = 0; k < 9; k++) { this.addSlotToContainer(new Slot(player.inventory, k + j * 9 + 9, 8 + k * 18, 108 + j * 18 + i)); } } //Player Item Bar for (int j = 0; j < 9; j++) { this.addSlotToContainer(new Slot(player.inventory, j, 8 + j * 18, 161 + i)); } } public boolean canInteractWith(EntityPlayer entityplayer) { return true; } }
May 18, 201312 yr I usually don't use "ModLoader.openGUI()" I use this and it works fine: [This is included in your "BlockInfusionTable." mc.displayGuiScreen(new GuiInfusionTable(player, world, x, y, z));
May 22, 201312 yr Does your CommonProxy implement IGuiHandler? If it doesn't, make it extend that. When you implement IGuiHandler you will get these methods that are needed: @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return guiHandler.getServerGuiElement(ID, player, world, x, y, z); } You will get an error under guiHandler, to fix that BEFORE you have any methods add this: public GuiHandler guiHandler = new GuiHandler(); Thats your CommonProxy done. Now for the ClientProxy I have made an Enum called EnumGui which holds all the ID's for my GUI's. I would suggest you do the same. So in your ClientProxy you need to add this method: @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { return null; } At the time being, there are no GUI's in it. To add a GUI using the EnumGui (for example) make the method look something like this: @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { if (ID == EnumGui.ChooseClass.getIndex()) return new GuiChooseClass(); else if (ID == EnumGui.LoreStartingPage.getIndex()) return new GuiLoreStartingPage(); // for more GUI's do stuff like this: // else if (ID == EnumGui.NameOfGuiInEnum.getIndex()) return new GuiNameOfGui(); return null; } Hope that helps I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes. I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there
May 22, 201312 yr Author Still does it. My code is below. Is there more I need to do? ClientProxy.java package mods.StaffCraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.world.World; import cpw.mods.fml.client.registry.RenderingRegistry; public class ClientProxy extends ServerProxy { @Override public void registerRenderThings() { RenderingRegistry.registerEntityRenderingHandler(EntityFireballProjectile.class, new RenderFireballProjectile(StaffCraft.fireballProjectile)); RenderingRegistry.registerEntityRenderingHandler(EntityBombProjectile.class, new RenderBombProjectile(StaffCraft.bombProjectile)); RenderingRegistry.registerEntityRenderingHandler(EntityMagicProjectile.class, new RenderMagicProjectile(StaffCraft.magicProjectile)); } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { Object gui = null; if (ID == 1) { gui = new GuiInfusionTable(player, world, x, y, z); } return gui; } } ServerProxy.java package mods.StaffCraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import cpw.mods.fml.common.network.IGuiHandler; public class ServerProxy implements IGuiHandler { public void registerRenderThings() { } @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { // TODO Auto-generated method stub return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { // TODO Auto-generated method stub return null; } }
May 22, 201312 yr Try making sure that the ID for the GUI is actually 1. And I think you should probably change it to 10.... I think 1 would have been taken already I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes. I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there
May 22, 201312 yr When I first started to make GUI blocks I had the exact same problem, I looked in your container code and dont see where you are referencing the block for your mod...look into the container for workbench, you will see a can interact with method and in that method will be where it says about it being the workbench black...if you dont have this, it is necessary to have it, or your gui will not stay open....same with furnaces and any block really, in some way the block has to be referenced in the tile or container to keep the GUI open. I know this doesnt sound like much I am tired and at work. But look into the code I am telling you and you will begin to see what I mean....
May 22, 201312 yr Author Try making sure that the ID for the GUI is actually 1. And I think you should probably change it to 10.... I think 1 would have been taken already The ID was actually 10.. Great minds think alike, right? It opens up now, but it crashes. Anyone know why? ---- Minecraft Crash Report ---- // Don't do that. Time: 5/21/13 11:43 PM Description: Ticking memory connection java.lang.NullPointerException at cpw.mods.fml.common.modloader.ModLoaderHelper.openGui(ModLoaderHelper.java:177) at net.minecraft.src.ModLoader.serverOpenWindow(ModLoader.java:830) at mods.StaffCraft.BlockInfusionTable.onBlockActivated(BlockInfusionTable.java:43) at net.minecraft.item.ItemInWorldManager.activateBlockOrUseItem(ItemInWorldManager.java:412) at net.minecraft.network.NetServerHandler.handlePlace(NetServerHandler.java:553) at net.minecraft.network.packet.Packet15Place.processPacket(Packet15Place.java:79) at net.minecraft.network.MemoryConnection.processReadPackets(MemoryConnection.java:89) at net.minecraft.network.NetServerHandler.networkTick(NetServerHandler.java:134) at net.minecraft.network.NetworkListenThread.networkTick(NetworkListenThread.java:53) at net.minecraft.server.integrated.IntegratedServerListenThread.networkTick(IntegratedServerListenThread.java:109) at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:674) at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:570) at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:127) at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:468) at net.minecraft.server.ThreadMinecraftServer.run(ThreadMinecraftServer.java:16) A detailed walkthrough of the error, its code path and all known details is as follows: --------------------------------------------------------------------------------------- -- System Details -- Details: Minecraft Version: 1.5.1 Operating System: Windows 7 (amd64) version 6.1 Java Version: 1.7.0_07, Oracle Corporation Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation Memory: 839045776 bytes (800 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB) JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M AABB Pool Size: 743 (41608 bytes; 0 MB) allocated, 393 (22008 bytes; 0 MB) used Suspicious classes: FML and Forge are installed IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0 FML: MCP v7.44 FML v5.1.43.676 Minecraft Forge 7.7.1.676 6 mods loaded, 6 mods active mcp{7.44} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available FML{5.1.43.676} [Forge Mod Loader] (coremods) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Forge{7.7.1.676} [Minecraft Forge] (coremods) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available tutorial{1.4.7} [Tutorial Mod] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available SpawnEggsPlus{1.0} [spawnEggsPlus] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available StaffCraft{Pre-Alpha 1} [staffCraft] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available Profiler Position: N/A (disabled) Vec3 Pool Size: 78 (4368 bytes; 0 MB) allocated, 54 (3024 bytes; 0 MB) used Player Count: 1 / 8; [EntityPlayerMP['Player437'/40, l='Test World', x=-125.80, y=4.00, z=2005.35]] Type: Integrated Server (map_client.txt) Is Modded: Definitely; Client brand changed to 'fml,forge'
May 22, 201312 yr Author Ah, so it seems somewhere along the way, the ID got changed to a 10, but I forgot to change it elsewhere. Crash is fixed, but now it won't open again, lol.
May 22, 201312 yr well.... Thats helpful... I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes. I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there
May 22, 201312 yr give us your updated code. and any crash reports. if it doesnt open it means you don't trigger the opening gui event. check you id's in the proxies again. https://minecraft.curseforge.com/members/Subaraki/projects
May 22, 201312 yr Author The code is the exact same other than the IDs. Everywhere that uses the ID is correct (I will check again to be sure). It doesn't crash, I fixed that issue. It DOES open, and prints out "Opening Gui" where I told it to, but it closes right away.
May 22, 201312 yr The code is the exact same other than the IDs. Everywhere that uses the ID is correct (I will check again to be sure). It doesn't crash, I fixed that issue. It DOES open, and prints out "Opening Gui" where I told it to, but it closes right away. That would mean its getting called then overriden... somehow... Try using a different place to call the opening of the GUI that is pretty much the same spot, or that opens it on the same sort of exceptions. For example find a different place to activate the GUI from when a block is right clicked. I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes. I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there
May 23, 201312 yr As I said before I have a small bit of experience with GUI blocks, and from the looks of your container you are missing one key ingredient... public boolean canInteractWith(EntityPlayer entityplayer) { if(worldObj.getBlockId(posX, posY, posZ) != Builder.builder.blockID) { return false; } else { return entityplayer.getDistanceSq((double)posX + 0.5D, (double)posY + 0.5D, (double)posZ + 0.5D) <= 64D; } } This bit is needed to reference your blocktable and to keep the GUI open, I know this because when I first started to mess with GUI blocks I had the same exact problem
May 23, 201312 yr Finally someone who knows something relavent I am Mew. The Legendary Psychic. I behave oddly and am always playing practical jokes. I have also found that I really love making extremely long and extremely but sometimes not so descriptive variables. Sort of like what I just did there
May 23, 201312 yr Author Added, but it is still happening.. Any idea why? The actual code is below.. x, y, and z come from the constructor. public boolean canInteractWith(EntityPlayer entityplayer) { if(entityplayer.worldObj.getBlockId(x, y, z) != StaffCraft.infusionTable.blockID) { return false; } else { return entityplayer.getDistanceSq((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D) <= 64D; } }
May 23, 201312 yr under the same user name<microjunk> I have a tutorial for 1.4.7 and one for 1.5.2 for crafting tables at minecraft forums, perhaps you should give those a look, in the meantime post your block, container, gui handler, and the code snippet for how you are registering the handler in your mod class. Also bare in mind that particles, images and GUI stuff are all done on the client side of the game, adding this info to your proxy is almost never a good idea, those that encourage it have been fortunate to have never had the multitude of errors that can come from mixing your proxy with IGuiHandler.....
May 23, 201312 yr Author What prints out, if it helps: 2013-05-23 14:59:53 [iNFO] [sTDOUT] Opening GUI 2013-05-23 14:59:53 [iNFO] [sTDOUT] Opened GUI 2013-05-23 14:59:53 [iNFO] [sTDOUT] Gui Closing 2013-05-23 14:59:53 [iNFO] [sTDOUT] Gui Closing These come from: System.out.println("Opening GUI"); Minecraft.getMinecraft().displayGuiScreen(new GuiInfusionTable(player, world, x, y, z)); System.out.println("Opened GUI"); and public void onCraftGuiClosed(EntityPlayer par1EntityPlayer) { super.onCraftGuiClosed(par1EntityPlayer); System.out.println("Gui Closing"); /* if (!par1EntityPlayer.worldObj.isRemote) { for (int var2 = 0; var2 < 4; ++var2) { ItemStack var3 = this.craftMatrix.getStackInSlotOnClosing(var2); if (var3 != null) { par1EntityPlayer.dropPlayerItem(var3); } } }*/ }
May 23, 201312 yr http://www.minecraftforum.net/topic/1788684-forge-151-crafting-table-with-custom-grid-sizes-5x5-code-posted/ everything you need for a custom crafting table.....
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.