Fix item stuck check (#37570)
This commit is contained in:
@@ -34,6 +34,7 @@ using Robust.Shared.Input.Binding;
|
|||||||
using Robust.Shared.Map;
|
using Robust.Shared.Map;
|
||||||
using Robust.Shared.Network;
|
using Robust.Shared.Network;
|
||||||
using Robust.Shared.Physics;
|
using Robust.Shared.Physics;
|
||||||
|
using Robust.Shared.Physics.Collision.Shapes;
|
||||||
using Robust.Shared.Physics.Components;
|
using Robust.Shared.Physics.Components;
|
||||||
using Robust.Shared.Physics.Systems;
|
using Robust.Shared.Physics.Systems;
|
||||||
using Robust.Shared.Player;
|
using Robust.Shared.Player;
|
||||||
@@ -53,21 +54,22 @@ namespace Content.Shared.Interaction
|
|||||||
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
||||||
[Dependency] private readonly IMapManager _mapManager = default!;
|
[Dependency] private readonly IMapManager _mapManager = default!;
|
||||||
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
|
||||||
|
[Dependency] private readonly ISharedChatManager _chat = default!;
|
||||||
[Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = 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 RotateToFaceSystem _rotateToFaceSystem = default!;
|
||||||
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;
|
||||||
[Dependency] private readonly SharedPhysicsSystem _broadphase = default!;
|
[Dependency] private readonly SharedPhysicsSystem _broadphase = default!;
|
||||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||||
[Dependency] private readonly SharedVerbSystem _verbSystem = default!;
|
[Dependency] private readonly SharedVerbSystem _verbSystem = default!;
|
||||||
[Dependency] private readonly SharedPopupSystem _popupSystem = 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 SharedUserInterfaceSystem _ui = default!;
|
||||||
[Dependency] private readonly SharedStrippableSystem _strippable = default!;
|
[Dependency] private readonly SharedStrippableSystem _strippable = default!;
|
||||||
[Dependency] private readonly SharedPlayerRateLimitManager _rateLimit = 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<IgnoreUIRangeComponent> _ignoreUiRangeQuery;
|
private EntityQuery<IgnoreUIRangeComponent> _ignoreUiRangeQuery;
|
||||||
private EntityQuery<FixturesComponent> _fixtureQuery;
|
private EntityQuery<FixturesComponent> _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
|
// 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.
|
// 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))
|
else if (_wallMountQuery.TryComp(target, out var wallMount))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user