using Content.Server.Mind; using Content.Shared.Language; using Content.Shared.Language.Events; using Content.Shared.Mind; using Content.Shared.Mind.Components; using Robust.Shared.Player; namespace Content.Server.Language; /// /// LanguageSystem Networking /// This is used to update client state when mind change entity. /// public sealed partial class LanguageSystem { [Dependency] private readonly MindSystem _mind = default!; public void InitializeNet() { // Refresh the client's state when its mind hops to a different entity SubscribeLocalEvent((uid, _, _) => SendLanguageStateToClient(uid)); SubscribeLocalEvent((_, _, args) => { if (args.Mind.Comp.Session != null) SendLanguageStateToClient(args.Mind.Comp.Session); }); SubscribeLocalEvent((uid, comp, _) => SendLanguageStateToClient(uid, comp)); SubscribeNetworkEvent((_, session) => SendLanguageStateToClient(session.SenderSession)); } private void SendLanguageStateToClient(EntityUid uid, LanguageSpeakerComponent? comp = null) { // Try to find a mind inside the entity and notify its session if (!_mind.TryGetMind(uid, out _, out var mindComp) || mindComp.Session == null) return; SendLanguageStateToClient(uid, mindComp.Session, comp); } private void SendLanguageStateToClient(ICommonSession session, LanguageSpeakerComponent? comp = null) { // Try to find an entity associated with the session and resolve the languages from it if (session.AttachedEntity is not { Valid: true } entity) return; SendLanguageStateToClient(entity, session, comp); } private void SendLanguageStateToClient(EntityUid uid, ICommonSession session, LanguageSpeakerComponent? component = null) { var langs = GetLanguages(uid, component); var message = new LanguagesUpdatedMessage(langs.CurrentLanguage, langs.SpokenLanguages, langs.UnderstoodLanguages); RaiseNetworkEvent(message, session); } }