Jump to content

[1.8] Crash with Slot NPE


The_SlayerMC

Recommended Posts

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'

Former developer for DivineRPG, Pixelmon and now the maker of Essence of the Gods

Link to comment
Share on other sites

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

}

}

 

 

Former developer for DivineRPG, Pixelmon and now the maker of Essence of the Gods

Link to comment
Share on other sites

...

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?

I'm back from being gone for... I think its been about a year. I'm pretty sure nobody remembers me, but hello anybody who does!

Link to comment
Share on other sites

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

1.7.10 is no longer supported by forge, you are on your own.

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.