diff --git a/OpenRA.Mods.RA/AutoTarget.cs b/OpenRA.Mods.RA/AutoTarget.cs index 2d59f5bcfe..81760d8746 100644 --- a/OpenRA.Mods.RA/AutoTarget.cs +++ b/OpenRA.Mods.RA/AutoTarget.cs @@ -72,27 +72,33 @@ namespace OpenRA.Mods.RA if (!self.IsIdle || !info.TargetWhenDamaged) return; - if (e.Attacker.Destroyed) + var attacker = e.Attacker; + if (attacker.Destroyed || Stance < UnitStance.ReturnFire) return; - if (Stance < UnitStance.ReturnFire) return; + if (!attacker.IsInWorld && !attacker.Destroyed) + { + // If the aggressor is in a transport, then attack the transport instead + var passenger = attacker.TraitOrDefault(); + if (passenger != null && passenger.Transport != null) + attacker = passenger.Transport; + } // not a lot we can do about things we can't hurt... although maybe we should automatically run away? - if (!attack.HasAnyValidWeapons(Target.FromActor(e.Attacker))) + if (!attack.HasAnyValidWeapons(Target.FromActor(attacker))) return; // don't retaliate against own units force-firing on us. It's usually not what the player wanted. - if (e.Attacker.AppearsFriendlyTo(self)) + if (attacker.AppearsFriendlyTo(self)) return; // don't retaliate against healers if (e.Damage < 0) return; - Aggressor = e.Attacker; - + Aggressor = attacker; if (at == null || !at.IsReachableTarget(at.Target, info.AllowMovement && Stance != UnitStance.Defend)) - Attack(self, e.Attacker); + Attack(self, Aggressor); } public void TickIdle(Actor self) diff --git a/OpenRA.Mods.RA/Cargo.cs b/OpenRA.Mods.RA/Cargo.cs index 8df6a3270b..5f7f6a2663 100644 --- a/OpenRA.Mods.RA/Cargo.cs +++ b/OpenRA.Mods.RA/Cargo.cs @@ -144,6 +144,7 @@ namespace OpenRA.Mods.RA foreach (var npe in self.TraitsImplementing()) npe.PassengerExited(self, a); + a.Trait().Transport = null; return a; } @@ -178,6 +179,8 @@ namespace OpenRA.Mods.RA foreach (var npe in self.TraitsImplementing()) npe.PassengerEntered(self, a); + + a.Trait().Transport = self; } public void Killed(Actor self, AttackInfo e) @@ -205,10 +208,13 @@ namespace OpenRA.Mods.RA // Notify initial cargo load if (!initialized) { - foreach (var npe in self.TraitsImplementing()) - foreach (var c in cargo) - npe.PassengerEntered(self, c); + foreach (var c in cargo) + { + c.Trait().Transport = self; + foreach (var npe in self.TraitsImplementing()) + npe.PassengerEntered(self, c); + } initialized = true; } diff --git a/OpenRA.Mods.RA/Passenger.cs b/OpenRA.Mods.RA/Passenger.cs index 4a04de827c..6e4ad6e8dc 100644 --- a/OpenRA.Mods.RA/Passenger.cs +++ b/OpenRA.Mods.RA/Passenger.cs @@ -30,6 +30,7 @@ namespace OpenRA.Mods.RA { public readonly PassengerInfo info; public Passenger( PassengerInfo info ) { this.info = info; } + public Actor Transport; public IEnumerable Orders {