Delta-v/Content.Server/_DV/AACTablet/AACTabletSystem.cs

61 lines
2.0 KiB
C#

using Content.Server.Chat.Systems;
using Content.Server.Speech.Components;
using Content.Shared._DV.AACTablet;
using Content.Shared.IdentityManagement;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
namespace Content.Server._DV.AACTablet;
public sealed class AACTabletSystem : EntitySystem
{
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
private readonly List<string> _localisedPhrases = [];
public const int MaxPhrases = 10; // no writing novels
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AACTabletComponent, AACTabletSendPhraseMessage>(OnSendPhrase);
}
private void OnSendPhrase(Entity<AACTabletComponent> ent, ref AACTabletSendPhraseMessage message)
{
if (ent.Comp.NextPhrase > _timing.CurTime || message.PhraseIds.Count > MaxPhrases)
return;
var senderName = Identity.Entity(message.Actor, EntityManager);
var speakerName = Loc.GetString("speech-name-relay",
("speaker", Name(ent)),
("originalName", senderName));
_localisedPhrases.Clear();
foreach (var phraseProto in message.PhraseIds)
{
if (_prototype.TryIndex(phraseProto, out var phrase))
{
// Ensures each phrase is capitalised to maintain common AAC styling
_localisedPhrases.Add(_chat.SanitizeMessageCapital(Loc.GetString(phrase.Text)));
}
}
if (_localisedPhrases.Count <= 0)
return;
EnsureComp<VoiceOverrideComponent>(ent).NameOverride = speakerName;
_chat.TrySendInGameICMessage(ent,
string.Join(" ", _localisedPhrases),
InGameICChatType.Speak,
hideChat: false,
nameOverride: speakerName);
var curTime = _timing.CurTime;
ent.Comp.NextPhrase = curTime + ent.Comp.Cooldown;
}
}