diff --git a/OpenRA.Mods.Common/Lint/CheckTargetHealthRadius.cs b/OpenRA.Mods.Common/Lint/CheckTargetHealthRadius.cs index 7e88927503..cc6d46e3fe 100644 --- a/OpenRA.Mods.Common/Lint/CheckTargetHealthRadius.cs +++ b/OpenRA.Mods.Common/Lint/CheckTargetHealthRadius.cs @@ -47,7 +47,20 @@ namespace OpenRA.Mods.Common.Lint continue; if (healthTraits.Where(x => x.Shape.OuterRadius.Length > warhead.TargetExtraSearchRadius.Length).Any()) - emitError("Actor type `{0}` has a health radius exceeding the victim scan radius of a warhead on `{1}`!" + emitError("Actor type `{0}` has a health radius exceeding the victim scan radius of a SpreadDamageWarhead on `{1}`!" + .F(actorInfo.Key, weaponInfo.Key)); + } + + var effectWarheads = weaponInfo.Value.Warheads.OfType(); + + foreach (var warhead in effectWarheads) + { + // This warhead cannot affect this actor. + if (!warhead.ValidTargets.Overlaps(targetable)) + continue; + + if (healthTraits.Where(x => x.Shape.OuterRadius.Length > warhead.TargetSearchRadius.Length).Any()) + emitError("Actor type `{0}` has a health radius exceeding the victim scan radius of a CreateEffectWarhead on `{1}`!" .F(actorInfo.Key, weaponInfo.Key)); } diff --git a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs index 4d0304ca2d..b618ec4dea 100644 --- a/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/CreateEffectWarhead.cs @@ -30,6 +30,9 @@ namespace OpenRA.Mods.Common.Warheads [Desc("Remap explosion effect to player color, if art supports it.")] public readonly bool UsePlayerPalette = false; + [Desc("Search radius around impact for 'direct hit' check.")] + public readonly WDist TargetSearchRadius = new WDist(2048); + [Desc("List of sounds that can be played on impact.")] public readonly string[] ImpactSounds = new string[0]; @@ -72,17 +75,17 @@ namespace OpenRA.Mods.Common.Warheads public bool GetDirectHit(World world, CPos cell, WPos pos, Actor firedBy, bool checkTargetType = false) { - foreach (var unit in world.ActorMap.GetActorsAt(cell)) + foreach (var victim in world.FindActorsInCircle(pos, TargetSearchRadius)) { - if (checkTargetType && !IsValidAgainst(unit, firedBy)) + if (checkTargetType && !IsValidAgainst(victim, firedBy)) continue; - var healthInfo = unit.Info.TraitInfoOrDefault(); + var healthInfo = victim.Info.TraitInfoOrDefault(); if (healthInfo == null) continue; // If the impact position is within any actor's HitShape, we have a direct hit - if ((unit.CenterPosition - pos).LengthSquared <= healthInfo.Shape.DistanceFromEdge(pos, unit).LengthSquared) + if (healthInfo.Shape.DistanceFromEdge(pos, victim).Length <= 0) return true; }