Posted May 15, 201411 yr Hi, I made my own GUI for a custom villager NPC I have. When I use the default GUI (same as Villager) the trader works perfectly. Whenever I put my own GUI in it's place, interacting crashes with this crash. In my Entity class, if I move the drawing of the GUI outside of the !isRemote (which is no longer like Villager code) and into an isRemote, then I get to see the GUI except when I close it I get this crash (I don't see any of the GUI besides the main background part, there are no buttons, things he is selling, etc): java.lang.NullPointerException: Updating screen events at com.mashmod.container.ContainerMiner.onContainerClosed(ContainerMiner.java:162) at net.minecraft.client.gui.inventory.GuiContainer.onGuiClosed(GuiContainer.java:746) at net.minecraft.client.Minecraft.displayGuiScreen(Minecraft.java:838) at net.minecraft.client.entity.EntityPlayerSP.closeScreen(EntityPlayerSP.java:362) at net.minecraft.client.entity.EntityClientPlayerMP.closeScreenNoPacket(EntityClientPlayerMP.java:271) at net.minecraft.client.entity.EntityClientPlayerMP.closeScreen(EntityClientPlayerMP.java:262) at net.minecraft.client.gui.inventory.GuiContainer.keyTyped(GuiContainer.java:701) at net.minecraft.client.gui.GuiScreen.handleKeyboardInput(GuiScreen.java:388) at net.minecraft.client.gui.GuiScreen.handleInput(GuiScreen.java:325) at net.minecraft.client.Minecraft.runTick(Minecraft.java:1727) at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1036) at net.minecraft.client.Minecraft.run(Minecraft.java:951) at net.minecraft.client.main.Main.main(Main.java:112) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at net.minecraft.launchwrapper.Launch.launch(Launch.java:134) at net.minecraft.launchwrapper.Launch.main(Launch.java:28) Normal crash w/out moving out of !isRemote Encountered an unexpected exception net.minecraft.util.ReportedException: Ticking player at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:206) ~[NetworkSystem.class:?] at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:762) ~[MinecraftServer.class:?] at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:650) ~[MinecraftServer.class:?] at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:120) ~[integratedServer.class:?] at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:528) [MinecraftServer.class:?] at net.minecraft.server.MinecraftServer$2.run(MinecraftServer.java:787) [MinecraftServer$2.class:?] Caused by: java.lang.NullPointerException at com.mashmod.container.ContainerMiner.canInteractWith(ContainerMiner.java:92) ~[ContainerMiner.class:?] at net.minecraftforge.event.entity.player.PlayerOpenContainerEvent.<init>(PlayerOpenContainerEvent.java:27) ~[PlayerOpenContainerEvent.class:?] at net.minecraftforge.common.ForgeHooks.canInteractWith(ForgeHooks.java:373) ~[ForgeHooks.class:?] at net.minecraft.entity.player.EntityPlayer.onUpdate(EntityPlayer.java:362) ~[EntityPlayer.class:?] at net.minecraft.entity.player.EntityPlayerMP.onUpdateEntity(EntityPlayerMP.java:363) ~[EntityPlayerMP.class:?] at net.minecraft.network.NetHandlerPlayServer.processPlayer(NetHandlerPlayServer.java:334) ~[NetHandlerPlayServer.class:?] at net.minecraft.network.play.client.C03PacketPlayer.processPacket(C03PacketPlayer.java:37) ~[C03PacketPlayer.class:?] at net.minecraft.network.play.client.C03PacketPlayer$C06PacketPlayerPosLook.processPacket(C03PacketPlayer.java:218) ~[C03PacketPlayer$C06PacketPlayerPosLook.class:?] at net.minecraft.network.NetworkManager.processReceivedPackets(NetworkManager.java:242) ~[NetworkManager.class:?] at net.minecraft.network.NetworkSystem.networkTick(NetworkSystem.java:190) ~[NetworkSystem.class:?] ... 5 more I have the code for my trader and gui here: Trader Entity Interact: @Override public boolean interact(EntityPlayer var1) { if (this.isEntityAlive() && !this.isTrading() && !this.isChild()) { if (!this.worldObj.isRemote) { this.setCustomer(var1); var1.openGui(mineandbash.instance, GuiHandler.miner, this.worldObj, this.getEntityId(), 0, 0); } return true; } else { return super.interact(var1); } } Container: public class ContainerMiner extends Container { /** * Instance of Merchant. */ private IMerchant theMerchant; private InventoryMerchant merchantInventory; /** * Instance of World. */ private final World theWorld; private static final String __OBFID = "CL_00001757"; public ContainerMiner (InventoryPlayer par1InventoryPlayer, IMerchant par2IMerchant, World par3World) { this.theMerchant = par2IMerchant; this.theWorld = par3World; this.merchantInventory = new InventoryMerchant(par1InventoryPlayer.player, par2IMerchant); this.addSlotToContainer(new Slot(this.merchantInventory, 0, 36, 53)); this.addSlotToContainer(new Slot(this.merchantInventory, 1, 62, 53)); this.addSlotToContainer(new SlotMerchantResult(par1InventoryPlayer.player, par2IMerchant, this.merchantInventory, 2, 120, 53)); int i; for (i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(par1InventoryPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for (i = 0; i < 9; ++i) { this.addSlotToContainer(new Slot(par1InventoryPlayer, i, 8 + i * 18, 142)); } } public InventoryMerchant getMerchantInventory() { return this.merchantInventory; } public void addCraftingToCrafters(ICrafting par1ICrafting) { super.addCraftingToCrafters(par1ICrafting); } /** * Looks for changes made in the container, sends them to every listener. */ public void detectAndSendChanges() { super.detectAndSendChanges(); } /** * Callback for when the crafting matrix is changed. */ public void onCraftMatrixChanged(IInventory par1IInventory) { this.merchantInventory.resetRecipeAndSlots(); super.onCraftMatrixChanged(par1IInventory); } public void setCurrentRecipeIndex(int par1) { this.merchantInventory.setCurrentRecipeIndex(par1); } @SideOnly(Side.CLIENT) public void updateProgressBar(int par1, int par2) {} public boolean canInteractWith(EntityPlayer par1EntityPlayer) { return this.theMerchant.getCustomer() == par1EntityPlayer; } /** * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that. */ public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(par2); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (par2 == 2) { if (!this.mergeItemStack(itemstack1, 3, 39, true)) { return null; } slot.onSlotChange(itemstack1, itemstack); } else if (par2 != 0 && par2 != 1) { if (par2 >= 3 && par2 < 30) { if (!this.mergeItemStack(itemstack1, 30, 39, false)) { return null; } } else if (par2 >= 30 && par2 < 39 && !this.mergeItemStack(itemstack1, 3, 30, false)) { return null; } } else if (!this.mergeItemStack(itemstack1, 3, 39, false)) { return null; } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack)null); } else { slot.onSlotChanged(); } if (itemstack1.stackSize == itemstack.stackSize) { return null; } slot.onPickupFromSlot(par1EntityPlayer, itemstack1); } return itemstack; } /** * Called when the container is closed. */ public void onContainerClosed(EntityPlayer par1EntityPlayer) { super.onContainerClosed(par1EntityPlayer); this.theMerchant.setCustomer((EntityPlayer)null); super.onContainerClosed(par1EntityPlayer); if (!this.theWorld.isRemote) { ItemStack itemstack = this.merchantInventory.getStackInSlotOnClosing(0); if (itemstack != null) { par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false); } itemstack = this.merchantInventory.getStackInSlotOnClosing(1); if (itemstack != null) { par1EntityPlayer.dropPlayerItemWithRandomChoice(itemstack, false); } } } } GUI-Handler: public class GuiHandler implements IGuiHandler{ public static int guiID = 0; public static int entMiner= guiID++; EntityMiner miner; @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); if(ID == entMiner) return new ContainerMerchant(player.inventory, miner, world); return null; } @Override public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { TileEntity entity = world.getTileEntity(x, y, z); if(ID == entMiner) return new GUIMiner(player.inventory, world, x, y, z); return null; } } Specific GUI: public class GUIMiner extends GuiContainer { static EntityMiner miner; public GUIMiner(InventoryPlayer par1InventoryPlayer, World par2World, int par3, int par4, int par5) { super(new ContainerMerchant(par1InventoryPlayer, miner, par2World)); } @Override protected void drawGuiContainerForegroundLayer(int par1, int par2) { this.fontRendererObj.drawString("Miner", 40 + 5, - 10 - 10, 4210752); this.fontRendererObj.drawString(StatCollector.translateToLocal("container.inventory"), 50 + 14, this.ySize - 96 - 10 - 19, 4210752); } @Override protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(new ResourceLocation("mineandbash:textures/guis/minergui.png")); this.xSize = 176; this.ySize = 231; int k = (this.width - this.xSize) / 2; int l = (this.height - this.ySize) / 2; this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); } }
May 16, 201411 yr Author You always pass null to the container as the villager. You need to send the entityId with openGui (x, y, z are just integers, you dont have to use a location!) and then use world.getEntityById. Where exactly do I use this world.getEntityById?
May 16, 201411 yr Author In your GUIHandler. Will try to fix this when I get home then. Would you happen to know why the buttons and whatnot don't show up? I just copied the Vanilla container.
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.