diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index f2ae9fd68e..0695bd3540 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -34,6 +34,7 @@ using Robust.Shared.Input.Binding; using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; using Robust.Shared.Player; @@ -53,21 +54,22 @@ namespace Content.Shared.Interaction [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly ISharedChatManager _chat = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly PullingSystem _pullSystem = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly SharedPhysicsSystem _broadphase = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; - [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly PullingSystem _pullSystem = default!; - [Dependency] private readonly InventorySystem _inventory = default!; - [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; [Dependency] private readonly SharedStrippableSystem _strippable = default!; [Dependency] private readonly SharedPlayerRateLimitManager _rateLimit = default!; - [Dependency] private readonly ISharedChatManager _chat = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly UseDelaySystem _useDelay = default!; private EntityQuery _ignoreUiRangeQuery; private EntityQuery _fixtureQuery; @@ -854,7 +856,20 @@ namespace Content.Shared.Interaction { // If the target is an item, we ignore any colliding entities. Currently done so that if items get stuck // inside of walls, users can still pick them up. - ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); // Note: This also bypasses items underneath doors, which may be problematic if it'd cause undesirable behavior. + // TODO: Bandaid, alloc spam + // We use 0.01 range just in case it's perfectly in between 2 walls and 1 gets missed. + foreach (var otherEnt in _lookup.GetEntitiesInRange(target, 0.01f, flags: LookupFlags.Static)) + { + if (target == otherEnt || + !_physicsQuery.TryComp(otherEnt, out var otherBody) || + !otherBody.CanCollide || + ((int) collisionMask & otherBody.CollisionLayer) == 0x0) + { + continue; + } + + ignored.Add(otherEnt); + } } else if (_wallMountQuery.TryComp(target, out var wallMount)) {