001    package cpw.mods.fml.common.network;
002    
003    import static cpw.mods.fml.common.network.FMLPacket.Type.MOD_IDENTIFIERS;
004    
005    import java.util.Collection;
006    import java.util.Map;
007    import java.util.Map.Entry;
008    
009    import net.minecraft.network.INetworkManager;
010    import net.minecraft.network.packet.NetHandler;
011    
012    import com.google.common.collect.Maps;
013    import com.google.common.io.ByteArrayDataInput;
014    import com.google.common.io.ByteArrayDataOutput;
015    import com.google.common.io.ByteStreams;
016    
017    public class ModIdentifiersPacket extends FMLPacket
018    {
019    
020        private Map<String, Integer> modIds = Maps.newHashMap();
021    
022        public ModIdentifiersPacket()
023        {
024            super(MOD_IDENTIFIERS);
025        }
026    
027        @Override
028        public byte[] generatePacket(Object... data)
029        {
030            ByteArrayDataOutput dat = ByteStreams.newDataOutput();
031            Collection<NetworkModHandler >networkMods = FMLNetworkHandler.instance().getNetworkIdMap().values();
032    
033            dat.writeInt(networkMods.size());
034            for (NetworkModHandler handler : networkMods)
035            {
036                dat.writeUTF(handler.getContainer().getModId());
037                dat.writeInt(handler.getNetworkId());
038            }
039    
040            // TODO send the other id maps as well
041            return dat.toByteArray();
042        }
043    
044        @Override
045        public FMLPacket consumePacket(byte[] data)
046        {
047            ByteArrayDataInput dat = ByteStreams.newDataInput(data);
048            int listSize = dat.readInt();
049            for (int i = 0; i < listSize; i++)
050            {
051                String modId = dat.readUTF();
052                int networkId = dat.readInt();
053                modIds.put(modId, networkId);
054            }
055            return this;
056        }
057    
058        @Override
059        public void execute(INetworkManager network, FMLNetworkHandler handler, NetHandler netHandler, String userName)
060        {
061            for (Entry<String,Integer> idEntry : modIds.entrySet())
062            {
063                handler.bindNetworkId(idEntry.getKey(), idEntry.getValue());
064            }
065            // TODO other id maps
066        }
067    }