/**
* This class was created by <Vazkii>. It's distributed as
* part of the Botania Mod. Get the Source Code in github:
* https://github.com/Vazkii/Botania
*
* Botania is Open Source and distributed under the
* Botania License: http://botaniamod.net/license.php
*
* File Created @ [Jan 21, 2014, 9:56:24 PM (GMT)]
*/
package vazkii.botania.common.block.tile;
import javax.annotation.Nonnull;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler;
public abstract class TileSimpleInventory extends TileMod {
protected SimpleItemStackHandler itemHandler = createItemHandler();
@Override
public void readPacketNBT(NBTTagCompound par1NBTTagCompound) {
itemHandler = createItemHandler();
itemHandler.deserializeNBT(par1NBTTagCompound);
}
@Override
public void writePacketNBT(NBTTagCompound par1NBTTagCompound) {
par1NBTTagCompound.merge(itemHandler.serializeNBT());
}
public abstract int getSizeInventory();
protected SimpleItemStackHandler createItemHandler() {
return new SimpleItemStackHandler(this, true);
}
public IItemHandlerModifiable getItemHandler() {
return itemHandler;
}
@Override
public boolean hasCapability(@Nonnull Capability<?> cap, EnumFacing side) {
return cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY || super.hasCapability(cap, side);
}
@Override
public <T> T getCapability(@Nonnull Capability<T> cap, EnumFacing side) {
if(cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
return CapabilityItemHandler.ITEM_HANDLER_CAPABILITY.cast(itemHandler);
return super.getCapability(cap, side);
}
/* Extension of ItemStackHandler that uses our own slot array, allows for control of writing,
allows control over stack limits, and allows for itemstack-slot validation */
protected static class SimpleItemStackHandler extends ItemStackHandler {
private final boolean allowWrite;
private final TileSimpleInventory tile;
public SimpleItemStackHandler(TileSimpleInventory inv, boolean allowWrite) {
super(inv.getSizeInventory());
this.allowWrite = allowWrite;
tile = inv;
}
@Nonnull
@Override
public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) {
if(allowWrite) {
return super.insertItem(slot, stack, simulate);
} else return stack;
}
@Nonnull
@Override
public ItemStack extractItem(int slot, int amount, boolean simulate) {
if(allowWrite) {
return super.extractItem(slot, amount, simulate);
} else return ItemStack.EMPTY;
}
@Override
public void onContentsChanged(int slot) {
tile.markDirty();
}
}
}