package com.agilemods.materiamuto.common.tile; import com.agilemods.materiamuto.common.config.data.EMCConstants; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import com.agilemods.materiamuto.common.core.helpers.InventoryHelper; import com.agilemods.materiamuto.common.core.helpers.MathFX; import com.agilemods.materiamuto.common.emc.EMCRegistry; import com.agilemods.materiamuto.common.tile.prefab.TileMM; public class TileCondenser extends TileMM implements IInventory { public static final int TARGET_SLOT = 91; public static final int INVENTORY_SIZE = 92; public static final int ANIMATION_TICK_MIN = 0; public static final int ANIMATION_TICK_MAX = 20; private int animationCooldown; public int animationTick; public boolean open; private ItemStack[] inventory = new ItemStack[INVENTORY_SIZE]; public double targetEmc; private double lastEmc; public double emc; @Override public void updateEntity() { if (!open) { if (animationTick < ANIMATION_TICK_MAX) { animationTick++; } } else { if (animationTick > ANIMATION_TICK_MIN) { animationTick--; } } if (!worldObj.isRemote) { if (animationCooldown > 0) { animationCooldown--; } ItemStack targetStack = getStackInSlot(TARGET_SLOT); boolean acted = false; if (targetStack != null) { targetEmc = EMCRegistry.getEMC(targetStack); for (int i = 0; i < TARGET_SLOT; i++) { ItemStack itemStack = getStackInSlot(i); double emc = EMCRegistry.getEMC(itemStack); if (itemStack != null && emc > 0 && (this.emc + emc) <= EMCConstants.CONDENSER_MAX_EMC) { if (itemStack.isItemEqual(targetStack)) { continue; } acted = true; itemStack.stackSize--; if (itemStack.stackSize <= 0) { setInventorySlotContents(i, null); } this.emc += emc; break; } } if (emc >= targetEmc) { ItemStack itemStack = targetStack.copy(); itemStack.stackSize = 1; if (insertStack(itemStack) == null) { acted = true; emc -= targetEmc; } } if (emc != lastEmc) { acted = true; lastEmc = emc; } setOpen(acted); } else { setOpen(false); } } } private void setOpen(boolean open) { if (animationCooldown > 0) { return; } if (this.open != open) { this.open = open; worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); animationCooldown = 20 * 15; } } public float getAnimationInterpolation() { return MathFX.sinerp(0F, 1F, ((float) animationTick / (float) ANIMATION_TICK_MAX)); } private ItemStack insertStack(ItemStack itemStack) { for (int i = 0; i < TARGET_SLOT; i++) { if (itemStack == null || itemStack.stackSize <= 0) { return null; } ItemStack slotStack = getStackInSlot(i); if (slotStack == null) { setInventorySlotContents(i, itemStack.copy()); return null; } if (!(itemStack.isItemEqual(slotStack))) { continue; } int remainingAmount = slotStack.getMaxStackSize() - slotStack.stackSize; if (remainingAmount <= 0) { continue; } if (itemStack.stackSize <= remainingAmount) { slotStack.stackSize += itemStack.stackSize; return null; } else { itemStack.stackSize -= remainingAmount; } } return itemStack; } @Override public void onBlockBroken() { InventoryHelper.dropContents(this, worldObj, xCoord, yCoord, zCoord); } @Override public void writeCustomNBT(NBTTagCompound nbtTagCompound) { InventoryHelper.writeToNBT(this, nbtTagCompound); nbtTagCompound.setDouble("emc", emc); nbtTagCompound.setBoolean("open", open); } @Override public void readCustomNBT(NBTTagCompound nbtTagCompound) { InventoryHelper.readFromNBT(this, nbtTagCompound); emc = nbtTagCompound.getDouble("emc"); open = nbtTagCompound.getBoolean("open"); } @Override public int getSizeInventory() { return INVENTORY_SIZE; } @Override public ItemStack getStackInSlot(int slot) { return slot >= 0 && slot < getSizeInventory() ? inventory[slot] : null; } @Override public void setInventorySlotContents(int slot, ItemStack itemStack) { if (slot >= 0 && slot < getSizeInventory()) { inventory[slot] = itemStack; } } @Override public ItemStack decrStackSize(int slot, int amount) { ItemStack itemStack = getStackInSlot(slot); if (itemStack != null) { ItemStack returnedStack; if (itemStack.stackSize <= amount) { returnedStack = itemStack.copy(); setInventorySlotContents(slot, null); this.markDirty(); return returnedStack; } else { returnedStack = itemStack.splitStack(amount); if (itemStack.stackSize == 0) { setInventorySlotContents(0, null); } this.markDirty(); return returnedStack; } } else { return null; } } @Override public ItemStack getStackInSlotOnClosing(int slot) { ItemStack itemStack = getStackInSlot(slot); if (itemStack != null) { ItemStack returnedStack = itemStack.copy(); setInventorySlotContents(slot, null); return returnedStack; } else { return null; } } @Override public String getInventoryName() { return "container.condenser"; } @Override public boolean hasCustomInventoryName() { return false; } @Override public int getInventoryStackLimit() { return 64; } @Override public void markDirty() { } @Override public boolean isUseableByPlayer(EntityPlayer entityPlayer) { return true; } @Override public void openInventory() { } @Override public void closeInventory() { } @Override public boolean isItemValidForSlot(int slot, ItemStack itemStack) { return true; } }