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 }