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.PacketEditFilter.EditFilterMessage; 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.WorldServer; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.common.network.simpleimpl.IMessage; import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler; import net.minecraftforge.fml.common.network.simpleimpl.MessageContext; public class PacketEditFilter implements IMessageHandler<EditFilterMessage, IMessage> { @Override public IMessage onMessage(EditFilterMessage message, MessageContext context) { WorldServer worldServer = FMLCommonHandler.instance().getMinecraftServerInstance().worldServerForDimension(message.coord4D.dimensionId); worldServer.addScheduledTask(new Runnable() { @Override public void run() { if(worldServer != null) { if(message.type == 0 && message.coord4D.getTileEntity(worldServer) instanceof TileEntityLogisticalSorter) { TileEntityLogisticalSorter sorter = (TileEntityLogisticalSorter) message.coord4D.getTileEntity(worldServer); if(!sorter.filters.contains(message.tFilter)) { return; } int index = sorter.filters.indexOf(message.tFilter); sorter.filters.remove(index); if(!message.delete) { sorter.filters.add(index, message.tEdited); } 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); if(!miner.filters.contains(message.mFilter)) { return; } int index = miner.filters.indexOf(message.mFilter); miner.filters.remove(index); if(!message.delete) { miner.filters.add(index, message.mEdited); } 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); if(!oredictionificator.filters.contains(message.oFilter)) { return; } int index = oredictionificator.filters.indexOf(message.oFilter); oredictionificator.filters.remove(index); if(!message.delete) { oredictionificator.filters.add(index, message.oEdited); } for(EntityPlayer iterPlayer : oredictionificator.playersUsing) { Mekanism.packetHandler.sendTo(new TileEntityMessage(Coord4D.get(oredictionificator), oredictionificator.getFilterPacket(new ArrayList())), (EntityPlayerMP)iterPlayer); } } } } }); return null; } public static class EditFilterMessage implements IMessage { public Coord4D coord4D; public TransporterFilter tFilter; public TransporterFilter tEdited; public MinerFilter mFilter; public MinerFilter mEdited; public OredictionificatorFilter oFilter; public OredictionificatorFilter oEdited; public byte type = -1; public boolean delete; public EditFilterMessage() {} public EditFilterMessage(Coord4D coord, boolean deletion, Object filter, Object edited) { coord4D = coord; delete = deletion; if(filter instanceof TransporterFilter) { tFilter = (TransporterFilter)filter; if(!delete) { tEdited = (TransporterFilter)edited; } type = 0; } else if(filter instanceof MinerFilter) { mFilter = (MinerFilter)filter; if(!delete) { mEdited = (MinerFilter)edited; } type = 1; } else if(filter instanceof OredictionificatorFilter) { oFilter = (OredictionificatorFilter)filter; if(!delete) { oEdited = (OredictionificatorFilter)edited; } type = 2; } } @Override public void toBytes(ByteBuf dataStream) { coord4D.write(dataStream); dataStream.writeByte(type); dataStream.writeBoolean(delete); ArrayList data = new ArrayList(); if(type == 0) { tFilter.write(data); if(!delete) { tEdited.write(data); } } else if(type == 1) { mFilter.write(data); if(!delete) { mEdited.write(data); } } else if(type == 2) { oFilter.write(data); if(!delete) { oEdited.write(data); } } PacketHandler.encode(data.toArray(), dataStream); } @Override public void fromBytes(ByteBuf dataStream) { coord4D = Coord4D.read(dataStream); type = dataStream.readByte(); delete = dataStream.readBoolean(); if(type == 0) { tFilter = TransporterFilter.readFromPacket(dataStream); if(!delete) { tEdited = TransporterFilter.readFromPacket(dataStream); } } else if(type == 1) { mFilter = MinerFilter.readFromPacket(dataStream); if(!delete) { mEdited = MinerFilter.readFromPacket(dataStream); } } else if(type == 2) { oFilter = OredictionificatorFilter.readFromPacket(dataStream); if(!delete) { oEdited = OredictionificatorFilter.readFromPacket(dataStream); } } } } }