+using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.ActionBlocker;
using Content.Shared.CombatMode;
using Content.Shared.Database;
using Content.Shared.Ghost;
+using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Input;
using Content.Shared.Interaction.Components;
using Content.Shared.Interaction.Events;
using Content.Shared.Inventory;
+using Content.Shared.Inventory.Events;
using Content.Shared.Item;
using Content.Shared.Movement.Components;
using Content.Shared.Physics;
using Content.Shared.Wall;
using JetBrains.Annotations;
using Robust.Shared.Containers;
+using Robust.Shared.GameObjects;
using Robust.Shared.Input;
using Robust.Shared.Input.Binding;
using Robust.Shared.Map;
+using Robust.Shared.Network;
using Robust.Shared.Physics;
using Robust.Shared.Physics.Components;
using Robust.Shared.Physics.Systems;
public abstract partial class SharedInteractionSystem : EntitySystem
{
[Dependency] private readonly IGameTiming _gameTiming = default!;
+ [Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly IMapManager _mapManager = default!;
[Dependency] private readonly ISharedAdminManager _adminManager = default!;
[Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
SubscribeLocalEvent<BoundUserInterfaceMessageAttempt>(OnBoundInterfaceInteractAttempt);
SubscribeAllEvent<InteractInventorySlotEvent>(HandleInteractInventorySlotEvent);
SubscribeLocalEvent<UnremoveableComponent, ContainerGettingRemovedAttemptEvent>(OnRemoveAttempt);
+ SubscribeLocalEvent<UnremoveableComponent, GotUnequippedEvent>(OnUnequip);
+ SubscribeLocalEvent<UnremoveableComponent, GotUnequippedHandEvent>(OnUnequipHand);
+ SubscribeLocalEvent<UnremoveableComponent, DroppedEvent>(OnDropped);
CommandBinds.Builder
.Bind(ContentKeyFunctions.AltActivateItemInWorld,
args.Cancel();
}
+ /// <summary>
+ /// If item has DeleteOnDrop true then item will be deleted if removed from inventory, if it is false then item
+ /// loses Unremoveable when removed from inventory (gibbing).
+ /// </summary>
+ private void OnUnequip(EntityUid uid, UnremoveableComponent item, GotUnequippedEvent args)
+ {
+ if (!item.DeleteOnDrop)
+ RemCompDeferred<UnremoveableComponent>(uid);
+ else if (_net.IsServer)
+ QueueDel(uid);
+ }
+
+ private void OnUnequipHand(EntityUid uid, UnremoveableComponent item, GotUnequippedHandEvent args)
+ {
+ if (!item.DeleteOnDrop)
+ RemCompDeferred<UnremoveableComponent>(uid);
+ else if (_net.IsServer)
+ QueueDel(uid);
+ }
+
+ private void OnDropped(EntityUid uid, UnremoveableComponent item, DroppedEvent args)
+ {
+ if (!item.DeleteOnDrop)
+ RemCompDeferred<UnremoveableComponent>(uid);
+ else if (_net.IsServer)
+ QueueDel(uid);
+ }
+
+
private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid)
{
if (!ValidateClientInput(session, coords, uid, out var userEntity))