package imdutch21.oilcraft.tileentity; import imdutch21.oilcraft.util.InventoryUtils; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyReceiver; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; 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.text.ITextComponent; import net.minecraftforge.fluids.*; public class TileEntityOilFurnace extends OCTickingTileEntity implements ISidedInventory, IFluidHandler, IEnergyReceiver, IEnergyHandler { public FluidTank tank = new FluidTank(10000); public EnergyStorage energyStorage = new EnergyStorage(8000, 1000); public ItemStack[] items = new ItemStack[2]; public int progress = 0; public int timeToProcess = 200; public int timesLeft = 0; @Override public void update() { super.update(); if (worldObj.isRemote) return; if (items[0] != null) { ItemStack output = FurnaceRecipes.instance().getSmeltingResult(items[0]); if (output != null && (items[1] == null || (matches(items[1], output) && items[1].stackSize + output.stackSize <= items[1].getMaxStackSize())) && energyStorage.getEnergyStored() - 1600 >= 0) { if (progress >= timeToProcess * (timesLeft > 0 ? 0.6f : 1)) { decrStackSize(0, 1); if (items[1] == null) items[1] = output.copy(); else items[1].stackSize += output.stackSize; energyStorage.extractEnergy(1600, false); if (timesLeft > 0) timesLeft--; progress = 0; worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); } else { progress++; } } else progress = 0; } else progress = 0; if (timesLeft == 0 && tank.getFluidAmount() >= 100) { tank.drain(100, true); timesLeft = 20; worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); } } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tank.readFromNBT(nbt); InventoryUtils.loadInventory(nbt, this); energyStorage.readFromNBT(nbt); progress = nbt.getInteger("progress"); timesLeft = nbt.getInteger("timesLeft"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); tank.writeToNBT(nbt); InventoryUtils.saveInventory(nbt, this); energyStorage.writeToNBT(nbt); nbt.setInteger("progress", progress); nbt.setInteger("timesLeft", timesLeft); return nbt; } @Override public SPacketUpdateTileEntity getUpdatePacket() { NBTTagCompound tag = new NBTTagCompound(); writeToNBT(tag); return new SPacketUpdateTileEntity(getPos(), 0, tag); } @Override public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) { NBTTagCompound nbt = packet.getNbtCompound(); readFromNBT(nbt); } @Override public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return energyStorage.receiveEnergy(maxReceive, simulate); } @Override public int getEnergyStored(EnumFacing from) { return energyStorage.getEnergyStored(); } @Override public int getMaxEnergyStored(EnumFacing from) { return energyStorage.getMaxEnergyStored(); } @Override public boolean canConnectEnergy(EnumFacing from) { return true; } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { if (resource.getFluid() == FluidRegistry.getFluid("oil")) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return tank.fill(resource, doFill); } else return 0; } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { return null; } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { return null; } @Override public boolean canFill(EnumFacing from, Fluid fluid) { return fluid == FluidRegistry.getFluid("oil"); } @Override public boolean canDrain(EnumFacing from, Fluid fluid) { return false; } @Override public FluidTankInfo[] getTankInfo(EnumFacing from) { return new FluidTankInfo[]{new FluidTankInfo(tank)}; } @Override public int[] getSlotsForFace(EnumFacing side) { if (side == EnumFacing.DOWN) return new int[]{1}; else return new int[]{0}; } @Override public boolean canInsertItem(int index, ItemStack itemStackIn, EnumFacing direction) { return direction != EnumFacing.DOWN && index == 0; } @Override public boolean canExtractItem(int index, ItemStack stack, EnumFacing direction) { return direction == EnumFacing.DOWN && index == 1; } @Override public int getSizeInventory() { return 2; } @Override public ItemStack getStackInSlot(int index) { if (index > items.length) return null; return items[index]; } @Override public ItemStack decrStackSize(int index, int count) { if (this.items[index] != null) { ItemStack itemstack; if (this.items[index].stackSize <= count) { itemstack = this.items[index]; this.items[index] = null; return itemstack; } else { itemstack = this.items[index].splitStack(count); if (this.items[index].stackSize == 0) { this.items[index] = null; } return itemstack; } } else { return null; } } @Override public ItemStack removeStackFromSlot(int index) { if (index > items.length) return null; if (this.items[index] != null) { ItemStack itemstack = this.items[index]; this.items[index] = null; return itemstack; } else { return null; } } @Override public void setInventorySlotContents(int index, ItemStack stack) { this.items[index] = stack; if (stack != null && stack.stackSize > this.getInventoryStackLimit()) { stack.stackSize = this.getInventoryStackLimit(); } } @Override public int getInventoryStackLimit() { return 64; } @Override public boolean isUseableByPlayer(EntityPlayer player) { return true; } @Override public void openInventory(EntityPlayer player) { } @Override public void closeInventory(EntityPlayer player) { } @Override public boolean isItemValidForSlot(int index, ItemStack stack) { return index == 0; } @Override public int getField(int id) { return 0; } @Override public void setField(int id, int value) { } @Override public int getFieldCount() { return 0; } @Override public void clear() { for (int i = 0; i < items.length; ++i) { this.items[i] = null; } } @Override public String getName() { return "container.oilFurnace"; } @Override public boolean hasCustomName() { return false; } @Override public ITextComponent getDisplayName() { return null; } }