/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.lib.inventory;
import java.util.LinkedList;
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 net.minecraftforge.common.util.Constants;
import buildcraft.api.core.INBTStoreable;
public class SimpleInventory implements IInventory, INBTStoreable {
private final ItemStack[] contents;
private final String name;
private final int stackLimit;
private final LinkedList<TileEntity> listener = new LinkedList<TileEntity>();
public SimpleInventory(int size, String invName, int invStackLimit) {
contents = new ItemStack[size];
name = invName;
stackLimit = invStackLimit;
}
@Override
public int getSizeInventory() {
return contents.length;
}
@Override
public ItemStack getStackInSlot(int slotId) {
return contents[slotId];
}
@Override
public ItemStack decrStackSize(int slotId, int count) {
if (slotId < contents.length && contents[slotId] != null) {
if (contents[slotId].stackSize > count) {
ItemStack result = contents[slotId].splitStack(count);
markDirty();
return result;
}
if (contents[slotId].stackSize < count) {
return null;
}
ItemStack stack = contents[slotId];
setInventorySlotContents(slotId, null);
return stack;
}
return null;
}
@Override
public void setInventorySlotContents(int slotId, ItemStack itemstack) {
if (slotId >= contents.length) {
return;
}
contents[slotId] = itemstack;
if (itemstack != null && itemstack.stackSize > this.getInventoryStackLimit()) {
itemstack.stackSize = this.getInventoryStackLimit();
}
markDirty();
}
@Override
public String getInventoryName() {
return name;
}
@Override
public int getInventoryStackLimit() {
return stackLimit;
}
@Override
public boolean isUseableByPlayer(EntityPlayer entityplayer) {
return true;
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public void readFromNBT(NBTTagCompound data) {
if (data.hasKey("items")) {
// this is to support legacy item load, the new format should be
// "Items"
readFromNBT(data, "items");
} else {
readFromNBT(data, "Items");
}
}
public void readFromNBT(NBTTagCompound data, String tag) {
NBTTagList nbttaglist = data.getTagList(tag, Constants.NBT.TAG_COMPOUND);
for (int j = 0; j < nbttaglist.tagCount(); ++j) {
NBTTagCompound slot = nbttaglist.getCompoundTagAt(j);
int index;
if (slot.hasKey("index")) {
index = slot.getInteger("index");
} else {
index = slot.getByte("Slot");
}
if (index >= 0 && index < contents.length) {
setInventorySlotContents(index, ItemStack.loadItemStackFromNBT(slot));
}
}
}
@Override
public void writeToNBT(NBTTagCompound data) {
writeToNBT(data, "Items");
}
public void writeToNBT(NBTTagCompound data, String tag) {
NBTTagList slots = new NBTTagList();
for (byte index = 0; index < contents.length; ++index) {
if (contents[index] != null && contents[index].stackSize > 0) {
NBTTagCompound slot = new NBTTagCompound();
slots.appendTag(slot);
slot.setByte("Slot", index);
contents[index].writeToNBT(slot);
}
}
data.setTag(tag, slots);
}
public void addListener(TileEntity listner) {
listener.add(listner);
}
@Override
public ItemStack getStackInSlotOnClosing(int slotId) {
if (this.contents[slotId] == null) {
return null;
}
ItemStack stackToTake = this.contents[slotId];
setInventorySlotContents(slotId, null);
return stackToTake;
}
public ItemStack[] getItemStacks() {
return contents;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemstack) {
return true;
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public void markDirty() {
for (TileEntity handler : listener) {
handler.markDirty();
}
}
}