package eiteam.esteemedinnovation.metalcasting.mold;
import eiteam.esteemedinnovation.api.crucible.CrucibleLiquid;
import eiteam.esteemedinnovation.api.mold.CrucibleMold;
import eiteam.esteemedinnovation.api.tile.TileEntityBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetworkManager;
import net.minecraft.network.play.server.SPacketUpdateTileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.text.ITextComponent;
public class TileEntityMold extends TileEntityBase implements ISidedInventory, ITickable {
private static final int[] moldSlots = new int[] {0};
public boolean isOpen = true;
public ItemStack mold;
public int changeTicks = 0;
private ItemStack inventory;
@Override
public SPacketUpdateTileEntity getUpdatePacket() {
super.getUpdatePacket();
NBTTagCompound access = new NBTTagCompound();
access.setBoolean("isOpen", isOpen);
access.setInteger("changeTicks", changeTicks);
NBTTagCompound nbttagcompound1;
if (mold != null) {
nbttagcompound1 = new NBTTagCompound();
mold.writeToNBT(nbttagcompound1);
access.setTag("mold", nbttagcompound1);
}
if (inventory != null) {
nbttagcompound1 = new NBTTagCompound();
inventory.writeToNBT(nbttagcompound1);
access.setTag("inventory", nbttagcompound1);
}
return new SPacketUpdateTileEntity(pos, 1, access);
}
@Override
public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity pkt) {
super.onDataPacket(net, pkt);
NBTTagCompound access = pkt.getNbtCompound();
isOpen = access.getBoolean("isOpen");
if (changeTicks == 0) {
changeTicks = access.getInteger("changeTicks");
}
if (access.hasKey("inventory")) {
inventory = ItemStack.loadItemStackFromNBT(access.getCompoundTag("inventory"));
}
mold = access.hasKey("mold") ? ItemStack.loadItemStackFromNBT(access.getCompoundTag("mold")) : null;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
isOpen = nbt.getBoolean("isOpen");
if (nbt.hasKey("inventory")) {
inventory = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("inventory"));
}
mold = nbt.hasKey("mold") ? ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("mold")) : null;
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setBoolean("isOpen", isOpen);
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
if (mold != null) {
mold.writeToNBT(nbttagcompound1);
nbt.setTag("mold", nbttagcompound1);
}
if (inventory != null) {
inventory.writeToNBT(nbttagcompound1);
nbt.setTag("inventory", nbttagcompound1);
}
return nbt;
}
public boolean canPour() {
return !isOpen && mold != null && inventory == null;
}
public void pour(CrucibleLiquid liquid) {
inventory = ((CrucibleMold) mold.getItem()).getItemFromLiquid(liquid, mold);
inventory.stackSize = 1;
markDirty();
}
public void dropItem(ItemStack item) {
EntityItem entityItem = new EntityItem(worldObj, pos.getX() + 0.5F, pos.getY() + 1.5F, pos.getZ() + 0.5F, item);
worldObj.spawnEntityInWorld(entityItem);
}
@Override
public int getSizeInventory() {
return 1;
}
@Override
public ItemStack getStackInSlot(int var1) {
return inventory;
}
@Override
public ItemStack decrStackSize(int slot, int amt) {
markDirty();
if (inventory.stackSize <= amt) {
ItemStack itemstack = inventory;
inventory = null;
return itemstack;
}
ItemStack itemstack = inventory.splitStack(amt);
if (inventory.stackSize == 0) {
inventory = null;
}
return itemstack;
}
@Override
public ItemStack removeStackFromSlot(int slot) {
if (inventory != null) {
ItemStack itemstack = inventory;
inventory = null;
return itemstack;
}
return null;
}
@Override
public void setInventorySlotContents(int slot, ItemStack stack) {
inventory = stack;
}
@Override
public String getName() {
return "container.mold";
}
@Override
public boolean hasCustomName() {
return false;
}
@Override
public ITextComponent getDisplayName() {
return null;
}
@Override
public int getInventoryStackLimit() {
return 1;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return this.isOpen;
}
@Override
public void openInventory(EntityPlayer player) {}
@Override
public void closeInventory(EntityPlayer player) {}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
return false;
}
@Override
public int getField(int id) {
return changeTicks;
}
@Override
public void setField(int id, int value) {
changeTicks = value;
}
@Override
public int getFieldCount() {
return 1;
}
@Override
public void clear() {
inventory = null;
}
@Override
public int[] getSlotsForFace(EnumFacing side) {
if (side == EnumFacing.DOWN) {
return moldSlots;
}
return new int[0];
}
@Override
public boolean canInsertItem(int slot, ItemStack item, EnumFacing side) {
return false;
}
@Override
public boolean canExtractItem(int slot, ItemStack item, EnumFacing side) {
return true;
}
@Override
public void update() {
if (changeTicks > 0) {
changeTicks--;
}
if (isOpen && inventory != null && changeTicks < 10) {
if (!worldObj.isRemote) {
dropItem(inventory);
}
inventory = null;
}
}
}