--- /dev/null
+using Content.Shared.Interaction;
+using Content.Shared.Whitelist;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Trigger.Components.Triggers;
+
+/// <summary>
+/// Triggers when an entity is used to interact with another entity (<see cref="InteractUsingEvent"/>).
+/// The user is the player initiating the interaction or the item used, depending on the TargetUsed datafield.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class TriggerOnInteractUsingComponent : BaseTriggerOnXComponent
+{
+ /// <summary>
+ /// Whitelist of entities that can be used to trigger this component.
+ /// </summary>
+ /// <remarks>No whitelist check when null.</remarks>
+ [DataField, AutoNetworkedField]
+ public EntityWhitelist? Whitelist;
+
+ /// <summary>
+ /// Blacklist of entities that cannot be used to trigger this component.
+ /// </summary>
+ /// <remarks>No blacklist check when null.</remarks>
+ [DataField, AutoNetworkedField]
+ public EntityWhitelist? Blacklist;
+
+ /// <summary>
+ /// If false, the trigger user will be the user that initiated the interaction.
+ /// If true, the trigger user will the entity that was used to interact.
+ /// </summary>
+ [DataField, AutoNetworkedField]
+ public bool TargetUsed = false;
+}
-using Content.Shared.Examine;
+using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Item.ItemToggle.Components;
SubscribeLocalEvent<TriggerOnActivateComponent, ActivateInWorldEvent>(OnActivate);
SubscribeLocalEvent<TriggerOnUseComponent, UseInHandEvent>(OnUse);
SubscribeLocalEvent<TriggerOnInteractHandComponent, InteractHandEvent>(OnInteractHand);
+ SubscribeLocalEvent<TriggerOnInteractUsingComponent, InteractUsingEvent>(OnInteractUsing);
+
SubscribeLocalEvent<TriggerOnThrowComponent, ThrowEvent>(OnThrow);
SubscribeLocalEvent<TriggerOnThrownComponent, ThrownEvent>(OnThrown);
args.Handled = true;
}
+ private void OnInteractUsing(Entity<TriggerOnInteractUsingComponent> ent, ref InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (!_whitelist.CheckBoth(args.Used, ent.Comp.Blacklist, ent.Comp.Whitelist))
+ return;
+
+ Trigger(ent.Owner, ent.Comp.TargetUsed ? args.Used : args.User, ent.Comp.KeyOut);
+ args.Handled = true;
+ }
+
private void OnThrow(Entity<TriggerOnThrowComponent> ent, ref ThrowEvent args)
{
Trigger(ent.Owner, args.Thrown, ent.Comp.KeyOut);