diff --git a/OpenRa.Game/GameRules/NewUnitInfo.cs b/OpenRa.Game/GameRules/NewUnitInfo.cs index 6611b48fb0..b69d5e8745 100755 --- a/OpenRa.Game/GameRules/NewUnitInfo.cs +++ b/OpenRa.Game/GameRules/NewUnitInfo.cs @@ -3,6 +3,9 @@ using System.Collections.Generic; using System.Linq; using OpenRa.FileFormats; using OpenRa.Traits; +using System.Reflection; +using IjwFramework.Types; +using System.IO; namespace OpenRa.GameRules { @@ -49,16 +52,25 @@ namespace OpenRa.GameRules return node; } + // todo: use mod metadata to do this + static Pair[] ModAssemblies = + { + Pair.New( typeof(ITraitInfo).Assembly, typeof(ITraitInfo).Namespace ), + Pair.New( Assembly.LoadFile(Path.GetFullPath(@"mods\ra\OpenRa.Mods.RA.dll")), "OpenRa.Mods.RA" ) + }; + static ITraitInfo LoadTraitInfo(string traitName, MiniYaml my) { - var fullTypeName = typeof(ITraitInfo).Namespace + "." + traitName + "Info"; - var info = (ITraitInfo)typeof(ITraitInfo).Assembly.CreateInstance(fullTypeName); + foreach (var mod in ModAssemblies) + { + var fullTypeName = mod.Second + "." + traitName + "Info"; + var info = (ITraitInfo)mod.First.CreateInstance(fullTypeName); + if (info == null) continue; + FieldLoader.Load(info, my); + return info; + } - if (info == null) - throw new NotImplementedException("Missing traitinfo type `{0}`".F(fullTypeName)); - - FieldLoader.Load(info, my); - return info; + throw new InvalidOperationException("Cannot locate trait: {0}".F(traitName)); } } } diff --git a/OpenRa.Game/OpenRa.Game.csproj b/OpenRa.Game/OpenRa.Game.csproj index 4f3afcfc26..8e756e5a09 100644 --- a/OpenRa.Game/OpenRa.Game.csproj +++ b/OpenRa.Game/OpenRa.Game.csproj @@ -206,7 +206,6 @@ - @@ -237,8 +236,6 @@ - - diff --git a/OpenRa.Game/Traits/Mine.cs b/OpenRa.Game/Traits/Mine.cs deleted file mode 100644 index 34188ff23f..0000000000 --- a/OpenRa.Game/Traits/Mine.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using OpenRa.Effects; - -namespace OpenRa.Traits -{ - -} diff --git a/OpenRa.Game/Traits/MineImmune.cs b/OpenRa.Game/Traits/MineImmune.cs deleted file mode 100644 index 79f1140290..0000000000 --- a/OpenRa.Game/Traits/MineImmune.cs +++ /dev/null @@ -1,5 +0,0 @@ - -namespace OpenRa.Traits -{ - -} diff --git a/OpenRa.Game/Traits/Minelayer.cs b/OpenRa.Game/Traits/Minelayer.cs deleted file mode 100644 index 6909689b24..0000000000 --- a/OpenRa.Game/Traits/Minelayer.cs +++ /dev/null @@ -1,5 +0,0 @@ -using System.Linq; - -namespace OpenRa.Traits -{ -} diff --git a/OpenRa.Mods.RA/Mine.cs b/OpenRa.Mods.RA/Mine.cs index f38d61fc9c..e9f85bb1cf 100644 --- a/OpenRa.Mods.RA/Mine.cs +++ b/OpenRa.Mods.RA/Mine.cs @@ -1,9 +1,7 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Text; -using OpenRa.Traits; using OpenRa.Effects; +using OpenRa.Traits; namespace OpenRa.Mods.RA { @@ -54,7 +52,4 @@ namespace OpenRa.Mods.RA public IEnumerable OccupiedCells() { yield return self.Location; } } - - class MineImmuneInfo : StatelessTraitInfo { } - class MineImmune { } } diff --git a/OpenRa.Mods.RA/MineImmune.cs b/OpenRa.Mods.RA/MineImmune.cs new file mode 100644 index 0000000000..1f4b51edb3 --- /dev/null +++ b/OpenRa.Mods.RA/MineImmune.cs @@ -0,0 +1,7 @@ +using OpenRa.Traits; + +namespace OpenRa.Mods.RA +{ + class MineImmuneInfo : StatelessTraitInfo { } + class MineImmune { } +} diff --git a/OpenRa.Mods.RA/Minelayer.cs b/OpenRa.Mods.RA/Minelayer.cs index 6dd7a915e6..3280c3f72f 100644 --- a/OpenRa.Mods.RA/Minelayer.cs +++ b/OpenRa.Mods.RA/Minelayer.cs @@ -1,20 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Linq; using OpenRa.Traits; -using OpenRa; namespace OpenRa.Mods.RA { - class MinelayerInfo : ITraitInfo + class MinelayerInfo : StatelessTraitInfo { public readonly string Mine = "minv"; - - public object Create(Actor self) - { - return new Minelayer(); - } } class Minelayer : IIssueOrder, IResolveOrder diff --git a/OpenRa.Mods.RA/OpenRa.Mods.RA.csproj b/OpenRa.Mods.RA/OpenRa.Mods.RA.csproj index 0054171f18..88746d0e66 100644 --- a/OpenRa.Mods.RA/OpenRa.Mods.RA.csproj +++ b/OpenRa.Mods.RA/OpenRa.Mods.RA.csproj @@ -46,6 +46,7 @@ + @@ -67,4 +68,8 @@ --> + + mkdir "$(SolutionDir)mods/ra/" +copy "$(TargetPath)" "$(SolutionDir)mods/ra/" + \ No newline at end of file diff --git a/mods/ra/OpenRa.Mods.RA.dll b/mods/ra/OpenRa.Mods.RA.dll new file mode 100644 index 0000000000..eabdbe9fd0 Binary files /dev/null and b/mods/ra/OpenRa.Mods.RA.dll differ