Jump to content
  • Home
  • Files
  • Docs
  • Merch
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.8] Crash with Slot NPE
1.13 Update Notes for Mod Creators
Sign in to follow this  
Followers 0
The_SlayerMC

[1.8] Crash with Slot NPE

By The_SlayerMC, March 20, 2015 in Modder Support

  • Reply to this topic
  • Start new topic

Recommended Posts

The_SlayerMC    7

The_SlayerMC

The_SlayerMC    7

  • Creeper Killer
  • The_SlayerMC
  • Members
  • 7
  • 201 posts
Posted March 20, 2015

Hello, i'm getting a really strange crash for a slot not getting the stack... I've tried to change things such as you would for a TE but if i comment the slot for the TE then it works fine...

 

[spoiler=Container]

package net.essence.blocks.tileentity.container;

import net.essence.blocks.tileentity.TileEntityKnowledgeTable;
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.InventoryBasic;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

public class ContainerKnowledgeTable extends Container {

public IInventory tableInventory;
private World world;

public ContainerKnowledgeTable(InventoryPlayer inventory, TileEntityKnowledgeTable entity, World w) {
	world = w;
	tableInventory = entity;
	this.addSlotToContainer(new Slot(entity, 0, 80, 35));
	for(int i = 0; i < 3; ++i) for(int j = 0; j < 9; ++j) this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
	for(int i = 0; i < 9; ++i) this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142));
}

@Override
public void onContainerClosed(EntityPlayer playerIn) {
	super.onContainerClosed(playerIn);
	if(!world.isRemote) {
		ItemStack itemstack = this.tableInventory.getStackInSlotOnClosing(0);
		if (itemstack != null) {
			playerIn.dropPlayerItemWithRandomChoice(itemstack, false);
		}
	}
}

@Override
public boolean canInteractWith(EntityPlayer playerIn) {
	return true;
}
}

 

 

 

[spoiler=Tile Entity]

package net.essence.blocks.tileentity;

import net.essence.EssenceItems;
import net.essence.items.ItemKnowledge;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.gui.IUpdatePlayerListBox;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.IChatComponent;

public class TileEntityKnowledgeTable extends TileEntity implements IUpdatePlayerListBox, IInventory {

private float rotate = 0.0F;
private ItemStack inventory = new ItemStack(EssenceItems.blankKnowledge);

@Override
public void writeToNBT(NBTTagCompound nbt) {
	super.writeToNBT(nbt);
	nbt.setFloat("rotation", 0.0F);
}

@Override
public void readFromNBT(NBTTagCompound nbt) {
	super.readFromNBT(nbt);
	rotate = nbt.getFloat("rotation");
}

public float getRotation() {
	return rotate;
}

@Override
public void update() {
	rotate += 5.0F;
	if(rotate >= 360F) rotate = 0.0F;
}

@Override
public int getSizeInventory() {
	return 1;
}

@Override
public ItemStack getStackInSlot(int i) {
	return i == 0 ? inventory : null;
}

@Override
public String getName() {
	return "knowledge Table";
}

@Override
public boolean hasCustomName() {
	return true;
}

@Override
public IChatComponent getDisplayName() {
	return null;
}

@Override
public ItemStack decrStackSize(int i, int j) {
	if(i == 0 && inventory != null) {
		if(inventory.stackSize <= j) {
			ItemStack itemstack = inventory;
			inventory = null;
			return itemstack;
		} else {
			inventory.stackSize -= j;
			return new ItemStack(inventory.getItem(), j, inventory.getMetadata());
		}
	} else {
		return null;
	}
}

@Override
public ItemStack getStackInSlotOnClosing(int index) {
	if(index == 0 && this.inventory != null)  {
            ItemStack itemstack = this.inventory;
            this.inventory = null;
            return itemstack;
        } else {
            return null;
        }
}

@Override
public void setInventorySlotContents(int i, ItemStack stack) {
	if(i == 0) this.inventory = stack;
}

@Override
public int getInventoryStackLimit() {
	return 64;
}

@Override
public boolean isUseableByPlayer(EntityPlayer player) {
	return true;
}

@Override
public void openInventory(EntityPlayer player) { }

@Override
public void closeInventory(EntityPlayer player) { }

@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
	return stack.getItem() != null && stack.getItem() instanceof ItemKnowledge;
}

@Override
public int getField(int id) {
	return 0;
}

@Override
public void setField(int id, int value) { }

@Override
public int getFieldCount() {
	return 0;
}

@Override
public void clear() {
	inventory = null;
}
}

 

 

 

Here is the crash:

---- Minecraft Crash Report ----
// Oh - I know what I did wrong!

Time: 20/03/15 3:26 PM
Description: Ticking entity

