package micdoodle8.mods.galacticraft.core.tile; import micdoodle8.mods.galacticraft.core.blocks.BlockOxygenCompressor; import micdoodle8.mods.galacticraft.core.energy.item.ItemElectricBase; import micdoodle8.mods.galacticraft.core.inventory.IInventoryDefaults; import micdoodle8.mods.galacticraft.core.items.ItemOxygenTank; import micdoodle8.mods.galacticraft.core.util.GCCoreUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.EnumFacing; import java.util.EnumSet; public class TileEntityOxygenDecompressor extends TileEntityOxygen implements IInventoryDefaults, ISidedInventory { private ItemStack[] containingItems = new ItemStack[2]; public static final int OUTPUT_PER_TICK = 100; private boolean usingEnergy = false; public TileEntityOxygenDecompressor() { super(1200, 0); } @Override public void update() { super.update(); if (!this.worldObj.isRemote) { this.usingEnergy = false; ItemStack tank1 = this.containingItems[0]; if (tank1 != null && this.hasEnoughEnergyToRun && this.getOxygenStored() < this.getMaxOxygenStored()) { if (tank1.getItem() instanceof ItemOxygenTank && tank1.getItemDamage() < tank1.getMaxDamage()) { tank1.setItemDamage(tank1.getItemDamage() + 1); this.receiveOxygen(1, true); this.usingEnergy = true; } } this.produceOxygen(); } } @Override public void readFromNBT(NBTTagCompound par1NBTTagCompound) { super.readFromNBT(par1NBTTagCompound); final NBTTagList var2 = par1NBTTagCompound.getTagList("Items", 10); this.containingItems = new ItemStack[this.getSizeInventory()]; for (int var3 = 0; var3 < var2.tagCount(); ++var3) { final NBTTagCompound var4 = var2.getCompoundTagAt(var3); final int var5 = var4.getByte("Slot") & 255; if (var5 < this.containingItems.length) { this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4); } } } @Override public void writeToNBT(NBTTagCompound par1NBTTagCompound) { super.writeToNBT(par1NBTTagCompound); final NBTTagList list = new NBTTagList(); for (int var3 = 0; var3 < this.containingItems.length; ++var3) { if (this.containingItems[var3] != null) { final NBTTagCompound var4 = new NBTTagCompound(); var4.setByte("Slot", (byte) var3); this.containingItems[var3].writeToNBT(var4); list.appendTag(var4); } } par1NBTTagCompound.setTag("Items", list); } @Override public int getSizeInventory() { return this.containingItems.length; } @Override public ItemStack getStackInSlot(int par1) { return this.containingItems[par1]; } @Override public ItemStack decrStackSize(int par1, int par2) { if (this.containingItems[par1] != null) { ItemStack var3; if (this.containingItems[par1].stackSize <= par2) { var3 = this.containingItems[par1]; this.containingItems[par1] = null; return var3; } else { var3 = this.containingItems[par1].splitStack(par2); if (this.containingItems[par1].stackSize == 0) { this.containingItems[par1] = null; } return var3; } } else { return null; } } @Override public ItemStack removeStackFromSlot(int par1) { if (this.containingItems[par1] != null) { final ItemStack var2 = this.containingItems[par1]; this.containingItems[par1] = null; return var2; } else { return null; } } @Override public void setInventorySlotContents(int par1, ItemStack par2ItemStack) { this.containingItems[par1] = par2ItemStack; if (par2ItemStack != null && par2ItemStack.stackSize > this.getInventoryStackLimit()) { par2ItemStack.stackSize = this.getInventoryStackLimit(); } } @Override public String getName() { return GCCoreUtil.translate("container.oxygendecompressor.name"); } @Override public int getInventoryStackLimit() { return 1; } @Override public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) { return this.worldObj.getTileEntity(this.getPos()) == this && par1EntityPlayer.getDistanceSq(this.getPos().getX() + 0.5D, this.getPos().getY() + 0.5D, this.getPos().getZ() + 0.5D) <= 64.0D; } // ISidedInventory Implementation: @Override public int[] getSlotsForFace(EnumFacing side) { return new int[] { 0, 1 }; } @Override public boolean canInsertItem(int slotID, ItemStack itemstack, EnumFacing side) { if (this.isItemValidForSlot(slotID, itemstack)) { switch (slotID) { case 0: return itemstack.getItemDamage() < itemstack.getMaxDamage(); case 1: return itemstack.getItem() instanceof ItemElectricBase && ((ItemElectricBase) itemstack.getItem()).getElectricityStored(itemstack) > 0; default: return false; } } return false; } @Override public boolean canExtractItem(int slotID, ItemStack itemstack, EnumFacing side) { if (this.isItemValidForSlot(slotID, itemstack)) { switch (slotID) { case 0: return itemstack.getItemDamage() == itemstack.getMaxDamage(); case 1: return itemstack.getItem() instanceof ItemElectricBase && ((ItemElectricBase) itemstack.getItem()).getElectricityStored(itemstack) <= 0; default: return false; } } return false; } @Override public boolean isItemValidForSlot(int slotID, ItemStack itemstack) { switch (slotID) { case 0: return itemstack.getItem() instanceof ItemOxygenTank; case 1: return ItemElectricBase.isElectricItem(itemstack.getItem()); } return false; } @Override public boolean hasCustomName() { return true; } @Override public boolean shouldUseEnergy() { return this.usingEnergy; } @Override public EnumFacing getFront() { return this.worldObj.getBlockState(getPos()).getValue(BlockOxygenCompressor.FACING); } @Override public EnumFacing getElectricInputDirection() { return getFront().rotateY(); } @Override public ItemStack getBatteryInSlot() { return this.getStackInSlot(1); } public EnumFacing getOxygenOutputDirection() { return this.getElectricInputDirection().getOpposite(); } @Override public EnumSet<EnumFacing> getOxygenInputDirections() { return EnumSet.noneOf(EnumFacing.class); } @Override public EnumSet<EnumFacing> getOxygenOutputDirections() { return EnumSet.of(this.getElectricInputDirection().getOpposite()); } @Override public boolean shouldPullOxygen() { return false; } @Override public boolean shouldUseOxygen() { return false; } @Override public int getOxygenProvide(EnumFacing direction) { return this.getOxygenOutputDirections().contains(direction) ? Math.min(TileEntityOxygenDecompressor.OUTPUT_PER_TICK, this.getOxygenStored()) : 0; } }