using Content.Client.Verbs;
+using Content.Shared.Verbs;
using JetBrains.Annotations;
using Robust.Shared.Console;
using Content.Shared.Examine;
using Content.Shared.IdentityManagement;
using Content.Shared.Input;
+using Content.Shared.Verbs;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.Input;
return;
// Do we need to do in-range unOccluded checks?
- var ignoreFov = !_eyeManager.CurrentEye.DrawFov ||
- (_verbSystem.Visibility & MenuVisibility.NoFov) == MenuVisibility.NoFov;
+ var visibility = _verbSystem.Visibility;
+
+ if (!_eyeManager.CurrentEye.DrawFov)
+ {
+ visibility &= ~MenuVisibility.NoFov;
+ }
+
+ var ev = new MenuVisibilityEvent()
+ {
+ Visibility = visibility,
+ };
+
+ _entityManager.EventBus.RaiseLocalEvent(player, ref ev);
+ visibility = ev.Visibility;
_entityManager.TryGetComponent(player, out ExaminerComponent? examiner);
var xformQuery = _entityManager.GetEntityQuery<TransformComponent>();
continue;
}
- if (ignoreFov)
+ if ((visibility & MenuVisibility.NoFov) == MenuVisibility.NoFov)
continue;
var pos = new MapCoordinates(_xform.GetWorldPosition(xform, xformQuery), xform.MapID);
? Visibility
: Visibility | MenuVisibility.NoFov;
+ var ev = new MenuVisibilityEvent()
+ {
+ TargetPos = targetPos,
+ Visibility = visibility,
+ };
+
+ RaiseLocalEvent(player.Value, ref ev);
+ visibility = ev.Visibility;
// Get entities
List<EntityUid> entities;
var entitiesUnderMouse = gameScreenBase.GetClickableEntities(targetPos).ToHashSet();
bool Predicate(EntityUid e) => e == player || entitiesUnderMouse.Contains(e);
- // first check the general location.
- if (!_examine.CanExamine(player.Value, targetPos, Predicate))
- return false;
-
TryComp(player.Value, out ExaminerComponent? examiner);
- // Then check every entity
entities = new();
foreach (var ent in _entityLookup.GetEntitiesInRange(targetPos, EntityMenuLookupSize))
{
}
}
- // Remove any entities that do not have LOS
- if ((visibility & MenuVisibility.NoFov) == 0)
- {
- var xformQuery = GetEntityQuery<TransformComponent>();
- var playerPos = _transform.GetMapCoordinates(player.Value, xform: xformQuery.GetComponent(player.Value));
-
- for (var i = entities.Count - 1; i >= 0; i--)
- {
- var entity = entities[i];
-
- if (!_examine.InRangeUnOccluded(
- playerPos,
- _transform.GetMapCoordinates(entity, xform: xformQuery.GetComponent(entity)),
- ExamineSystemShared.ExamineRange,
- null))
- {
- entities.RemoveSwap(i);
- }
- }
- }
-
if (entities.Count == 0)
return false;
OnVerbsResponse?.Invoke(msg);
}
}
-
- [Flags]
- public enum MenuVisibility
- {
- // What entities can a user see on the entity menu?
- Default = 0, // They can only see entities in FoV.
- NoFov = 1 << 0, // They ignore FoV restrictions
- InContainer = 1 << 1, // They can see through containers.
- Invisible = 1 << 2, // They can see entities without sprites and the "HideContextMenu" tag is ignored.
- All = NoFov | InContainer | Invisible
- }
}
using Content.Shared.Interaction;
using Content.Shared.Inventory.VirtualItem;
using Robust.Shared.Containers;
+using Robust.Shared.Map;
namespace Content.Shared.Verbs
{
_interactionSystem.DoContactInteraction(user, target);
}
}
+
+ // Does nothing on server
+ /// <summary>
+ /// Raised directed when trying to get the entity menu visibility for entities.
+ /// </summary>
+ [ByRefEvent]
+ public record struct MenuVisibilityEvent
+ {
+ public MapCoordinates TargetPos;
+ public MenuVisibility Visibility;
+ }
+
+ // Does nothing on server
+ [Flags]
+ public enum MenuVisibility
+ {
+ // What entities can a user see on the entity menu?
+ Default = 0, // They can only see entities in FoV.
+ NoFov = 1 << 0, // They ignore FoV restrictions
+ InContainer = 1 << 1, // They can see through containers.
+ Invisible = 1 << 2, // They can see entities without sprites and the "HideContextMenu" tag is ignored.
+ All = NoFov | InContainer | Invisible
+ }
}