package choonster.testmod3.tileentity;
import choonster.testmod3.api.capability.lock.ILock;
import choonster.testmod3.capability.lock.CapabilityLock;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.items.IItemHandler;
import javax.annotation.Nullable;
/**
* A {@link TileEntity} with a single {@link IItemHandler} inventory, locked with an {@link ILock}.
*
* @author Choonster
*/
public abstract class TileEntityItemHandlerLockable<INVENTORY extends IItemHandler & INBTSerializable<NBTTagCompound>, LOCK extends ILock & INBTSerializable<NBTTagCompound>> extends TileEntityItemHandler<INVENTORY> {
/**
* The lock.
*/
protected final LOCK lock = createLock();
/**
* Create and return the lock.
*
* @return The lock
*/
protected abstract LOCK createLock();
@Override
public void openGUI(World world, EntityPlayer player) {
if (lock.tryOpen(player)) {
super.openGUI(world, player);
}
}
@Override
public void readFromNBT(NBTTagCompound compound) {
super.readFromNBT(compound);
lock.deserializeNBT(compound.getCompoundTag("Lock"));
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound compound) {
super.writeToNBT(compound);
compound.setTag("Lock", lock.serializeNBT());
return compound;
}
@Override
public NBTTagCompound getUpdateTag() {
final NBTTagCompound updateTag = super.getUpdateTag();
updateTag.setTag("Lock", lock.serializeNBT());
return updateTag;
}
@Nullable
@Override
public SPacketUpdateTileEntity getUpdatePacket() {
return new SPacketUpdateTileEntity(getPos(), 0, getUpdateTag());
}
@Override
public boolean hasCapability(Capability<?> capability, @Nullable EnumFacing facing) {
return capability == CapabilityLock.LOCK_CAPABILITY || super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
if (capability == CapabilityLock.LOCK_CAPABILITY) {
return CapabilityLock.LOCK_CAPABILITY.cast(lock);
}
return super.getCapability(capability, facing);
}
}