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

@@ -409,26 +409,29 @@ 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>();
if (positionable.CanEnterCell(self.Location, self, BlockedByActor.All))
{
positionable.SetPosition(passenger, self.Location);
w.Add(passenger);
var nbms = passenger.TraitsImplementing<INotifyBlockingMove>(); var nbms = passenger.TraitsImplementing<INotifyBlockingMove>();
foreach (var nbm in nbms) foreach (var nbm in nbms)
nbm.OnNotifyBlockingMove(passenger, passenger); nbm.OnNotifyBlockingMove(passenger, passenger);
} }
else else
passenger.Kill(e.Attacker); passenger.Kill(e.Attacker);
});
} }
}
else
foreach (var c in cargo) foreach (var c in cargo)
c.Kill(e.Attacker); c.Kill(e.Attacker);