package buildcraftAdditions.inventories;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.tileentity.TileEntity;
import cpw.mods.fml.common.network.ByteBufUtils;
import net.minecraftforge.common.util.Constants;
import buildcraftAdditions.api.nbt.INBTSaveable;
import buildcraftAdditions.api.networking.ISyncObject;
/**
* Copyright (c) 2014-2015, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
public class CustomInventory implements IInventory, ISyncObject, INBTSaveable {
private final ItemStack[] itemStacks;
private final String name;
private final int stackLimit;
private final TileEntity entity;
public CustomInventory(String name, int slots, int stackLimit, TileEntity entity) {
this.name = name;
this.stackLimit = stackLimit;
itemStacks = new ItemStack[slots];
this.entity = entity;
}
@Override
public void readFromNBT(NBTTagCompound tag) {
NBTTagList nbttaglist = tag.getTagList("ItemStacks", Constants.NBT.TAG_COMPOUND);
for (int t = 0; t < nbttaglist.tagCount(); t++) {
NBTTagCompound slot = nbttaglist.getCompoundTagAt(t);
int index;
if (slot.hasKey("index")) {
index = slot.getInteger("index");
} else {
index = slot.getByte("Slot");
}
if (index >= 0 && index < itemStacks.length) {
setInventorySlotContents(index, ItemStack.loadItemStackFromNBT(slot));
}
}
}
@Override
public void writeToNBT(NBTTagCompound tag) {
NBTTagList list = new NBTTagList();
for (byte t = 0; t < itemStacks.length; t++) {
if (itemStacks[t] != null && itemStacks[t].stackSize > 0) {
NBTTagCompound slot = new NBTTagCompound();
list.appendTag(slot);
slot.setByte("Slot", t);
itemStacks[t].writeToNBT(slot);
}
}
tag.setTag("ItemStacks", list);
}
@Override
public void writeToByteBuff(ByteBuf buf) {
for (ItemStack stack : itemStacks)
ByteBufUtils.writeItemStack(buf, stack);
}
@Override
public void readFromByteBuff(ByteBuf buf) {
for (int i = 0; i < itemStacks.length; i++)
itemStacks[i] = ByteBufUtils.readItemStack(buf);
}
@Override
public int getSizeInventory() {
return itemStacks.length;
}
@Override
public ItemStack getStackInSlot(int slot) {
return itemStacks[slot];
}
@Override
public ItemStack decrStackSize(int slot, int amount) {
if (slot < itemStacks.length && itemStacks[slot] != null) {
if (itemStacks[slot].stackSize > amount) {
return itemStacks[slot].splitStack(amount);
}
ItemStack stack = itemStacks[slot];
setInventorySlotContents(slot, null);
return stack;
}
return null;
}
@Override
public ItemStack getStackInSlotOnClosing(int slot) {
if (itemStacks[slot] == null) {
return null;
}
ItemStack stack = itemStacks[slot];
setInventorySlotContents(slot, null);
return stack;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
itemStacks[slot] = stack;
if (stack != null && stack.stackSize > getInventoryStackLimit()) {
stack.stackSize = getInventoryStackLimit();
}
markDirty();
}
@Override
public String getInventoryName() {
return name;
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public int getInventoryStackLimit() {
return stackLimit;
}
@Override
public void markDirty() {
entity.markDirty();
}
@Override
public boolean isUseableByPlayer(EntityPlayer var1) {
return true;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
return true;
}
}