    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    }