From b693f20789c96e1656a01d6877d14289b57430a7 Mon Sep 17 00:00:00 2001 From: darkademic <41052878+darkademic@users.noreply.github.com> Date: Sat, 25 May 2024 09:00:05 +0100 Subject: [PATCH] Fix crash caused by queuing multiple pick up orders for a single unit. --- OpenRA.Mods.Common/Activities/PickupUnit.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/OpenRA.Mods.Common/Activities/PickupUnit.cs b/OpenRA.Mods.Common/Activities/PickupUnit.cs index 09c9864753..b2a792dc2a 100644 --- a/OpenRA.Mods.Common/Activities/PickupUnit.cs +++ b/OpenRA.Mods.Common/Activities/PickupUnit.cs @@ -33,6 +33,7 @@ namespace OpenRA.Mods.Common.Activities enum PickupState { Intercept, LockCarryable, Pickup } PickupState state = PickupState.Intercept; + bool reserveFailed; public PickupUnit(Actor self, Actor cargo, int delay, Color? targetLineColor) { @@ -52,7 +53,10 @@ namespace OpenRA.Mods.Common.Activities { // The cargo might have become invalid while we were moving towards it. if (cargo.IsDead || carryable.IsTraitDisabled || carryall.IsTraitDisabled || !cargo.AppearsFriendlyTo(self)) + { + reserveFailed = true; return; + } if (carryall.ReserveCarryable(self, cargo)) { @@ -61,11 +65,13 @@ namespace OpenRA.Mods.Common.Activities QueueChild(new Fly(self, Target.FromActor(cargo))); QueueChild(new FlyIdle(self, idleTurn: false)); } + else + reserveFailed = true; } public override bool Tick(Actor self) { - if (IsCanceling) + if (IsCanceling || reserveFailed) return true; if (cargo.IsDead || carryable.IsTraitDisabled || carryall.IsTraitDisabled || !cargo.AppearsFriendlyTo(self) || cargo != carryall.Carryable)