/**
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
* <p/>
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.energy.fuels;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import buildcraft.api.core.StackKey;
import buildcraft.api.fuels.ICoolant;
import buildcraft.api.fuels.ICoolantManager;
import buildcraft.api.fuels.ISolidCoolant;
public final class CoolantManager implements ICoolantManager {
public static final CoolantManager INSTANCE = new CoolantManager();
private final List<ICoolant> coolants = new LinkedList<ICoolant>();
private final List<ISolidCoolant> solidCoolants = new LinkedList<ISolidCoolant>();
private CoolantManager() {
}
@Override
public ICoolant addCoolant(ICoolant coolant) {
coolants.add(coolant);
return coolant;
}
@Override
public ICoolant addCoolant(Fluid fluid, float degreesCoolingPerMB) {
return addCoolant(new BCCoolant(fluid, degreesCoolingPerMB));
}
@Override
public ISolidCoolant addSolidCoolant(ISolidCoolant solidCoolant) {
solidCoolants.add(solidCoolant);
return solidCoolant;
}
@Override
public ISolidCoolant addSolidCoolant(StackKey solid, StackKey liquid, float multiplier) {
assert solid.stack != null && solid.fluidStack == null;
assert liquid.stack == null && liquid.fluidStack != null;
return addSolidCoolant(new BCSolidCoolant(solid, liquid, multiplier));
}
@Override
public Collection<ICoolant> getCoolants() {
return coolants;
}
@Override
public Collection<ISolidCoolant> getSolidCoolants() {
return solidCoolants;
}
@Override
public ICoolant getCoolant(Fluid fluid) {
for (ICoolant coolant : coolants) {
if (coolant.getFluid() == fluid) {
return coolant;
}
}
return null;
}
@Override
public ISolidCoolant getSolidCoolant(StackKey solid) {
assert solid.stack != null && solid.fluidStack == null;
for (ISolidCoolant solidCoolant : solidCoolants) {
if (solidCoolant.getFluidFromSolidCoolant(solid.stack) != null) {
return solidCoolant;
}
}
return null;
}
private static final class BCCoolant implements ICoolant {
private final Fluid fluid;
private final float degreesCoolingPerMB;
public BCCoolant(Fluid fluid, float degreesCoolingPerMB) {
this.fluid = fluid;
this.degreesCoolingPerMB = degreesCoolingPerMB;
}
@Override
public Fluid getFluid() {
return fluid;
}
@Override
public float getDegreesCoolingPerMB(float heat) {
return degreesCoolingPerMB;
}
}
private static final class BCSolidCoolant implements ISolidCoolant {
private final StackKey solid;
private final StackKey liquid;
private final float multiplier;
public BCSolidCoolant(StackKey solid, StackKey liquid, float multiplier) {
this.solid = solid;
this.liquid = liquid;
this.multiplier = multiplier;
}
@Override
public FluidStack getFluidFromSolidCoolant(ItemStack stack) {
if (stack == null || !stack.isItemEqual(solid.stack)) {
return null;
}
int liquidAmount = (int) (stack.stackSize * liquid.fluidStack.amount * multiplier / solid.stack.stackSize);
return new FluidStack(liquid.fluidStack.getFluid(), liquidAmount);
}
}
}