2015-11-02 20:39:44 +00:00
package WayofTime.bloodmagic.tile ;
2015-10-30 03:22:14 +00:00
2016-09-08 00:46:06 +00:00
import WayofTime.bloodmagic.tile.base.TileBase ;
2015-10-30 03:22:14 +00:00
import net.minecraft.entity.player.EntityPlayer ;
import net.minecraft.inventory.IInventory ;
2016-04-13 21:58:06 +00:00
import net.minecraft.inventory.ISidedInventory ;
2015-11-03 17:11:39 +00:00
import net.minecraft.inventory.InventoryHelper ;
2015-10-30 03:22:14 +00:00
import net.minecraft.item.ItemStack ;
2015-11-03 16:42:38 +00:00
import net.minecraft.nbt.NBTTagCompound ;
import net.minecraft.nbt.NBTTagList ;
2016-04-13 21:58:06 +00:00
import net.minecraft.util.EnumFacing ;
2017-01-02 09:18:29 +00:00
import net.minecraft.util.NonNullList ;
2016-03-17 20:00:44 +00:00
import net.minecraft.util.text.ITextComponent ;
import net.minecraft.util.text.TextComponentString ;
2016-04-13 21:58:06 +00:00
import net.minecraftforge.common.capabilities.Capability ;
import net.minecraftforge.items.CapabilityItemHandler ;
import net.minecraftforge.items.IItemHandler ;
import net.minecraftforge.items.wrapper.InvWrapper ;
import net.minecraftforge.items.wrapper.SidedInvWrapper ;
import WayofTime.bloodmagic.util.helper.TextHelper ;
2015-10-30 03:22:14 +00:00
2016-09-08 00:46:06 +00:00
public class TileInventory extends TileBase implements IInventory
2015-12-30 20:34:40 +00:00
{
2015-11-29 02:25:46 +00:00
protected int [ ] syncedSlots = new int [ 0 ] ;
2017-01-02 09:18:29 +00:00
protected NonNullList < ItemStack > inventory ;
2015-10-30 03:22:14 +00:00
private int size ;
private String name ;
2015-12-30 20:34:40 +00:00
public TileInventory ( int size , String name )
{
2017-01-02 09:18:29 +00:00
this . inventory = NonNullList . withSize ( size , ItemStack . EMPTY ) ;
2015-10-30 03:22:14 +00:00
this . size = size ;
this . name = name ;
2016-04-13 21:58:06 +00:00
initializeItemHandlers ( ) ;
2015-10-30 03:22:14 +00:00
}
2016-08-31 01:12:40 +00:00
protected boolean isSyncedSlot ( int slot )
2015-12-30 20:34:40 +00:00
{
for ( int s : this . syncedSlots )
{
if ( s = = slot )
{
2015-11-28 01:15:19 +00:00
return true ;
}
}
return false ;
}
2015-11-03 16:42:38 +00:00
@Override
2016-09-08 00:46:06 +00:00
public void deserialize ( NBTTagCompound tagCompound )
2015-12-30 20:34:40 +00:00
{
2016-09-08 00:49:28 +00:00
super . deserialize ( tagCompound ) ;
2015-11-03 16:42:38 +00:00
NBTTagList tags = tagCompound . getTagList ( " Items " , 10 ) ;
2017-01-02 09:18:29 +00:00
inventory = NonNullList . withSize ( size , ItemStack . EMPTY ) ;
2015-11-03 16:42:38 +00:00
2015-12-30 20:34:40 +00:00
for ( int i = 0 ; i < tags . tagCount ( ) ; i + + )
{
if ( ! isSyncedSlot ( i ) )
{
2015-11-28 01:15:19 +00:00
NBTTagCompound data = tags . getCompoundTagAt ( i ) ;
2015-11-29 02:25:46 +00:00
byte j = data . getByte ( " Slot " ) ;
2015-11-03 16:42:38 +00:00
2017-01-02 09:18:29 +00:00
if ( j > = 0 & & j < inventory . size ( ) )
2015-12-30 20:34:40 +00:00
{
2017-02-26 01:59:10 +00:00
inventory . set ( j , new ItemStack ( data ) ) ; // No matter how much an i looks like a j, it is not one. They are drastically different characters and cause drastically different things to happen. Apparently I didn't know this at one point. - TehNut
2015-11-28 01:15:19 +00:00
}
2015-11-03 16:42:38 +00:00
}
}
}
@Override
2016-09-08 00:46:06 +00:00
public NBTTagCompound serialize ( NBTTagCompound tagCompound )
2015-12-30 20:34:40 +00:00
{
2016-09-08 00:49:28 +00:00
super . serialize ( tagCompound ) ;
2015-11-03 16:42:38 +00:00
NBTTagList tags = new NBTTagList ( ) ;
2017-01-02 09:18:29 +00:00
for ( int i = 0 ; i < inventory . size ( ) ; i + + )
2015-12-30 20:34:40 +00:00
{
2017-01-02 09:18:29 +00:00
if ( ( ! inventory . get ( i ) . isEmpty ( ) ) & & ! isSyncedSlot ( i ) )
2015-12-30 20:34:40 +00:00
{
2015-11-03 16:42:38 +00:00
NBTTagCompound data = new NBTTagCompound ( ) ;
data . setByte ( " Slot " , ( byte ) i ) ;
2017-01-02 09:18:29 +00:00
inventory . get ( i ) . writeToNBT ( data ) ;
2015-11-03 16:42:38 +00:00
tags . appendTag ( data ) ;
}
}
tagCompound . setTag ( " Items " , tags ) ;
2016-05-20 00:43:33 +00:00
return tagCompound ;
2015-11-03 16:42:38 +00:00
}
2015-12-30 20:34:40 +00:00
public void dropItems ( )
{
2015-11-03 17:11:39 +00:00
InventoryHelper . dropInventoryItems ( getWorld ( ) , getPos ( ) , this ) ;
2015-10-30 03:22:14 +00:00
}
// IInventory
@Override
2015-12-30 20:34:40 +00:00
public int getSizeInventory ( )
{
2015-10-30 03:22:14 +00:00
return size ;
}
@Override
2015-12-30 20:34:40 +00:00
public ItemStack getStackInSlot ( int index )
{
2017-01-02 09:18:29 +00:00
return inventory . get ( index ) ;
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public ItemStack decrStackSize ( int index , int count )
{
2017-01-02 09:18:29 +00:00
if ( ! getStackInSlot ( index ) . isEmpty ( ) )
2015-12-30 20:34:40 +00:00
{
2016-03-18 20:05:57 +00:00
if ( ! getWorld ( ) . isRemote )
getWorld ( ) . notifyBlockUpdate ( getPos ( ) , getWorld ( ) . getBlockState ( getPos ( ) ) , getWorld ( ) . getBlockState ( getPos ( ) ) , 3 ) ;
2017-01-02 09:18:29 +00:00
if ( getStackInSlot ( index ) . getCount ( ) < = count )
2015-12-30 20:34:40 +00:00
{
2017-01-02 09:18:29 +00:00
ItemStack itemStack = inventory . get ( index ) ;
inventory . set ( index , ItemStack . EMPTY ) ;
2015-11-28 01:15:19 +00:00
markDirty ( ) ;
return itemStack ;
}
2017-01-02 09:18:29 +00:00
ItemStack itemStack = inventory . get ( index ) . splitStack ( count ) ;
2015-11-28 01:15:19 +00:00
markDirty ( ) ;
return itemStack ;
}
2015-10-30 03:22:14 +00:00
2017-01-02 09:18:29 +00:00
return ItemStack . EMPTY ;
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public ItemStack removeStackFromSlot ( int slot )
{
2017-01-02 09:18:29 +00:00
if ( ! inventory . get ( slot ) . isEmpty ( ) )
2015-12-30 20:34:40 +00:00
{
2017-01-02 09:18:29 +00:00
ItemStack itemStack = inventory . get ( slot ) ;
setInventorySlotContents ( slot , ItemStack . EMPTY ) ;
2015-11-28 01:15:19 +00:00
return itemStack ;
}
2017-01-02 09:18:29 +00:00
return ItemStack . EMPTY ;
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public void setInventorySlotContents ( int slot , ItemStack stack )
{
2017-01-02 09:18:29 +00:00
inventory . set ( slot , stack ) ;
2016-12-13 03:56:36 +00:00
if ( ! stack . isEmpty ( ) & & stack . getCount ( ) > getInventoryStackLimit ( ) )
stack . setCount ( getInventoryStackLimit ( ) ) ;
2015-11-28 01:15:19 +00:00
markDirty ( ) ;
2016-03-18 20:05:57 +00:00
if ( ! getWorld ( ) . isRemote )
getWorld ( ) . notifyBlockUpdate ( getPos ( ) , getWorld ( ) . getBlockState ( getPos ( ) ) , getWorld ( ) . getBlockState ( getPos ( ) ) , 3 ) ;
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public int getInventoryStackLimit ( )
{
2015-10-30 03:22:14 +00:00
return 64 ;
}
@Override
2015-12-30 20:34:40 +00:00
public void openInventory ( EntityPlayer player )
{
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public void closeInventory ( EntityPlayer player )
{
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public boolean isItemValidForSlot ( int index , ItemStack stack )
{
2015-10-30 03:22:14 +00:00
return true ;
}
@Override
2015-12-30 20:34:40 +00:00
public int getField ( int id )
{
2015-10-30 03:22:14 +00:00
return 0 ;
}
@Override
2015-12-30 20:34:40 +00:00
public void setField ( int id , int value )
{
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public int getFieldCount ( )
{
2015-10-30 03:22:14 +00:00
return 0 ;
}
@Override
2015-12-30 20:34:40 +00:00
public void clear ( )
{
2017-01-02 09:18:29 +00:00
this . inventory = NonNullList . withSize ( size , ItemStack . EMPTY ) ;
2015-10-30 03:22:14 +00:00
}
2016-12-13 03:56:36 +00:00
@Override
public boolean isEmpty ( ) {
for ( ItemStack stack : inventory )
if ( ! stack . isEmpty ( ) )
return false ;
return true ;
}
@Override
public boolean isUsableByPlayer ( EntityPlayer player ) {
return true ;
}
2015-10-30 03:22:14 +00:00
// IWorldNameable
@Override
2015-12-30 20:34:40 +00:00
public String getName ( )
{
2017-01-02 09:18:29 +00:00
return TextHelper . localize ( " tile.bloodmagic. " + name + " .name " ) ;
2015-10-30 03:22:14 +00:00
}
@Override
2015-12-30 20:34:40 +00:00
public boolean hasCustomName ( )
{
2015-10-30 03:22:14 +00:00
return true ;
}
@Override
2016-03-17 20:00:44 +00:00
public ITextComponent getDisplayName ( )
2015-12-30 20:34:40 +00:00
{
2016-03-17 20:00:44 +00:00
return new TextComponentString ( getName ( ) ) ;
2015-10-30 03:22:14 +00:00
}
2016-04-13 21:58:06 +00:00
protected void initializeItemHandlers ( )
{
if ( this instanceof ISidedInventory )
{
handlerDown = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . DOWN ) ;
handlerUp = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . UP ) ;
handlerNorth = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . NORTH ) ;
handlerSouth = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . SOUTH ) ;
handlerWest = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . WEST ) ;
handlerEast = new SidedInvWrapper ( ( ISidedInventory ) this , EnumFacing . EAST ) ;
} else
{
handlerDown = new InvWrapper ( this ) ;
handlerUp = handlerDown ;
handlerNorth = handlerDown ;
handlerSouth = handlerDown ;
handlerWest = handlerDown ;
handlerEast = handlerDown ;
}
}
IItemHandler handlerDown ;
IItemHandler handlerUp ;
IItemHandler handlerNorth ;
IItemHandler handlerSouth ;
IItemHandler handlerWest ;
IItemHandler handlerEast ;
@SuppressWarnings ( " unchecked " )
@Override
public < T > T getCapability ( Capability < T > capability , EnumFacing facing )
{
if ( facing ! = null & & capability = = CapabilityItemHandler . ITEM_HANDLER_CAPABILITY )
{
switch ( facing )
{
case DOWN :
return ( T ) handlerDown ;
case EAST :
return ( T ) handlerEast ;
case NORTH :
return ( T ) handlerNorth ;
case SOUTH :
return ( T ) handlerSouth ;
case UP :
return ( T ) handlerUp ;
case WEST :
return ( T ) handlerWest ;
}
2016-06-29 12:26:24 +00:00
} else if ( facing = = null & & capability = = CapabilityItemHandler . ITEM_HANDLER_CAPABILITY )
{
return ( T ) handlerDown ;
2016-04-13 21:58:06 +00:00
}
return super . getCapability ( capability , facing ) ;
}
@Override
public boolean hasCapability ( Capability < ? > capability , EnumFacing facing )
{
return capability = = CapabilityItemHandler . ITEM_HANDLER_CAPABILITY | | super . hasCapability ( capability , facing ) ;
}
2015-10-30 03:22:14 +00:00
}