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 }