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