package imdutch21.oilcraft.tileentity; import imdutch21.oilcraft.util.ConfigHandler; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyProvider; import cofh.api.energy.IEnergyReceiver; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.NetworkManager; import net.minecraft.network.play.server.SPacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.BlockPos; import net.minecraftforge.fluids.*; public class TileEntityOilGenerator extends OCTickingTileEntity implements IFluidHandler, IEnergyProvider, IEnergyHandler { public FluidTank tank = new FluidTank(10000); public EnergyStorage energyStorage = new EnergyStorage(80000, 1000); public boolean outputUp = false, outputDown = false, outputNorth = false, outputSouth = false, outputEast = false, outputWest = false; public int ticksLeft = 0; @Override public void update() { super.update(); if (worldObj.isRemote) return; if (ticksLeft > 0) { if (energyStorage.getEnergyStored() + ConfigHandler.OIL_GENERATOR_RF_TICK <= energyStorage.getMaxEnergyStored()) { energyStorage.receiveEnergy(ConfigHandler.OIL_GENERATOR_RF_TICK, false); ticksLeft--; worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); } } else if (tank.getFluidAmount() >= 100) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); tank.drain(100, true); ticksLeft = ConfigHandler.OIL_GENERATOR_TICKS; } distributePower(); } @Override public int extractEnergy(EnumFacing from, int maxExtract, boolean simulate) { if (outputEnabled(from.getIndex())) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return energyStorage.extractEnergy(maxExtract, simulate); } return 0; } @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 outputEnabled(from.getIndex()); } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); return tank.fill(resource, doFill); } @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 void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); tank.readFromNBT(nbt); energyStorage.readFromNBT(nbt); ticksLeft = nbt.getInteger("ticksLeft"); outputDown = nbt.getBoolean("outputDown"); outputUp = nbt.getBoolean("outputUp"); outputNorth = nbt.getBoolean("outputNorth"); outputEast = nbt.getBoolean("outputEast"); outputSouth = nbt.getBoolean("outputSouth"); outputWest = nbt.getBoolean("outputWest"); } @Override public NBTTagCompound writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); tank.writeToNBT(nbt); energyStorage.writeToNBT(nbt); nbt.setInteger("ticksLeft", ticksLeft); nbt.setBoolean("outputDown", outputDown); nbt.setBoolean("outputUp", outputUp); nbt.setBoolean("outputNorth", outputNorth); nbt.setBoolean("outputEast", outputEast); nbt.setBoolean("outputSouth", outputSouth); nbt.setBoolean("outputWest", outputWest); 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); } public void distributePower() { for (EnumFacing direction : EnumFacing.VALUES) { if (outputEnabled(direction.getIndex())) { TileEntity te = worldObj.getTileEntity(new BlockPos(getPos().getX() + direction.getFrontOffsetX(), getPos().getY() + direction.getFrontOffsetY(), getPos().getZ() + direction.getFrontOffsetZ())); if (te instanceof IEnergyHandler) { int sending = ConfigHandler.OIL_GENERATOR_RF_TICK; int received = ((IEnergyReceiver) te).receiveEnergy(direction, sending, true); if (received <= sending && received > 0 && energyStorage.getEnergyStored() >= sending) { energyStorage.extractEnergy(received, false); ((IEnergyReceiver) te).receiveEnergy(direction, received, false); worldObj.notifyBlockUpdate(getPos(), worldObj.getBlockState(getPos()), worldObj.getBlockState(getPos()), 3); worldObj.notifyBlockUpdate(te.getPos(), worldObj.getBlockState(te.getPos()), worldObj.getBlockState(te.getPos()), 3); } } } } } public boolean outputEnabled(int side) { switch (side) { case 0: return outputDown; case 1: return outputUp; case 2: return outputNorth; case 3: return outputSouth; case 4: return outputWest; case 5: return outputEast; default: return false; } } public void switchOutput(int side) { switch (side) { case 0: outputDown = !outputDown; break; case 1: outputUp = !outputUp; break; case 2: outputNorth = !outputNorth; break; case 3: outputSouth = !outputSouth; break; case 4: outputWest = !outputWest; break; case 5: outputEast = !outputEast; break; } } }