Jump to content

Custom Villager GUI Crashing.


Catfish55

Recommended Posts

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);

}

}

 

 

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.