]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add "Reset to default" verb to `TriggerOnVoice` (#35636)
authorMilenVolf <63782763+MilenVolf@users.noreply.github.com>
Thu, 16 Oct 2025 18:36:16 +0000 (21:36 +0300)
committerGitHub <noreply@github.com>
Thu, 16 Oct 2025 18:36:16 +0000 (18:36 +0000)
* Add "Reset to default" verb to `TriggerOnVoice`

* Forgor to remove these changes

* Apply requested changes

* Test fail is real

* Apply requested changes

* Update according to refactored trigger system

* cleanup

---------

Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Content.Shared/Trigger/Components/Triggers/TriggerOnVoiceComponent.cs
Content.Shared/Trigger/Systems/TriggerSystem.Voice.cs
Resources/Locale/en-US/speech/speech-triggers.ftl [new file with mode: 0644]
Resources/Locale/en-US/triggers/trigger-on-voice.ftl
Resources/Prototypes/Entities/Clothing/Head/specific.yml

index 974d5322e02257f6909d0f22c1da14b9db7abc78..1f6c62f6b67bc78132b95f0b7d971f371ffc9ad5 100644 (file)
@@ -21,6 +21,12 @@ public sealed partial class TriggerOnVoiceComponent : BaseTriggerOnXComponent
     [DataField, AutoNetworkedField]
     public string? KeyPhrase;
 
+    /// <summary>
+    /// The default keyphrase that is used when the trigger's keyphrase is reset.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public LocId? DefaultKeyPhrase;
+
     /// <summary>
     /// Range in which we listen for the keyphrase.
     /// </summary>
@@ -75,6 +81,12 @@ public sealed partial class TriggerOnVoiceComponent : BaseTriggerOnXComponent
     [DataField, AutoNetworkedField]
     public LocId? RecordingVerbMessage;
 
+    /// <summary>
+    /// The verb text that is shown when you can reset keyphrase to default.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public LocId ResetRecordingVerb = "trigger-on-voice-default";
+
     /// <summary>
     /// The verb text that is shown when you can clear a recording.
     /// </summary>
index c374369a7f013764cff44758f976da1130a5d7e8..a312b6aa282ad92660e76de00e620dcc3984c549 100644 (file)
@@ -11,18 +11,21 @@ public sealed partial class TriggerSystem
 {
     private void InitializeVoice()
     {
-        SubscribeLocalEvent<TriggerOnVoiceComponent, ComponentInit>(OnVoiceInit);
+        SubscribeLocalEvent<TriggerOnVoiceComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<TriggerOnVoiceComponent, ExaminedEvent>(OnVoiceExamine);
         SubscribeLocalEvent<TriggerOnVoiceComponent, ListenEvent>(OnListen);
         SubscribeLocalEvent<TriggerOnVoiceComponent, GetVerbsEvent<AlternativeVerb>>(OnVoiceGetAltVerbs);
     }
 
-    private void OnVoiceInit(Entity<TriggerOnVoiceComponent> ent, ref ComponentInit args)
+    private void OnMapInit(Entity<TriggerOnVoiceComponent> ent, ref MapInitEvent args)
     {
-        if (ent.Comp.IsListening)
-            EnsureComp<ActiveListenerComponent>(ent).Range = ent.Comp.ListenRange;
-        else
-            RemCompDeferred<ActiveListenerComponent>(ent);
+        if (ent.Comp.DefaultKeyPhrase != null)
+        {
+            ent.Comp.KeyPhrase = Loc.GetString(ent.Comp.DefaultKeyPhrase);
+            Dirty(ent);
+        }
+
+        UpdateListening(ent);
     }
 
     private void OnVoiceExamine(EntityUid uid, TriggerOnVoiceComponent component, ExaminedEvent args)
@@ -94,6 +97,19 @@ public sealed partial class TriggerSystem
             Priority = 1
         });
 
