Make context menu uses spritetree (#31792)

Rather than doing goofy hacks we just use what sprites are near the mouse.
This commit is contained in:
metalgearsloth
2024-09-12 13:29:11 +10:00
committed by GitHub
parent 782d6d780c
commit 292de9c859
3 changed files with 26 additions and 32 deletions

View File

@@ -1,5 +1,6 @@
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using System.Numerics;
using Content.Client.Examine; using Content.Client.Examine;
using Content.Client.Gameplay; using Content.Client.Gameplay;
using Content.Client.Popups; using Content.Client.Popups;
@@ -7,6 +8,7 @@ using Content.Shared.Examine;
using Content.Shared.Tag; using Content.Shared.Tag;
using Content.Shared.Verbs; using Content.Shared.Verbs;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Client.ComponentTrees;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.Graphics; using Robust.Client.Graphics;
using Robust.Client.Player; using Robust.Client.Player;
@@ -21,9 +23,10 @@ namespace Content.Client.Verbs
{ {
[Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!;
[Dependency] private readonly ExamineSystem _examine = default!; [Dependency] private readonly ExamineSystem _examine = default!;
[Dependency] private readonly SpriteTreeSystem _tree = default!;
[Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!;
[Dependency] private readonly IStateManager _stateManager = 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!; [Dependency] private readonly IPlayerManager _playerManager = default!;
/// <summary> /// <summary>
@@ -31,8 +34,6 @@ namespace Content.Client.Verbs
/// </summary> /// </summary>
public const float EntityMenuLookupSize = 0.25f; public const float EntityMenuLookupSize = 0.25f;
[Dependency] private readonly IEyeManager _eyeManager = default!;
/// <summary> /// <summary>
/// These flags determine what entities the user can see on the context menu. /// These flags determine what entities the user can see on the context menu.
/// </summary> /// </summary>
@@ -40,6 +41,8 @@ namespace Content.Client.Verbs
public Action<VerbsResponseEvent>? OnVerbsResponse; public Action<VerbsResponseEvent>? OnVerbsResponse;
private List<EntityUid> _entities = new();
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -76,49 +79,50 @@ namespace Content.Client.Verbs
visibility = ev.Visibility; visibility = ev.Visibility;
// Get entities // Get entities
List<EntityUid> entities; _entities.Clear();
var examineFlags = LookupFlags.All & ~LookupFlags.Sensors; var entitiesUnderMouse = _tree.QueryAabb(targetPos.MapId, Box2.CenteredAround(targetPos.Position, new Vector2(EntityMenuLookupSize, EntityMenuLookupSize)));
// Do we have to do FoV checks? // Do we have to do FoV checks?
if ((visibility & MenuVisibility.NoFov) == 0) if ((visibility & MenuVisibility.NoFov) == 0)
{ {
var entitiesUnderMouse = gameScreenBase.GetClickableEntities(targetPos).ToHashSet(); bool Predicate(EntityUid e) => e == player;
bool Predicate(EntityUid e) => e == player || entitiesUnderMouse.Contains(e);
TryComp(player.Value, out ExaminerComponent? examiner); TryComp(player.Value, out ExaminerComponent? examiner);
entities = new(); foreach (var ent in entitiesUnderMouse)
foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize, flags: examineFlags))
{ {
if (_examine.CanExamine(player.Value, targetPos, Predicate, ent, examiner)) if (_examine.CanExamine(player.Value, targetPos, Predicate, ent.Uid, examiner))
entities.Add(ent); _entities.Add(ent.Uid);
} }
} }
else 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; return false;
if (visibility == MenuVisibility.All) if (visibility == MenuVisibility.All)
{ {
result = entities; result = new (_entities);
return true; return true;
} }
// remove any entities in containers // remove any entities in containers
if ((visibility & MenuVisibility.InContainer) == 0) 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)) if (ContainerSystem.IsInSameOrTransparentContainer(player.Value, entity))
continue; continue;
entities.RemoveSwap(i); _entities.RemoveSwap(i);
} }
} }
@@ -127,23 +131,23 @@ namespace Content.Client.Verbs
{ {
var spriteQuery = GetEntityQuery<SpriteComponent>(); 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) || if (!spriteQuery.TryGetComponent(entity, out var spriteComponent) ||
!spriteComponent.Visible || !spriteComponent.Visible ||
_tagSystem.HasTag(entity, "HideContextMenu")) _tagSystem.HasTag(entity, "HideContextMenu"))
{ {
entities.RemoveSwap(i); _entities.RemoveSwap(i);
} }
} }
} }
if (entities.Count == 0) if (_entities.Count == 0)
return false; return false;
result = entities; result = new(_entities);
return true; return true;
} }

View File

@@ -126,11 +126,6 @@
bodyType: Static bodyType: Static
- type: Fixtures - type: Fixtures
fixtures: fixtures:
# Context / examine fixture
fix1:
shape:
!type:PhysShapeCircle
radius: 0.25
slipFixture: slipFixture:
shape: shape:
!type:PhysShapeAabb !type:PhysShapeAabb

View File

@@ -8,11 +8,6 @@
bodyType: Static bodyType: Static
- type: Fixtures - type: Fixtures
fixtures: fixtures:
# This exists for examine.
fix1:
shape:
!type:PhysShapeCircle
radius: 0.25
light: light:
shape: shape:
!type:PhysShapeCircle !type:PhysShapeCircle