From c3b4e2b237d8a79115b1649fa9879b3bf882f0e0 Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Mon, 5 Dec 2022 22:29:42 +0200 Subject: [PATCH] Fix EjectOnDeath checks --- OpenRA.Mods.Common/Traits/Cargo.cs | 41 ++++++++++++++++-------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Cargo.cs b/OpenRA.Mods.Common/Traits/Cargo.cs index 62d79b9610..c5ce17c633 100644 --- a/OpenRA.Mods.Common/Traits/Cargo.cs +++ b/OpenRA.Mods.Common/Traits/Cargo.cs @@ -408,29 +408,32 @@ namespace OpenRA.Mods.Common.Traits } void INotifyKilled.Killed(Actor self, AttackInfo e) - { - if (Info.EjectOnDeath) - while (!IsEmpty() && CanUnload(BlockedByActor.All)) + { + if (Info.EjectOnDeath && self.IsAtGroundLevel() && (!checkTerrainType || Info.UnloadTerrainTypes.Contains(self.World.Map.GetTerrainInfo(self.Location).Type))) + { + while (!IsEmpty()) { var passenger = Unload(self); - var cp = self.CenterPosition; - var inAir = self.World.Map.DistanceAboveTerrain(cp).Length != 0; - var positionable = passenger.Trait(); - positionable.SetPosition(passenger, self.Location); - - if (!inAir && positionable.CanEnterCell(self.Location, self, BlockedByActor.None)) + self.World.AddFrameEndTask(w => { - self.World.AddFrameEndTask(w => w.Add(passenger)); - var nbms = passenger.TraitsImplementing(); - foreach (var nbm in nbms) - nbm.OnNotifyBlockingMove(passenger, passenger); - } - else - passenger.Kill(e.Attacker); - } + var positionable = passenger.Trait(); + if (positionable.CanEnterCell(self.Location, self, BlockedByActor.All)) + { + positionable.SetPosition(passenger, self.Location); + w.Add(passenger); - foreach (var c in cargo) - c.Kill(e.Attacker); + var nbms = passenger.TraitsImplementing(); + foreach (var nbm in nbms) + nbm.OnNotifyBlockingMove(passenger, passenger); + } + else + passenger.Kill(e.Attacker); + }); + } + } + else + foreach (var c in cargo) + c.Kill(e.Attacker); cargo.Clear(); }