Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix forensics not being applied to held items #30609

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Content.Server/Inventory/ServerInventorySystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ public void TransferEntityInventories(Entity<InventoryComponent?> source, Entity
var enumerator = new InventorySlotEnumerator(source.Comp);
while (enumerator.NextItem(out var item, out var slot))
{
if (TryUnequip(source, slot.Name, true, true, inventory: source.Comp))
TryEquip(target, item, slot.Name , true, true, inventory: target.Comp);
if (TryUnequip(source, slot.Name, true, true, inventory: source.Comp, triggerHandContact: true))
TryEquip(target, item, slot.Name , true, true, inventory: target.Comp, triggerHandContact: true);
}
}
}
Expand Down
1 change: 1 addition & 0 deletions Content.Server/Strip/StrippableSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.IdentityManagement;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Inventory;
using Content.Shared.Inventory.VirtualItem;
Expand Down
6 changes: 3 additions & 3 deletions Content.Shared/Clothing/EntitySystems/ClothingSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,14 @@ private void QuickEquip(
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;
}

Expand Down Expand Up @@ -190,7 +190,7 @@ private void OnUnequipDoAfter(Entity<ClothingComponent> ent, ref ClothingUnequip
{
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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ private void OnToggleableUnequip(EntityUid uid, ToggleableClothingComponent comp
// This should maybe double check that the entity currently in the slot is actually the attached clothing, but
// if its not, then something else has gone wrong already...
if (component.Container != null && component.Container.ContainedEntity == null && component.ClothingUid != null)
_inventorySystem.TryUnequip(args.Equipee, component.Slot, force: true);
_inventorySystem.TryUnequip(args.Equipee, component.Slot, force: true, triggerHandContact: true);
}

private void OnRemoveToggleable(EntityUid uid, ToggleableClothingComponent component, ComponentRemove args)
Expand Down Expand Up @@ -248,7 +248,7 @@ private void ToggleClothing(EntityUid user, EntityUid target, ToggleableClothing
user, user);
}
else
_inventorySystem.TryEquip(user, parent, component.ClothingUid.Value, component.Slot);
_inventorySystem.TryEquip(user, parent, component.ClothingUid.Value, component.Slot, triggerHandContact: true);
}

private void OnGetActions(EntityUid uid, ToggleableClothingComponent component, GetItemActionsEvent args)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,8 @@ public virtual void DoPickup(EntityUid uid, Hand hand, EntityUid entity, HandsCo
return;
}

_interactionSystem.DoContactInteraction(uid, entity); //Possibly fires twice if manually picked up via interacting with the object

if (log)
_adminLogger.Add(LogType.Pickup, LogImpact.Low, $"{ToPrettyString(uid):user} picked up {ToPrettyString(entity):entity}");

Expand Down
44 changes: 32 additions & 12 deletions Content.Shared/Inventory/InventorySystem.Equip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ private void OnUseSlot(UseSlotNetworkMessage ev, EntitySessionEventArgs eventArg
// 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);
Expand All @@ -118,15 +118,15 @@ private void OnUseSlot(UseSlotNetworkMessage ev, EntitySessionEventArgs eventArg

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))
{
Expand Down Expand Up @@ -188,6 +188,10 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin
_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);
Expand Down Expand Up @@ -318,9 +322,10 @@ 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, silent, force, predicted, inventory, clothing, reparent, checkDoafter);
return TryUnequip(uid, uid, slot, silent, force, predicted, inventory, clothing, reparent, checkDoafter, triggerHandContact);
}

public bool TryUnequip(
Expand All @@ -333,9 +338,10 @@ 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(
Expand All @@ -348,9 +354,10 @@ 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(
Expand All @@ -364,7 +371,8 @@ public bool TryUnequip(
InventoryComponent? inventory = null,
ClothingComponent? clothing = null,
bool reparent = true,
bool checkDoafter = false)
bool checkDoafter = false,
bool triggerHandContact = false)
{
removedItem = null;

Expand Down Expand Up @@ -445,6 +453,10 @@ public bool TryUnequip(
_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);
Expand Down Expand Up @@ -520,4 +532,12 @@ public bool TryGetSlotEntity(EntityUid uid, string slot, [NotNullWhen(true)] out
entityUid = container.ContainedEntity;
return entityUid != null;
}

public void TriggerHandContactInteraction(EntityUid uid)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This's only used within this file presently, does it need to be public?

{
foreach (var item in _handsSystem.EnumerateHeld(uid))
{
_interactionSystem.DoContactInteraction(uid, item);
}
}
}
10 changes: 8 additions & 2 deletions Content.Shared/Strip/SharedStrippableSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ namespace Content.Shared.Strip;

public abstract class SharedStrippableSystem : EntitySystem
{
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;

[Dependency] private readonly SharedUserInterfaceSystem _ui = default!;

[Dependency] private readonly InventorySystem _inventorySystem = default!;
Expand Down Expand Up @@ -241,7 +243,7 @@ private void StripInsertInventory(
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");
}

Expand Down Expand Up @@ -303,6 +305,8 @@ private void StartStripRemoveInventory(
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,
Expand Down Expand Up @@ -330,7 +334,7 @@ private void StripRemoveInventory(
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.
Expand Down Expand Up @@ -508,6 +512,8 @@ private void StartStripRemoveHand(
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,
Expand Down
Loading