using Content.Server.Administration.Logs; using Content.Server.Implants; using Content.Server.Speech.Components; using Content.Shared.Database; using Content.Shared.Implants; using Content.Shared.Inventory; using Content.Shared.Popups; using Content.Shared.Preferences; using Content.Shared.Speech; using Content.Shared.VoiceMask; using Robust.Shared.Prototypes; namespace Content.Server.DeltaV.Implants; public sealed class SyrinxImplantSystem : EntitySystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnImplanted); SubscribeLocalEvent(OnRemoved); SubscribeLocalEvent(OnChangeName); SubscribeLocalEvent(OnChangeVerb); } private void OnImplanted(Entity ent, ref ImplantImplantedEvent args) { if (args.Implanted is not {} user) return; ent.Comp.Existing = HasComp(user); var voice = EnsureComp(user); voice.NameOverride = Name(user); } private void OnRemoved(Entity ent, ref ImplantRemovedEvent args) { if (args.Implanted is not {} user) return; if (ent.Comp.Existing && TryComp(user, out var voice)) voice.NameOverride = Name(user); else RemComp(user); } private void OnChangeVerb(Entity ent, ref VoiceMaskChangeVerbMessage msg) { var user = msg.Actor; if (!TryComp(user, out var voice)) return; if (msg.Verb is {} id && !_proto.HasIndex(id)) return; voice.SpeechVerbOverride = msg.Verb; // verb is only important to metagamers so no need to log as opposed to name _popup.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, user); UpdateUI(ent, voice); } /// /// Copy from VoiceMaskSystem, adapted to work with SyrinxImplantComponent. /// private void OnChangeName(Entity ent, ref VoiceMaskChangeNameMessage msg) { var user = msg.Actor; if (!TryComp(user, out var voice)) return; if (msg.Name.Length > HumanoidCharacterProfile.MaxNameLength || msg.Name.Length <= 0) { _popup.PopupEntity(Loc.GetString("voice-mask-popup-failure"), user, user, PopupType.SmallCaution); return; } voice.NameOverride = msg.Name.Trim(); _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user):player} set voice of {ToPrettyString(uid):mask}: {voice.NameOverride}"); _popup.PopupEntity(Loc.GetString("voice-mask-popup-success"), user, user); UpdateUI(ent, voice); } /// /// Copy from VoiceMaskSystem, adapted to work with SyrinxImplantComponent. /// private void UpdateUI(EntityUid uid, VoiceOverrideComponent voice) { var state = new VoiceMaskBuiState(voice.NameOverride, voice.SpeechVerbOverride); _ui.TrySetUiState(uid, VoiceMaskUIKey.Key, state); } }