package micdoodle8.mods.galacticraft.core.energy.tile;
import ic2.api.energy.tile.IEnergyAcceptor;
import ic2.api.energy.tile.IEnergyEmitter;
import ic2.api.energy.tile.IEnergySource;
import ic2.api.energy.tile.IEnergyTile;
import micdoodle8.mods.galacticraft.api.transmission.tile.IConductor;
import micdoodle8.mods.galacticraft.api.transmission.tile.IElectrical;
import micdoodle8.mods.galacticraft.api.vector.BlockVec3;
import micdoodle8.mods.galacticraft.core.energy.EnergyConfigHandler;
import micdoodle8.mods.galacticraft.core.energy.EnergyUtil;
import micdoodle8.mods.galacticraft.core.util.CompatibilityManager;
import micdoodle8.mods.miccore.Annotations.RuntimeInterface;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.common.eventhandler.Event;
public abstract class TileBaseUniversalConductor extends TileBaseConductor
{
protected boolean isAddedToEnergyNet;
private float IC2surplusJoules = 0F;
@Override
public void onNetworkChanged()
{
}
@Override
public TileEntity[] getAdjacentConnections()
{
return EnergyUtil.getAdjacentPowerConnections(this);
}
//Update ticks only required if IC2 is loaded
@RuntimeInterface(clazz = "net.minecraft.util.ITickable", modID = "IC2", deobfName = "func_73660_a")
public void update()
{
if (!this.isAddedToEnergyNet)
{
if (!this.worldObj.isRemote)
{
this.initIC();
}
this.isAddedToEnergyNet = true;
}
}
@Override
public void invalidate()
{
this.IC2surplusJoules = 0F;
this.unloadTileIC2();
super.invalidate();
}
@Override
public void onChunkUnload()
{
this.unloadTileIC2();
super.onChunkUnload();
}
protected void initIC()
{
if (EnergyConfigHandler.isIndustrialCraft2Loaded() && !this.worldObj.isRemote)
{
try
{
Object o = CompatibilityManager.classIC2tileEventLoad.getConstructor(IEnergyTile.class).newInstance(this);
if (o != null && o instanceof Event)
{
MinecraftForge.EVENT_BUS.post((Event) o);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
private void unloadTileIC2()
{
if (this.isAddedToEnergyNet && this.worldObj != null)
{
if (!this.worldObj.isRemote && EnergyConfigHandler.isIndustrialCraft2Loaded())
{
try
{
Object o = CompatibilityManager.classIC2tileEventUnload.getConstructor(IEnergyTile.class).newInstance(this);
if (o != null && o instanceof Event)
{
MinecraftForge.EVENT_BUS.post((Event) o);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
this.isAddedToEnergyNet = false;
}
}
@RuntimeInterface(clazz = "ic2.api.energy.tile.IEnergySink", modID = "IC2")
public double getDemandedEnergy()
{
if (this.getNetwork() == null)
{
return 0.0;
}
if (this.IC2surplusJoules < 0.001F)
{
this.IC2surplusJoules = 0F;
return this.getNetwork().getRequest(this) / EnergyConfigHandler.IC2_RATIO;
}
this.IC2surplusJoules = this.getNetwork().produce(this.IC2surplusJoules, true, 1, this);
if (this.IC2surplusJoules < 0.001F)
{
this.IC2surplusJoules = 0F;
return this.getNetwork().getRequest(this) / EnergyConfigHandler.IC2_RATIO;
}
return 0D;
}
@RuntimeInterface(clazz = "ic2.api.energy.tile.IEnergySink", modID = "IC2")
public double injectEnergy(EnumFacing directionFrom, double amount, double voltage)
{
TileEntity tile = new BlockVec3(this).getTileEntityOnSide(this.worldObj, directionFrom);
int tier = ((int) voltage > 120) ? 2 : 1;
if (tile instanceof IEnergySource && ((IEnergySource) tile).getOfferedEnergy() >= 128)
{
tier = 2;
}
float convertedEnergy = (float) amount * EnergyConfigHandler.IC2_RATIO;
float surplus = this.getNetwork().produce(convertedEnergy, true, tier, this, tile);
if (surplus >= 0.001F)
{
this.IC2surplusJoules = surplus;
}
else
{
this.IC2surplusJoules = 0F;
}
return 0D;
}
@RuntimeInterface(clazz = "ic2.api.energy.tile.IEnergySink", modID = "IC2")
public int getSinkTier()
{
return 3;
}
@RuntimeInterface(clazz = "ic2.api.energy.tile.IEnergyAcceptor", modID = "IC2")
public boolean acceptsEnergyFrom(IEnergyEmitter emitter, EnumFacing side)
{
//Don't add connection to IC2 grid if it's a Galacticraft tile
if (emitter instanceof IElectrical || emitter instanceof IConductor)
{
return false;
}
//Don't make connection with IC2 wires [don't want risk of multiple connections + there is a graphical glitch in IC2]
try
{
if (EnergyUtil.clazzIC2Cable != null && EnergyUtil.clazzIC2Cable.isInstance(emitter))
{
return false;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return true;
}
@RuntimeInterface(clazz = "ic2.api.energy.tile.IEnergyEmitter", modID = "IC2")
public boolean emitsEnergyTo(IEnergyAcceptor receiver, EnumFacing side)
{
//Don't add connection to IC2 grid if it's a Galacticraft tile
if (receiver instanceof IElectrical || receiver instanceof IConductor)
{
return false;
}
//Don't make connection with IC2 wires [don't want risk of multiple connections + there is a graphical glitch in IC2]
try
{
if (EnergyUtil.clazzIC2Cable != null && EnergyUtil.clazzIC2Cable.isInstance(receiver))
{
return false;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return true;
}
@RuntimeInterface(clazz = "cofh.api.energy.IEnergyReceiver", modID = "")
public int receiveEnergy(EnumFacing from, int maxReceive, boolean simulate)
{
if (this.getNetwork() == null)
{
return 0;
}
float receiveGC = maxReceive * EnergyConfigHandler.RF_RATIO;
float sentGC = receiveGC - this.getNetwork().produce(receiveGC, !simulate, 1);
return MathHelper.floor_float(sentGC / EnergyConfigHandler.RF_RATIO);
}
@RuntimeInterface(clazz = "cofh.api.energy.IEnergyProvider", modID = "")
public int extractEnergy(EnumFacing from, int maxExtract, boolean simulate)
{
return 0;
}
@RuntimeInterface(clazz = "cofh.api.energy.IEnergyHandler", modID = "")
public boolean canConnectEnergy(EnumFacing from)
{
//Do not form wire-to-wire connections with EnderIO conduits
TileEntity tile = new BlockVec3(this).getTileEntityOnSide(this.worldObj, from);
try
{
if (EnergyUtil.clazzEnderIOCable != null && EnergyUtil.clazzEnderIOCable.isInstance(tile))
{
return false;
}
if (EnergyUtil.clazzMekCable != null && EnergyUtil.clazzMekCable.isInstance(tile))
{
return false;
}
}
catch (Exception e)
{
}
return true;
}
@RuntimeInterface(clazz = "cofh.api.energy.IEnergyHandler", modID = "")
public int getEnergyStored(EnumFacing from)
{
return 0;
}
@RuntimeInterface(clazz = "cofh.api.energy.IEnergyHandler", modID = "")
public int getMaxEnergyStored(EnumFacing from)
{
if (this.getNetwork() == null)
{
return 0;
}
return MathHelper.floor_float(this.getNetwork().getRequest(this) / EnergyConfigHandler.RF_RATIO);
}
@RuntimeInterface(clazz = "mekanism.api.energy.IStrictEnergyAcceptor", modID = "Mekanism")
public double transferEnergyToAcceptor(EnumFacing side, double amount)
{
if (!this.canReceiveEnergy(side))
{
return 0;
}
return amount - this.getNetwork().produce((float) amount * EnergyConfigHandler.MEKANISM_RATIO, true, 1, this) / EnergyConfigHandler.MEKANISM_RATIO;
}
@RuntimeInterface(clazz = "mekanism.api.energy.IStrictEnergyAcceptor", modID = "Mekanism")
public boolean canReceiveEnergy(EnumFacing side)
{
if (this.getNetwork() == null)
{
return false;
}
TileEntity te = new BlockVec3(this).getTileEntityOnSide(this.worldObj, side);
try
{
if (EnergyUtil.clazzMekCable != null && EnergyUtil.clazzMekCable.isInstance(te))
{
return false;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return true;
}
@RuntimeInterface(clazz = "mekanism.api.energy.IStrictEnergyAcceptor", modID = "Mekanism")
public double getEnergy()
{
return 0;
}
@RuntimeInterface(clazz = "mekanism.api.energy.IStrictEnergyAcceptor", modID = "Mekanism")
public void setEnergy(double energy)
{
}
@RuntimeInterface(clazz = "mekanism.api.energy.IStrictEnergyAcceptor", modID = "Mekanism")
public double getMaxEnergy()
{
if (this.getNetwork() == null)
{
return 0;
}
return this.getNetwork().getRequest(this) / EnergyConfigHandler.MEKANISM_RATIO;
}
}