using Content.Server._CP14.Objectives.Components; using Content.Server.Station.Components; using Content.Shared._CP14.Vampire.Components; using Content.Shared.Mind; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Objectives.Components; using Content.Shared.Objectives.Systems; using Content.Shared.Roles.Jobs; using Robust.Shared.Prototypes; namespace Content.Server._CP14.Objectives.Systems; public sealed class CP14VampireObjectiveConditionsSystem : EntitySystem { [Dependency] private readonly MetaDataSystem _meta = default!; [Dependency] private readonly SharedObjectivesSystem _objectives = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly SharedJobSystem _jobs = default!; [Dependency] private readonly IPrototypeManager _proto = default!; public readonly float RequiredAlivePercentage = 0.5f; public readonly int RequiredHeartLevel = 3; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnBloodPurityAfterAssign); SubscribeLocalEvent(OnBloodPurityGetProgress); SubscribeLocalEvent(OnDefenceAfterAssign); SubscribeLocalEvent(OnDefenceGetProgress); } private void OnDefenceAfterAssign(Entity ent, ref ObjectiveAfterAssignEvent args) { _meta.SetEntityName(ent, Loc.GetString("cp14-objective-vampire-defence-settlement-title")); _meta.SetEntityDescription(ent, Loc.GetString("cp14-objective-vampire-defence-settlement-desc", ("count", RequiredAlivePercentage * 100))); _objectives.SetIcon(ent, ent.Comp.Icon); } public float CalculateAlivePlayersPercentage() { var query = EntityQueryEnumerator(); var totalPlayers = 0f; var alivePlayers = 0f; while (query.MoveNext(out var uid, out var jobs)) { totalPlayers += jobs.PlayerJobs.Count; foreach (var (netUserId, jobsList) in jobs.PlayerJobs) { if (!_mind.TryGetMind(netUserId, out var mind)) continue; if (!_jobs.MindTryGetJob(mind, out var jobRole)) continue; var firstMindEntity = GetEntity(mind.Value.Comp.OriginalOwnedEntity); if (firstMindEntity is null) continue; if (!_mobState.IsDead(firstMindEntity.Value)) alivePlayers++; } } return totalPlayers > 0 ? (alivePlayers / totalPlayers) : 0f; } private void OnDefenceGetProgress(Entity ent, ref ObjectiveGetProgressEvent args) { args.Progress = CalculateAlivePlayersPercentage() > RequiredAlivePercentage ? 1 : 0; } private void OnBloodPurityAfterAssign(Entity ent, ref ObjectiveAfterAssignEvent args) { if (!TryComp(args.Mind?.OwnedEntity, out var vampireComp)) return; ent.Comp.Faction = vampireComp.Faction; _meta.SetEntityName(ent, Loc.GetString("cp14-objective-vampire-pure-blood-title")); _meta.SetEntityDescription(ent, Loc.GetString("cp14-objective-vampire-pure-blood-desc")); _objectives.SetIcon(ent, ent.Comp.Icon); } private void OnBloodPurityGetProgress(Entity ent, ref ObjectiveGetProgressEvent args) { var query = EntityQueryEnumerator(); var ourHeartReady = false; var othersHeartsExist = false; while (query.MoveNext(out var uid, out var vampire)) { if (vampire.Faction == ent.Comp.Faction && vampire.Level >= RequiredHeartLevel) ourHeartReady = true; if (vampire.Faction != ent.Comp.Faction && vampire.Level >= RequiredHeartLevel) { othersHeartsExist = true; break; } } var progress = 0f; if (ourHeartReady) progress += 0.5f; if (!othersHeartsExist) progress += 0.5f; args.Progress = progress; } }