package micdoodle8.mods.galacticraft.core.tile; import micdoodle8.mods.galacticraft.api.item.IItemOxygenSupply; import micdoodle8.mods.galacticraft.core.GCBlocks; import micdoodle8.mods.galacticraft.core.blocks.BlockMachine2; import micdoodle8.mods.galacticraft.core.inventory.IInventoryDefaults; import micdoodle8.mods.galacticraft.core.util.FluidUtil; import micdoodle8.mods.galacticraft.core.util.GCCoreUtil; import net.minecraft.block.state.IBlockState; 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 net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; public class TileEntityOxygenStorageModule extends TileEntityOxygen implements IInventoryDefaults, ISidedInventory, IFluidHandler { public final Set<EntityPlayer> playersUsing = new HashSet<EntityPlayer>(); public int scaledOxygenLevel; private int lastScaledOxygenLevel; public static final int OUTPUT_PER_TICK = 500; public static final int OXYGEN_CAPACITY = 60000; private ItemStack[] containingItems = new ItemStack[1]; public TileEntityOxygenStorageModule() { super(OXYGEN_CAPACITY, 40); this.storage.setCapacity(0); this.storage.setMaxExtract(0); } @Override public void update() { if (!this.worldObj.isRemote) { ItemStack oxygenItemStack = this.getStackInSlot(0); if (oxygenItemStack != null && oxygenItemStack.getItem() instanceof IItemOxygenSupply) { IItemOxygenSupply oxygenItem = (IItemOxygenSupply) oxygenItemStack.getItem(); int oxygenDraw = (int) Math.floor(Math.min(this.oxygenPerTick * 2.5F, this.getMaxOxygenStored() - this.getOxygenStored())); this.setOxygenStored(getOxygenStored() + oxygenItem.discharge(oxygenItemStack, oxygenDraw)); if (this.getOxygenStored() > this.getMaxOxygenStored()) { this.setOxygenStored(this.getOxygenStored()); } } } super.update(); this.scaledOxygenLevel = this.getScaledOxygenLevel(16); if (this.scaledOxygenLevel != this.lastScaledOxygenLevel) { this.worldObj.notifyLightSet(this.getPos()); } this.lastScaledOxygenLevel = this.scaledOxygenLevel; this.produceOxygen(getFront().rotateY().getOpposite()); // if (!this.worldObj.isRemote) // { // int gasToSend = Math.min(this.storedOxygen, // GCCoreTileEntityOxygenStorageModule.OUTPUT_PER_TICK); // GasStack toSend = new GasStack(GalacticraftCore.gasOxygen, // gasToSend); // this.storedOxygen -= GasTransmission.emitGasToNetwork(toSend, this, // this.getOxygenOutputDirection()); // // Vector3 thisVec = new Vector3(this); // TileEntity tileEntity = // thisVec.modifyPositionFromSide(this.getOxygenOutputDirection()).getTileEntity(this.worldObj); // // if (tileEntity instanceof IGasAcceptor) // { // if (((IGasAcceptor) // tileEntity).canReceiveGas(this.getOxygenInputDirection(), // GalacticraftCore.gasOxygen)) // { // double sendingGas = 0; // // if (this.storedOxygen >= // GCCoreTileEntityOxygenStorageModule.OUTPUT_PER_TICK) // { // sendingGas = GCCoreTileEntityOxygenStorageModule.OUTPUT_PER_TICK; // } // else // { // sendingGas = this.storedOxygen; // } // // this.storedOxygen -= sendingGas - ((IGasAcceptor) // tileEntity).receiveGas(new GasStack(GalacticraftCore.gasOxygen, (int) // Math.floor(sendingGas))); // } // } // } this.lastScaledOxygenLevel = this.scaledOxygenLevel; } @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 EnumSet<EnumFacing> getElectricalInputDirections() { return EnumSet.noneOf(EnumFacing.class); } @Override public EnumSet<EnumFacing> getElectricalOutputDirections() { return EnumSet.noneOf(EnumFacing.class); } @Override public boolean shouldPullEnergy() { return false; } @Override public boolean shouldUseEnergy() { return false; } @Override public EnumFacing getElectricInputDirection() { return null; } @Override public ItemStack getBatteryInSlot() { return null; } @Override public boolean shouldUseOxygen() { return false; } @Override public int getOxygenProvide(EnumFacing direction) { return this.getOxygenOutputDirections().contains(direction) ? Math.min(TileEntityOxygenStorageModule.OUTPUT_PER_TICK, this.getOxygenStored()) : 0; } @Override public EnumFacing getFront() { IBlockState state = this.worldObj.getBlockState(this.getPos()); if (state.getBlock() != GCBlocks.machineBase2) { return EnumFacing.NORTH; } return this.worldObj.getBlockState(getPos()).getValue(BlockMachine2.FACING); } @Override public EnumSet<EnumFacing> getOxygenInputDirections() { return EnumSet.of(getFront().rotateY()); } @Override public EnumSet<EnumFacing> getOxygenOutputDirections() { return EnumSet.of(getFront().rotateY().getOpposite()); } @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("tile.machine2.6.name"); } @Override public int getInventoryStackLimit() { return 64; } @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; } @Override public boolean hasCustomName() { return true; } @Override public boolean isItemValidForSlot(int slotID, ItemStack itemstack) { return slotID == 0 && itemstack != null && itemstack.getItem() instanceof IItemOxygenSupply; } //ISidedInventory @Override public int[] getSlotsForFace(EnumFacing side) { return new int[] { 0 }; } @Override public boolean canInsertItem(int slotID, ItemStack itemstack, EnumFacing side) { if (slotID == 0 && this.isItemValidForSlot(slotID, itemstack)) { return itemstack.getItemDamage() < itemstack.getItem().getMaxDamage(); } return false; } @Override public boolean canExtractItem(int slotID, ItemStack itemstack, EnumFacing side) { if (slotID == 0 && itemstack != null) { return FluidUtil.isEmptyContainer(itemstack); } return false; } //IFluidHandler methods - to allow this to accept Liquid Oxygen @Override public boolean canDrain(EnumFacing from, Fluid fluid) { return super.canDrain(from, fluid); } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { return super.drain(from, resource, doDrain); } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { return super.drain(from, maxDrain, doDrain); } @Override public boolean canFill(EnumFacing from, Fluid fluid) { // if (from.ordinal() == this.getBlockMetadata() - BlockMachine2.OXYGEN_STORAGE_MODULE_METADATA + 2 && GalacticraftCore.isPlanetsLoaded) // { // //Can fill with LOX only // return fluid != null && fluid.getName().equals(AsteroidsModule.fluidLiquidOxygen.getName()); // } return super.canFill(from, fluid); } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { // int used = 0; // // if (resource != null && this.canFill(from, resource.getFluid())) // { // used = (int) (this.receiveOxygen((int) Math.floor(resource.amount / Constants.LOX_GAS_RATIO), doFill) * Constants.LOX_GAS_RATIO); // } return super.fill(from, resource, doFill); } @Override public FluidTankInfo[] getTankInfo(EnumFacing from) { // FluidTankInfo[] tankInfo = new FluidTankInfo[] {}; // int metaside = this.getBlockMetadata() - BlockMachine2.OXYGEN_STORAGE_MODULE_METADATA + 2; // int side = from.ordinal(); // // if (metaside == side && GalacticraftCore.isPlanetsLoaded) // { // tankInfo = new FluidTankInfo[] { new FluidTankInfo(new FluidStack(AsteroidsModule.fluidLiquidOxygen, (int) (this.getOxygenStored() * Constants.LOX_GAS_RATIO)), (int) (OXYGEN_CAPACITY * Constants.LOX_GAS_RATIO)) }; // } // return tankInfo; return super.getTankInfo(from); } }