package mekanism.common.tile;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import mekanism.api.Coord4D;
import mekanism.api.Range4D;
import mekanism.api.energy.IStrictEnergyStorage;
import mekanism.common.Mekanism;
import mekanism.common.capabilities.Capabilities;
import mekanism.common.content.matrix.MatrixCache;
import mekanism.common.content.matrix.MatrixUpdateProtocol;
import mekanism.common.content.matrix.SynchronizedMatrixData;
import mekanism.common.integration.IComputerIntegration;
import mekanism.common.multiblock.MultiblockManager;
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.util.ChargeUtils;
import mekanism.common.util.LangUtils;
import mekanism.common.util.MekanismUtils;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fml.common.FMLCommonHandler;
public class TileEntityInductionCasing extends TileEntityMultiblock<SynchronizedMatrixData> implements IStrictEnergyStorage, IComputerIntegration
{
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.lastInput = structure.transferCap-structure.remainingInput;
structure.remainingInput = structure.transferCap;
structure.lastOutput = structure.transferCap-structure.remainingOutput;
structure.remainingOutput = structure.transferCap;
ChargeUtils.charge(0, this);
ChargeUtils.discharge(1, this);
}
}
}
@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<Object>())), new Range4D(Coord4D.get(this)));
player.openGui(Mekanism.instance, 49, worldObj, getPos().getX(), getPos().getY(), getPos().getZ());
return true;
}
return false;
}
@Override
public ArrayList<Object> getNetworkedData(ArrayList<Object> data)
{
super.getNetworkedData(data);
if(structure != null)
{
data.add(structure.getEnergy(worldObj));
data.add(structure.storageCap);
data.add(structure.transferCap);
data.add(structure.lastInput);
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(FMLCommonHandler.instance().getEffectiveSide().isClient())
{
if(clientHasStructure)
{
structure.clientEnergy = dataStream.readDouble();
structure.storageCap = dataStream.readDouble();
structure.transferCap = dataStream.readDouble();
structure.lastInput = 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 getName()
{
return LangUtils.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 != null ? structure.clientEnergy : 0;
}
}
@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;
}
public static final String[] methods = new String[] {"getEnergy", "getMaxEnergy", "getInput", "getOutput", "getTransferCap"};
@Override
public String[] getMethods()
{
return methods;
}
@Override
public Object[] invoke(int method, Object[] arguments) throws Exception
{
if(structure == null)
{
return new Object[] {"Unformed."};
}
switch(method)
{
case 0:
return new Object[] {getEnergy()};
case 1:
return new Object[] {getMaxEnergy()};
case 2:
return new Object[] {structure.lastInput};
case 3:
return new Object[] {structure.lastOutput};
case 4:
return new Object[] {structure.transferCap};
default:
return new Object[] {"Unknown command."};
}
}
@Override
public boolean hasCapability(net.minecraftforge.common.capabilities.Capability<?> capability, net.minecraft.util.EnumFacing facing)
{
return capability == Capabilities.ENERGY_STORAGE_CAPABILITY || super.hasCapability(capability, facing);
}
@Override
public <T> T getCapability(Capability<T> capability, net.minecraft.util.EnumFacing facing)
{
if (capability == Capabilities.ENERGY_STORAGE_CAPABILITY)
return (T) this;
return super.getCapability(capability, facing);
}
}