using Content.Server.Mind; using Content.Server.Roles; using Content.Server.Roles.Jobs; using Content.Shared.CharacterInfo; using Content.Shared.Objectives; using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Systems; namespace Content.Server.CharacterInfo; public sealed class CharacterInfoSystem : EntitySystem { [Dependency] private readonly JobSystem _jobs = default!; [Dependency] private readonly MindSystem _minds = default!; [Dependency] private readonly RoleSystem _roles = default!; [Dependency] private readonly SharedObjectivesSystem _objectives = default!; public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(OnRequestCharacterInfoEvent); } private void OnRequestCharacterInfoEvent(RequestCharacterInfoEvent msg, EntitySessionEventArgs args) { if (!args.SenderSession.AttachedEntity.HasValue || args.SenderSession.AttachedEntity != GetEntity(msg.NetEntity)) return; var entity = args.SenderSession.AttachedEntity.Value; var objectives = new Dictionary>(); var jobTitle = "No Profession"; string? briefing = null; if (_minds.TryGetMind(entity, out var mindId, out var mind)) { // Get objectives foreach (var objective in mind.AllObjectives) { var info = _objectives.GetInfo(objective, mindId, mind); if (info == null) continue; // group objectives by their issuer var issuer = Comp(objective).Issuer; if (!objectives.ContainsKey(issuer)) objectives[issuer] = new List(); objectives[issuer].Add(info.Value); } if (_jobs.MindTryGetJobName(mindId, out var jobName)) jobTitle = jobName; // Get briefing briefing = _roles.MindGetBriefing(mindId); } RaiseNetworkEvent(new CharacterInfoEvent(GetNetEntity(entity), jobTitle, objectives, briefing), args.SenderSession); } }