[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>
[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>
{
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)
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;
});
}
+ /// <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>
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);
+ }
}
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}"