From 71f5c2d665b124845d6e0b73f969d70d995999bd Mon Sep 17 00:00:00 2001
From: Artxmisery <78118840+Artxmisery@users.noreply.github.com>
Date: Sat, 16 Aug 2025 13:50:32 +0000
Subject: [PATCH] Equip and unequip triggers (#39675)
* added equip and unequip triggers for equipment and equipee
* Update Content.Shared/Trigger/Components/Triggers/TriggerOnDidEquipComponent.cs
---------
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
---
.../Triggers/TriggerOnDidEquipComponent.cs | 18 +++++
.../Triggers/TriggerOnDidUnequipComponent.cs | 18 +++++
.../Triggers/TriggerOnGotEquippedComponent.cs | 18 +++++
.../TriggerOnGotUnequippedComponent.cs | 18 +++++
.../Systems/TriggerOnEquipmentSystem.cs | 70 +++++++++++++++++++
5 files changed, 142 insertions(+)
create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnDidEquipComponent.cs
create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnDidUnequipComponent.cs
create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnGotEquippedComponent.cs
create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnGotUnequippedComponent.cs
create mode 100644 Content.Shared/Trigger/Systems/TriggerOnEquipmentSystem.cs
diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnDidEquipComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnDidEquipComponent.cs
new file mode 100644
index 0000000000..3c970eb855
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnDidEquipComponent.cs
@@ -0,0 +1,18 @@
+using Content.Shared.Inventory;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+///
+/// Triggers when an entity equips another entity.
+/// The user is the entity being equipped.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnDidEquipComponent : BaseTriggerOnXComponent
+{
+ ///
+ /// The slots entities being equipped to will trigger the entity.
+ ///
+ [DataField, AutoNetworkedField]
+ public SlotFlags SlotFlags;
+}
diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnDidUnequipComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnDidUnequipComponent.cs
new file mode 100644
index 0000000000..c6ec3821b1
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnDidUnequipComponent.cs
@@ -0,0 +1,18 @@
+using Content.Shared.Inventory;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+///
+/// Triggers when an entity unequips another entity.
+/// The user is the entity being unequipped.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnDidUnequipComponent : BaseTriggerOnXComponent
+{
+ ///
+ /// The slots that entities being unequipped from will trigger the entity.
+ ///
+ [DataField, AutoNetworkedField]
+ public SlotFlags SlotFlags;
+}
diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnGotEquippedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnGotEquippedComponent.cs
new file mode 100644
index 0000000000..c3bb62fa80
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnGotEquippedComponent.cs
@@ -0,0 +1,18 @@
+using Content.Shared.Inventory;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+///
+/// Triggers when an entity is equipped to another entity.
+/// The user is the entity being equipped to (i.e. the equipee).
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnGotEquippedComponent : BaseTriggerOnXComponent
+{
+ ///
+ /// The slots that being equipped to will trigger the entity.
+ ///
+ [DataField, AutoNetworkedField]
+ public SlotFlags SlotFlags;
+}
diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnGotUnequippedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnGotUnequippedComponent.cs
new file mode 100644
index 0000000000..2b6663e1f0
--- /dev/null
+++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnGotUnequippedComponent.cs
@@ -0,0 +1,18 @@
+using Content.Shared.Inventory;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+///
+/// Triggers when an entity is unequipped from another entity.
+/// The user is the entity being unequipped from (i.e. the (un)equipee).
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnGotUnequippedComponent : BaseTriggerOnXComponent
+{
+ ///
+ /// The slots that being unequipped from will trigger the entity.
+ ///
+ [DataField, AutoNetworkedField]
+ public SlotFlags SlotFlags;
+}
diff --git a/Content.Shared/Trigger/Systems/TriggerOnEquipmentSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnEquipmentSystem.cs
new file mode 100644
index 0000000000..bc097ae831
--- /dev/null
+++ b/Content.Shared/Trigger/Systems/TriggerOnEquipmentSystem.cs
@@ -0,0 +1,70 @@
+using Content.Shared.Trigger.Components.Triggers;
+using Robust.Shared.Timing;
+using Content.Shared.Inventory.Events;
+
+namespace Content.Shared.Trigger.Systems;
+
+///
+/// System for creating triggers when entities are equipped or unequipped from inventory slots.
+///
+public sealed class TriggerOnEquipmentSystem : EntitySystem
+{
+ [Dependency] private readonly TriggerSystem _trigger = default!;
+ [Dependency] private readonly IGameTiming _timing = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnDidEquip);
+ SubscribeLocalEvent(OnDidUnequip);
+ SubscribeLocalEvent(OnGotEquipped);
+ SubscribeLocalEvent(OnGotUnequipped);
+ }
+
+ // Used by entities when equipping or unequipping other entities
+ private void OnDidEquip(Entity ent, ref DidEquipEvent args)
+ {
+ if (_timing.ApplyingState)
+ return;
+
+ if ((ent.Comp.SlotFlags & args.SlotFlags) == 0)
+ return;
+
+ _trigger.Trigger(ent.Owner, args.Equipment, ent.Comp.KeyOut);
+ }
+
+ private void OnDidUnequip(Entity ent, ref DidUnequipEvent args)
+ {
+ if (_timing.ApplyingState)
+ return;
+
+ if ((ent.Comp.SlotFlags & args.SlotFlags) == 0)
+ return;
+
+ _trigger.Trigger(ent.Owner, args.Equipment, ent.Comp.KeyOut);
+ }
+
+ // Used by entities when they get equipped or unequipped
+ private void OnGotEquipped(Entity ent, ref GotEquippedEvent args)
+ {
+ if (_timing.ApplyingState)
+ return;
+
+ if ((ent.Comp.SlotFlags & args.SlotFlags) == 0)
+ return;
+
+ _trigger.Trigger(ent.Owner, args.Equipee, ent.Comp.KeyOut);
+ }
+
+ private void OnGotUnequipped(Entity ent, ref GotUnequippedEvent args)
+ {
+ if (_timing.ApplyingState)
+ return;
+
+ if ((ent.Comp.SlotFlags & args.SlotFlags) == 0)
+ return;
+
+ _trigger.Trigger(ent.Owner, args.Equipee, ent.Comp.KeyOut);
+ }
+}
--
2.51.2