001    package cpw.mods.fml.common.network;
002    
003    import java.util.List;
004    
005    import com.google.common.collect.ImmutableList;
006    import com.google.common.collect.ImmutableList.Builder;
007    import com.google.common.collect.Lists;
008    import com.google.common.io.ByteArrayDataInput;
009    import com.google.common.io.ByteArrayDataOutput;
010    import com.google.common.io.ByteStreams;
011    
012    import cpw.mods.fml.common.FMLCommonHandler;
013    import cpw.mods.fml.common.Loader;
014    import cpw.mods.fml.common.ModContainer;
015    import cpw.mods.fml.common.versioning.ArtifactVersion;
016    import cpw.mods.fml.common.versioning.DefaultArtifactVersion;
017    import cpw.mods.fml.common.versioning.VersionRange;
018    
019    import net.minecraft.network.INetworkManager;
020    import net.minecraft.network.packet.NetHandler;
021    
022    public class ModMissingPacket extends FMLPacket
023    {
024    
025        private List<ModData> missing;
026        private List<ModData> badVersion;
027    
028        public ModMissingPacket()
029        {
030            super(Type.MOD_MISSING);
031        }
032    
033        @Override
034        public byte[] generatePacket(Object... data)
035        {
036            ByteArrayDataOutput dat = ByteStreams.newDataOutput();
037    
038            List<String> missing = (List<String>) data[0];
039            List<String> badVersion = (List<String>) data[1];
040    
041            dat.writeInt(missing.size());
042            for (String missed : missing)
043            {
044                ModContainer mc = Loader.instance().getIndexedModList().get(missed);
045                dat.writeUTF(missed);
046                dat.writeUTF(mc.getVersion());
047            }
048            dat.writeInt(badVersion.size());
049            for (String bad : badVersion)
050            {
051                ModContainer mc = Loader.instance().getIndexedModList().get(bad);
052                dat.writeUTF(bad);
053                dat.writeUTF(mc.getVersion());
054            }
055            return dat.toByteArray();
056        }
057    
058        private static class ModData
059        {
060            String modId;
061            String modVersion;
062        }
063        @Override
064        public FMLPacket consumePacket(byte[] data)
065        {
066            ByteArrayDataInput dat = ByteStreams.newDataInput(data);
067            int missingLen = dat.readInt();
068            missing = Lists.newArrayListWithCapacity(missingLen);
069            for (int i = 0; i < missingLen; i++)
070            {
071                ModData md = new ModData();
072                md.modId = dat.readUTF();
073                md.modVersion = dat.readUTF();
074                missing.add(md);
075            }
076            int badVerLength = dat.readInt();
077            badVersion = Lists.newArrayListWithCapacity(badVerLength);
078            for (int i = 0; i < badVerLength; i++)
079            {
080                ModData md = new ModData();
081                md.modId = dat.readUTF();
082                md.modVersion = dat.readUTF();
083                badVersion.add(md);
084            }
085            return this;
086        }
087    
088        @Override
089        public void execute(INetworkManager network, FMLNetworkHandler handler, NetHandler netHandler, String userName)
090        {
091            FMLCommonHandler.instance().getSidedDelegate().displayMissingMods(this);
092        }
093    
094        public List<ArtifactVersion> getModList()
095        {
096            Builder<ArtifactVersion> builder = ImmutableList.<ArtifactVersion>builder();
097            for (ModData md : missing)
098            {
099                builder.add(new DefaultArtifactVersion(md.modId, VersionRange.createFromVersion(md.modVersion, null)));
100            }
101            for (ModData md : badVersion)
102            {
103                builder.add(new DefaultArtifactVersion(md.modId, VersionRange.createFromVersion(md.modVersion, null)));
104            }
105            return builder.build();
106        }
107    
108    }