package mekanism.generators.common.tile.turbine;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import mekanism.api.Coord4D;
import mekanism.api.MekanismConfig.general;
import mekanism.api.MekanismConfig.generators;
import mekanism.api.Range4D;
import mekanism.api.energy.IStrictEnergyStorage;
import mekanism.common.Mekanism;
import mekanism.common.PacketHandler;
import mekanism.common.multiblock.MultiblockCache;
import mekanism.common.multiblock.MultiblockManager;
import mekanism.common.multiblock.UpdateProtocol;
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.tile.TileEntityGasTank.GasMode;
import mekanism.common.tile.TileEntityMultiblock;
import mekanism.common.util.LangUtils;
import mekanism.common.util.MekanismUtils;
import mekanism.generators.common.MekanismGenerators;
import mekanism.generators.common.content.turbine.SynchronizedTurbineData;
import mekanism.generators.common.content.turbine.TurbineCache;
import mekanism.generators.common.content.turbine.TurbineUpdateProtocol;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
import net.minecraftforge.fluids.FluidRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fml.common.FMLCommonHandler;
public class TileEntityTurbineCasing extends TileEntityMultiblock<SynchronizedTurbineData> implements IStrictEnergyStorage
{
public TileEntityTurbineCasing()
{
this("TurbineCasing");
}
public TileEntityTurbineCasing(String name)
{
super(name);
}
@Override
public void onUpdate()
{
super.onUpdate();
if(!worldObj.isRemote)
{
if(structure != null)
{
if(structure.fluidStored != null && structure.fluidStored.amount <= 0)
{
structure.fluidStored = null;
markDirty();
}
if(isRendering)
{
structure.lastSteamInput = structure.newSteamInput;
structure.newSteamInput = 0;
int stored = structure.fluidStored != null ? structure.fluidStored.amount : 0;
double proportion = (double)stored/(double)structure.getFluidCapacity();
double flowRate = 0;
if(stored > 0 && getEnergy() < structure.getEnergyCapacity())
{
double energyMultiplier = (general.maxEnergyPerSteam/TurbineUpdateProtocol.MAX_BLADES)*Math.min(structure.blades, structure.coils*generators.turbineBladesPerCoil);
double rate = structure.lowerVolume*(structure.getDispersers()*generators.turbineDisperserGasFlow);
rate = Math.min(rate, structure.vents*generators.turbineVentGasFlow);
double origRate = rate;
rate = Math.min(Math.min(stored, rate), (getMaxEnergy()-getEnergy())/energyMultiplier)*proportion;
flowRate = rate/origRate;
setEnergy(getEnergy()+((int)rate)*energyMultiplier);
structure.fluidStored.amount -= rate;
structure.clientFlow = Math.min((int)rate, structure.condensers*generators.condenserRate);
structure.flowRemaining = (int)rate;
if(structure.fluidStored.amount == 0)
{
structure.fluidStored = null;
}
}
else {
structure.clientFlow = 0;
}
if(structure.dumpMode == GasMode.DUMPING && structure.fluidStored != null)
{
structure.fluidStored.amount -= Math.min(structure.fluidStored.amount, Math.max(structure.fluidStored.amount/50, structure.lastSteamInput*2));
if(structure.fluidStored.amount == 0)
{
structure.fluidStored = null;
}
}
float newRotation = (float)flowRate;
boolean needsRotationUpdate = false;
if(Math.abs(newRotation-structure.clientRotation) > SynchronizedTurbineData.ROTATION_THRESHOLD)
{
structure.clientRotation = newRotation;
needsRotationUpdate = true;
}
if(structure.needsRenderUpdate() || needsRotationUpdate)
{
sendPacketToRenderer();
}
structure.prevFluid = structure.fluidStored != null ? structure.fluidStored.copy() : null;
}
}
}
}
@Override
public String getName()
{
return LangUtils.localize("gui.industrialTurbine");
}
@Override
public boolean onActivate(EntityPlayer player, EnumHand hand, ItemStack stack)
{
if(!player.isSneaking() && structure != null)
{
Mekanism.packetHandler.sendToReceivers(new TileEntityMessage(Coord4D.get(this), getNetworkedData(new ArrayList())), new Range4D(Coord4D.get(this)));
player.openGui(MekanismGenerators.instance, 6, worldObj, getPos().getX(), getPos().getY(), getPos().getZ());
return true;
}
return false;
}
@Override
public double getEnergy()
{
return structure != null ? structure.electricityStored : 0;
}
@Override
public double getMaxEnergy()
{
return structure.getEnergyCapacity();
}
@Override
public void setEnergy(double energy)
{
if(structure != null)
{
structure.electricityStored = Math.max(Math.min(energy, getMaxEnergy()), 0);
MekanismUtils.saveChunk(this);
}
}
public int getScaledFluidLevel(int i)
{
if(structure.getFluidCapacity() == 0 || structure.fluidStored == null)
{
return 0;
}
return structure.fluidStored.amount*i / structure.getFluidCapacity();
}
@Override
public ArrayList getNetworkedData(ArrayList data)
{
super.getNetworkedData(data);
if(structure != null)
{
data.add(structure.volume);
data.add(structure.lowerVolume);
data.add(structure.vents);
data.add(structure.blades);
data.add(structure.coils);
data.add(structure.condensers);
data.add(structure.getDispersers());
data.add(structure.electricityStored);
data.add(structure.clientFlow);
data.add(structure.lastSteamInput);
data.add(structure.dumpMode.ordinal());
if(structure.fluidStored != null)
{
data.add(1);
data.add(FluidRegistry.getFluidName(structure.fluidStored));
data.add(structure.fluidStored.amount);
}
else {
data.add(0);
}
if(isRendering)
{
structure.complex.write(data);
data.add(structure.clientRotation);
}
}
return data;
}
@Override
public void handlePacketData(ByteBuf dataStream)
{
if(!worldObj.isRemote)
{
if(structure != null)
{
byte type = dataStream.readByte();
if(type == 0)
{
structure.dumpMode = GasMode.values()[structure.dumpMode.ordinal() == GasMode.values().length-1 ? 0 : structure.dumpMode.ordinal()+1];
}
}
return;
}
super.handlePacketData(dataStream);
if(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
if(clientHasStructure)
{
structure.volume = dataStream.readInt();
structure.lowerVolume = dataStream.readInt();
structure.vents = dataStream.readInt();
structure.blades = dataStream.readInt();
structure.coils = dataStream.readInt();
structure.condensers = dataStream.readInt();
structure.clientDispersers = dataStream.readInt();
structure.electricityStored = dataStream.readDouble();
structure.clientFlow = dataStream.readInt();
structure.lastSteamInput = dataStream.readInt();
structure.dumpMode = GasMode.values()[dataStream.readInt()];
if(dataStream.readInt() == 1)
{
structure.fluidStored = new FluidStack(FluidRegistry.getFluid(PacketHandler.readString(dataStream)), dataStream.readInt());
}
else {
structure.fluidStored = null;
}
if(isRendering)
{
structure.complex = Coord4D.read(dataStream);
structure.clientRotation = dataStream.readFloat();
SynchronizedTurbineData.clientRotationMap.put(structure.inventoryID, structure.clientRotation);
}
}
}
}
@Override
protected SynchronizedTurbineData getNewStructure()
{
return new SynchronizedTurbineData();
}
@Override
public MultiblockCache<SynchronizedTurbineData> getNewCache()
{
return new TurbineCache();
}
@Override
protected UpdateProtocol<SynchronizedTurbineData> getProtocol()
{
return new TurbineUpdateProtocol(this);
}
@Override
public MultiblockManager<SynchronizedTurbineData> getManager()
{
return MekanismGenerators.turbineManager;
}
}