/*******************************************************************************
* 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.inventory;
import com.shinoow.abyssalcraft.api.APIUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.ItemStackHelper;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.util.EnumHand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.text.ITextComponent;
import net.minecraftforge.common.util.Constants;
public class InventoryCrystalBag implements IInventory
{
private String name;
public static int INV_SIZE;
private NonNullList<ItemStack> inventory;
private final ItemStack invItem;
/**
* @param itemstack - the ItemStack to which this inventory belongs
*/
public InventoryCrystalBag(ItemStack stack)
{
invItem = stack;
if (!stack.hasTagCompound())
stack.setTagCompound(new NBTTagCompound());
INV_SIZE = stack.getTagCompound().getInteger("InvSize");
inventory = NonNullList.withSize(INV_SIZE, ItemStack.EMPTY);
name = stack.getDisplayName();
readFromNBT(stack.getTagCompound());
}
@Override
public int getSizeInventory()
{
return inventory.size();
}
@Override
public ItemStack getStackInSlot(int slot)
{
return inventory.get(slot);
}
@Override
public ItemStack decrStackSize(int slot, int amount)
{
ItemStack itemstack = ItemStackHelper.getAndSplit(inventory, slot, amount);
if (!itemstack.isEmpty())
markDirty();
return itemstack;
}
@Override
public ItemStack removeStackFromSlot(int slot)
{
return ItemStackHelper.getAndRemove(inventory, slot);
}
@Override
public void setInventorySlotContents(int slot, ItemStack itemstack)
{
inventory.set(slot, itemstack);
if (!itemstack.isEmpty() && itemstack.getCount() > getInventoryStackLimit())
itemstack.setCount(getInventoryStackLimit());
markDirty();
}
@Override
public String getName()
{
return name;
}
@Override
public boolean hasCustomName()
{
return name.length() > 0;
}
@Override
public ITextComponent getDisplayName() {
return null;
}
@Override
public int getInventoryStackLimit()
{
return 64;
}
@Override
public void markDirty()
{
for (int i = 0; i < getSizeInventory(); ++i)
if (getStackInSlot(i).isEmpty())
inventory.set(i, ItemStack.EMPTY);
writeToNBT(invItem.getTagCompound());
}
@Override
public boolean isUsableByPlayer(EntityPlayer player)
{
return player.getHeldItem(EnumHand.MAIN_HAND) == invItem;
}
@Override
public void openInventory(EntityPlayer player) {}
@Override
public void closeInventory(EntityPlayer player) {}
@Override
public boolean isItemValidForSlot(int slot, ItemStack itemstack)
{
return APIUtils.isCrystal(itemstack);
}
public void readFromNBT(NBTTagCompound tagcompound)
{
NBTTagList items = tagcompound.getTagList("ItemInventory", Constants.NBT.TAG_COMPOUND);
for (int i = 0; i < items.tagCount(); ++i)
{
NBTTagCompound item = items.getCompoundTagAt(i);
byte slot = item.getByte("Slot");
if (slot >= 0 && slot < getSizeInventory())
inventory.set(slot, new ItemStack(item));
}
}
public void writeToNBT(NBTTagCompound tagcompound)
{
NBTTagList items = new NBTTagList();
for (int i = 0; i < getSizeInventory(); ++i)
if (!getStackInSlot(i).isEmpty())
{
NBTTagCompound item = new NBTTagCompound();
item.setInteger("Slot", i);
getStackInSlot(i).writeToNBT(item);
items.appendTag(item);
}
tagcompound.setTag("ItemInventory", items);
}
@Override
public int getField(int id) {
// TODO Auto-generated method stub
return 0;
}
@Override
public void setField(int id, int value) {
// TODO Auto-generated method stub
}
@Override
public int getFieldCount() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void clear() {
inventory.clear();
}
@Override
public boolean isEmpty()
{
for (ItemStack itemstack : inventory)
if (!itemstack.isEmpty())
return false;
return true;
}
}