/*******************************************************************************
* AbyssalCraft
* Copyright (c) 2012 - 2017 Shinoow.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v3
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl-3.0.txt
*
* Contributors:
* Shinoow - implementation
******************************************************************************/
package com.shinoow.abyssalcraft.common.blocks.tile;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.ContainerChest;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.NonNullList;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponentString;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.IInteractionObject;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import com.shinoow.abyssalcraft.common.blocks.BlockCrate;
public class TileEntityCrate extends TileEntity implements IInventory, ITickable, IInteractionObject
{
private NonNullList<ItemStack> crateContents = NonNullList.withSize(36, ItemStack.EMPTY);
public int numUsingPlayers;
private int ticksSinceSync;
private int cachedCrateType;
private String customName;
public TileEntityCrate(){
cachedCrateType = -1;
}
@SideOnly(Side.CLIENT)
public TileEntityCrate(int par1){
cachedCrateType = par1;
}
@Override
public int getSizeInventory()
{
return 36;
}
@Override
public ItemStack getStackInSlot(int par1)
{
return crateContents.get(par1);
}
@Override
public ItemStack decrStackSize(int par1, int par2)
{
ItemStack itemstack = ItemStackHelper.getAndSplit(crateContents, par1, par2);
if (!itemstack.isEmpty())
markDirty();
return itemstack;
}
@Override
public ItemStack removeStackFromSlot(int par1)
{
return ItemStackHelper.getAndRemove(crateContents, par1);
}
@Override
public void setInventorySlotContents(int par1, ItemStack par2ItemStack)
{
crateContents.set(par1, par2ItemStack);
if (!par2ItemStack.isEmpty() && par2ItemStack.getCount() > getInventoryStackLimit())
par2ItemStack.setCount(getInventoryStackLimit());
markDirty();
}
@Override
public String getName()
{
return hasCustomName() ? customName : "container.abyssalcraft.crate";
}
@Override
public boolean hasCustomName()
{
return customName != null && customName.length() > 0;
}
public void func_94043_a(String par1Str)
{
customName = par1Str;
}
@Override
public void readFromNBT(NBTTagCompound par1NBTTagCompound)
{
super.readFromNBT(par1NBTTagCompound);
crateContents = NonNullList.<ItemStack>withSize(getSizeInventory(), ItemStack.EMPTY);
ItemStackHelper.loadAllItems(par1NBTTagCompound, crateContents);
if (par1NBTTagCompound.hasKey("CustomName", 8))
customName = par1NBTTagCompound.getString("CustomName");
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound par1NBTTagCompound)
{
super.writeToNBT(par1NBTTagCompound);
ItemStackHelper.saveAllItems(par1NBTTagCompound, crateContents);
if (hasCustomName())
par1NBTTagCompound.setString("CustomName", customName);
return par1NBTTagCompound;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public boolean isUsableByPlayer(EntityPlayer par1EntityPlayer)
{
return world.getTileEntity(pos) != this ? false : par1EntityPlayer.getDistanceSq(pos.getX() + 0.5D, pos.getY() + 0.5D, pos.getZ() + 0.5D) <= 64.0D;
}
@Override
public void updateContainingBlockInfo()
{
super.updateContainingBlockInfo();
}
@Override
public void update()
{
++ticksSinceSync;
if (!world.isRemote && numUsingPlayers != 0 && (ticksSinceSync + pos.getX() + pos.getY() + pos.getZ()) % 200 == 0)
numUsingPlayers = 0;
}
@Override
public boolean receiveClientEvent(int par1, int par2)
{
if (par1 == 1)
{
numUsingPlayers = par2;
return true;
} else
return super.receiveClientEvent(par1, par2);
}
@Override
public void openInventory(EntityPlayer player)
{
if (numUsingPlayers < 0)
numUsingPlayers = 0;
++numUsingPlayers;
world.addBlockEvent(pos, getBlockType(), 1, numUsingPlayers);
world.notifyNeighborsOfStateChange(pos, getBlockType(), false);
}
@Override
public void closeInventory(EntityPlayer player)
{
if (getBlockType() != null && getBlockType() instanceof BlockCrate)
{
--numUsingPlayers;
world.addBlockEvent(pos, getBlockType(), 1, numUsingPlayers);
world.notifyNeighborsOfStateChange(pos, getBlockType(), false);
}
}
@Override
public void invalidate()
{
super.invalidate();
updateContainingBlockInfo();
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
return true;
}
public int func_98041_l()
{
if (cachedCrateType == -1)
if (world == null || !(getBlockType() instanceof BlockCrate))
return 0;
return cachedCrateType;
}
@Override
public ITextComponent getDisplayName()
{
return hasCustomName() ? new TextComponentString(getName()) : new TextComponentTranslation(getName(), new Object[0]);
}
@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() {
crateContents.clear();
}
@Override
public Container createContainer(InventoryPlayer playerInventory,
EntityPlayer playerIn) {
return new ContainerChest(playerInventory, this, playerIn);
}
@Override
public String getGuiID() {
return "minecraft:chest";
}
@Override
public boolean isEmpty()
{
for (ItemStack itemstack : crateContents)
if (!itemstack.isEmpty())
return false;
return true;
}
}