From: Morb <14136326+Morb0@users.noreply.github.com> Date: Tue, 24 Oct 2023 07:55:46 +0000 (+0300) Subject: Hijack shuttle objective (#19621) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=47b244b191f5e0dcea2ef63c0ff273ac81c379aa;p=space-station-14.git Hijack shuttle objective (#19621) Co-authored-by: DrSmugleaf --- diff --git a/Content.Server/Objectives/Components/HijackShuttleComponent.cs b/Content.Server/Objectives/Components/HijackShuttleComponent.cs new file mode 100644 index 0000000000..010f6f1407 --- /dev/null +++ b/Content.Server/Objectives/Components/HijackShuttleComponent.cs @@ -0,0 +1,8 @@ +using Content.Server.Objectives.Systems; + +namespace Content.Server.Objectives.Components; + +[RegisterComponent, Access(typeof(HijackShuttleConditionSystem))] +public sealed partial class HijackShuttleComponent : Component +{ +} diff --git a/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs b/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs new file mode 100644 index 0000000000..5ea560297c --- /dev/null +++ b/Content.Server/Objectives/Systems/HijackShuttleConditionSystem.cs @@ -0,0 +1,104 @@ +using Content.Server.Objectives.Components; +using Content.Server.Shuttles.Components; +using Content.Server.Shuttles.Systems; +using Content.Shared.Cuffs.Components; +using Content.Shared.Humanoid; +using Content.Shared.Mind; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Objectives.Components; +using Content.Shared.Roles; +using Robust.Shared.Player; + +namespace Content.Server.Objectives.Systems; + +public sealed class HijackShuttleConditionSystem : EntitySystem +{ + [Dependency] private readonly EmergencyShuttleSystem _emergencyShuttle = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly SharedRoleSystem _role = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnGetProgress); + } + + private void OnGetProgress(EntityUid uid, HijackShuttleComponent comp, ref ObjectiveGetProgressEvent args) + { + args.Progress = GetProgress(args.MindId, args.Mind); + } + + private float GetProgress(EntityUid mindId, MindComponent mind) + { + // not escaping alive if you're deleted/dead + if (mind.OwnedEntity == null || _mind.IsCharacterDeadIc(mind)) + return 0f; + + // You're not escaping if you're restrained! + if (TryComp(mind.OwnedEntity, out var cuffed) && cuffed.CuffedHandCount > 0) + return 0f; + + // There no emergency shuttles + if (!_emergencyShuttle.EmergencyShuttleArrived) + return 0f; + + // Check hijack for each emergency shuttle + foreach (var stationData in EntityQuery()) + { + if (stationData.EmergencyShuttle == null) + continue; + + if (IsShuttleHijacked(stationData.EmergencyShuttle.Value, mindId)) + return 1f; + } + + return 0f; + } + + private bool IsShuttleHijacked(EntityUid shuttleGridId, EntityUid mindId) + { + var gridPlayers = Filter.BroadcastGrid(shuttleGridId).Recipients; + var humanoids = GetEntityQuery(); + var cuffable = GetEntityQuery(); + EntityQuery(); + + var agentOnShuttle = false; + foreach (var player in gridPlayers) + { + if (player.AttachedEntity == null || + !_mind.TryGetMind(player.AttachedEntity.Value, out var crewMindId, out _)) + continue; + + if (mindId == crewMindId) + { + agentOnShuttle = true; + continue; + } + + var isHumanoid = humanoids.HasComponent(player.AttachedEntity.Value); + if (!isHumanoid) // Only humanoids count as enemies + continue; + + var isAntagonist = _role.MindIsAntagonist(mindId); + if (isAntagonist) // Allow antagonist + continue; + + var isPersonIncapacitated = _mobState.IsIncapacitated(player.AttachedEntity.Value); + if (isPersonIncapacitated) // Allow dead and crit + continue; + + var isPersonCuffed = + cuffable.TryGetComponent(player.AttachedEntity.Value, out var cuffed) + && cuffed.CuffedHandCount > 0; + if (isPersonCuffed) // Allow handcuffed + continue; + + return false; + } + + return agentOnShuttle; + } +} diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 62478082d8..deb2ba256d 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -5,6 +5,7 @@ using Content.Server.UserInterface; using Content.Shared.Access; using Content.Shared.CCVar; using Content.Shared.Database; +using Content.Shared.Emag.Systems; using Content.Shared.Popups; using Content.Shared.Shuttles.BUIStates; using Content.Shared.Shuttles.Events; @@ -89,6 +90,7 @@ public sealed partial class EmergencyShuttleSystem SubscribeLocalEvent(OnEmergencyRepeal); SubscribeLocalEvent(OnEmergencyRepealAll); SubscribeLocalEvent(OnEmergencyOpenAttempt); + SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnEscapeUnpaused); } @@ -103,6 +105,12 @@ public sealed partial class EmergencyShuttleSystem } } + private void OnEmagged(EntityUid uid, EmergencyShuttleConsoleComponent component, ref GotEmaggedEvent args) + { + _logger.Add(LogType.EmergencyShuttle, LogImpact.Extreme, $"{ToPrettyString(args.UserUid):player} emagged shuttle console for early launch"); + EarlyLaunch(); + } + private void SetAuthorizeTime(float obj) { _authorizeTime = obj; diff --git a/Resources/Locale/en-US/objectives/conditions/hijack-shuttle-condition.ftl b/Resources/Locale/en-US/objectives/conditions/hijack-shuttle-condition.ftl new file mode 100644 index 0000000000..5a0c1fd88b --- /dev/null +++ b/Resources/Locale/en-US/objectives/conditions/hijack-shuttle-condition.ftl @@ -0,0 +1,2 @@ +objective-condition-hijack-shuttle-title = Hijack emergency shuttle +objective-condition-hijack-shuttle-description = Leave on the shuttle free and clear of the loyal Nanotrasen crew on board. Use ANY methods available to you. Syndicate agents, Nanotrasen enemies, and handcuffed hostages may remain alive on the shuttle. Ignore assistance from anyone other than a support agent. diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index 2ddf78e032..7d6c9a48a3 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -33,6 +33,7 @@ weights: EscapeShuttleObjective: 1 DieObjective: 0.05 + HijackShuttleObjective: 0.02 - type: weightedRandom id: TraitorObjectiveGroupSocial