From 11ca728e4122c121437157329bae06d843314e18 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sat, 31 May 2025 02:11:25 +0300 Subject: [PATCH] fix: anomaly shooting no longer throws when it have no possible targets in range (#37927) Co-authored-by: pa.pecherskij --- .../Effects/ProjectileAnomalySystem.cs | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs index 4a60aa9a2f..917ab0ce99 100644 --- a/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/ProjectileAnomalySystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using System.Numerics; using Content.Server.Anomaly.Components; using Content.Server.Weapons.Ranged.Systems; @@ -7,7 +6,6 @@ using Content.Shared.Mobs.Components; using Content.Shared.Projectiles; using Robust.Server.GameObjects; using Robust.Shared.Map; -using Robust.Shared.Physics; using Robust.Shared.Random; namespace Content.Server.Anomaly.Effects; @@ -24,10 +22,19 @@ public sealed class ProjectileAnomalySystem : EntitySystem [Dependency] private readonly GunSystem _gunSystem = default!; [Dependency] private readonly SharedMapSystem _map = default!; + private EntityQuery _xFormQuery; + private EntityQuery _mobQuery; + + /// Pre-allocated collection for calculating entities in range. + private readonly HashSet _inRange = new(); + public override void Initialize() { SubscribeLocalEvent(OnPulse); SubscribeLocalEvent(OnSupercritical); + + _xFormQuery = GetEntityQuery(); + _mobQuery = GetEntityQuery(); } private void OnPulse(EntityUid uid, ProjectileAnomalyComponent component, ref AnomalyPulseEvent args) @@ -43,16 +50,19 @@ public sealed class ProjectileAnomalySystem : EntitySystem private void ShootProjectilesAtEntities(EntityUid uid, ProjectileAnomalyComponent component, float severity) { var projectileCount = (int)MathF.Round(MathHelper.Lerp(component.MinProjectiles, component.MaxProjectiles, severity)); - var xformQuery = GetEntityQuery(); - var mobQuery = GetEntityQuery(); - var xform = xformQuery.GetComponent(uid); - var inRange = _lookup.GetEntitiesInRange(uid, component.ProjectileRange * severity, LookupFlags.Dynamic).ToList(); - _random.Shuffle(inRange); + var xform = _xFormQuery.GetComponent(uid); + + _inRange.Clear(); + _lookup.GetEntitiesInRange(uid, component.ProjectileRange * severity, _inRange, LookupFlags.Dynamic); + + if (_inRange.Count == 0) + return; + var priority = new List(); - foreach (var entity in inRange) + foreach (var entity in _inRange) { - if (mobQuery.HasComponent(entity)) + if (_mobQuery.HasComponent(entity)) priority.Add(entity); } @@ -60,17 +70,20 @@ public sealed class ProjectileAnomalySystem : EntitySystem while (projectileCount > 0) { Log.Debug($"{projectileCount}"); - var target = priority.Any() + var target = priority.Count > 0 ? _random.PickAndTake(priority) - : _random.Pick(inRange); + : _random.Pick(_inRange); - var targetCoords = xformQuery.GetComponent(target).Coordinates.Offset(_random.NextVector2(0.5f)); + var targetXForm= _xFormQuery.GetComponent(target); + var targetCoords = targetXForm.Coordinates.Offset(_random.NextVector2(0.5f)); ShootProjectile( - uid, component, + uid, + component, xform.Coordinates, targetCoords, - severity); + severity + ); projectileCount--; } } @@ -80,7 +93,8 @@ public sealed class ProjectileAnomalySystem : EntitySystem ProjectileAnomalyComponent component, EntityCoordinates coords, EntityCoordinates targetCoords, - float severity) + float severity + ) { var mapPos = _xform.ToMapCoordinates(coords); -- 2.51.2