diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnBuckledComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnBuckledComponent.cs new file mode 100644 index 0000000000..b6f3506f64 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnBuckledComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when the owning entity is buckled. +/// This is intended to be used on buckle-able entities like mobs. +/// The user is the strap entity (a chair or similar). +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnBuckledComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnExaminedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnExaminedComponent.cs new file mode 100644 index 0000000000..8ceb755933 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnExaminedComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when the entity is being examined. +/// The user is the player doing the examination. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnExaminedComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnLandComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnLandComponent.cs new file mode 100644 index 0000000000..48d048886a --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnLandComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when the entity exits a floating or thrown state and lands on a surface. +/// The user is the thrower. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnLandComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnStrappedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnStrappedComponent.cs new file mode 100644 index 0000000000..b5a60b6a03 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnStrappedComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when something is strapped to the entity. +/// This is intended to be used on objects like chairs or beds. +/// The user is the entity strapped to the component owner. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnStrappedComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnUnbuckledComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnUnbuckledComponent.cs new file mode 100644 index 0000000000..47092f4b69 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnUnbuckledComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when the owning entity is unbuckled. +/// This is intended to be used on buckle-able entities like mobs. +/// The user is the strap entity (a chair or similar). +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnUnbuckledComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnUnstrappedComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnUnstrappedComponent.cs new file mode 100644 index 0000000000..c9ff41282e --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnUnstrappedComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Triggers when something is unstrapped from the entity. +/// This is intended to be used on objects like chairs or beds. +/// The user is the entity unstrapped from the component owner. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnUnstrappedComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Systems/TriggerOnLandSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnLandSystem.cs new file mode 100644 index 0000000000..754f285753 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnLandSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Throwing; +using Content.Shared.Trigger.Components.Triggers; + +namespace Content.Shared.Trigger.Systems; + +public sealed partial class TriggerOnLandSystem : EntitySystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnLand); + } + + private void OnLand(Entity ent, ref LandEvent args) + { + _trigger.Trigger(ent.Owner, args.User, ent.Comp.KeyOut); + } +} diff --git a/Content.Shared/Trigger/Systems/TriggerOnStrappedOrBuckledSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnStrappedOrBuckledSystem.cs new file mode 100644 index 0000000000..d4960ff70c --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnStrappedOrBuckledSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Buckle.Components; +using Content.Shared.Trigger.Components.Triggers; + +namespace Content.Shared.Trigger.Systems; + +/// +/// This is a system covering all trigger interactions involving strapping or buckling objects. +/// The users of strap components are the objects having an entity strapped to them (IE: Chairs) +/// The users of buckle components are entities being buckled to an object. (IE: Mobs and players) +/// +public sealed partial class TriggerOnStrappedOrBuckledSystem : EntitySystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStrapped); + SubscribeLocalEvent(OnUnstrapped); + SubscribeLocalEvent(OnBuckled); + SubscribeLocalEvent(OnUnbuckled); + } + + + #region Class Methods + // Called by objects entities can be buckled to. (Chairs, surgical tables/) + private void OnStrapped(Entity ent, ref StrappedEvent args) + { + _trigger.Trigger(ent.Owner, args.Strap, ent.Comp.KeyOut); + } + + private void OnUnstrapped(Entity ent, ref UnstrappedEvent args) + { + _trigger.Trigger(ent.Owner, args.Strap, ent.Comp.KeyOut); + } + + // Called by entities that are buckled to an object. (Mobs, players.) + private void OnBuckled(Entity ent, ref BuckledEvent args) + { + _trigger.Trigger(ent.Owner, args.Buckle, ent.Comp.KeyOut); + } + + private void OnUnbuckled(Entity ent, ref UnbuckledEvent args) + { + _trigger.Trigger(ent.Owner, args.Buckle, ent.Comp.KeyOut); + } + #endregion +} diff --git a/Content.Shared/Trigger/Systems/TriggerSystem.Interaction.cs b/Content.Shared/Trigger/Systems/TriggerSystem.Interaction.cs index 035ef4ec91..230b628663 100644 --- a/Content.Shared/Trigger/Systems/TriggerSystem.Interaction.cs +++ b/Content.Shared/Trigger/Systems/TriggerSystem.Interaction.cs @@ -1,4 +1,5 @@ -using Content.Shared.Interaction; +using Content.Shared.Examine; +using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Trigger.Components.Triggers; @@ -10,6 +11,8 @@ public sealed partial class TriggerSystem { private void InitializeInteraction() { + SubscribeLocalEvent(OnExamined); + SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnUse); SubscribeLocalEvent(OnInteractHand); @@ -19,6 +22,11 @@ public sealed partial class TriggerSystem SubscribeLocalEvent(HandleUseDelayOnTrigger); } + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + Trigger(ent.Owner, args.Examiner, ent.Comp.KeyOut); + } + private void OnActivate(Entity ent, ref ActivateInWorldEvent args) { if (args.Handled)