using Content.Shared.CharacterInfo; using Content.Shared.Objectives; using Robust.Client.GameObjects; using Robust.Client.Player; namespace Content.Client.CharacterInfo; public sealed class CharacterInfoSystem : EntitySystem { [Dependency] private readonly IPlayerManager _players = default!; public event Action? OnCharacterUpdate; public event Action? OnCharacterDetached; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnPlayerAttached); SubscribeNetworkEvent(OnCharacterInfoEvent); } public void RequestCharacterInfo() { var entity = _players.LocalPlayer?.ControlledEntity; if (entity == null) { return; } RaiseNetworkEvent(new RequestCharacterInfoEvent(entity.Value)); } private void OnPlayerAttached(PlayerAttachSysMessage msg) { if (msg.AttachedEntity == default) { OnCharacterDetached?.Invoke(); } } private void OnCharacterInfoEvent(CharacterInfoEvent msg, EntitySessionEventArgs args) { var sprite = CompOrNull(msg.EntityUid); var data = new CharacterData(msg.JobTitle, msg.Objectives, msg.Briefing, sprite, Name(msg.EntityUid)); OnCharacterUpdate?.Invoke(data); } public readonly record struct CharacterData( string Job, Dictionary> Objectives, string Briefing, ISpriteComponent? Sprite, string EntityName ); }