Files
tbd-station-14/Content.Shared/Trigger/Systems/TriggerSystem.Interaction.cs
āda a5351b8c77 ExtinguishOnTrigger and TriggerOnInteractHand (#39537)
* simplely one commit

* simplelly two commit

* requested changes

---------

Co-authored-by: iaada <iaada@users.noreply.github.com>
2025-08-11 21:21:11 +02:00

107 lines
3.5 KiB
C#

using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.Trigger.Components.Triggers;
using Content.Shared.Trigger.Components.Effects;
namespace Content.Shared.Trigger.Systems;
public sealed partial class TriggerSystem
{
private void InitializeInteraction()
{
SubscribeLocalEvent<TriggerOnActivateComponent, ActivateInWorldEvent>(OnActivate);
SubscribeLocalEvent<TriggerOnUseComponent, UseInHandEvent>(OnUse);
SubscribeLocalEvent<TriggerOnInteractHandComponent, InteractHandEvent>(OnInteractHand);
SubscribeLocalEvent<ItemToggleOnTriggerComponent, TriggerEvent>(HandleItemToggleOnTrigger);
SubscribeLocalEvent<AnchorOnTriggerComponent, TriggerEvent>(HandleAnchorOnTrigger);
SubscribeLocalEvent<UseDelayOnTriggerComponent, TriggerEvent>(HandleUseDelayOnTrigger);
}
private void OnActivate(Entity<TriggerOnActivateComponent> ent, ref ActivateInWorldEvent args)
{
if (args.Handled)
return;
if (ent.Comp.RequireComplex && !args.Complex)
return;
Trigger(ent.Owner, args.User, ent.Comp.KeyOut);
args.Handled = true;
}
private void OnUse(Entity<TriggerOnUseComponent> ent, ref UseInHandEvent args)
{
if (args.Handled)
return;
Trigger(ent.Owner, args.User, ent.Comp.KeyOut);
args.Handled = true;
}
private void OnInteractHand(Entity<TriggerOnInteractHandComponent> ent, ref InteractHandEvent args)
{
if (args.Handled)
return;
Trigger(ent.Owner, args.User, ent.Comp.KeyOut);
args.Handled = true;
}
private void HandleItemToggleOnTrigger(Entity<ItemToggleOnTriggerComponent> ent, ref TriggerEvent args)
{
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
return;
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
if (!TryComp<ItemToggleComponent>(target, out var itemToggle))
return;
var handled = false;
if (itemToggle.Activated && ent.Comp.CanDeactivate)
handled = _itemToggle.TryDeactivate((target.Value, itemToggle), args.User, ent.Comp.Predicted, ent.Comp.ShowPopup);
else if (ent.Comp.CanActivate)
handled = _itemToggle.TryActivate((target.Value, itemToggle), args.User, ent.Comp.Predicted, ent.Comp.ShowPopup);
args.Handled |= handled;
}
private void HandleAnchorOnTrigger(Entity<AnchorOnTriggerComponent> ent, ref TriggerEvent args)
{
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
return;
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
if (target == null)
return;
var xform = Transform(target.Value);
if (xform.Anchored && ent.Comp.CanUnanchor)
_transform.Unanchor(target.Value, xform);
else if (ent.Comp.CanAnchor)
_transform.AnchorEntity(target.Value, xform);
if (ent.Comp.RemoveOnTrigger)
RemCompDeferred<AnchorOnTriggerComponent>(target.Value);
args.Handled = true;
}
private void HandleUseDelayOnTrigger(Entity<UseDelayOnTriggerComponent> ent, ref TriggerEvent args)
{
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
return;
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
if (target == null)
return;
args.Handled |= _useDelay.TryResetDelay(target.Value, ent.Comp.CheckDelayed);
}
}