package mcjty.rftools.varia;
import cofh.api.energy.IEnergyHandler;
import cofh.api.energy.IEnergyProvider;
import cofh.api.energy.IEnergyReceiver;
import mcjty.rftools.RFTools;
import mcjty.rftools.apideps.DraconicEvolutionCompatibility;
import mcjty.rftools.apideps.EnderIOCompatibility;
import mcjty.rftools.apideps.MekanismCompatibility;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
public class EnergyTools {
public static class EnergyLevel {
private final int energy;
private final int maxEnergy;
public EnergyLevel(int energy, int maxEnergy) {
this.energy = energy;
this.maxEnergy = maxEnergy;
}
public int getEnergy() {
return energy;
}
public int getMaxEnergy() {
return maxEnergy;
}
}
public static class EnergyLevelMulti {
private final long energy;
private final long maxEnergy;
public EnergyLevelMulti(long energy, long maxEnergy) {
this.energy = energy;
this.maxEnergy = maxEnergy;
}
public long getEnergy() {
return energy;
}
public long getMaxEnergy() {
return maxEnergy;
}
}
public static boolean isEnergyTE(TileEntity te) {
return te instanceof IEnergyHandler || te instanceof IEnergyReceiver || te instanceof IEnergyProvider;
}
// Get energy level with possible support for multiblocks (like EnderIO capacitor bank).
public static EnergyLevelMulti getEnergyLevelMulti(TileEntity tileEntity) {
long maxEnergyStored;
long energyStored;
if (RFTools.instance.enderio && EnderIOCompatibility.isPowerStorage(tileEntity)) {
maxEnergyStored = EnderIOCompatibility.getMaxEnergyLevel(tileEntity);
energyStored = EnderIOCompatibility.getEnergyLevel(tileEntity);
} else if (RFTools.instance.draconicevolution && DraconicEvolutionCompatibility.isPowerStorage(tileEntity)) {
maxEnergyStored = DraconicEvolutionCompatibility.getMaxEnergyLevel(tileEntity);
energyStored = DraconicEvolutionCompatibility.getEnergyLevel(tileEntity);
} else if (RFTools.instance.mekanism && MekanismCompatibility.isPowerStorage(tileEntity)) {
maxEnergyStored = MekanismCompatibility.getMaxEnergyLevel(tileEntity);
energyStored = MekanismCompatibility.getEnergyLevel(tileEntity);
} else if (tileEntity instanceof IEnergyHandler) {
IEnergyHandler handler = (IEnergyHandler) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else if (tileEntity instanceof IEnergyReceiver) {
IEnergyReceiver handler = (IEnergyReceiver) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else if (tileEntity instanceof IEnergyProvider) {
IEnergyProvider handler = (IEnergyProvider) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else {
maxEnergyStored = 0;
energyStored = 0;
}
return new EnergyLevelMulti(energyStored, maxEnergyStored);
}
public static EnergyLevel getEnergyLevel(TileEntity tileEntity) {
int maxEnergyStored;
int energyStored;
if (tileEntity instanceof IEnergyHandler) {
IEnergyHandler handler = (IEnergyHandler) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else if (tileEntity instanceof IEnergyReceiver) {
IEnergyReceiver handler = (IEnergyReceiver) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else if (tileEntity instanceof IEnergyProvider) {
IEnergyProvider handler = (IEnergyProvider) tileEntity;
maxEnergyStored = handler.getMaxEnergyStored(ForgeDirection.DOWN);
energyStored = handler.getEnergyStored(ForgeDirection.DOWN);
} else {
maxEnergyStored = 0;
energyStored = 0;
}
return new EnergyLevel(energyStored, maxEnergyStored);
}
public static int extractEnergy(TileEntity tileEntity, ForgeDirection from, int maxExtract) {
if (tileEntity instanceof IEnergyHandler) {
return ((IEnergyHandler) tileEntity).extractEnergy(from, maxExtract, false);
} else if (tileEntity instanceof IEnergyProvider) {
return ((IEnergyProvider) tileEntity).extractEnergy(from, maxExtract, false);
} else {
return 0;
}
}
public static int receiveEnergy(TileEntity tileEntity, ForgeDirection from, int maxReceive) {
if (tileEntity instanceof IEnergyHandler) {
return ((IEnergyHandler) tileEntity).receiveEnergy(from, maxReceive, false);
} else if (tileEntity instanceof IEnergyReceiver) {
return ((IEnergyReceiver) tileEntity).receiveEnergy(from, maxReceive, false);
} else {
return 0;
}
}
}