Files
OldThink/Content.Server/Objectives/Systems/KillPersonConditionSystem.cs
withoutcode333 0e4e5b7805 Upstream core (#282)
* yes

(cherry picked from commit a6b5e1c66dfe4241977bcde753af594392164eca)

* Is real, navernoe (#944)

* its real

* fix shield

* remove comments game preset

* maximum predicted

* fixes

* АААААААААААААААААААААААААААА ПОМОГИТЕ Я ЕБНУЛСЯ ПОКА ФИКСИЛ ЭТУ ЗАЛУПУ

* govnoedit

* secret

(cherry picked from commit 22c7b68048590b5098efbfff0d0f5205d3a64c48)

* [Feature/Tweaks] Raznoe (#934)

* make thruster great again

* make hardsuit hos great again

* new ficha for medical hud

* fix

* vrode da

* GOOOVNO REMIX REVERB EXTRA

* fix

* правки

---------

Co-authored-by: BIGZi0348 <svalker0348@gmail.com>
(cherry picked from commit 141e61a0449873842f46d83eff9e9ce857147d60)

* Automatic changelog update

(cherry picked from commit d14fe5fb6c934ed522df0b5bc453e4c04707a6db)

* [Feature] Executions (#932)

* based

* cleanup

* cleanup + fixes

* fix

* fix

* fix ftl

* Update Resources/Locale/ru-RU/_white/executions/execution.ftl

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* Update execution.ftl

* правки

* vrode norm

* da

---------

Co-authored-by: BIGZi0348 <118811750+BIGZi0348@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: BIGZi0348 <svalker0348@gmail.com>
(cherry picked from commit 83e164172f8e290acee7634f14ac51281be020ad)

* Automatic changelog update

(cherry picked from commit 71f907c563a30a1fc7ef5751a4d6f2c780a14f4c)

* hotfix (#946)

(cherry picked from commit f577caec41ab277ee8fc1c18fe64f7e26a6e50f5)

---------

Co-authored-by: RavmorganButOnCocaine <valtos@nextmail.ru>
2025-04-13 19:03:49 +05:00

163 lines
5.4 KiB
C#

using System.Linq;
using Content.Server._Miracle.GulagSystem;
using Content.Server._White.Cult.GameRule;
using Content.Server.Objectives.Components;
using Content.Server.Shuttles.Systems;
using Content.Shared.CCVar;
using Content.Shared.Mind;
using Content.Shared.Objectives.Components;
using Content.Shared.Roles.Jobs;
using Robust.Shared.Configuration;
using Robust.Shared.Random;
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 IRobustRandom _random = default!;
[Dependency] private readonly SharedJobSystem _job = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly TargetObjectiveSystem _target = default!;
[Dependency] private readonly GulagSystem _gulag = default!; // WD
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<KillPersonConditionComponent, ObjectiveGetProgressEvent>(OnGetProgress);
SubscribeLocalEvent<PickRandomPersonComponent, ObjectiveAssignedEvent>(OnPersonAssigned);
SubscribeLocalEvent<PickRandomHeadComponent, ObjectiveAssignedEvent>(OnHeadAssigned);
SubscribeLocalEvent<PickCultTargetComponent, ObjectiveAssignedEvent>(OnCultTargetAssigned);
}
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 void OnPersonAssigned(EntityUid uid, PickRandomPersonComponent comp, ref ObjectiveAssignedEvent args)
{
// invalid objective prototype
if (!TryComp<TargetObjectiveComponent>(uid, out var target))
{
args.Cancelled = true;
return;
}
// target already assigned
if (target.Target != null)
return;
// no other humans to kill
var allHumans = _mind.GetAliveHumansExcept(args.MindId);
allHumans = allHumans.Where(x => !_gulag.IsMindGulagged(x)).ToList();
if (allHumans.Count == 0)
{
args.Cancelled = true;
return;
}
_target.SetTarget(uid, _random.Pick(allHumans), target);
}
private void OnHeadAssigned(EntityUid uid, PickRandomHeadComponent comp, ref ObjectiveAssignedEvent args)
{
// invalid prototype
if (!TryComp<TargetObjectiveComponent>(uid, out var target))
{
args.Cancelled = true;
return;
}
// target already assigned
if (target.Target != null)
return;
// no other humans to kill
var allHumans = _mind.GetAliveHumansExcept(args.MindId);
allHumans = allHumans.Where(x => !_gulag.IsMindGulagged(x)).ToList();
if (allHumans.Count == 0)
{
args.Cancelled = true;
return;
}
var allHeads = new List<EntityUid>();
foreach (var mind in allHumans)
{
// RequireAdminNotify used as a cheap way to check for command department
if (_job.MindTryGetJob(mind, out _, out var prototype) && prototype.RequireAdminNotify)
allHeads.Add(mind);
}
if (allHeads.Count == 0)
allHeads = allHumans; // fallback to non-head target
_target.SetTarget(uid, _random.Pick(allHeads), target);
}
private void OnCultTargetAssigned(Entity<PickCultTargetComponent> ent, ref ObjectiveAssignedEvent args)
{
// invalid prototype
if (!TryComp<TargetObjectiveComponent>(ent.Owner, out var target))
{
args.Cancelled = true;
return;
}
// target already assigned
if (target.Target != null)
return;
var cultistRule = EntityManager.EntityQuery<CultRuleComponent>().FirstOrDefault();
if (cultistRule?.CultTarget is null)
{
return;
}
_target.SetTarget(ent.Owner, cultistRule.CultTarget.Value);
}
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;
}
}