package crazypants.enderio.fluid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import cpw.mods.fml.common.Loader;
import crazypants.enderio.Log;
public class FluidFuelRegister implements IFluidRegister {
public static final FluidFuelRegister instance = new FluidFuelRegister();
private static final String KEY_FLUID_NAME = "fluidName";
private static final String KEY_POWER_PER_CYCLE = "powerPerCycle";
private static final String KEY_TOTAL_BURN_TIME = "totalBurnTime";
private static final String KEY_COOLING_PER_MB = "coolingPerMb";
private final Map<String, IFluidCoolant> coolants = new HashMap<String, IFluidCoolant>();
private final Map<String, IFluidFuel> fuels = new HashMap<String, IFluidFuel>();
private final List<IFluidRegister> otherRegisters = new ArrayList<IFluidRegister>();
private FluidFuelRegister() {
addCoolant(FluidRegistry.WATER, 0.0023f);
if(Loader.isModLoaded("BuildCraft|Energy")) {
try {
IFluidRegister reg = (IFluidRegister) Class.forName("crazypants.enderio.fluid.BuildCraftFluidRegister").newInstance();
otherRegisters.add(reg);
} catch (Exception e) {
Log.error("FluidFuelRegister: Error occured registering build craft fuels: " + e);
}
}
}
public void addCoolant(NBTTagCompound tag) {
if(tag == null) {
return;
}
if(!tag.hasKey(KEY_FLUID_NAME)) {
return;
}
if(!tag.hasKey(KEY_COOLING_PER_MB)) {
return;
}
addCoolant(tag.getString(KEY_FLUID_NAME), tag.getFloat(KEY_COOLING_PER_MB));
}
public void addCoolant(String fluidName, float degreesCoolingPerMB) {
addCoolant(FluidRegistry.getFluid(fluidName), degreesCoolingPerMB);
}
@Override
public void addCoolant(Fluid fluid, float degreesCoolingPerMB) {
if(fluid == null || coolants.get(fluid.getName()) != null) {
return;
}
coolants.put(fluid.getName(), new CoolantImpl(fluid, degreesCoolingPerMB));
for (IFluidRegister reg : otherRegisters) {
reg.addCoolant(fluid, degreesCoolingPerMB);
}
}
@Override
public IFluidCoolant getCoolant(Fluid fluid) {
if(fluid == null) {
return null;
}
IFluidCoolant res = coolants.get(fluid.getName());
if(res == null && !coolants.containsKey(fluid.getName())) {
for (IFluidRegister reg : otherRegisters) {
res = reg.getCoolant(fluid);
if(res != null) {
break;
}
}
coolants.put(fluid.getName(), res);
}
return res;
}
@Override
public IFluidCoolant getCoolant(FluidStack fluid) {
if(fluid == null || fluid.getFluid() == null) {
return null;
}
return getCoolant(fluid.getFluid());
}
public void addFuel(NBTTagCompound tag) {
if(tag == null) {
return;
}
if(!tag.hasKey(KEY_FLUID_NAME)) {
return;
}
if(!tag.hasKey(KEY_POWER_PER_CYCLE)) {
return;
}
if(!tag.hasKey(KEY_TOTAL_BURN_TIME)) {
return;
}
addFuel(tag.getString(KEY_FLUID_NAME), tag.getInteger(KEY_POWER_PER_CYCLE), tag.getInteger(KEY_TOTAL_BURN_TIME));
}
public void addFuel(String fluidName, int powerPerCycleRF, int totalBurnTime) {
addFuel(FluidRegistry.getFluid(fluidName), powerPerCycleRF, totalBurnTime);
}
@Override
public void addFuel(Fluid fluid, int powerPerCycleRF, int totalBurnTime) {
if(fluid == null || fuels.get(fluid.getName()) != null) {
return;
}
fuels.put(fluid.getName(), new FuelImpl(fluid, powerPerCycleRF, totalBurnTime));
for (IFluidRegister reg : otherRegisters) {
reg.addFuel(fluid, powerPerCycleRF, totalBurnTime);
}
}
@Override
public IFluidFuel getFuel(Fluid fluid) {
if(fluid == null) {
return null;
}
IFluidFuel res = fuels.get(fluid.getName());
if(res == null && !fuels.containsKey(fluid.getName())) {
for (IFluidRegister reg : otherRegisters) {
res = reg.getFuel(fluid);
if(res != null) {
break;
}
}
fuels.put(fluid.getName(), res);
}
return res;
}
@Override
public IFluidFuel getFuel(FluidStack fluid) {
if(fluid == null || fluid.getFluid() == null) {
return null;
}
return getFuel(fluid.getFluid());
}
public static class FuelImpl implements IFluidFuel {
private final Fluid fluid;
private final int powerPerCycle;
private final int totalBurningTime;
public FuelImpl(Fluid fluid, int powerPerCycle, int totalBurningTime) {
this.fluid = fluid;
this.powerPerCycle = powerPerCycle;
this.totalBurningTime = totalBurningTime;
}
@Override
public Fluid getFluid() {
return fluid;
}
@Override
public int getTotalBurningTime() {
return totalBurningTime;
}
@Override
public int getPowerPerCycle() {
return powerPerCycle;
}
}
public static class CoolantImpl implements IFluidCoolant {
private final Fluid fluid;
private final float degreesCoolingPerMB;
public CoolantImpl(Fluid fluid, float degreesCoolingPerMB) {
this.fluid = fluid;
this.degreesCoolingPerMB = degreesCoolingPerMB;
}
@Override
public Fluid getFluid() {
return fluid;
}
@Override
public float getDegreesCoolingPerMB(float heat) {
return degreesCoolingPerMB;
}
}
}