    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    }