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(); }