]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Make context menu uses spritetree (#31792)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Thu, 12 Sep 2024 03:29:11 +0000 (13:29 +1000)
committerGitHub <noreply@github.com>
Thu, 12 Sep 2024 03:29:11 +0000 (13:29 +1000)
Rather than doing goofy hacks we just use what sprites are near the mouse.

Content.Client/Verbs/VerbSystem.cs
Resources/Prototypes/Entities/Effects/puddle.yml
Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml

index 6d8b3a2243b7127fd2879ae6e49dd76208c8cb78..f990c83d7c2a9f5752ddbe2b3c84e740a56aaa2e 100644 (file)
@@ -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!;
 
         /// <summary>
@@ -31,8 +34,6 @@ namespace Content.Client.Verbs
         /// </summary>
         public const float EntityMenuLookupSize = 0.25f;
 
-        [Dependency] private readonly IEyeManager _eyeManager = default!;
-
         /// <summary>
         ///     These flags determine what entities the user can see on the context menu.
         /// </summary>
@@ -40,6 +41,8 @@ namespace Content.Client.Verbs
 
         public Action<VerbsResponseEvent>? OnVerbsResponse;
 
+        private List<EntityUid> _entities = new();
+
         public override void Initialize()
         {
             base.Initialize();
@@ -76,49 +79,50 @@ namespace Content.Client.Verbs
             visibility = ev.Visibility;
 
             // Get entities
-            List<EntityUid> 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<SpriteComponent>();
 
-                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;
         }
 
index e1dd567893d10ae78b44956505e254899b87398b..36f0faa1df1a8918d5abd07989a66707f9ca812f 100644 (file)
     bodyType: Static
   - type: Fixtures
     fixtures:
-      # Context / examine fixture
-      fix1:
-        shape:
-          !type:PhysShapeCircle
-          radius: 0.25
       slipFixture:
         shape:
           !type:PhysShapeAabb
index db269426236e90c577aee9088675c91befdece17..895b710a068bbe935774ffac386a3c362bdfc057 100644 (file)
@@ -8,11 +8,6 @@
     bodyType: Static
   - type: Fixtures
     fixtures:
-      # This exists for examine.
-      fix1:
-        shape:
-          !type:PhysShapeCircle
-          radius: 0.25
       light:
         shape:
           !type:PhysShapeCircle