diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index f5bfca8f6f..b44d1bd23e 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -77,6 +77,7 @@ namespace OpenRA readonly IMouseBounds[] mouseBounds; readonly IVisibilityModifier[] visibilityModifiers; readonly IDefaultVisibility defaultVisibility; + readonly INotifyIdle[] tickIdles; readonly ITargetablePositions[] targetablePositions; WPos[] staticTargetablePositions; @@ -119,6 +120,7 @@ namespace OpenRA mouseBounds = TraitsImplementing().ToArray(); visibilityModifiers = TraitsImplementing().ToArray(); defaultVisibility = Trait(); + tickIdles = TraitsImplementing().ToArray(); Targetables = TraitsImplementing().ToArray(); targetablePositions = TraitsImplementing().ToArray(); world.AddFrameEndTask(w => @@ -141,6 +143,9 @@ namespace OpenRA if (!wasIdle && IsIdle) foreach (var n in TraitsImplementing()) n.OnBecomingIdle(this); + else if (wasIdle) + foreach (var tickIdle in tickIdles) + tickIdle.TickIdle(this); } public IEnumerable Render(WorldRenderer wr) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index b6328fb9f1..4241db482c 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -355,12 +355,7 @@ namespace OpenRA { WorldTick++; - using (new PerfSample("tick_idle")) - foreach (var ni in ActorsWithTrait()) - if (ni.Actor.IsIdle) - ni.Trait.TickIdle(ni.Actor); - - using (new PerfSample("tick_activities")) + using (new PerfSample("tick_actors")) foreach (var a in actors.Values) a.Tick();