diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 46a0af0fd4..ac42f3d285 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -56,7 +56,7 @@ namespace OpenRA static bool changePending; public static Pair[] ModAssemblies; - public static void LoadModPackages(Manifest manifest) + static void LoadModPackages(Manifest manifest) { FileSystem.UnmountAll(); Timer.Time("reset: {0}"); @@ -67,7 +67,7 @@ namespace OpenRA Timer.Time("mount temporary packages: {0}"); } - internal static void LoadModAssemblies(Manifest m) + static void LoadModAssemblies(Manifest m) { // All the core namespaces var asms = typeof(Game).Assembly.GetNamespaces() @@ -96,6 +96,19 @@ namespace OpenRA ModAssemblies = asms.ToArray(); } + + public static T CreateObject(string classname) + { + foreach (var mod in ModAssemblies) + { + var fullTypeName = mod.Second + "." + classname; + var obj = mod.First.CreateInstance(fullTypeName); + if (obj != null) + return (T)obj; + } + + throw new InvalidOperationException("Cannot locate type: {0}".F(classname)); + } public static void ChangeMap(string mapName) { diff --git a/OpenRA.Game/GameRules/ActorInfo.cs b/OpenRA.Game/GameRules/ActorInfo.cs index f386648538..6adc0db176 100644 --- a/OpenRA.Game/GameRules/ActorInfo.cs +++ b/OpenRA.Game/GameRules/ActorInfo.cs @@ -71,16 +71,9 @@ namespace OpenRA.GameRules static ITraitInfo LoadTraitInfo(string traitName, MiniYaml my) { - foreach (var mod in Game.ModAssemblies) - { - var fullTypeName = mod.Second + "." + traitName + "Info"; - var info = (ITraitInfo)mod.First.CreateInstance(fullTypeName); - if (info == null) continue; - FieldLoader.Load(info, my); - return info; - } - - throw new InvalidOperationException("Cannot locate trait: {0}".F(traitName)); + var info = Game.CreateObject(traitName + "Info"); + FieldLoader.Load(info, my); + return info; } public IEnumerable TraitsInConstructOrder()