diff --git a/OpenRA.Game/Activities/Activity.cs b/OpenRA.Game/Activities/Activity.cs index 601efb318c..d83acfac46 100644 --- a/OpenRA.Game/Activities/Activity.cs +++ b/OpenRA.Game/Activities/Activity.cs @@ -234,20 +234,20 @@ namespace OpenRA.Activities return true; } - public virtual void Queue(Activity activity) + public virtual void Queue(Actor self, Activity activity, bool pretick = false) { if (NextInQueue != null) - NextInQueue.Queue(activity); + NextInQueue.Queue(self, activity); else - NextInQueue = activity; + NextInQueue = pretick ? ActivityUtils.RunActivity(self, activity) : activity; } - public virtual void QueueChild(Activity activity) + public virtual void QueueChild(Actor self, Activity activity, bool pretick = false) { if (ChildActivity != null) - ChildActivity.Queue(activity); + ChildActivity.Queue(self, activity); else - ChildActivity = activity; + ChildActivity = pretick ? ActivityUtils.RunActivity(self, activity) : activity; } /// @@ -258,10 +258,10 @@ namespace OpenRA.Activities /// /// Activity from which to start traversing, and which to mark. If null, mark the calling activity, and start traversal from the root. /// Initial level of indentation. - protected void PrintActivityTree(Activity origin = null, int level = 0) + protected void PrintActivityTree(Actor self, Activity origin = null, int level = 0) { if (origin == null) - RootActivity.PrintActivityTree(this); + RootActivity.PrintActivityTree(self, this); else { Console.Write(new string(' ', level * 2)); @@ -271,10 +271,10 @@ namespace OpenRA.Activities Console.WriteLine(this.GetType().ToString().Split('.').Last()); if (ChildActivity != null) - ChildActivity.PrintActivityTree(origin, level + 1); + ChildActivity.PrintActivityTree(self, origin, level + 1); if (NextInQueue != null) - NextInQueue.PrintActivityTree(origin, level); + NextInQueue.PrintActivityTree(self, origin, level); } } diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index efbec300a8..3c46a71617 100644 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -222,7 +222,7 @@ namespace OpenRA if (CurrentActivity == null) CurrentActivity = nextActivity; else - CurrentActivity.RootActivity.Queue(nextActivity); + CurrentActivity.RootActivity.Queue(this, nextActivity); } public bool CancelActivity() diff --git a/OpenRA.Game/Traits/ActivityUtils.cs b/OpenRA.Game/Traits/ActivityUtils.cs index fd8fe2d6be..e0feb07456 100644 --- a/OpenRA.Game/Traits/ActivityUtils.cs +++ b/OpenRA.Game/Traits/ActivityUtils.cs @@ -51,10 +51,10 @@ namespace OpenRA.Traits return act; } - public static Activity SequenceActivities(params Activity[] acts) + public static Activity SequenceActivities(Actor self, params Activity[] acts) { return acts.Reverse().Aggregate( - (next, a) => { a.Queue(next); return a; }); + (next, a) => { a.Queue(self, next); return a; }); } } } diff --git a/OpenRA.Mods.Cnc/Activities/LayMines.cs b/OpenRA.Mods.Cnc/Activities/LayMines.cs index b46c9148e0..db361ac377 100644 --- a/OpenRA.Mods.Cnc/Activities/LayMines.cs +++ b/OpenRA.Mods.Cnc/Activities/LayMines.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Cnc.Activities return new Wait(20); // Add a CloseEnough range of 512 to the Rearm/Repair activities in order to ensure that we're at the host actor - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new MoveAdjacentTo(self, Target.FromActor(rearmTarget)), movement.MoveTo(self.World.Map.CellContaining(rearmTarget.CenterPosition), rearmTarget), new Rearm(self, rearmTarget, new WDist(512)), @@ -64,7 +64,7 @@ namespace OpenRA.Mods.Cnc.Activities if (minelayer.Minefield.Contains(self.Location) && ShouldLayMine(self, self.Location)) { LayMine(self); - return ActivityUtils.SequenceActivities(new Wait(20), this); // A little wait after placing each mine, for show + return ActivityUtils.SequenceActivities(self, new Wait(20), this); // A little wait after placing each mine, for show } if (minelayer.Minefield.Length > 0) @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Cnc.Activities { var p = minelayer.Minefield.Random(self.World.SharedRandom); if (ShouldLayMine(self, p)) - return ActivityUtils.SequenceActivities(movement.MoveTo(p, 0), this); + return ActivityUtils.SequenceActivities(self, movement.MoveTo(p, 0), this); } } diff --git a/OpenRA.Mods.Cnc/Activities/Leap.cs b/OpenRA.Mods.Cnc/Activities/Leap.cs index 3a4659e13f..e37af852ea 100644 --- a/OpenRA.Mods.Cnc/Activities/Leap.cs +++ b/OpenRA.Mods.Cnc/Activities/Leap.cs @@ -108,7 +108,7 @@ namespace OpenRA.Mods.Cnc.Activities attack.DoAttack(self, target); jumpComplete = true; - QueueChild(mobile.VisualMove(self, position, self.World.Map.CenterOfSubCell(destinationCell, destinationSubCell))); + QueueChild(self, mobile.VisualMove(self, position, self.World.Map.CenterOfSubCell(destinationCell, destinationSubCell)), true); return this; } diff --git a/OpenRA.Mods.Cnc/Activities/LeapAttack.cs b/OpenRA.Mods.Cnc/Activities/LeapAttack.cs index e1c94edcb3..9141cd070a 100644 --- a/OpenRA.Mods.Cnc/Activities/LeapAttack.cs +++ b/OpenRA.Mods.Cnc/Activities/LeapAttack.cs @@ -97,7 +97,7 @@ namespace OpenRA.Mods.Cnc.Activities if (!allowMovement || lastVisibleMaxRange == WDist.Zero || lastVisibleMaxRange < lastVisibleMinRange) return NextActivity; - QueueChild(mobile.MoveWithinRange(target, lastVisibleMinRange, lastVisibleMaxRange, checkTarget.CenterPosition, Color.Red)); + QueueChild(self, mobile.MoveWithinRange(target, lastVisibleMinRange, lastVisibleMaxRange, checkTarget.CenterPosition, Color.Red), true); return this; } @@ -127,11 +127,11 @@ namespace OpenRA.Mods.Cnc.Activities var desiredFacing = (destination - origin).Yaw.Facing; if (mobile.Facing != desiredFacing) { - QueueChild(new Turn(self, desiredFacing)); + QueueChild(self, new Turn(self, desiredFacing), true); return this; } - QueueChild(new Leap(self, target, mobile, targetMobile, info.Speed.Length, attack, edible)); + QueueChild(self, new Leap(self, target, mobile, targetMobile, info.Speed.Length, attack, edible), true); // Re-queue the child activities to kill the target if it didn't die in one go return this; diff --git a/OpenRA.Mods.Cnc/Traits/Attack/AttackTesla.cs b/OpenRA.Mods.Cnc/Traits/Attack/AttackTesla.cs index df1481eddb..25c97167fa 100644 --- a/OpenRA.Mods.Cnc/Traits/Attack/AttackTesla.cs +++ b/OpenRA.Mods.Cnc/Traits/Attack/AttackTesla.cs @@ -103,7 +103,7 @@ namespace OpenRA.Mods.Cnc.Traits if (!string.IsNullOrEmpty(attack.info.ChargeAudio)) Game.Sound.Play(SoundType.World, attack.info.ChargeAudio, self.CenterPosition); - return ActivityUtils.SequenceActivities(new Wait(attack.info.InitialChargeDelay), new ChargeFire(attack, target), this); + return ActivityUtils.SequenceActivities(self, new Wait(attack.info.InitialChargeDelay), new ChargeFire(attack, target), this); } } @@ -128,7 +128,7 @@ namespace OpenRA.Mods.Cnc.Traits attack.DoAttack(self, target); - return ActivityUtils.SequenceActivities(new Wait(attack.info.ChargeDelay), this); + return ActivityUtils.SequenceActivities(self, new Wait(attack.info.ChargeDelay), this); } } } diff --git a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs index a0a412e3b0..7c49a47ebb 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyAttack.cs @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Activities // If all valid weapons have depleted their ammo and Rearmable trait exists, return to RearmActor to reload and then resume the activity if (rearmable != null && !useLastVisibleTarget && attackAircraft.Armaments.All(x => x.IsTraitPaused || !x.Weapon.IsValidAgainst(target, self.World, self))) - return ActivityUtils.SequenceActivities(new ReturnToBase(self, aircraft.Info.AbortOnResupply), this); + return ActivityUtils.SequenceActivities(self, new ReturnToBase(self, aircraft.Info.AbortOnResupply), this); var pos = self.CenterPosition; var checkTarget = useLastVisibleTarget ? lastVisibleTarget : target; @@ -90,7 +90,7 @@ namespace OpenRA.Mods.Common.Activities return NextActivity; // Fly towards the last known position - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new Fly(self, target, WDist.Zero, lastVisibleMaximumRange, checkTarget.CenterPosition, Color.Red), this); } @@ -103,18 +103,18 @@ namespace OpenRA.Mods.Common.Activities { // TODO: This should fire each weapon at its maximum range if (attackAircraft != null && target.IsInRange(self.CenterPosition, attackAircraft.GetMinimumRange())) - ChildActivity = ActivityUtils.SequenceActivities( + ChildActivity = ActivityUtils.SequenceActivities(self, new FlyTimed(ticksUntilTurn, self), new Fly(self, target, checkTarget.CenterPosition, Color.Red), new FlyTimed(ticksUntilTurn, self)); else - ChildActivity = ActivityUtils.SequenceActivities( + ChildActivity = ActivityUtils.SequenceActivities(self, new Fly(self, target, checkTarget.CenterPosition, Color.Red), new FlyTimed(ticksUntilTurn, self)); // HACK: This needs to be done in this round-about way because TakeOff doesn't behave as expected when it doesn't have a NextActivity. if (self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length < aircraft.Info.MinAirborneAltitude) - ChildActivity = ActivityUtils.SequenceActivities(new TakeOff(self), ChildActivity); + ChildActivity = ActivityUtils.SequenceActivities(self, new TakeOff(self), ChildActivity); } ActivityUtils.RunActivity(self, ChildActivity); diff --git a/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs b/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs index 6b0c0972da..202b1f1119 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs @@ -89,7 +89,7 @@ namespace OpenRA.Mods.Common.Activities } wasMovingWithinRange = true; - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, aircraft.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition, targetLineColor), this); } diff --git a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs index f81930fdec..899046eda8 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliAttack.cs @@ -75,7 +75,7 @@ namespace OpenRA.Mods.Common.Activities // If all valid weapons have depleted their ammo and Rearmable trait exists, return to RearmActor to reload and then resume the activity if (rearmable != null && !useLastVisibleTarget && attackAircraft.Armaments.All(x => x.IsTraitPaused || !x.Weapon.IsValidAgainst(target, self.World, self))) - return ActivityUtils.SequenceActivities(new HeliReturnToBase(self, aircraft.Info.AbortOnResupply), this); + return ActivityUtils.SequenceActivities(self, new HeliReturnToBase(self, aircraft.Info.AbortOnResupply), this); var pos = self.CenterPosition; var checkTarget = useLastVisibleTarget ? lastVisibleTarget : target; diff --git a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs index 2a15e1692a..ad9f8d4b49 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliReturnToBase.cs @@ -61,7 +61,7 @@ namespace OpenRA.Mods.Common.Activities if (nearestResupplier == null && aircraft.Info.LandWhenIdle) { if (aircraft.Info.TurnToLand) - return ActivityUtils.SequenceActivities(new Turn(self, initialFacing), new HeliLand(self, true)); + return ActivityUtils.SequenceActivities(self, new Turn(self, initialFacing), new HeliLand(self, true)); return new HeliLand(self, true); } @@ -79,7 +79,7 @@ namespace OpenRA.Mods.Common.Activities var target = Target.FromPos(nearestResupplier.CenterPosition + randomPosition); - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new HeliFly(self, target, WDist.Zero, aircraft.Info.WaitDistanceFromResupplyBase, targetLineColor: Color.Green), this); } @@ -109,7 +109,7 @@ namespace OpenRA.Mods.Common.Activities else landingProcedures.Add(NextActivity); - return ActivityUtils.SequenceActivities(landingProcedures.ToArray()); + return ActivityUtils.SequenceActivities(self, landingProcedures.ToArray()); } bool ShouldLandAtBuilding(Actor self, Actor dest) diff --git a/OpenRA.Mods.Common/Activities/Air/ResupplyAircraft.cs b/OpenRA.Mods.Common/Activities/Air/ResupplyAircraft.cs index 9b1c9cc8fe..7d11169b38 100644 --- a/OpenRA.Mods.Common/Activities/Air/ResupplyAircraft.cs +++ b/OpenRA.Mods.Common/Activities/Air/ResupplyAircraft.cs @@ -30,19 +30,15 @@ namespace OpenRA.Mods.Common.Activities if (!aircraft.Info.TakeOffOnResupply) { - ChildActivity = ActivityUtils.SequenceActivities( - aircraft.GetResupplyActivities(host) - .Append(new AllowYieldingReservation(self)) - .Append(new WaitFor(() => NextInQueue != null || aircraft.ReservedActor == null)) - .ToArray()); + ChildActivity = ActivityUtils.SequenceActivities(self, aircraft.GetResupplyActivities(host).ToArray()); + QueueChild(self, new AllowYieldingReservation(self)); + QueueChild(self, new WaitFor(() => NextInQueue != null || aircraft.ReservedActor == null)); } else { - ChildActivity = ActivityUtils.SequenceActivities( - aircraft.GetResupplyActivities(host) - .Append(new AllowYieldingReservation(self)) - .Append(new TakeOff(self, (a, b, c) => NextInQueue == null && b.NextInQueue == null)) - .ToArray()); + ChildActivity = ActivityUtils.SequenceActivities(self, aircraft.GetResupplyActivities(host).ToArray()); + QueueChild(self, new AllowYieldingReservation(self)); + QueueChild(self, new TakeOff(self, (a, b, c) => NextInQueue == null && b.NextInQueue == null)); } } diff --git a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs index 22dab5f870..73baa2477d 100644 --- a/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs +++ b/OpenRA.Mods.Common/Activities/Air/ReturnToBase.cs @@ -135,7 +135,7 @@ namespace OpenRA.Mods.Common.Activities var nearestResupplier = ChooseResupplier(self, false); if (nearestResupplier != null) - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new Fly(self, Target.FromActor(nearestResupplier), WDist.Zero, aircraft.Info.WaitDistanceFromResupplyBase, targetLineColor: Color.Green), new FlyCircle(self, aircraft.Info.NumberOfTicksToVerifyAvailableAirport), this); @@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Activities if (!abortOnResupply) landingProcedures.Add(NextActivity); - return ActivityUtils.SequenceActivities(landingProcedures.ToArray()); + return ActivityUtils.SequenceActivities(self, landingProcedures.ToArray()); } } } diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index 6900ffaddf..5c313e27f6 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Activities // Move towards the last known position wasMovingWithinRange = true; - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, move.MoveWithinRange(target, WDist.Zero, lastVisibleMaximumRange, checkTarget.CenterPosition, Color.Red), this); } @@ -168,7 +168,7 @@ namespace OpenRA.Mods.Common.Activities var sightRange = rs != null ? rs.Range : WDist.FromCells(2); attackStatus |= AttackStatus.NeedsToMove; - moveActivity = ActivityUtils.SequenceActivities( + moveActivity = ActivityUtils.SequenceActivities(self, move.MoveWithinRange(target, sightRange, target.CenterPosition, Color.Red), this); @@ -195,9 +195,8 @@ namespace OpenRA.Mods.Common.Activities return AttackStatus.UnableToAttack; attackStatus |= AttackStatus.NeedsToMove; - var checkTarget = useLastVisibleTarget ? lastVisibleTarget : target; - moveActivity = ActivityUtils.SequenceActivities( + moveActivity = ActivityUtils.SequenceActivities(self, move.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition, Color.Red), this); @@ -209,7 +208,7 @@ namespace OpenRA.Mods.Common.Activities if (!Util.FacingWithinTolerance(facing.Facing, desiredFacing, ((AttackFrontalInfo)attack.Info).FacingTolerance)) { attackStatus |= AttackStatus.NeedsToTurn; - turnActivity = ActivityUtils.SequenceActivities(new Turn(self, desiredFacing), this); + turnActivity = ActivityUtils.SequenceActivities(self, new Turn(self, desiredFacing), this); return AttackStatus.NeedsToTurn; } diff --git a/OpenRA.Mods.Common/Activities/DeliverResources.cs b/OpenRA.Mods.Common/Activities/DeliverResources.cs index 4ceac383a4..9d0767c47d 100644 --- a/OpenRA.Mods.Common/Activities/DeliverResources.cs +++ b/OpenRA.Mods.Common/Activities/DeliverResources.cs @@ -57,7 +57,7 @@ namespace OpenRA.Mods.Common.Activities // No refineries exist; check again after delay defined in Harvester. if (harv.LinkedProc == null) - return ActivityUtils.SequenceActivities(new Wait(harv.Info.SearchForDeliveryBuildingDelay), this); + return ActivityUtils.SequenceActivities(self, new Wait(harv.Info.SearchForDeliveryBuildingDelay), this); var proc = harv.LinkedProc; var iao = proc.Trait(); @@ -68,7 +68,7 @@ namespace OpenRA.Mods.Common.Activities foreach (var n in self.TraitsImplementing()) n.MovingToRefinery(self, proc, null); - return ActivityUtils.SequenceActivities(movement.MoveTo(proc.Location + iao.DeliveryOffset, 0), this); + return ActivityUtils.SequenceActivities(self, movement.MoveTo(proc.Location + iao.DeliveryOffset, 0), this); } if (!isDocking) @@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Activities iao.OnDock(self, this); } - return ActivityUtils.SequenceActivities(new Wait(10), this); + return ActivityUtils.SequenceActivities(self, new Wait(10), this); } } } diff --git a/OpenRA.Mods.Common/Activities/DeliverUnit.cs b/OpenRA.Mods.Common/Activities/DeliverUnit.cs index 748d28e62b..511f6c6c39 100644 --- a/OpenRA.Mods.Common/Activities/DeliverUnit.cs +++ b/OpenRA.Mods.Common/Activities/DeliverUnit.cs @@ -98,7 +98,7 @@ namespace OpenRA.Mods.Common.Activities // Can't land, so wait at the target until something changes if (!targetLocation.HasValue) { - innerActivity = ActivityUtils.SequenceActivities( + innerActivity = ActivityUtils.SequenceActivities(self, new HeliFly(self, Target.FromCell(self.World, destination)), new Wait(25)); @@ -117,7 +117,7 @@ namespace OpenRA.Mods.Common.Activities { var facing = (targetPosition - self.CenterPosition).Yaw.Facing; localOffset = carryall.CarryableOffset.Rotate(body.QuantizeOrientation(self, WRot.FromFacing(facing))); - innerActivity = ActivityUtils.SequenceActivities( + innerActivity = ActivityUtils.SequenceActivities(self, new HeliFly(self, Target.FromPos(targetPosition - body.LocalToWorld(localOffset))), new Turn(self, facing)); @@ -170,7 +170,7 @@ namespace OpenRA.Mods.Common.Activities return this; case DeliveryState.TakeOff: - return ActivityUtils.SequenceActivities(new HeliFly(self, Target.FromPos(self.CenterPosition)), NextActivity); + return ActivityUtils.SequenceActivities(self, new HeliFly(self, Target.FromPos(self.CenterPosition)), NextActivity); case DeliveryState.Aborted: carryall.UnreserveCarryable(self); diff --git a/OpenRA.Mods.Common/Activities/DeployForGrantedCondition.cs b/OpenRA.Mods.Common/Activities/DeployForGrantedCondition.cs index 2213c6280a..e77169e832 100644 --- a/OpenRA.Mods.Common/Activities/DeployForGrantedCondition.cs +++ b/OpenRA.Mods.Common/Activities/DeployForGrantedCondition.cs @@ -30,7 +30,7 @@ namespace OpenRA.Mods.Common.Activities { // Turn to the required facing. if (deploy.Info.Facing != -1 && canTurn) - QueueChild(new Turn(self, deploy.Info.Facing)); + QueueChild(self, new Turn(self, deploy.Info.Facing)); } public override Activity Tick(Actor self) diff --git a/OpenRA.Mods.Common/Activities/FindResources.cs b/OpenRA.Mods.Common/Activities/FindResources.cs index 1c9c024441..e66bcaabf6 100644 --- a/OpenRA.Mods.Common/Activities/FindResources.cs +++ b/OpenRA.Mods.Common/Activities/FindResources.cs @@ -55,7 +55,7 @@ namespace OpenRA.Mods.Common.Activities if (harv.IsFull) { // HACK: DeliverResources is ignored if there are queued activities, so discard NextActivity - return ActivityUtils.SequenceActivities(new DeliverResources(self)); + return ActivityUtils.SequenceActivities(self, new DeliverResources(self)); } var closestHarvestablePosition = ClosestHarvestablePos(self); @@ -82,13 +82,13 @@ namespace OpenRA.Mods.Common.Activities // Avoid creating an activity cycle var next = NextInQueue; NextInQueue = null; - return ActivityUtils.SequenceActivities(next, new Wait(randFrames), this); + return ActivityUtils.SequenceActivities(self, next, new Wait(randFrames), this); } else { // Attempt to claim the target cell if (!claimLayer.TryClaimCell(self, closestHarvestablePosition.Value)) - return ActivityUtils.SequenceActivities(new Wait(25), this); + return ActivityUtils.SequenceActivities(self, new Wait(25), this); harv.LastSearchFailed = false; @@ -100,7 +100,7 @@ namespace OpenRA.Mods.Common.Activities n.MovingToResources(self, closestHarvestablePosition.Value, this); self.SetTargetLine(Target.FromCell(self.World, closestHarvestablePosition.Value), Color.Red, false); - return ActivityUtils.SequenceActivities(mobile.MoveTo(closestHarvestablePosition.Value, 1), new HarvestResource(self), this); + return ActivityUtils.SequenceActivities(self, mobile.MoveTo(closestHarvestablePosition.Value, 1), new HarvestResource(self), this); } } diff --git a/OpenRA.Mods.Common/Activities/HarvestResource.cs b/OpenRA.Mods.Common/Activities/HarvestResource.cs index 0f6020916f..aca5a1148a 100644 --- a/OpenRA.Mods.Common/Activities/HarvestResource.cs +++ b/OpenRA.Mods.Common/Activities/HarvestResource.cs @@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Activities var current = facing.Facing; var desired = body.QuantizeFacing(current, harvInfo.HarvestFacings); if (desired != current) - return ActivityUtils.SequenceActivities(new Turn(self, desired), this); + return ActivityUtils.SequenceActivities(self, new Turn(self, desired), this); } var resource = resLayer.Harvest(self.Location); @@ -71,7 +71,7 @@ namespace OpenRA.Mods.Common.Activities foreach (var t in self.TraitsImplementing()) t.Harvested(self, resource); - return ActivityUtils.SequenceActivities(new Wait(harvInfo.BaleLoadDelay), this); + return ActivityUtils.SequenceActivities(self, new Wait(harvInfo.BaleLoadDelay), this); } } } diff --git a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs index 4bb677a6c4..fcfe92ec94 100644 --- a/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs +++ b/OpenRA.Mods.Common/Activities/HarvesterDockSequence.cs @@ -54,8 +54,8 @@ namespace OpenRA.Mods.Common.Activities case DockingState.Turn: dockingState = DockingState.Dock; if (IsDragRequired) - return ActivityUtils.SequenceActivities(new Turn(self, DockAngle), new Drag(self, StartDrag, EndDrag, DragLength), this); - return ActivityUtils.SequenceActivities(new Turn(self, DockAngle), this); + return ActivityUtils.SequenceActivities(self, new Turn(self, DockAngle), new Drag(self, StartDrag, EndDrag, DragLength), this); + return ActivityUtils.SequenceActivities(self, new Turn(self, DockAngle), this); case DockingState.Dock: if (Refinery.IsInWorld && !Refinery.IsDead) foreach (var nd in Refinery.TraitsImplementing()) @@ -74,7 +74,7 @@ namespace OpenRA.Mods.Common.Activities Harv.LastLinkedProc = Harv.LinkedProc; Harv.LinkProc(self, null); if (IsDragRequired) - return ActivityUtils.SequenceActivities(new Drag(self, EndDrag, StartDrag, DragLength), NextActivity); + return ActivityUtils.SequenceActivities(self, new Drag(self, EndDrag, StartDrag, DragLength), NextActivity); return NextActivity; } diff --git a/OpenRA.Mods.Common/Activities/Hunt.cs b/OpenRA.Mods.Common/Activities/Hunt.cs index cda71881d9..a5fa509fc6 100644 --- a/OpenRA.Mods.Common/Activities/Hunt.cs +++ b/OpenRA.Mods.Common/Activities/Hunt.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Activities if (target == null) return this; - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new AttackMoveActivity(self, move.MoveTo(target.Location, 2)), new Wait(25), this); diff --git a/OpenRA.Mods.Common/Activities/Move/Follow.cs b/OpenRA.Mods.Common/Activities/Move/Follow.cs index 85132b8e82..f155a100a2 100644 --- a/OpenRA.Mods.Common/Activities/Move/Follow.cs +++ b/OpenRA.Mods.Common/Activities/Move/Follow.cs @@ -83,7 +83,7 @@ namespace OpenRA.Mods.Common.Activities // Move into range wasMovingWithinRange = true; - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, move.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition, targetLineColor), this); } diff --git a/OpenRA.Mods.Common/Activities/Move/Move.cs b/OpenRA.Mods.Common/Activities/Move/Move.cs index 904361a8f8..6bf07770d8 100644 --- a/OpenRA.Mods.Common/Activities/Move/Move.cs +++ b/OpenRA.Mods.Common/Activities/Move/Move.cs @@ -227,8 +227,7 @@ namespace OpenRA.Mods.Common.Activities // To avoid issues, we also make these mini-turns uninterruptible (like MovePart activities) to ensure the actor // finishes that mini-turn before starting something else. var facingWithinTolerance = Util.FacingWithinTolerance(mobile.Facing, firstFacing, mobile.TurnSpeed); - QueueChild(new Turn(self, firstFacing, facingWithinTolerance, !facingWithinTolerance)); - ChildActivity = ActivityUtils.RunActivity(self, ChildActivity); + QueueChild(self, new Turn(self, firstFacing, facingWithinTolerance, !facingWithinTolerance), true); return this; } @@ -242,18 +241,7 @@ namespace OpenRA.Mods.Common.Activities var to = Util.BetweenCells(self.World, mobile.FromCell, mobile.ToCell) + (map.Grid.OffsetOfSubCell(mobile.FromSubCell) + map.Grid.OffsetOfSubCell(mobile.ToSubCell)) / 2; - QueueChild(new MoveFirstHalf( - this, - from, - to, - mobile.Facing, - mobile.Facing, - 0)); - - // While carrying out one Move order, MoveSecondHalf finishes its work from time to time and returns null. - // That causes the ChildActivity to be null and makes us return to this part of code. - // If we only queue the activity and not run it, units will lose one tick and pause briefly! - ChildActivity = ActivityUtils.RunActivity(self, ChildActivity); + QueueChild(self, new MoveFirstHalf(this, from, to, mobile.Facing, mobile.Facing, 0), true); return this; } @@ -387,7 +375,7 @@ namespace OpenRA.Mods.Common.Activities if (ret == this) return ret; - Queue(ret); + Queue(self, ret); return NextActivity; } diff --git a/OpenRA.Mods.Common/Activities/Move/VisualMoveIntoTarget.cs b/OpenRA.Mods.Common/Activities/Move/VisualMoveIntoTarget.cs index 2c3f8d3fa8..ff9a37e937 100644 --- a/OpenRA.Mods.Common/Activities/Move/VisualMoveIntoTarget.cs +++ b/OpenRA.Mods.Common/Activities/Move/VisualMoveIntoTarget.cs @@ -65,7 +65,7 @@ namespace OpenRA.Mods.Common.Activities { var turn = ActivityUtils.RunActivity(self, new Turn(self, facing)); if (turn != null) - QueueChild(turn); + QueueChild(self, turn); return this; } diff --git a/OpenRA.Mods.Common/Activities/Parachute.cs b/OpenRA.Mods.Common/Activities/Parachute.cs index b80168cf55..5c8f621327 100644 --- a/OpenRA.Mods.Common/Activities/Parachute.cs +++ b/OpenRA.Mods.Common/Activities/Parachute.cs @@ -81,7 +81,7 @@ namespace OpenRA.Mods.Common.Activities } // Only the last queued activity (given order) is kept - public override void Queue(Activity activity) + public override void Queue(Actor self, Activity activity, bool pretick = false) { NextActivity = activity; } diff --git a/OpenRA.Mods.Common/Activities/Transform.cs b/OpenRA.Mods.Common/Activities/Transform.cs index 3fcd951027..43c800a5e6 100644 --- a/OpenRA.Mods.Common/Activities/Transform.cs +++ b/OpenRA.Mods.Common/Activities/Transform.cs @@ -36,10 +36,10 @@ namespace OpenRA.Mods.Common.Activities protected override void OnFirstRun(Actor self) { if (self.Info.HasTraitInfo()) - QueueChild(new Turn(self, Facing)); + QueueChild(self, new Turn(self, Facing)); if (self.Info.HasTraitInfo()) - QueueChild(new HeliLand(self, true)); + QueueChild(self, new HeliLand(self, true)); } public override Activity Tick(Actor self) @@ -71,7 +71,7 @@ namespace OpenRA.Mods.Common.Activities IsInterruptible = false; // Wait forever - QueueChild(new WaitFor(() => false)); + QueueChild(self, new WaitFor(() => false)); makeAnimation.Reverse(self, () => DoTransform(self)); return this; } diff --git a/OpenRA.Mods.Common/Activities/UnloadCargo.cs b/OpenRA.Mods.Common/Activities/UnloadCargo.cs index 0489746fa6..e83a0f25f8 100644 --- a/OpenRA.Mods.Common/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.Common/Activities/UnloadCargo.cs @@ -70,7 +70,7 @@ namespace OpenRA.Mods.Common.Activities { self.NotifyBlocker(BlockedExitCells(actor)); - return ActivityUtils.SequenceActivities(new Wait(10), this); + return ActivityUtils.SequenceActivities(self, new Wait(10), this); } cargo.Unload(self); diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 0d20577a34..11cdaba5a1 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -657,7 +657,7 @@ namespace OpenRA.Mods.Common.Traits return new Fly(self, target, WDist.FromCells(3), WDist.FromCells(5), initialTargetPosition, targetLineColor); - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new HeliFly(self, target, initialTargetPosition, targetLineColor), new Turn(self, Info.InitialFacing)); } @@ -674,11 +674,11 @@ namespace OpenRA.Mods.Common.Traits { // TODO: Ignore repulsion when moving if (!Info.CanHover) - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new CallFunc(() => SetVisualPosition(self, fromPos)), new Fly(self, Target.FromPos(toPos))); - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, new CallFunc(() => SetVisualPosition(self, fromPos)), new HeliFly(self, Target.FromPos(toPos))); } diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index cb6a4ad0b9..fba77fdbc6 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -275,7 +275,7 @@ namespace OpenRA.Mods.Common.Traits } wasMovingWithinRange = true; - return ActivityUtils.SequenceActivities( + return ActivityUtils.SequenceActivities(self, move.MoveWithinRange(target, minRange, maxRange, checkTarget.CenterPosition, Color.Red), this); } diff --git a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs index 3638855248..c20bd59934 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/Refinery.cs @@ -144,12 +144,12 @@ namespace OpenRA.Mods.Common.Traits { if (!preventDock) { - dockOrder.Queue(new CallFunc(() => dockedHarv = harv, false)); - dockOrder.Queue(DockSequence(harv, self)); - dockOrder.Queue(new CallFunc(() => dockedHarv = null, false)); + dockOrder.Queue(self, new CallFunc(() => dockedHarv = harv, false)); + dockOrder.Queue(self, DockSequence(harv, self)); + dockOrder.Queue(self, new CallFunc(() => dockedHarv = null, false)); } - dockOrder.Queue(new CallFunc(() => harv.Trait().ContinueHarvesting(harv))); + dockOrder.Queue(self, new CallFunc(() => harv.Trait().ContinueHarvesting(harv))); } void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 6c3f3b8906..e6da47bac4 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -271,7 +271,7 @@ namespace OpenRA.Mods.Common.Traits var notifyBlocking = new CallFunc(() => self.NotifyBlocker(cellInfo.Cell)); var waitFor = new WaitFor(() => CanEnterCell(cellInfo.Cell)); var move = new Move(self, cellInfo.Cell); - self.QueueActivity(ActivityUtils.SequenceActivities(notifyBlocking, waitFor, move)); + self.QueueActivity(ActivityUtils.SequenceActivities(self, notifyBlocking, waitFor, move)); Log.Write("debug", "OnNudge (notify next blocking actor, wait and move) #{0} from {1} to {2}", self.ActorID, self.Location, cellInfo.Cell); @@ -628,7 +628,7 @@ namespace OpenRA.Mods.Common.Traits var delta = toPos - fromPos; var facing = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : Facing; - return ActivityUtils.SequenceActivities(new Turn(self, facing), new Drag(self, fromPos, toPos, length)); + return ActivityUtils.SequenceActivities(self, new Turn(self, facing), new Drag(self, fromPos, toPos, length)); } CPos? ClosestGroundCell() diff --git a/OpenRA.Mods.Common/Traits/Repairable.cs b/OpenRA.Mods.Common/Traits/Repairable.cs index 908b270a90..db138e9a6b 100644 --- a/OpenRA.Mods.Common/Traits/Repairable.cs +++ b/OpenRA.Mods.Common/Traits/Repairable.cs @@ -112,13 +112,11 @@ namespace OpenRA.Mods.Common.Traits self.CancelActivity(); self.SetTargetLine(order.Target, Color.Green); - - var activities = ActivityUtils.SequenceActivities( + var activities = ActivityUtils.SequenceActivities(self, movement.MoveToTarget(self, order.Target, targetLineColor: Color.Green), new CallFunc(() => AfterReachActivities(self, order, movement))); self.QueueActivity(new WaitForTransport(self, activities)); - TryCallTransport(self, order.Target, new CallFunc(() => AfterReachActivities(self, order, movement))); } }