java.lang.NullPointerException: Ticking entity
at net.minecraft.inventory.Slot.getStack(Slot.java:58)
at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:76)
at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:229)
at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:1865)
at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:732)
at net.minecraft.world.World.updateEntity(World.java:1835)
at net.minecraft.world.World.updateEntities(World.java:1664)
at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:571)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:598)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:164)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:478)
at java.lang.Thread.run(Unknown Source)


A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------

-- Head --
Stacktrace:
at net.minecraft.inventory.Slot.getStack(Slot.java:58)
at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:76)
at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:229)
at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:1865)
at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:732)
at net.minecraft.world.World.updateEntity(World.java:1835)

-- Entity being ticked --
Details:
Entity Type: null (net.minecraft.entity.player.EntityPlayerMP)
Entity ID: 78
Entity Name: Player155
Entity's Exact location: 593.97, 4.00, 693.67
Entity's Block location: 593.00,4.00,693.00 - World: (593,4,693), Chunk: (at 1,0,5 in 37,43; contains blocks 592,0,688 to 607,255,703), Region: (1,1; contains chunks 32,32 to 63,63, blocks 512,0,512 to 1023,255,1023)
Entity's Momentum: 0.00, -0.08, 0.00
Entity's Rider: ~~ERROR~~ NullPointerException: null
Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
at net.minecraft.world.World.updateEntities(World.java:1664)
at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:571)

-- Affected level --
Details:
Level name: New World
All players: 1 total; [EntityPlayerMP['Player155'/78, l='New World', x=593.97, y=4.00, z=693.67]]
Chunk stats: ServerChunkCache: 1286 Drop: 0
Level seed: 2209123573195456436
Level generator: ID 01 - flat, ver 0. Features enabled: true
Level generator options: 
Level spawn location: 601.00,4.00,701.00 - World: (601,4,701), Chunk: (at 9,0,13 in 37,43; contains blocks 592,0,688 to 607,255,703), Region: (1,1; contains chunks 32,32 to 63,63, blocks 512,0,512 to 1023,255,1023)
Level time: 27434 game time, 27434 day time
Level dimension: 0
Level storage version: 0x04ABD - Anvil
Level weather: Rain time: 72120 (now: false), thunder time: 64136 (now: false)
Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true
Stacktrace:
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:703)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:598)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:164)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:478)
at java.lang.Thread.run(Unknown Source)

-- System Details --
Details:
Minecraft Version: 1.8
Operating System: Windows 7 (amd64) version 6.1
Java Version: 1.8.0_20, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 624873872 bytes (595 MB) / 1037959168 bytes (989 MB) up to 1037959168 bytes (989 MB)
JVM Flags: 3 total; -Xincgc -Xmx1024M -Xms1024M
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
FML: MCP v9.10 FML v8.0.26.1305 Minecraft Forge 11.14.1.1305 4 mods loaded, 4 mods active
mcp{9.05} [Minecraft Coder Pack] (minecraft.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
FML{8.0.26.1305} [Forge Mod Loader] (forgeSrc-1.8-11.14.1.1305.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Forge{11.14.1.1305} [Minecraft Forge] (forgeSrc-1.8-11.14.1.1305.jar) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
essence{1.1.0} [Essence of the Gods] (bin) Unloaded->Constructed->Pre-initialized->Initialized->Post-initialized->Available->Available->Available->Available
Profiler Position: N/A (disabled)
Player Count: 1 / 8; [EntityPlayerMP['Player155'/78, l='New World', x=593.97, y=4.00, z=693.67]]
Type: Integrated Server (map_client.txt)
Is Modded: Definitely; Client brand changed to 'fml,forge'

  • Quote

Share this post


Link to post
Share on other sites

diesieben07    6671

diesieben07

diesieben07    6671

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6671
  • 45644 posts
Posted March 20, 2015

We need the code for the GuiHandler as well. From the crash it seems like the TileEntity is null when passed to your GUI.

  • Quote

Share this post


Link to post
Share on other sites

The_SlayerMC    7

The_SlayerMC

The_SlayerMC    7

  • Creeper Killer
  • The_SlayerMC
  • Members
  • 7
  • 201 posts
Posted March 22, 2015

[spoiler=Gui Handler]

package net.essence.client;

 

import net.essence.blocks.tileentity.*;

import net.essence.blocks.tileentity.container.*;

import net.essence.client.render.gui.*;

import net.essence.items.tileentity.*;

import net.essence.items.tileentity.container.*;

import net.essence.util.ContainerEmpty;

import net.minecraft.entity.Entity;

import net.minecraft.entity.IMerchant;

import net.minecraft.entity.player.*;

import net.minecraft.tileentity.*;

import net.minecraft.util.*;

import net.minecraft.world.*;

import net.minecraftforge.fml.common.network.*;

import net.slayer.api.entity.tileentity.container.*;

 

public class GuiHandler implements IGuiHandler {

 

public enum GuiIDs {

ENRICHMENT_TABLE, INCUBATOR, BACKPACK, MAGE, BLACKSMITH, GREEN_ELF, RED_ELF, KNOWLEDGE;

}

 

@Override

public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {

TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));

if(ID == GuiIDs.ENRICHMENT_TABLE.ordinal()) return new ContainerEnrichedTable(player.inventory, world, new BlockPos(x, y, z), player);

if(ID == GuiIDs.INCUBATOR.ordinal()) return new ContainerIncubator(player.inventory, (TileEntityIncubator)entity);

if(ID == GuiIDs.BACKPACK.ordinal()) return new ContainerBackpack(player.inventory, (TileEntityBackpack)entity);

if(ID == GuiIDs.MAGE.ordinal()) return new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world);

if(ID == GuiIDs.BLACKSMITH.ordinal()) return new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world);

