package mekanism.common.tile;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import mekanism.api.MekanismConfig.general;
import mekanism.api.energy.IStrictEnergyStorage;
import mekanism.common.Mekanism;
import mekanism.common.content.matrix.MatrixCache;
import mekanism.common.content.matrix.MatrixUpdateProtocol;
import mekanism.common.content.matrix.SynchronizedMatrixData;
import mekanism.common.multiblock.MultiblockManager;
import mekanism.common.util.ChargeUtils;
import mekanism.common.util.MekanismUtils;
import net.minecraft.item.ItemStack;
import cpw.mods.fml.common.Optional.Interface;
import cpw.mods.fml.common.Optional.Method;
import dan200.computercraft.api.lua.ILuaContext;
import dan200.computercraft.api.lua.LuaException;
import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral;
@Interface(iface = "dan200.computercraft.api.peripheral.IPeripheral", modid = "ComputerCraft")
public class TileEntityInductionCasing extends TileEntityMultiblock<SynchronizedMatrixData> implements IStrictEnergyStorage, IPeripheral
{
public int clientCells;
public int clientProviders;
public TileEntityInductionCasing()
{
this("InductionCasing");
}
public TileEntityInductionCasing(String name)
{
super(name);
inventory = new ItemStack[2];
}
@Override
public void onUpdate()
{
super.onUpdate();
if(!worldObj.isRemote)
{
if(structure != null && isRendering)
{
structure.lastOutput = structure.outputCap-structure.remainingOutput;
structure.remainingOutput = structure.outputCap;
ChargeUtils.charge(0, this);
ChargeUtils.discharge(1, this);
}
}
}
@Override
public ArrayList getNetworkedData(ArrayList data)
{
super.getNetworkedData(data);
if(structure != null)
{
data.add(structure.getEnergy(worldObj));
data.add(structure.storageCap);
data.add(structure.outputCap);
data.add(structure.lastOutput);
data.add(structure.volWidth);
data.add(structure.volHeight);
data.add(structure.volLength);
data.add(structure.cells.size());
data.add(structure.providers.size());
}
return data;
}
@Override
public void handlePacketData(ByteBuf dataStream)
{
super.handlePacketData(dataStream);
if(clientHasStructure)
{
structure.clientEnergy = dataStream.readDouble();
structure.storageCap = dataStream.readDouble();
structure.outputCap = dataStream.readDouble();
structure.lastOutput = dataStream.readDouble();
structure.volWidth = dataStream.readInt();
structure.volHeight = dataStream.readInt();
structure.volLength = dataStream.readInt();
clientCells = dataStream.readInt();
clientProviders = dataStream.readInt();
}
}
@Override
protected SynchronizedMatrixData getNewStructure()
{
return new SynchronizedMatrixData();
}
@Override
public MatrixCache getNewCache()
{
return new MatrixCache();
}
@Override
protected MatrixUpdateProtocol getProtocol()
{
return new MatrixUpdateProtocol(this);
}
@Override
public MultiblockManager<SynchronizedMatrixData> getManager()
{
return Mekanism.matrixManager;
}
@Override
public String getInventoryName()
{
return MekanismUtils.localize("gui.inductionMatrix");
}
public int getScaledEnergyLevel(int i)
{
return (int)(getEnergy()*i / getMaxEnergy());
}
@Override
public double getEnergy()
{
if(!worldObj.isRemote)
{
return structure != null ? structure.getEnergy(worldObj) : 0;
}
else {
return structure.clientEnergy;
}
}
@Override
public void setEnergy(double energy)
{
if(structure != null)
{
structure.setEnergy(worldObj, Math.max(Math.min(energy, getMaxEnergy()), 0));
MekanismUtils.saveChunk(this);
}
}
@Override
public double getMaxEnergy()
{
return structure != null ? structure.storageCap : 0;
}
@Override
@Method(modid = "ComputerCraft")
public String getType()
{
return "Mekanism-InductionMatrix";
}
public static final String[] NAMES = new String[] { "getEnergyStored", "getMaxEnergyStored", "getEnergyStoredMJ", "getMaxEnergyStoredMJ", "getLastOutput", "getOutputCap" };
@Override
@Method(modid = "ComputerCraft")
public String[] getMethodNames()
{
return NAMES;
}
@Override
@Method(modid = "ComputerCraft")
public Object[] callMethod(IComputerAccess computer, ILuaContext context, int method, Object[] arguments) throws LuaException, InterruptedException
{
if (structure == null)
{
return new Object[] { "Unformed." };
}
switch (method)
{
case 0:
return new Object[] { getEnergy() * general.TO_TE };
case 1:
return new Object[] { getMaxEnergy() * general.TO_TE };
case 2:
return new Object[] { getEnergy() };
case 3:
return new Object[] { getMaxEnergy() };
case 4:
return new Object[] { structure.lastOutput };
case 5:
return new Object[] { structure.outputCap };
default:
Mekanism.logger.error("Attempted to call unknown method with computer ID " + computer.getID());
return new Object[] { "Unknown command." };
}
}
@Override
@Method(modid = "ComputerCraft")
public boolean equals(IPeripheral other)
{
return this == other;
}
@Override
@Method(modid = "ComputerCraft")
public void attach(IComputerAccess computer) {}
@Override
@Method(modid = "ComputerCraft")
public void detach(IComputerAccess computer) {}
}