+        if (ent.Comp.DefaultKeyPhrase != null
+            && ent.Comp.KeyPhrase != Loc.GetString(ent.Comp.DefaultKeyPhrase))
+        {
+            args.Verbs.Add(new AlternativeVerb
+            {
+                Text = Loc.GetString(ent.Comp.ResetRecordingVerb),
+                Act = () =>
+                {
+                    SetToDefault(ent, user);
+                },
+            });
+        }
+
         if (string.IsNullOrWhiteSpace(ent.Comp.KeyPhrase))
             return;
 
@@ -107,6 +123,17 @@ public sealed partial class TriggerSystem
         });
     }
 
+    /// <summary>
+    /// Updates the presence/absence of the ActiveListenerComponent based on IsListening.
+    /// </summary>
+    private void UpdateListening(Entity<TriggerOnVoiceComponent> ent)
+    {
+        if (ent.Comp.IsListening)
+            EnsureComp<ActiveListenerComponent>(ent).Range = ent.Comp.ListenRange;
+        else
+            RemCompDeferred<ActiveListenerComponent>(ent);
+    }
+
     /// <summary>
     /// Start recording a new keyphrase.
     /// </summary>
@@ -163,4 +190,23 @@ public sealed partial class TriggerSystem
         Dirty(ent);
         RemComp<ActiveListenerComponent>(ent);
     }
+
+    /// <summary>
+    /// Resets the current key phrase to default.
+    /// </summary>
+    public void SetToDefault(Entity<TriggerOnVoiceComponent> ent, EntityUid? user = null)
+    {
+        if (ent.Comp.DefaultKeyPhrase == null)
+            return;
+
+        ent.Comp.KeyPhrase = Loc.GetString(ent.Comp.DefaultKeyPhrase);
+        ent.Comp.IsRecording = false;
+        Dirty(ent);
+        UpdateListening(ent);
+
+        _adminLogger.Add(LogType.Trigger, LogImpact.Low,
+            $"A voice-trigger on {ToPrettyString(ent):entity} has been reset to default keyphrase: '{ent.Comp.KeyPhrase}'. User: {ToPrettyString(user):speaker}");
+
+        _popup.PopupPredicted(Loc.GetString("trigger-on-voice-set-default", ("keyphrase", ent.Comp.KeyPhrase)), ent, user);
+    }
 }
diff --git a/Resources/Locale/en-US/speech/speech-triggers.ftl b/Resources/Locale/en-US/speech/speech-triggers.ftl
new file mode 100644 (file)
index 0000000..6b6652a
--- /dev/null
@@ -0,0 +1 @@
+key-phrase-gadget = go go gadget
index 7ace486657ce91615c294ce12aa89884bcce0d27..c955cd538443eca8fc5cc0ff2854fdb603eb5a9d 100644 (file)
@@ -4,9 +4,11 @@ trigger-on-voice-uninitialized = The display reads: Uninitialized...
 trigger-on-voice-record = Record
 trigger-on-voice-stop = Stop
 trigger-on-voice-clear = Clear recording
+trigger-on-voice-default = Reset to default
 
 trigger-on-voice-start-recording = Started recording.
 trigger-on-voice-stop-recording = Stopped recording.
 trigger-on-voice-record-failed-too-long = Message too long, try again.
 trigger-on-voice-record-failed-too-short = Message too short, try again.
 trigger-on-voice-recorded = Recorded successfully!
+trigger-on-voice-set-default = Set to default keyphrase: "{$keyphrase}"
index 4539e2fdf33ce69dec1ea803eb6654a88691f2ba..4528d8cabd07ca2be99a4c97a3c43b76d8c2f4b8 100644 (file)
@@ -24,7 +24,7 @@
   - type: Tag
     tags: [] # ignore "WhitelistChameleon" tag
   - type: TriggerOnVoice
-    keyPhrase: "go go gadget"
+    defaultKeyPhrase: key-phrase-gadget
     listenRange: 0
   - type: ActiveListener
     range: 0