Hi,
My Minecraft client keeps crashing every time I try to open up my Grinder block. I assume it's a Container GUI bug, but I don't know why the NPE is throwing Ticking Player .
Here's the crash log:
---- Minecraft Crash Report ----
// Why did you do that?
Time: 7/22/19 4:57 AM
Description: Ticking player
java.lang.NullPointerException: Ticking player
at net.minecraft.inventory.Slot.getStack(Slot.java:81)
at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97)
at com.ssbbpeople.metallurgy.blocks.grinder.ContainerGrinder.detectAndSendChanges(ContainerGrinder.java:65)
at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365)
at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2171)
at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871)
at net.minecraft.world.World.updateEntity(World.java:2130)
at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:672)
at net.minecraft.world.World.updateEntities(World.java:1906)
at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643)
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592)
at java.lang.Thread.run(Unknown Source)
A detailed walkthrough of the error, its code path and all known details is as follows:
---------------------------------------------------------------------------------------
-- Head --
Thread: Server thread
Stacktrace:
at net.minecraft.inventory.Slot.getStack(Slot.java:81)
at net.minecraft.inventory.Container.detectAndSendChanges(Container.java:97)
at com.ssbbpeople.metallurgy.blocks.grinder.ContainerGrinder.detectAndSendChanges(ContainerGrinder.java:65)
at net.minecraft.entity.player.EntityPlayerMP.onUpdate(EntityPlayerMP.java:365)
at net.minecraft.world.World.updateEntityWithOptionalForce(World.java:2171)
at net.minecraft.world.WorldServer.updateEntityWithOptionalForce(WorldServer.java:871)
at net.minecraft.world.World.updateEntity(World.java:2130)
-- Player being ticked --
Details:
Entity Type: null (net.minecraft.entity.player.EntityPlayerMP)
Entity ID: 0
Entity Name: Player127
Entity's Exact location: -1486.50, 4.00, 122.50
Entity's Block location: World: (-1487,4,122), Chunk: (at 1,0,10 in -93,7; contains blocks -1488,0,112 to -1473,255,127), Region: (-3,0; contains chunks -96,0 to -65,31, blocks -1536,0,0 to -1025,255,511)
Entity's Momentum: 0.00, -0.08, 0.00
Entity's Passengers: []
Entity's Vehicle: ~~ERROR~~ NullPointerException: null
Stacktrace:
at net.minecraft.world.WorldServer.tickPlayers(WorldServer.java:672)
at net.minecraft.world.World.updateEntities(World.java:1906)
at net.minecraft.world.WorldServer.updateEntities(WorldServer.java:643)
-- Affected level --
Details:
Level name: Test World - 7B
All players: 1 total; [EntityPlayerMP['Player127'/0, l='Test World - 7B', x=-1486.50, y=4.00, z=122.50]]
Chunk stats: ServerChunkCache: 625 Drop: 0
Level seed: -1413871684550780093
Level generator: ID 01 - flat, ver 0. Features enabled: true
Level generator options:
Level spawn location: World: (-1487,4,118), Chunk: (at 1,0,6 in -93,7; contains blocks -1488,0,112 to -1473,255,127), Region: (-3,0; contains chunks -96,0 to -65,31, blocks -1536,0,0 to -1025,255,511)
Level time: 219 game time, 219 day time
Level dimension: 0
Level storage version: 0x04ABD - Anvil
Level weather: Rain time: 112927 (now: false), thunder time: 171545 (now: false)
Level game mode: Game mode: creative (ID 1). Hardcore: false. Cheats: true
Stacktrace:
at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:842)
at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:743)
at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:192)
at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:592)
at java.lang.Thread.run(Unknown Source)
-- System Details --
Details:
Minecraft Version: 1.12.2
Operating System: Windows 7 (amd64) version 6.1
Java Version: 1.8.0_221, Oracle Corporation
Java VM Version: Java HotSpot(TM) 64-Bit Server VM (mixed mode), Oracle Corporation
Memory: 844942440 bytes (805 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 9.42 Powered by Forge 14.23.5.2838 5 mods loaded, 5 mods active
States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
| State | ID | Version | Source | Signature |
|:------ |:--------- |:------------ |:-------------------------------- |:--------- |
| LCHIJA | minecraft | 1.12.2 | minecraft.jar | None |
| LCHIJA | mcp | 9.42 | minecraft.jar | None |
| LCHIJA | FML | 8.0.99.99 | forgeSrc-1.12.2-14.23.5.2838.jar | None |
| LCHIJA | forge | 14.23.5.2838 | forgeSrc-1.12.2-14.23.5.2838.jar | None |
| LCHIJA | mm | 1.0 | bin | None |
Loaded coremods (and transformers):
GL info: ~~ERROR~~ RuntimeException: No OpenGL context found in the current thread.
Profiler Position: N/A (disabled)
Player Count: 1 / 8; [EntityPlayerMP['Player127'/0, l='Test World - 7B', x=-1486.50, y=4.00, z=122.50]]
Type: Integrated Server (map_client.txt)
Is Modded: Definitely; Client brand changed to 'fml,forge'
Here's my ContainerGrinder class:
package com.ssbbpeople.metallurgy.blocks.grinder;
import com.ssbbpeople.metallurgy.blocks.grinder.slots.SlotGrinderFuel;
import com.ssbbpeople.metallurgy.blocks.grinder.slots.SlotGrinderOutput;
import com.ssbbpeople.metallurgy.blocks.tileentities.TileEntityGrinder;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.*;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.ICapabilityProvider;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.SlotItemHandler;
public class ContainerGrinder extends Container {
private IInventory TileEntityGrinder;
GrinderTileEntity tileentity;
private IItemHandler InvHandler;
private final IInventory tileFurnace;
private int cookTime, totalCookTime, ovenBurnTime, currentItemBurnTime;
public ContainerGrinder(InventoryPlayer playerInventory, IInventory furnaceInventory, GrinderTileEntity containerTileEntity)
{
this.tileentity = containerTileEntity;
this.tileFurnace = furnaceInventory;
this.addSlotToContainer(new Slot(furnaceInventory, 0, 56, 17));
this.addSlotToContainer(new SlotGrinderFuel(furnaceInventory, 1, 56, 53));
this.addSlotToContainer(new SlotGrinderOutput(playerInventory.player, furnaceInventory, 2, 116, 35));
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int k = 0; k < 9; k++)
{
this.addSlotToContainer(new Slot(playerInventory, k, 8 + k * 18, 142));
}
}
public ContainerGrinder(IInventory playerInventory, IInventory furnaceInventory, GrinderTileEntity containerTileEntity) {
this.tileentity = containerTileEntity;
this.tileFurnace = furnaceInventory;
this.InvHandler = ((ICapabilityProvider) tileentity).getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY, null);
}
@Override
public void addListener(IContainerListener listener)
{
super.addListener(listener);
listener.sendAllWindowProperties(this, this.TileEntityGrinder);
}
@Override
public void detectAndSendChanges()
{
super.detectAndSendChanges();
for (int i = 0; i < this.listeners.size(); ++i)
{
IContainerListener icontainerlistener = this.listeners.get(i);
if (this.cookTime != this.TileEntityGrinder.getField(2))
{
icontainerlistener.sendWindowProperty(this, 2, this.TileEntityGrinder.getField(2));
}
if (this.ovenBurnTime != this.TileEntityGrinder.getField(0))
{
icontainerlistener.sendWindowProperty(this, 0, this.TileEntityGrinder.getField(0));
}
if (this.currentItemBurnTime != this.TileEntityGrinder.getField(1))
{
icontainerlistener.sendWindowProperty(this, 1, this.TileEntityGrinder.getField(1));
}
if (this.totalCookTime != this.TileEntityGrinder.getField(3))
{
icontainerlistener.sendWindowProperty(this, 3, this.TileEntityGrinder.getField(3));
}
}
this.cookTime = this.TileEntityGrinder.getField(2);
this.ovenBurnTime = this.TileEntityGrinder.getField(0);
this.currentItemBurnTime = this.TileEntityGrinder.getField(1);
this.totalCookTime = this.TileEntityGrinder.getField(3);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer playerIn, int index)
{
ItemStack itemstack = ItemStack.EMPTY;
Slot slot = this.inventorySlots.get(index);
if (slot != null && slot.getHasStack())
{
ItemStack itemstack1 = slot.getStack();
itemstack = itemstack1.copy();
if (index == 2)
{
if (!this.mergeItemStack(itemstack1, 3, 39, true))
{
return ItemStack.EMPTY;
}
slot.onSlotChange(itemstack1, itemstack);
}
else if (index != 1 && index != 0)
{
if (!GrinderRecipes.instance().getCookingResult(itemstack1).isEmpty())
{
if (!this.mergeItemStack(itemstack1, 0, 1, false))
{
return ItemStack.EMPTY;
}
}
else if (ContainerGrinder.isItemFuel(itemstack1))
{
if (!this.mergeItemStack(itemstack1, 1, 2, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 3 && index < 30)
{
if (!this.mergeItemStack(itemstack1, 30, 39, false))
{
return ItemStack.EMPTY;
}
}
else if (index >= 30 && index < 39 && !this.mergeItemStack(itemstack1, 3, 30, false))
{
return ItemStack.EMPTY;
}
}
else if (!this.mergeItemStack(itemstack1, 3, 39, false))
{
return ItemStack.EMPTY;
}
if (itemstack1.isEmpty())
{
slot.putStack(ItemStack.EMPTY);
}
else
{
slot.onSlotChanged();
}
if (itemstack1.getCount() == itemstack.getCount())
{
return ItemStack.EMPTY;
}
slot.onTake(playerIn, itemstack1);
}
return itemstack;
}
public static int getItemBurnTime(ItemStack stack)
{
if (stack.isEmpty())
{
return 0;
}
else
{
int burnTime = net.minecraftforge.event.ForgeEventFactory.getItemBurnTime(stack);
if (burnTime >= 0) return burnTime;
Item item = stack.getItem();
if (item == Items.REDSTONE)
{
return 300;
}
else if (item ==Item.getItemFromBlock(Blocks.REDSTONE_BLOCK))
{
return 4000;
}
}
return 300;
}
public static boolean isItemFuel(ItemStack stack)
{
return getItemBurnTime(stack) > 0;
}
public ContainerGrinder(InventoryPlayer playerInventory, IInventory furnaceInventory)
{
this.TileEntityGrinder = furnaceInventory;
this.tileFurnace = furnaceInventory;
this.addSlotToContainer(new Slot(furnaceInventory, 0, 56, 17));
this.addSlotToContainer(new SlotGrinderFuel(furnaceInventory, 1, 56, 53));
this.addSlotToContainer(new SlotGrinderOutput(playerInventory.player, furnaceInventory, 2, 116, 35));
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 9; ++j)
{
this.addSlotToContainer(new Slot(playerInventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
}
}
for(int k = 0; k < 9; k++)
{
this.addSlotToContainer(new Slot(playerInventory, k, 8 + k * 18, 142));
}
}
//Tile Entities
@Override
public void updateProgressBar(int id, int data)
{
this.TileEntityGrinder.setField(id, data);
}
@Override
public boolean canInteractWith(EntityPlayer playerIn)
{
return this.TileEntityGrinder.isUsableByPlayer(playerIn);
}
}
And my TileEntityGrinder class:
package com.ssbbpeople.metallurgy.blocks.tileentities;
import javax.annotation.Nullable;
import com.ssbbpeople.metallurgy.blocks.grinder.ContainerGrinder;
import com.ssbbpeople.metallurgy.blocks.grinder.Grinder;
import com.ssbbpeople.metallurgy.blocks.grinder.GrinderRecipes;
import com.ssbbpeople.metallurgy.blocks.grinder.slots.SlotGrinderFuel;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBoat;
import net.minecraft.item.ItemDoor;
import net.minecraft.item.ItemHoe;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemSword;
import net.minecraft.item.ItemTool;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityLockable;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.datafix.DataFixer;
import net.minecraft.util.datafix.FixTypes;
import net.minecraft.util.datafix.walkers.ItemStackDataLists;
import net.minecraft.util.math.MathHelper;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.ItemStackHandler;
public class TileEntityGrinder extends TileEntity implements IInventory, ISidedInventory {
private static final int[] SLOTS_TOP = new int[] {0};
private static final int[] SLOTS_BOTTOM = new int[] {2, 1};
private static final int[] SLOTS_SIDES = new int[] {1};
private NonNullList<ItemStack> furnaceItemStacks = NonNullList.<ItemStack>withSize(3, ItemStack.EMPTY);
private int furnaceBurnTime;
private int currentItemBurnTime;
private static int cookTime;
private int totalCookTime;
private String furnaceCustomName;
@Override
public int getSizeInventory()
{
return this.furnaceItemStacks.size();
}
@Override
public boolean isEmpty()
{
for(ItemStack stack : this.furnaceItemStacks)
{
if(!stack.isEmpty())
{
return false;
}
}
return true;
}
@Override
public ItemStack getStackInSlot(int index)
{
return this.furnaceItemStacks.get(index);
}
@Override
public ItemStack decrStackSize(int index, int count)
{
return ItemStackHelper.getAndSplit(furnaceItemStacks, index, count);
}
@Override
public ItemStack removeStackFromSlot(int index)
{
return ItemStackHelper.getAndRemove(furnaceItemStacks, index);
}
@Override
public void setInventorySlotContents(int index, ItemStack stack)
{
ItemStack itemStack = this.furnaceItemStacks.get(index);
boolean flag = !stack.isEmpty() && stack.isItemEqual(itemStack) && ItemStack.areItemStackShareTagsEqual(stack, itemStack);
this.furnaceItemStacks.set(index, stack);
if(stack.getCount() > this.getInventoryStackLimit())
{
stack.setCount(this.getInventoryStackLimit());
}
if(index == 0 && !flag)
{
this.totalCookTime = this.getCookTime(stack);
this.cookTime = 0;
this.markDirty();
}
}
@Override
public String getName()
{
return this.hasCustomName() ? this.furnaceCustomName : "container.grinder";
}
@Override
public boolean hasCustomName()
{
return this.furnaceCustomName != null && !this.furnaceCustomName.isEmpty();
}
public void setCustomInventoryName(String furnaceCustomName)
{
this.furnaceCustomName = furnaceCustomName;
}
public static void registerFixesFurnace(DataFixer fixer)
{
fixer.registerWalker(FixTypes.BLOCK_ENTITY, new ItemStackDataLists(TileEntityGrinder.class, new String[] {"Items"}));
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
public boolean isBurning()
{
return this.furnaceBurnTime > 0;
}
@SideOnly(Side.CLIENT)
public static boolean isBurning(IInventory inventory)
{
return inventory.getField(0) > 0;
}
public void update()
{
boolean flag = this.isBurning();
boolean flag1 = false;
if (this.isBurning())
{
--this.furnaceBurnTime;
}
if (!this.world.isRemote)
{
ItemStack itemstack = this.furnaceItemStacks.get(1);
if (this.isBurning() || !itemstack.isEmpty() && !((ItemStack)this.furnaceItemStacks.get(0)).isEmpty())
{
if (!this.isBurning() && this.canSmelt())
{
this.furnaceBurnTime = getItemBurnTime(itemstack);
this.currentItemBurnTime = this.furnaceBurnTime;
if (this.isBurning())
{
flag1 = true;
if (!itemstack.isEmpty())
{
Item item = itemstack.getItem();
itemstack.shrink(1);
if (itemstack.isEmpty())
{
ItemStack item1 = item.getContainerItem(itemstack);
this.furnaceItemStacks.set(1, item1);
}
}
}
}
if (this.isBurning() && this.canSmelt())
{
++this.cookTime;
if (this.cookTime == this.totalCookTime)
{
this.cookTime = 0;
this.totalCookTime = this.getCookTime(this.furnaceItemStacks.get(0));
this.smeltItem();
flag1 = true;
}
}
else
{
this.cookTime = 0;
}
}
else if (!this.isBurning() && this.cookTime > 0)
{
this.cookTime = MathHelper.clamp(this.cookTime - 2, 0, this.totalCookTime);
}
}
if (flag1)
{
this.markDirty();
}
}
public int getCookTime(ItemStack stack)
{
return 10;
}
private boolean canSmelt()
{
if (((ItemStack)this.furnaceItemStacks.get(0)).isEmpty())
{
return false;
}
else
{
ItemStack itemstack = GrinderRecipes.instance().getCookingResult(this.furnaceItemStacks.get(0));
if (itemstack.isEmpty())
{
return false;
}
else
{
ItemStack itemstack1 = this.furnaceItemStacks.get(2);
if (itemstack1.isEmpty())
{
return true;
}
else if (!itemstack1.isItemEqual(itemstack))
{
return false;
}
else if (itemstack1.getCount() + itemstack.getCount() <= this.getInventoryStackLimit() && itemstack1.getCount() + itemstack.getCount() <= itemstack1.getMaxStackSize())
{
return true;
}
else
{
return itemstack1.getCount() + itemstack.getCount() <= itemstack.getMaxStackSize();
}
}
}
}
public void smeltItem()
{
if (this.canSmelt())
{
ItemStack itemstack = this.furnaceItemStacks.get(0);
ItemStack itemstack1 = GrinderRecipes.instance().getCookingResult(itemstack);
ItemStack itemstack2 = this.furnaceItemStacks.get(2);
if (itemstack2.isEmpty())
{
this.furnaceItemStacks.set(2, itemstack1.copy());
}
else if (itemstack2.getItem() == itemstack1.getItem())
{
itemstack2.grow(itemstack1.getCount());
}
if (itemstack.getItem() == Item.getItemFromBlock(Blocks.SPONGE) && itemstack.getMetadata() == 1 && !((ItemStack)this.furnaceItemStacks.get(1)).isEmpty() && ((ItemStack)this.furnaceItemStacks.get(1)).getItem() == Items.BUCKET)
{
this.furnaceItemStacks.set(1, new ItemStack(Items.WATER_BUCKET));
}
itemstack.shrink(1);
}
}
public static int getItemBurnTime(ItemStack stack)
{
if (stack.isEmpty())
{
return 0;
}
else
{
int burnTime = net.minecraftforge.event.ForgeEventFactory.getItemBurnTime(stack);
if (burnTime >= 0) return burnTime;
Item item = stack.getItem();
if (item == Item.getItemFromBlock(Blocks.WOODEN_SLAB))
{
return 150;
}
else if (item == Item.getItemFromBlock(Blocks.WOOL))
{
return 100;
}
}
return cookTime;
}
public static boolean isItemFuel(ItemStack stack)
{
return getItemBurnTime(stack) > 0;
}
@Override
public boolean isUsableByPlayer(EntityPlayer player)
{
if(this.world.getTileEntity(this.pos) != this)
{
return false;
}
else
{
return player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
}
}
public void openInventory(EntityPlayer player)
{
}
public void closeInventory(EntityPlayer player)
{
}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack)
{
if(index == 2)
{
return false;
}
else if(index != 1)
{
return true;
}
else
{
ItemStack itemStack = this.furnaceItemStacks.get(1);
return isItemFuel(stack) || SlotGrinderFuel.isBucket(stack) && itemStack.getItem() != Items.BUCKET;
}
}
public int[] getSlotsForFace(EnumFacing side)
{
if(side == EnumFacing.DOWN)
{
return SLOTS_BOTTOM;
}
else
{
return side == EnumFacing.UP ? SLOTS_TOP : SLOTS_SIDES;
}
}
public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction)
{
return this.isItemValidForSlot(index, itemStackIn);
}
public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction)
{
if(direction == EnumFacing.DOWN && index == 1)
{
Item item = stack.getItem();
if(item != Items.WATER_BUCKET && item != Items.BUCKET)
{
return false;
}
}
return true;
}
public String getGuiID()
{
return "mm:grinder";
}
public Container createContainer(InventoryPlayer playerInventory, EntityPlayer playerIn)
{
return new ContainerGrinder(playerInventory, this);
}
public int getField(int id)
{
switch (id)
{
case 0:
return this.furnaceBurnTime;
case 1:
return this.currentItemBurnTime;
case 2:
return this.cookTime;
case 3:
return this.totalCookTime;
default:
return 0;
}
}
public void setField(int id, int value)
{
switch (id)
{
case 0:
this.furnaceBurnTime = value;
break;
case 1:
this.currentItemBurnTime = value;
break;
case 2:
this.cookTime = value;
break;
case 3:
this.totalCookTime = value;
}
}
@Override
public int getFieldCount()
{
return 4;
}
@Override
public void clear()
{
this.furnaceItemStacks.clear();
}
net.minecraftforge.items.IItemHandler handlerTop = new net.minecraftforge.items.wrapper.SidedInvWrapper(this, net.minecraft.util.EnumFacing.UP);
net.minecraftforge.items.IItemHandler handlerBottom = new net.minecraftforge.items.wrapper.SidedInvWrapper(this, net.minecraft.util.EnumFacing.DOWN);
net.minecraftforge.items.IItemHandler handlerSide = new net.minecraftforge.items.wrapper.SidedInvWrapper(this, net.minecraft.util.EnumFacing.WEST);
@Override
@javax.annotation.Nullable
public <T> T getCapability(net.minecraftforge.common.capabilities.Capability<T> capability, @javax.annotation.Nullable net.minecraft.util.EnumFacing facing)
{
if (facing != null && capability == net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
if (facing == EnumFacing.DOWN)
return (T) handlerBottom;
else if (facing == EnumFacing.UP)
return (T) handlerTop;
else
return (T) handlerSide;
return super.getCapability(capability, facing);
}
//NBT Tags
private ItemStackHandler inventory = new ItemStackHandler(1);
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
compound.setTag("inventory", inventory.serializeNBT());
return super.writeToNBT(compound);
}
@Override
public void readFromNBT(NBTTagCompound compound) {
inventory.deserializeNBT(compound.getCompoundTag("inventory"));
super.readFromNBT(compound);
}
}
Here's my GitHub: https://github.com/SpookyBarca/Metallurgy
Any help is appreciated, thank you!