From 292de9c859f932456f9257ebcecaa1be53c572d3 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 12 Sep 2024 13:29:11 +1000 Subject: [PATCH] Make context menu uses spritetree (#31792) Rather than doing goofy hacks we just use what sprites are near the mouse. --- Content.Client/Verbs/VerbSystem.cs | 48 ++++++++++--------- .../Prototypes/Entities/Effects/puddle.yml | 5 -- .../Wallmounts/surveillance_camera.yml | 5 -- 3 files changed, 26 insertions(+), 32 deletions(-) diff --git a/Content.Client/Verbs/VerbSystem.cs b/Content.Client/Verbs/VerbSystem.cs index 6d8b3a2243..f990c83d7c 100644 --- a/Content.Client/Verbs/VerbSystem.cs +++ b/Content.Client/Verbs/VerbSystem.cs @@ -1,5 +1,6 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; +using System.Numerics; using Content.Client.Examine; using Content.Client.Gameplay; using Content.Client.Popups; @@ -7,6 +8,7 @@ using Content.Shared.Examine; using Content.Shared.Tag; using Content.Shared.Verbs; using JetBrains.Annotations; +using Robust.Client.ComponentTrees; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; @@ -21,9 +23,10 @@ namespace Content.Client.Verbs { [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly ExamineSystem _examine = default!; + [Dependency] private readonly SpriteTreeSystem _tree = default!; [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly IStateManager _stateManager = default!; - [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; /// @@ -31,8 +34,6 @@ namespace Content.Client.Verbs /// public const float EntityMenuLookupSize = 0.25f; - [Dependency] private readonly IEyeManager _eyeManager = default!; - /// /// These flags determine what entities the user can see on the context menu. /// @@ -40,6 +41,8 @@ namespace Content.Client.Verbs public Action? OnVerbsResponse; + private List _entities = new(); + public override void Initialize() { base.Initialize(); @@ -76,49 +79,50 @@ namespace Content.Client.Verbs visibility = ev.Visibility; // Get entities - List entities; - var examineFlags = LookupFlags.All & ~LookupFlags.Sensors; + _entities.Clear(); + var entitiesUnderMouse = _tree.QueryAabb(targetPos.MapId, Box2.CenteredAround(targetPos.Position, new Vector2(EntityMenuLookupSize, EntityMenuLookupSize))); // Do we have to do FoV checks? if ((visibility & MenuVisibility.NoFov) == 0) { - var entitiesUnderMouse = gameScreenBase.GetClickableEntities(targetPos).ToHashSet(); - bool Predicate(EntityUid e) => e == player || entitiesUnderMouse.Contains(e); + bool Predicate(EntityUid e) => e == player; TryComp(player.Value, out ExaminerComponent? examiner); - entities = new(); - foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize, flags: examineFlags)) + foreach (var ent in entitiesUnderMouse) { - if (_examine.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) - entities.Add(ent); + if (_examine.CanExamine(player.Value, targetPos, Predicate, ent.Uid, examiner)) + _entities.Add(ent.Uid); } } else { - entities = _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize, flags: examineFlags).ToList(); + foreach (var ent in entitiesUnderMouse) + { + _entities.Add(ent.Uid); + } } - if (entities.Count == 0) + if (_entities.Count == 0) return false; if (visibility == MenuVisibility.All) { - result = entities; + result = new (_entities); return true; } // remove any entities in containers if ((visibility & MenuVisibility.InContainer) == 0) { - for (var i = entities.Count - 1; i >= 0; i--) + for (var i = _entities.Count - 1; i >= 0; i--) { - var entity = entities[i]; + var entity = _entities[i]; if (ContainerSystem.IsInSameOrTransparentContainer(player.Value, entity)) continue; - entities.RemoveSwap(i); + _entities.RemoveSwap(i); } } @@ -127,23 +131,23 @@ namespace Content.Client.Verbs { var spriteQuery = GetEntityQuery(); - for (var i = entities.Count - 1; i >= 0; i--) + for (var i = _entities.Count - 1; i >= 0; i--) { - var entity = entities[i]; + var entity = _entities[i]; if (!spriteQuery.TryGetComponent(entity, out var spriteComponent) || !spriteComponent.Visible || _tagSystem.HasTag(entity, "HideContextMenu")) { - entities.RemoveSwap(i); + _entities.RemoveSwap(i); } } } - if (entities.Count == 0) + if (_entities.Count == 0) return false; - result = entities; + result = new(_entities); return true; } diff --git a/Resources/Prototypes/Entities/Effects/puddle.yml b/Resources/Prototypes/Entities/Effects/puddle.yml index e1dd567893..36f0faa1df 100644 --- a/Resources/Prototypes/Entities/Effects/puddle.yml +++ b/Resources/Prototypes/Entities/Effects/puddle.yml @@ -126,11 +126,6 @@ bodyType: Static - type: Fixtures fixtures: - # Context / examine fixture - fix1: - shape: - !type:PhysShapeCircle - radius: 0.25 slipFixture: shape: !type:PhysShapeAabb diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml index db26942623..895b710a06 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml @@ -8,11 +8,6 @@ bodyType: Static - type: Fixtures fixtures: - # This exists for examine. - fix1: - shape: - !type:PhysShapeCircle - radius: 0.25 light: shape: !type:PhysShapeCircle