Fix EjectOnDeath checks

This commit is contained in:
Gustas
2022-12-05 22:29:42 +02:00
committed by Matthias Mailänder
parent 7769764b0b
commit c3b4e2b237

View File

@@ -408,29 +408,32 @@ namespace OpenRA.Mods.Common.Traits
} }
void INotifyKilled.Killed(Actor self, AttackInfo e) void INotifyKilled.Killed(Actor self, AttackInfo e)
{ {
if (Info.EjectOnDeath) if (Info.EjectOnDeath && self.IsAtGroundLevel() && (!checkTerrainType || Info.UnloadTerrainTypes.Contains(self.World.Map.GetTerrainInfo(self.Location).Type)))
while (!IsEmpty() && CanUnload(BlockedByActor.All)) {
while (!IsEmpty())
{ {
var passenger = Unload(self); var passenger = Unload(self);
var cp = self.CenterPosition; self.World.AddFrameEndTask(w =>
var inAir = self.World.Map.DistanceAboveTerrain(cp).Length != 0;
var positionable = passenger.Trait<IPositionable>();
positionable.SetPosition(passenger, self.Location);
if (!inAir && positionable.CanEnterCell(self.Location, self, BlockedByActor.None))
{ {
self.World.AddFrameEndTask(w => w.Add(passenger)); var positionable = passenger.Trait<IPositionable>();
var nbms = passenger.TraitsImplementing<INotifyBlockingMove>(); if (positionable.CanEnterCell(self.Location, self, BlockedByActor.All))
foreach (var nbm in nbms) {
nbm.OnNotifyBlockingMove(passenger, passenger); positionable.SetPosition(passenger, self.Location);
} w.Add(passenger);
else
passenger.Kill(e.Attacker);
}
foreach (var c in cargo) var nbms = passenger.TraitsImplementing<INotifyBlockingMove>();
c.Kill(e.Attacker); 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(); cargo.Clear();
} }