package mekanism.common.network;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import mekanism.api.Coord4D;
import mekanism.common.Mekanism;
import mekanism.common.PacketHandler;
import mekanism.common.content.miner.MinerFilter;
import mekanism.common.content.transporter.TransporterFilter;
import mekanism.common.network.PacketNewFilter.NewFilterMessage;
import mekanism.common.network.PacketTileEntity.TileEntityMessage;
import mekanism.common.tile.TileEntityDigitalMiner;
import mekanism.common.tile.TileEntityLogisticalSorter;
import mekanism.common.tile.TileEntityOredictionificator;
import mekanism.common.tile.TileEntityOredictionificator.OredictionificatorFilter;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.simpleimpl.IMessage;
import cpw.mods.fml.common.network.simpleimpl.IMessageHandler;
import cpw.mods.fml.common.network.simpleimpl.MessageContext;
public class PacketNewFilter implements IMessageHandler<NewFilterMessage, IMessage>
{
@Override
public IMessage onMessage(NewFilterMessage message, MessageContext context)
{
World worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(message.coord4D.dimensionId);
if(worldServer != null)
{
if(message.type == 0 && message.coord4D.getTileEntity(worldServer) instanceof TileEntityLogisticalSorter)
{
TileEntityLogisticalSorter sorter = (TileEntityLogisticalSorter)message.coord4D.getTileEntity(worldServer);
sorter.filters.add(message.tFilter);
for(EntityPlayer iterPlayer : sorter.playersUsing)
{
Mekanism.packetHandler.sendTo(new TileEntityMessage(Coord4D.get(sorter), sorter.getFilterPacket(new ArrayList())), (EntityPlayerMP)iterPlayer);
}
}
else if(message.type == 1 && message.coord4D.getTileEntity(worldServer) instanceof TileEntityDigitalMiner)
{
TileEntityDigitalMiner miner = (TileEntityDigitalMiner)message.coord4D.getTileEntity(worldServer);
miner.filters.add(message.mFilter);
for(EntityPlayer iterPlayer : miner.playersUsing)
{
Mekanism.packetHandler.sendTo(new TileEntityMessage(Coord4D.get(miner), miner.getFilterPacket(new ArrayList())), (EntityPlayerMP)iterPlayer);
}
}
else if(message.type == 2 && message.coord4D.getTileEntity(worldServer) instanceof TileEntityOredictionificator)
{
TileEntityOredictionificator oredictionificator = (TileEntityOredictionificator)message.coord4D.getTileEntity(worldServer);
oredictionificator.filters.add(message.oFilter);
for(EntityPlayer iterPlayer : oredictionificator.playersUsing)
{
Mekanism.packetHandler.sendTo(new TileEntityMessage(Coord4D.get(oredictionificator), oredictionificator.getFilterPacket(new ArrayList())), (EntityPlayerMP)iterPlayer);
}
}
}
return null;
}
public static class NewFilterMessage implements IMessage
{
public Coord4D coord4D;
public TransporterFilter tFilter;
public MinerFilter mFilter;
public OredictionificatorFilter oFilter;
public byte type = -1;
public NewFilterMessage() {}
public NewFilterMessage(Coord4D coord, Object filter)
{
coord4D = coord;
if(filter instanceof TransporterFilter)
{
tFilter = (TransporterFilter)filter;
type = 0;
}
else if(filter instanceof MinerFilter)
{
mFilter = (MinerFilter)filter;
type = 1;
}
else if(filter instanceof OredictionificatorFilter)
{
oFilter = (OredictionificatorFilter)filter;
type = 2;
}
}
@Override
public void toBytes(ByteBuf dataStream)
{
dataStream.writeInt(coord4D.xCoord);
dataStream.writeInt(coord4D.yCoord);
dataStream.writeInt(coord4D.zCoord);
dataStream.writeInt(coord4D.dimensionId);
dataStream.writeByte(type);
ArrayList data = new ArrayList();
if(type == 0)
{
tFilter.write(data);
}
else if(type == 1)
{
mFilter.write(data);
}
else if(type == 2)
{
oFilter.write(data);
}
PacketHandler.encode(data.toArray(), dataStream);
}
@Override
public void fromBytes(ByteBuf dataStream)
{
coord4D = new Coord4D(dataStream.readInt(), dataStream.readInt(), dataStream.readInt(), dataStream.readInt());
type = dataStream.readByte();
if(type == 0)
{
tFilter = TransporterFilter.readFromPacket(dataStream);
}
else if(type == 1)
{
mFilter = MinerFilter.readFromPacket(dataStream);
}
else if(type == 2)
{
oFilter = OredictionificatorFilter.readFromPacket(dataStream);
}
}
}
}