Fix up some network related stuff and optimize mod lookup a bit

This commit is contained in:
Christian 2012-08-11 02:43:04 -04:00
parent 2e66429b03
commit 7e35f13f30
4 changed files with 51 additions and 10 deletions

View File

@ -155,14 +155,7 @@ public class FMLCommonHandler
*/ */
public ModContainer findContainerFor(Object mod) public ModContainer findContainerFor(Object mod)
{ {
for (ModContainer mc : Loader.instance().getActiveModList()) return Loader.instance().getReversedModObjectList().get(mod);
{
if (mc.matches(mod))
{
return mc;
}
}
return null;
} }
/** /**
* Get the forge mod loader logging instance (goes to the forgemodloader log file) * Get the forge mod loader logging instance (goes to the forgemodloader log file)

View File

@ -7,6 +7,9 @@ import java.util.logging.Level;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.ArrayListMultimap; 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.ImmutableMap;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -17,7 +20,9 @@ import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import cpw.mods.fml.common.LoaderState.ModState; 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.FMLLoadEvent;
import cpw.mods.fml.common.event.FMLPreInitializationEvent;
import cpw.mods.fml.common.event.FMLStateEvent; import cpw.mods.fml.common.event.FMLStateEvent;
import cpw.mods.fml.common.network.FMLNetworkHandler; import cpw.mods.fml.common.network.FMLNetworkHandler;
@ -32,6 +37,7 @@ public class LoadController
private Map<String, ModContainer> modList; private Map<String, ModContainer> modList;
private List<ModContainer> activeModList = Lists.newArrayList(); private List<ModContainer> activeModList = Lists.newArrayList();
private String activeContainer; private String activeContainer;
private BiMap<ModContainer, Object> modObjectList;
public LoadController(Loader loader) public LoadController(Loader loader)
{ {
@ -103,6 +109,7 @@ public class LoadController
{ {
return activeContainer!=null ? modList.get(activeContainer) : null; return activeContainer!=null ? modList.get(activeContainer) : null;
} }
@Subscribe @Subscribe
public void propogateStateMessage(FMLStateEvent stateEvent) public void propogateStateMessage(FMLStateEvent stateEvent)
{ {
@ -125,6 +132,16 @@ public class LoadController
} }
} }
@Subscribe
public void buildModObjectList(FMLConstructionEvent pre)
{
com.google.common.collect.ImmutableBiMap.Builder<ModContainer, Object> builder = ImmutableBiMap.<ModContainer, Object>builder();
for (ModContainer mc : activeModList)
{
builder.put(mc, mc.getMod());
}
modObjectList = builder.build();
}
public void errorOccurred(ModContainer modContainer, Throwable exception) public void errorOccurred(ModContainer modContainer, Throwable exception)
{ {
errors.put(modContainer.getModId(), exception); errors.put(modContainer.getModId(), exception);
@ -162,4 +179,9 @@ public class LoadController
throw new LoaderException(e); throw new LoaderException(e);
} }
} }
public BiMap<ModContainer, Object> getModObjectList()
{
return ImmutableBiMap.copyOf(modObjectList);
}
} }

View File

@ -39,6 +39,7 @@ import com.google.common.base.Joiner;
import com.google.common.base.Splitter; import com.google.common.base.Splitter;
import com.google.common.base.Splitter.MapSplitter; import com.google.common.base.Splitter.MapSplitter;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
import com.google.common.collect.BiMap;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@ -603,4 +604,14 @@ public class Loader
modController.transition(LoaderState.AVAILABLE); modController.transition(LoaderState.AVAILABLE);
} }
public BiMap<ModContainer, Object> getModObjectList()
{
return modController.getModObjectList();
}
public BiMap<Object, ModContainer> getReversedModObjectList()
{
return getModObjectList().inverse();
}
} }

View File

@ -26,6 +26,7 @@ import com.google.common.collect.Maps;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.FMLLog;
import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer; import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.common.discovery.ASMDataTable; 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) 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) 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 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);
} }
} }