if(ID == GuiIDs.GREEN_ELF.ordinal()) return new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world);

if(ID == GuiIDs.RED_ELF.ordinal()) return new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world);

if(ID == GuiIDs.KNOWLEDGE.ordinal()) return new ContainerKnowledgeTable(player.inventory, (TileEntityKnowledgeTable)entity, world);

return null;

}

 

@Override

public Object getClientGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {

TileEntity entity = world.getTileEntity(new BlockPos(x, y, z));

if(ID == GuiIDs.ENRICHMENT_TABLE.ordinal()) return new GuiEnrichedEnchantmentTable(player.inventory, world, x, y, z, player);

if(ID == GuiIDs.INCUBATOR.ordinal()) return new GuiIncubator(player.inventory, (TileEntityIncubator)entity);

if(ID == GuiIDs.BACKPACK.ordinal()) return new GuiBackpack(player.inventory, (TileEntityBackpack)entity);

if(ID == GuiIDs.MAGE.ordinal()) return new GuiMage(new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world), (IMerchant)getEntityByID(x, world));

if(ID == GuiIDs.BLACKSMITH.ordinal()) return new GuiBlacksmith(new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world), (IMerchant)getEntityByID(x, world));

if(ID == GuiIDs.GREEN_ELF.ordinal()) return new GuiGreenElf(new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world), (IMerchant)getEntityByID(x, world));

if(ID == GuiIDs.RED_ELF.ordinal()) return new GuiRedElf(new ContainerModVillager(player.inventory, (IMerchant)getEntityByID(x, world), world), (IMerchant)getEntityByID(x, world));

if(ID == GuiIDs.KNOWLEDGE.ordinal()) return new GuiKnowledgeTable(player.inventory, (TileEntityKnowledgeTable)entity, world);

return null;

}

 

private Entity getEntityByID(int entityID, World world) {

for(int i = 0; i < world.getLoadedEntityList().size(); i++) {

if(((Entity)world.getLoadedEntityList().get(i)).getEntityId() == entityID) {

return ((Entity)world.getLoadedEntityList().get(i));

}

}

return null;

}

}

 

 

 

[spoiler=Block Code]

 

@Override

public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumFacing side, float hitX, float hitY, float hitZ) {

TileEntityKnowledgeTable tile = (TileEntityKnowledgeTable)worldIn.getTileEntity(pos);

if(!worldIn.isRemote) {

if(tile != null) {

playerIn.openGui(Essence.instance, GuiIDs.KNOWLEDGE.ordinal(), worldIn, 0, 0, 0);

}

return true;

}

return false;

}

 

@Override

public TileEntity createNewTileEntity(World worldIn, int meta) {

return new TileEntityKnowledgeTable();

}

}

 

 

  • Quote

Share this post


Link to post
Share on other sites

diesieben07    6671

diesieben07

diesieben07    6671

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6671
  • 45644 posts
Posted March 22, 2015
playerIn.openGui(Essence.instance, GuiIDs.KNOWLEDGE.ordinal(), worldIn, 0, 0, 0);

I highly doubt there's always a block of this type at 0, 0, 0.
  • Quote

Share this post


Link to post
Share on other sites

The_SlayerMC    7

The_SlayerMC

The_SlayerMC    7

  • Creeper Killer
  • The_SlayerMC
  • Members
  • 7
  • 201 posts
Posted March 22, 2015

Thats what i have all my other GUI's set too, i also thought this would be a problem so i casted the players pos to an int and set the coords like that, but it still did nothing.

  • Quote

Share this post


Link to post
Share on other sites

diesieben07    6671

diesieben07

diesieben07    6671

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6671
  • 45644 posts
Posted March 22, 2015

