Fix EjectOnDeath checks
This commit is contained in:
committed by
Matthias Mailänder
parent
7769764b0b
commit
c3b4e2b237
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user