001 package cpw.mods.fml.common.event;
002
003 import java.util.List;
004
005 import com.google.common.base.Function;
006 import com.google.common.base.Functions;
007 import com.google.common.base.Predicate;
008 import com.google.common.base.Predicates;
009 import com.google.common.collect.ArrayListMultimap;
010 import com.google.common.collect.FluentIterable;
011 import com.google.common.collect.ImmutableList;
012 import com.google.common.collect.ImmutableListMultimap;
013 import com.google.common.collect.Maps;
014 import com.google.common.collect.Multimaps;
015
016 import cpw.mods.fml.common.Loader;
017 import cpw.mods.fml.common.LoaderState;
018 import cpw.mods.fml.common.ModContainer;
019 import cpw.mods.fml.common.Mod.Init;
020 import cpw.mods.fml.common.Mod.PostInit;
021
022
023 /**
024 * Simple intermod communications to receive simple messages directed at you from
025 * other mods
026 *
027 * @author cpw
028 *
029 */
030 public class FMLInterModComms {
031 private static ArrayListMultimap<String, IMCMessage> modMessages = ArrayListMultimap.create();
032 /**
033 * Subscribe to this event to receive your messages (they are sent between {@link Init} and {@link PostInit})
034 *
035 * @author cpw
036 *
037 */
038 public static class IMCEvent extends FMLEvent {
039 @Override
040 public void applyModContainer(ModContainer activeContainer) {
041 currentList = ImmutableList.copyOf(modMessages.get(activeContainer.getModId()));
042 }
043 private ImmutableList<IMCMessage> currentList;
044
045 public ImmutableList<IMCMessage> getMessages()
046 {
047 return currentList;
048 }
049 }
050
051 /**
052 * You will receive an instance of this for each message sent
053 * @author cpw
054 *
055 */
056 public static final class IMCMessage {
057 /**
058 * This is the modid of the mod that sent you the message
059 */
060 public final String sender;
061
062 /**
063 * This field, and {@link #value} are both at the mod's discretion
064 */
065 public final String key;
066 /**
067 * This field, and {@link #key} are both at the mod's discretion
068 */
069 public final String value;
070
071 private IMCMessage(String sender, String key, String value)
072 {
073 this.key = key;
074 this.value = value;
075 this.sender = sender;
076 }
077 @Override
078 public String toString() {
079 return sender;
080 }
081 }
082
083 public static boolean sendMessage(String modId, String key, String value)
084 {
085 if (Loader.instance().activeModContainer()==null)
086 {
087 return false;
088 }
089 modMessages.put(modId, new IMCMessage(Loader.instance().activeModContainer().getModId(), key, value));
090 return Loader.isModLoaded(modId) && !Loader.instance().hasReachedState(LoaderState.POSTINITIALIZATION);
091 }
092 }