using Content.Shared.Language; using Content.Shared.Language.Components; using Content.Shared.Language.Events; using Content.Shared.Language.Systems; using Robust.Client.Player; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; namespace Content.Client.Language.Systems; public sealed class LanguageSystem : SharedLanguageSystem { [Dependency] private readonly IPlayerManager _playerManager = default!; /// /// Invoked when the languages of the local player entity change, for use in UI. /// public event Action? OnLanguagesChanged; public override void Initialize() { _playerManager.LocalPlayerAttached += NotifyUpdate; SubscribeLocalEvent(OnHandleState); } private void OnHandleState(Entity ent, ref ComponentHandleState args) { if (args.Current is not LanguageSpeakerComponent.State state) return; ent.Comp.CurrentLanguage = state.CurrentLanguage; ent.Comp.SpokenLanguages = state.SpokenLanguages; ent.Comp.UnderstoodLanguages = state.UnderstoodLanguages; if (ent.Owner == _playerManager.LocalEntity) NotifyUpdate(ent); } /// /// Returns the LanguageSpeakerComponent of the local player entity. /// Will return null if the player does not have an entity, or if the client has not yet received the component state. /// public LanguageSpeakerComponent? GetLocalSpeaker() { return CompOrNull(_playerManager.LocalEntity); } public void RequestSetLanguage(ProtoId language) { if (GetLocalSpeaker()?.CurrentLanguage?.Equals(language) == true) return; RaiseNetworkEvent(new LanguagesSetMessage(language)); } private void NotifyUpdate(EntityUid localPlayer) { RaiseLocalEvent(localPlayer, new LanguagesUpdateEvent(), broadcast: true); OnLanguagesChanged?.Invoke(); } }