if (!_invSystem.TryUnequip(userEnt, slotDef.Name, true, inventory: userEnt, checkDoafter: true))
continue;
- if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true))
+ if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true, triggerHandContact: true))
continue;
_handsSystem.PickupOrDrop(userEnt, slotEntity.Value, handsComp: userEnt);
}
else
{
- if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true))
+ if (!_invSystem.TryEquip(userEnt, toEquipEnt, slotDef.Name, true, inventory: userEnt, clothing: toEquipEnt, checkDoafter: true, triggerHandContact: true))
continue;
}
{
if (args.Handled || args.Cancelled || args.Target is not { } target)
return;
- args.Handled = _invSystem.TryUnequip(args.User, target, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false);
+ args.Handled = _invSystem.TryUnequip(args.User, target, args.Slot, clothing: ent.Comp, predicted: true, checkDoafter: false, triggerHandContact: true);
if (args.Handled)
_handsSystem.TryPickup(args.User, ent);
}
// unequip the item.
if (itemUid != null)
{
- if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory, checkDoafter: true))
+ if (!TryUnequip(actor, ev.Slot, out var item, predicted: true, inventory: inventory, checkDoafter: true, triggerHandContact: true))
return;
_handsSystem.PickupOrDrop(actor, item.Value);
RaiseLocalEvent(held.Value, new HandDeselectedEvent(actor));
- TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter: true);
+ TryEquip(actor, actor, held.Value, ev.Slot, predicted: true, inventory: inventory, force: true, checkDoafter: true, triggerHandContact: true);
}
public bool TryEquip(EntityUid uid, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false,
- InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false) =>
- TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing, checkDoafter);
+ InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false, bool triggerHandContact = false) =>
+ TryEquip(uid, uid, itemUid, slot, silent, force, predicted, inventory, clothing, checkDoafter, triggerHandContact);
public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, string slot, bool silent = false, bool force = false, bool predicted = false,
- InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false)
+ InventoryComponent? inventory = null, ClothingComponent? clothing = null, bool checkDoafter = false, bool triggerHandContact = false)
{
if (!Resolve(target, ref inventory, false))
{
_audio.PlayPredicted(clothing.EquipSound, target, actor);
}
+ // If new gloves are equipped, trigger OnContactInteraction for held items
+ if (triggerHandContact && !((slotDefinition.SlotFlags & SlotFlags.GLOVES) == 0))
+ TriggerHandContactInteraction(target);
+
Dirty(target, inventory);
_movementSpeed.RefreshMovementSpeedModifiers(target);
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
- bool checkDoafter = false)
+ bool checkDoafter = false,
+ bool triggerHandContact = false)
{
- return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter);
+ return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact);
}
public bool TryUnequip(
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
- bool checkDoafter = false)
+ bool checkDoafter = false,
+ bool triggerHandContact = false)
{
- return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent, checkDoafter);
+ return TryUnequip(actor, target, slot, out _, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact);
}
public bool TryUnequip(
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
- bool checkDoafter = false)
+ bool checkDoafter = false,
+ bool triggerHandContact = false)
{
- return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent, checkDoafter);
+ return TryUnequip(uid, uid, slot, out removedItem, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact);
}
public bool TryUnequip(
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
- bool checkDoafter = false)
+ bool checkDoafter = false,
+ bool triggerHandContact = false)
{
var itemsDropped = 0;
return TryUnequip(actor, target, slot, out removedItem, ref itemsDropped,
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
- bool checkDoafter = false)
+ bool checkDoafter = false,
+ bool triggerHandContact = false)
{
removedItem = null;
_audio.PlayPredicted(clothing.UnequipSound, target, actor);
}
+ // If gloves are unequipped, OnContactInteraction should trigger for held items
+ if (triggerHandContact && !((slotDefinition.SlotFlags & SlotFlags.GLOVES) == 0))
+ TriggerHandContactInteraction(target);
+
Dirty(target, inventory);
_movementSpeed.RefreshMovementSpeedModifiers(target);
entityUid = container.ContainedEntity;
return entityUid != null;
}
+
+ public void TriggerHandContactInteraction(EntityUid uid)
+ {
+ foreach (var item in _handsSystem.EnumerateHeld(uid))
+ {
+ _interactionSystem.DoContactInteraction(uid, item);
+ }
+ }
}
public abstract class SharedStrippableSystem : EntitySystem
{
+ [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
+
[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
if (!_handsSystem.TryDrop(user, handsComp: user.Comp))
return;
- _inventorySystem.TryEquip(user, target, held, slot);
+ _inventorySystem.TryEquip(user, target, held, slot, triggerHandContact: true);
_adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot");
}
var prefix = stealth ? "stealthily " : "";
_adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot");
+ _interactionSystem.DoContactInteraction(user, item);
+
var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, true, slot), user, target, item)
{
Hidden = stealth,
if (!CanStripRemoveInventory(user, target, item, slot))
return;
- if (!_inventorySystem.TryUnequip(user, target, slot))
+ if (!_inventorySystem.TryUnequip(user, target, slot, triggerHandContact: true))
return;
RaiseLocalEvent(item, new DroppedEvent(user), true); // Gas tank internals etc.
var prefix = stealth ? "stealthily " : "";
_adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands");
+ _interactionSystem.DoContactInteraction(user, item);
+
var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, false, handName), user, target, item)
{
Hidden = stealth,