package blusunrize.immersiveengineering.common.blocks.metal;
import blusunrize.immersiveengineering.api.IEEnums.SideConfig;
import blusunrize.immersiveengineering.api.energy.ThermoelectricHandler;
import blusunrize.immersiveengineering.common.Config.IEConfig;
import blusunrize.immersiveengineering.common.blocks.TileEntityIEBase;
import blusunrize.immersiveengineering.common.util.EnergyHelper;
import blusunrize.immersiveengineering.common.util.EnergyHelper.IEForgeEnergyWrapper;
import blusunrize.immersiveengineering.common.util.EnergyHelper.IIEInternalFluxConnector;
import net.minecraft.block.Block;
import net.minecraft.block.BlockDynamicLiquid;
import net.minecraft.block.BlockStaticLiquid;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.IFluidBlock;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class TileEntityThermoelectricGen extends TileEntityIEBase implements ITickable, IIEInternalFluxConnector
{
@Override
public void update()
{
if(!worldObj.isRemote)
{
int energy = 0;
for(EnumFacing fd : new EnumFacing[]{EnumFacing.DOWN,EnumFacing.NORTH,EnumFacing.WEST})
if(!worldObj.isAirBlock(getPos().offset(fd)) && !worldObj.isAirBlock(getPos().offset(fd.getOpposite())))
{
int temp0 = getTemperature(getPos().offset(fd));
int temp1 = getTemperature(getPos().offset(fd.getOpposite()));
if(temp0>-1&&temp1>-1)
{
int diff = Math.abs(temp0-temp1);
energy += (int) (Math.sqrt(diff)/2 * IEConfig.Machines.thermoelectric_output);
}
}
outputEnergy(energy);
}
}
public void outputEnergy(int amount)
{
for(EnumFacing fd : EnumFacing.VALUES)
{
TileEntity te = worldObj.getTileEntity(getPos().offset(fd));
amount -= EnergyHelper.insertFlux(te, fd.getOpposite(), amount, false);
}
}
int getTemperature(BlockPos pos)
{
Fluid f = getFluid(pos);
if(f!=null)
return f.getTemperature(worldObj, pos);
IBlockState state = worldObj.getBlockState(pos);
return ThermoelectricHandler.getTemperature(state.getBlock(), state.getBlock().getMetaFromState(state));
}
Fluid getFluid(BlockPos pos)
{
IBlockState state = worldObj.getBlockState(pos);
Block b = state.getBlock();
Fluid f = FluidRegistry.lookupFluidForBlock(b);
if(f==null && b instanceof BlockDynamicLiquid && b.getMetaFromState(state)==0)
if(state.getMaterial().equals(Material.WATER))
f = FluidRegistry.WATER;
else if(state.getMaterial().equals(Material.LAVA))
f = FluidRegistry.LAVA;
if(b instanceof IFluidBlock && !((IFluidBlock)b).canDrain(worldObj, pos))
return null;
if(b instanceof BlockStaticLiquid && b.getMetaFromState(state)!=0)
return null;
if(f==null)
return null;
return f;
}
@Override
public void readCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
}
@Override
public void writeCustomNBT(NBTTagCompound nbt, boolean descPacket)
{
}
@Nonnull
@Override
public SideConfig getEnergySideConfig(@Nullable EnumFacing facing)
{
return SideConfig.OUTPUT;
}
@Override
public boolean canConnectEnergy(EnumFacing from)
{
return true;
}
IEForgeEnergyWrapper wrapper = new IEForgeEnergyWrapper(this,null);
@Override
public IEForgeEnergyWrapper getCapabilityWrapper(EnumFacing facing)
{
return wrapper;
}
}