diff --git a/OpenRA.Game/Graphics/CursorSheetBuilder.cs b/OpenRA.Game/Graphics/CursorSheetBuilder.cs index 6e0e783143..688826341f 100644 --- a/OpenRA.Game/Graphics/CursorSheetBuilder.cs +++ b/OpenRA.Game/Graphics/CursorSheetBuilder.cs @@ -27,7 +27,7 @@ namespace OpenRA.Graphics } Sprite[] LoadCursors(string filename) - { + { try { var shp = new Dune2ShpReader(FileSystem.OpenWithExts(filename, exts)); diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index aaba582781..368d514146 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -17,31 +17,61 @@ namespace OpenRA.Orders { class UnitOrderGenerator : IOrderGenerator { - public IEnumerable Order( World world, int2 xy, MouseInput mi ) - { - var underCursor = world.FindUnitsAtMouse(mi.Location) - .Where(a => a.Info.Traits.Contains()) - .OrderByDescending(a => a.Info.Traits.Contains() ? a.Info.Traits.Get().Priority : int.MinValue) - .FirstOrDefault(); - - var orders = world.Selection.Actors - .Select(a => OrderForUnit(a, xy, mi, underCursor)) - .Where(o => o != null) - .ToArray(); - - var actorsInvolved = orders.Select(o => o.self).Distinct(); - if (actorsInvolved.Any()) - yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, - string.Join(",", actorsInvolved.Select(a => a.ActorID.ToString()).ToArray())); + public IEnumerable Order( World world, int2 xy, MouseInput mi ) + { + var custom = world.WorldActor.TraitOrDefault(); + if (custom != null) + { + var customOrders = custom.Order(world, xy, mi); - foreach( var o in orders ) - yield return CheckSameOrder( o.iot, o.trait.IssueOrder( o.self, o.iot, o.target ) ); + foreach (var o in customOrders) + yield return o; + } + else + { + var underCursor = world.FindUnitsAtMouse(mi.Location) + .Where(a => a.Info.Traits.Contains()) + .OrderByDescending( + a => + a.Info.Traits.Contains() + ? a.Info.Traits.Get().Priority + : int.MinValue) + .FirstOrDefault(); + + var orders = world.Selection.Actors + .Select(a => OrderForUnit(a, xy, mi, underCursor)) + .Where(o => o != null) + .ToArray(); + + var actorsInvolved = orders.Select(o => o.self).Distinct(); + if (actorsInvolved.Any()) + yield return new Order("CreateGroup", actorsInvolved.First().Owner.PlayerActor, + string.Join(",", actorsInvolved.Select(a => a.ActorID.ToString()).ToArray())) + ; + + foreach (var o in orders) + yield return CheckSameOrder(o.iot, o.trait.IssueOrder(o.self, o.iot, o.target)); + } } - public void Tick( World world ) {} + public void Tick( World world ) + { + var custom = world.WorldActor.TraitOrDefault(); + if (custom != null) + { + custom.Tick(world); + } + } + + public void RenderBeforeWorld( WorldRenderer wr, World world ) + { + var custom = world.WorldActor.TraitOrDefault(); + if (custom != null) + { + custom.RenderBeforeWorld(wr, world); + return; + } - public void RenderBeforeWorld( WorldRenderer wr, World world ) - { foreach (var a in world.Selection.Actors) if (!a.Destroyed) foreach (var t in a.TraitsImplementing()) @@ -50,8 +80,15 @@ namespace OpenRA.Orders Game.Renderer.Flush(); } - public void RenderAfterWorld( WorldRenderer wr, World world ) - { + public void RenderAfterWorld( WorldRenderer wr, World world ) + { + var custom = world.WorldActor.TraitOrDefault(); + if (custom != null) + { + custom.RenderAfterWorld(wr, world); + return; + } + foreach (var a in world.Selection.Actors) if (!a.Destroyed) foreach (var t in a.TraitsImplementing()) @@ -60,8 +97,14 @@ namespace OpenRA.Orders Game.Renderer.Flush(); } - public string GetCursor( World world, int2 xy, MouseInput mi ) - { + public string GetCursor( World world, int2 xy, MouseInput mi ) + { + var custom = world.WorldActor.TraitOrDefault(); + if (custom != null) + { + return custom.GetCursor(world, xy, mi); + } + var underCursor = world.FindUnitsAtMouse(mi.Location) .Where(a => a.Info.Traits.Contains()) .OrderByDescending(a => a.Info.Traits.Contains() ? a.Info.Traits.Get().Priority : int.MinValue) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index a1bf8600dd..eb9a2e2e26 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -51,7 +51,7 @@ namespace OpenRA.Traits } public interface IOrderCursor { string CursorForOrder(Actor self, Order order); } public interface IOrderVoice { string VoicePhraseForOrder(Actor self, Order order); } - + public interface ICustomUnitOrderGenerator : IOrderGenerator {}; public interface INotifySold { void Selling( Actor self ); void Sold( Actor self ); } public interface INotifyDamage { void Damaged(Actor self, AttackInfo e); } public interface INotifyBuildComplete { void BuildingComplete(Actor self); } diff --git a/OpenRA.Mods.RA/IronCurtainable.cs b/OpenRA.Mods.RA/IronCurtainable.cs index ced009dfda..9bb06bd917 100644 --- a/OpenRA.Mods.RA/IronCurtainable.cs +++ b/OpenRA.Mods.RA/IronCurtainable.cs @@ -38,4 +38,4 @@ namespace OpenRA.Mods.RA RemainingTicks = duration; } } -} +} \ No newline at end of file