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)
{
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)

View File

@ -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<String, ModContainer> modList;
private List<ModContainer> activeModList = Lists.newArrayList();
private String activeContainer;
private BiMap<ModContainer, Object> 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<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)
{
errors.put(modContainer.getModId(), exception);
@ -162,4 +179,9 @@ public class LoadController
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.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<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 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);
}
}