/*
* Copyright (c) CovertJaguar, 2014 http://railcraft.info
*
* This code is the property of CovertJaguar
* and may only be used with explicit written
* permission unless otherwise specified on the
* license page at http://railcraft.info/wiki/info:license.
*/
package mods.railcraft.common.blocks.machine.beta;
import mods.railcraft.common.util.steam.ISteamUser;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Random;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import mods.railcraft.common.gui.EnumGui;
import mods.railcraft.common.gui.GuiHandler;
import mods.railcraft.common.fluids.Fluids;
import mods.railcraft.common.util.effects.EffectManager;
import mods.railcraft.common.fluids.FluidHelper;
import mods.railcraft.common.fluids.TankManager;
import mods.railcraft.common.fluids.tanks.FilteredTank;
import mods.railcraft.common.util.misc.MiscTools;
import mods.railcraft.common.util.sounds.SoundHelper;
import mods.railcraft.common.util.steam.Steam;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
/**
*
* @author CovertJaguar <http://www.railcraft.info>
*/
public abstract class TileEngineSteam extends TileEngine implements IFluidHandler, ISteamUser {
private final static int TANK_CAPACITY = 8 * FluidHelper.BUCKET_VOLUME;
public final static int TANK_STEAM = 0;
private final FilteredTank steamTank;
private final TankManager tankManager = new TankManager();
private int steamUsed;
public TileEngineSteam() {
steamTank = new FilteredTank(TANK_CAPACITY, Fluids.STEAM.get(), this);
tankManager.add(steamTank);
}
@Override
protected void playSoundOut() {
SoundHelper.playSoundClient(worldObj, xCoord, yCoord, zCoord, SoundHelper.SOUND_STEAM_BURST, 0.15F, (float) (0.5F + MiscTools.getRand().nextGaussian() * 0.1));
}
@Override
protected void playSoundIn() {
SoundHelper.playSoundClient(worldObj, xCoord, yCoord, zCoord, SoundHelper.SOUND_STEAM_BURST, 0.15F, (float) (1 + MiscTools.getRand().nextGaussian() * 0.1));
}
private int getParticleRate() {
switch (getEnergyStage()) {
case BLUE:
return 1;
case GREEN:
return 2;
case YELLOW:
return 3;
case ORANGE:
return 4;
case RED:
return 5;
case OVERHEAT:
return 8;
default:
return 0;
}
}
@Override
public boolean openGui(EntityPlayer player) {
GuiHandler.openGui(EnumGui.ENGINE_STEAM, player, worldObj, xCoord, yCoord, zCoord);
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void randomDisplayTick(Random rand) {
if (isActive() || getEnergyStage() == EnergyStage.OVERHEAT) {
int steamRate = getParticleRate();
for (int i = 0; i < steamRate; i++) {
EffectManager.instance.steamEffect(worldObj, this, 0);
}
}
}
@Override
public void burn() {
int output = 0;
if (getEnergyStage() != EnergyStage.OVERHEAT) {
if (isPowered()) {
FluidStack steam = steamTank.getFluid();
if (steam != null && steam.amount >= steamTank.getCapacity() / 2 - Steam.STEAM_PER_UNIT_WATER) {
steam = tankManager.drain(0, steamUsedPerTick() - 1, true);
if (steam != null)
steamUsed += steam.amount;
}
}
FluidStack steam = tankManager.drain(0, 1, true);
if (steam != null)
steamUsed += steam.amount;
if (isPowered()) {
if (steamUsed >= steamUsedPerTick()) {
steamUsed -= steamUsedPerTick();
output = getMaxOutputRF();
addEnergy(output);
}
} else {
steamUsed = 0;
ventSteam();
}
}
currentOutput = (currentOutput * 74 + output) / 75f;
}
@Override
protected void overheat() {
super.overheat();
ventSteam();
}
protected void ventSteam() {
getTankManager().drain(TANK_STEAM, 5, true);
}
@Override
public final int maxEnergyExtracted() {
return getMaxOutputRF() * 8;
}
public abstract int getMaxOutputRF();
public abstract int steamUsedPerTick();
@Override
public void writeToNBT(NBTTagCompound data) {
super.writeToNBT(data);
tankManager.writeTanksToNBT(data);
}
@Override
public void readFromNBT(NBTTagCompound data) {
super.readFromNBT(data);
tankManager.readTanksFromNBT(data);
}
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
return null;
}
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
return null;
}
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
if (!isPowered())
return 0;
return tankManager.fill(0, resource, doFill);
}
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid) {
return false;
}
@Override
public boolean canFill(ForgeDirection from, Fluid fluid) {
if (getOrientation() == from)
return false;
return Fluids.STEAM.is(fluid);
}
@Override
public FluidTankInfo[] getTankInfo(ForgeDirection from) {
if (getOrientation() == from)
return null;
return tankManager.getTankInfo();
}
public TankManager getTankManager() {
return tankManager;
}
}