...

You need to pass the coordinates of the Block of course.

  • Quote

Share this post


Link to post
Share on other sites

starwarsmace    18

starwarsmace

starwarsmace    18

  • Diamond Finder
  • starwarsmace
  • Members
  • 18
  • 333 posts
Posted March 22, 2015

...

You need to pass the coordinates of the Block of course.

Question:

You need correct coordinates for tile entities only right?

For guis that open up that dont have anything to do with a block you can just pass the parameters of 0,0,0. Right?

  • Quote

Share this post


Link to post
Share on other sites

Ernio    598

Ernio

Ernio    598

  • Reality Controller
  • Ernio
  • Forge Modder
  • 598
  • 2638 posts
Posted March 22, 2015

GUI != Container.

 

To just open gui you don't need to pass any special coords, you can even pass something else - you literally have 3 integers that you may wanna use to send some ID for example.

 

If you want to open Gui that is connected with block's container (TileEntity) you need to pass proper coords of given block.

 

If you want to open some other inventory that the one held by player (horse for example, just note that horses are NOT using forge system, I am just giving example of inventory), you will probably need to send that entity's coords to know where the container is opened (not necessarily).

  • Quote

Share this post


Link to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

  • Insert image from URL
×
  • Desktop
  • Tablet
  • Phone
Sign in to follow this  
Followers 0
Go To Topic Listing



  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • Filip4223
      [1.12.2] How can I close GUI in Forge?

      By Filip4223 · Posted 3 minutes ago

      I did it, but I think it's only clientside prevention. I gotta send real packet "close gui" to trigger serverside InventoryCloseEvent (or something like that).
    • diesieben07
      [1.12.2] How can I close GUI in Forge?

      By diesieben07 · Posted 13 minutes ago

      To prevent the GUI from opening in GuiOpenEvent you need to cancel the event.
    • diesieben07
      [SOLVED] [1.12.2] Modifying player capabilities for offline players?

      By diesieben07 · Posted 15 minutes ago

      The only way to make data persist is to write to to some form of file. Whether you do it explicitly, or implicitly. You cannot persist data by wishing really hard.
    • Filip4223
      [1.12.2] How can I close GUI in Forge?

      By Filip4223 · Posted 19 minutes ago

      I am trying to write an Minecraft Forge (1.12.2) mod. It should work like that: OnGuiOpen: If GUI title is equals to constant string value then close GUI (like ESC). That must be known by the server exactly like closing a GUI by clicking E/ESC.   My code (doesn't work - I'm seeing 'Turning off' in console but gui is still turned on)   public class ModEventHandler { @SubscribeEvent public void onGuiOpen(GuiOpenEvent event) { if(event.getGui() instanceof GuiContainer) { checkGui((GuiContainer) event.getGui()); } } private void checkGui(GuiContainer gui) { if(gui.inventorySlots instanceof ContainerChest) { ContainerChest _gui = (ContainerChest)gui.inventorySlots; String text = _gui.getLowerChestInventory().getDisplayName().getUnformattedText().toString(); if(text.contains(" ")) { System.out.println("Turning off"); Minecraft.getMinecraft().player.closeScreen(); Minecraft.getMinecraft().displayGuiScreen(null); KeyBinding.onTick(Keyboard.KEY_ESCAPE); } } } }   Thank u in advance for help
    • Differentiation
      [SOLVED] [1.12.2] Modifying player capabilities for offline players?

      By Differentiation · Posted 40 minutes ago

      The thing is I was trying to figure out if there's any way to accomplish this without having to save data to a file.
  • Topics

    • Filip4223
      2
      [1.12.2] How can I close GUI in Forge?

      By Filip4223
      Started 18 minutes ago

    • Differentiation
      12
      [SOLVED] [1.12.2] Modifying player capabilities for offline players?

      By Differentiation
      Started 8 hours ago

    • DragonITA
      4
      [1.14.4] How to get Minecraft Horse model/texture to make a custom unicorn?

      By DragonITA
      Started 2 hours ago

    • LachM
      5
      Issue loading 1.14.4 Server (No Issue with Client)

      By LachM
      Started 1 hour ago

    • RunKeish
      3
      Forge 14.4 crashes on statup

      By RunKeish
      Started 1 hour ago

  • Who's Online (See full list)

    • saxon564
    • Legenes
    • Filip4223
    • diesieben07
    • Differentiation
    • Enterman
    • zacisrelatable
    • LachM
    • Choonster
    • Lea9ue
    • MightyAhmed
    • KolonilGamer
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [1.8] Crash with Slot NPE
  • Theme
  • Contact Us
  • Discord

Copyright © 2019 ForgeDevelopment LLC · Ads by Curse Powered by Invision Community