| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- using Content.Server.Objectives.Components;
- using Content.Server.Shuttles.Systems;
- using Content.Shared.CCVar;
- using Content.Shared.Mind;
- using Content.Shared.Objectives.Components;
- using Robust.Shared.Configuration;
- namespace Content.Server.Objectives.Systems;
- /// <summary>
- /// Handles kill person condition logic and picking random kill targets.
- /// </summary>
- public sealed class KillPersonConditionSystem : EntitySystem
- {
- [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!;
- [Dependency] private readonly IConfigurationManager _config = default!;
- [Dependency] private readonly SharedMindSystem _mind = default!;
- [Dependency] private readonly TargetObjectiveSystem _target = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<KillPersonConditionComponent, ObjectiveGetProgressEvent>(OnGetProgress);
- }
- private void OnGetProgress(EntityUid uid, KillPersonConditionComponent comp, ref ObjectiveGetProgressEvent args)
- {
- if (!_target.GetTarget(uid, out var target))
- return;
- args.Progress = GetProgress(target.Value, comp.RequireDead);
- }
- private float GetProgress(EntityUid target, bool requireDead)
- {
- // deleted or gibbed or something, counts as dead
- if (!TryComp<MindComponent>(target, out var mind) || mind.OwnedEntity == null)
- return 1f;
- // dead is success
- if (_mind.IsCharacterDeadIc(mind))
- return 1f;
- // if the target has to be dead dead then don't check evac stuff
- if (requireDead)
- return 0f;
- // if evac is disabled then they really do have to be dead
- if (!_config.GetCVar(CCVars.EmergencyShuttleEnabled))
- return 0f;
- // target is escaping so you fail
- if (_emergencyShuttle.IsTargetEscaping(mind.OwnedEntity.Value))
- return 0f;
- // evac has left without the target, greentext since the target is afk in space with a full oxygen tank and coordinates off.
- if (_emergencyShuttle.ShuttlesLeft)
- return 1f;
- // if evac is still here and target hasn't boarded, show 50% to give you an indicator that you are doing good
- return _emergencyShuttle.EmergencyShuttleArrived ? 0.5f : 0f;
- }
- }
|