From 7e35f13f309fbac7d4a7b08e461ed967a4efb880 Mon Sep 17 00:00:00 2001 From: Christian Date: Sat, 11 Aug 2012 02:43:04 -0400 Subject: [PATCH] Fix up some network related stuff and optimize mod lookup a bit --- .../cpw/mods/fml/common/FMLCommonHandler.java | 9 +------- .../cpw/mods/fml/common/LoadController.java | 22 +++++++++++++++++++ fml/common/cpw/mods/fml/common/Loader.java | 11 ++++++++++ .../fml/common/network/FMLNetworkHandler.java | 19 ++++++++++++++-- 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/fml/common/cpw/mods/fml/common/FMLCommonHandler.java b/fml/common/cpw/mods/fml/common/FMLCommonHandler.java index b3469abe0..f9ea042e7 100644 --- a/fml/common/cpw/mods/fml/common/FMLCommonHandler.java +++ b/fml/common/cpw/mods/fml/common/FMLCommonHandler.java @@ -155,14 +155,7 @@ public class FMLCommonHandler */ public ModContainer findContainerFor(Object mod) { - for (ModContainer mc : Loader.instance().getActiveModList()) - { - if (mc.matches(mod)) - { - return mc; - } - } - return null; + return Loader.instance().getReversedModObjectList().get(mod); } /** * Get the forge mod loader logging instance (goes to the forgemodloader log file) diff --git a/fml/common/cpw/mods/fml/common/LoadController.java b/fml/common/cpw/mods/fml/common/LoadController.java index 4ff7f2c03..19ee5a591 100644 --- a/fml/common/cpw/mods/fml/common/LoadController.java +++ b/fml/common/cpw/mods/fml/common/LoadController.java @@ -7,6 +7,9 @@ import java.util.logging.Level; import com.google.common.base.Joiner; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -17,7 +20,9 @@ import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import cpw.mods.fml.common.LoaderState.ModState; +import cpw.mods.fml.common.event.FMLConstructionEvent; import cpw.mods.fml.common.event.FMLLoadEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLStateEvent; import cpw.mods.fml.common.network.FMLNetworkHandler; @@ -32,6 +37,7 @@ public class LoadController private Map modList; private List activeModList = Lists.newArrayList(); private String activeContainer; + private BiMap modObjectList; public LoadController(Loader loader) { @@ -103,6 +109,7 @@ public class LoadController { return activeContainer!=null ? modList.get(activeContainer) : null; } + @Subscribe public void propogateStateMessage(FMLStateEvent stateEvent) { @@ -125,6 +132,16 @@ public class LoadController } } + @Subscribe + public void buildModObjectList(FMLConstructionEvent pre) + { + com.google.common.collect.ImmutableBiMap.Builder builder = ImmutableBiMap.builder(); + for (ModContainer mc : activeModList) + { + builder.put(mc, mc.getMod()); + } + modObjectList = builder.build(); + } public void errorOccurred(ModContainer modContainer, Throwable exception) { errors.put(modContainer.getModId(), exception); @@ -162,4 +179,9 @@ public class LoadController throw new LoaderException(e); } } + + public BiMap getModObjectList() + { + return ImmutableBiMap.copyOf(modObjectList); + } } diff --git a/fml/common/cpw/mods/fml/common/Loader.java b/fml/common/cpw/mods/fml/common/Loader.java index d3ea218bc..e232d26ff 100644 --- a/fml/common/cpw/mods/fml/common/Loader.java +++ b/fml/common/cpw/mods/fml/common/Loader.java @@ -39,6 +39,7 @@ import com.google.common.base.Joiner; import com.google.common.base.Splitter; import com.google.common.base.Splitter.MapSplitter; import com.google.common.base.Throwables; +import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; @@ -603,4 +604,14 @@ public class Loader modController.transition(LoaderState.AVAILABLE); } + + public BiMap getModObjectList() + { + return modController.getModObjectList(); + } + + public BiMap getReversedModObjectList() + { + return getModObjectList().inverse(); + } } diff --git a/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java b/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java index d5725fe13..3f533e2ff 100644 --- a/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java +++ b/fml/common/cpw/mods/fml/common/network/FMLNetworkHandler.java @@ -26,6 +26,7 @@ import com.google.common.collect.Maps; import com.google.common.hash.Hashing; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModContainer; import cpw.mods.fml.common.discovery.ASMDataTable; @@ -284,13 +285,27 @@ public class FMLNetworkHandler public static void openGui(EntityPlayer player, Object mod, int modGuiId, World world, int x, int y, int z) { + ModContainer mc = FMLCommonHandler.instance().findContainerFor(mod); + if (mc == null) + { + NetworkModHandler nmh = instance().findNetworkModHandler(mod); + if (nmh != null) + { + mc = nmh.getContainer(); + } + else + { + FMLLog.warning("A mod tried to open a gui on the server without being a NetworkMod"); + return; + } + } if (player instanceof EntityPlayerMP) { - NetworkRegistry.instance().openRemoteGui(FMLCommonHandler.instance().findContainerFor(mod), (EntityPlayerMP) player, modGuiId, world, x, y, z); + NetworkRegistry.instance().openRemoteGui(mc, (EntityPlayerMP) player, modGuiId, world, x, y, z); } else { - NetworkRegistry.instance().openLocalGui(FMLCommonHandler.instance().findContainerFor(mod), (EntityPlayerMP) player, modGuiId, world, x, y, z); + NetworkRegistry.instance().openLocalGui(mc, player, modGuiId, world, x, y, z); } }