From 7311ce671fe29d81c662b2313e28c275c4f868cb Mon Sep 17 00:00:00 2001 From: Vyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com> Date: Mon, 29 Jan 2024 07:06:32 +0300 Subject: [PATCH] Store ninja objectives in conditions 2 (#20894) * move spider charge target from role * shorter field names * remove ninja role comment * remove unused systems in SpaceNinjaSystem * GenericAntagObjectivesAddedEvent * check if warp point is on same map * remove unnecessary import * add missing loc when spider charge has no target * a * remove spider charge target requirement comp * inline SpiderChargeTitle * allow planting charge without objective * remove map check * fix role check when planting * obj.Target * Fix merge --------- Co-authored-by: metalgearsloth --- .../GenericAntag/GenericAntagSystem.cs | 2 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 22 +++----- .../Ninja/Systems/SpiderChargeSystem.cs | 9 +-- .../SpiderChargeConditionComponent.cs | 12 +++- .../SpiderChargeTargetRequirementComponent.cs | 11 ---- .../Systems/NinjaConditionsSystem.cs | 56 ++++++++++++++----- .../SpiderChargeTargetRequirementSystem.cs | 24 -------- Content.Server/Roles/NinjaRoleComponent.cs | 8 --- .../objectives/conditions/spider-charge.ftl | 1 + Resources/Prototypes/Objectives/ninja.yml | 1 - 10 files changed, 65 insertions(+), 81 deletions(-) delete mode 100644 Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs delete mode 100644 Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs diff --git a/Content.Server/GenericAntag/GenericAntagSystem.cs b/Content.Server/GenericAntag/GenericAntagSystem.cs index d789153fbc..6b1774159c 100644 --- a/Content.Server/GenericAntag/GenericAntagSystem.cs +++ b/Content.Server/GenericAntag/GenericAntagSystem.cs @@ -60,7 +60,7 @@ public sealed class GenericAntagSystem : EntitySystem } /// -/// Event raised on a player's entity after its simple antag rule is started and objectives get added. +/// Event raised on a player's entity after its simple antag rule is started. /// Use this to add a briefing, roles, etc. /// [ByRefEvent] diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 716c98372c..835ac7ad6c 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -7,7 +7,6 @@ using Content.Server.PowerCell; using Content.Server.Research.Systems; using Content.Server.Roles; using Content.Server.GenericAntag; -using Content.Server.Warps; using Content.Shared.Alert; using Content.Shared.Clothing.EntitySystems; using Content.Shared.Doors.Components; @@ -17,9 +16,11 @@ using Content.Shared.Ninja.Components; using Content.Shared.Ninja.Systems; using Content.Shared.Popups; using Content.Shared.Rounding; -using Robust.Shared.Random; +using Robust.Shared.Audio; +using Robust.Shared.Player; using System.Diagnostics.CodeAnalysis; using Content.Server.Objectives.Components; +using Robust.Shared.Audio.Systems; namespace Content.Server.Ninja.Systems; @@ -37,9 +38,9 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly IChatManager _chatMan = default!; - [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly RoleSystem _role = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedMindSystem _mind = default!; [Dependency] private readonly StealthClothingSystem _stealthClothing = default!; @@ -161,18 +162,9 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem _role.MindAddRole(mindId, role, mind); _role.MindPlaySound(mindId, config.GreetingSound, mind); - // choose spider charge detonation point - var warps = new List(); - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var warpUid, out _, out var warp)) - { - warps.Add(warpUid); - } - - if (warps.Count > 0) - role.SpiderChargeTarget = _random.Pick(warps); - - _chatMan.DispatchServerMessage(mind.Session, Loc.GetString("ninja-role-greeting")); + var session = mind.Session; + _audio.PlayGlobal(config.GreetingSound, Filter.Empty().AddPlayer(session), false, AudioParams.Default); + _chatMan.DispatchServerMessage(session, Loc.GetString("ninja-role-greeting")); } // TODO: PowerCellDraw, modify when cloak enabled diff --git a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs index 0182bd7ca7..948d715f0a 100644 --- a/Content.Server/Ninja/Systems/SpiderChargeSystem.cs +++ b/Content.Server/Ninja/Systems/SpiderChargeSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Explosion.EntitySystems; +using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; using Content.Server.Objectives.Components; using Content.Server.Popups; @@ -38,7 +39,7 @@ public sealed class SpiderChargeSystem : EntitySystem var user = args.User; - if (!_mind.TryGetRole(user, out var role)) + if (!_mind.TryGetRole(user, out var _)) { _popup.PopupEntity(Loc.GetString("spider-charge-not-ninja"), user, user); args.Cancelled = true; @@ -46,11 +47,11 @@ public sealed class SpiderChargeSystem : EntitySystem } // allow planting anywhere if there is no target, which should never happen - if (role.SpiderChargeTarget == null) + if (!_mind.TryGetObjectiveComp(user, out var obj) || obj.Target == null) return; // assumes warp point still exists - var targetXform = Transform(role.SpiderChargeTarget.Value); + var targetXform = Transform(obj.Target.Value); var locXform = Transform(args.Target); if (locXform.MapID != targetXform.MapID || (_transform.GetWorldPosition(locXform) - _transform.GetWorldPosition(targetXform)).LengthSquared() > comp.Range * comp.Range) @@ -79,6 +80,6 @@ public sealed class SpiderChargeSystem : EntitySystem return; // assumes the target was destroyed, that the charge wasn't moved somehow - obj.SpiderChargeDetonated = true; + obj.Detonated = true; } } diff --git a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs index 1c6f22ed57..368c9f27ed 100644 --- a/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs +++ b/Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs @@ -6,9 +6,15 @@ namespace Content.Server.Objectives.Components; /// /// Requires that the player is a ninja and blew up their spider charge at its target location. /// -[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem))] +[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SpiderChargeSystem), typeof(SpaceNinjaSystem))] public sealed partial class SpiderChargeConditionComponent : Component { - [DataField("spiderChargeDetonated"), ViewVariables(VVAccess.ReadWrite)] - public bool SpiderChargeDetonated; + [DataField, ViewVariables(VVAccess.ReadWrite)] + public bool Detonated; + + /// + /// Warp point that the spider charge has to target + /// + [DataField, ViewVariables(VVAccess.ReadWrite)] + public EntityUid? Target; } diff --git a/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs b/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs deleted file mode 100644 index e148d772f4..0000000000 --- a/Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Content.Server.Objectives.Systems; - -namespace Content.Server.Objectives.Components; - -/// -/// Requires the player to be a ninja that has a spider charge target assigned, which is almost always the case. -/// -[RegisterComponent, Access(typeof(SpiderChargeTargetRequirementSystem))] -public sealed partial class SpiderChargeTargetRequirementComponent : Component -{ -} diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs index 24eeb0542e..2bd8538af1 100644 --- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs +++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs @@ -1,7 +1,10 @@ -using Content.Server.Roles; using Content.Server.Objectives.Components; using Content.Server.Warps; using Content.Shared.Objectives.Components; +using Content.Shared.Mind; +using Content.Shared.Ninja.Components; +using Robust.Shared.Random; +using Content.Server.Roles; namespace Content.Server.Objectives.Systems; @@ -13,11 +16,14 @@ public sealed class NinjaConditionsSystem : EntitySystem { [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly NumberObjectiveSystem _number = default!; + [Dependency] private readonly SharedMindSystem _mind = default!; + [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { SubscribeLocalEvent(OnDoorjackGetProgress); + SubscribeLocalEvent(OnSpiderChargeRequirementCheck); SubscribeLocalEvent(OnSpiderChargeAfterAssign); SubscribeLocalEvent(OnSpiderChargeGetProgress); @@ -43,28 +49,50 @@ public sealed class NinjaConditionsSystem : EntitySystem } // spider charge - - private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args) + private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args) { - _metaData.SetEntityName(uid, SpiderChargeTitle(args.MindId), args.Meta); - } + if (args.Cancelled || !HasComp(args.MindId)) + { + return; + } - private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args) - { - args.Progress = comp.SpiderChargeDetonated ? 1f : 0f; + // choose spider charge detonation point + var warps = new List(); + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var warpUid, out _, out var warp)) + { + if (warp.Location != null) + { + warps.Add(warpUid); + } + } + + if (warps.Count <= 0) + { + args.Cancelled = true; + return; + } + comp.Target = _random.Pick(warps); } - private string SpiderChargeTitle(EntityUid mindId) + private void OnSpiderChargeAfterAssign(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveAfterAssignEvent args) { - if (!TryComp(mindId, out var role) || - role.SpiderChargeTarget == null || - !TryComp(role.SpiderChargeTarget, out var warp)) + string title; + if (comp.Target == null || !TryComp(comp.Target, out var warp) || warp.Location == null) { // this should never really happen but eh - return Loc.GetString("objective-condition-spider-charge-title-no-target"); + title = Loc.GetString("objective-condition-spider-charge-title-no-target"); } + else + { + title = Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location)); + } + _metaData.SetEntityName(uid, title, args.Meta); + } - return Loc.GetString("objective-condition-spider-charge-title", ("location", warp.Location ?? Name(role.SpiderChargeTarget.Value))); + private void OnSpiderChargeGetProgress(EntityUid uid, SpiderChargeConditionComponent comp, ref ObjectiveGetProgressEvent args) + { + args.Progress = comp.Detonated ? 1f : 0f; } // steal research diff --git a/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs b/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs deleted file mode 100644 index 107d88900a..0000000000 --- a/Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs +++ /dev/null @@ -1,24 +0,0 @@ -using Content.Server.Objectives.Components; -using Content.Server.Roles; -using Content.Shared.Objectives.Components; - -namespace Content.Server.Objectives.Systems; - -public sealed class SpiderChargeTargetRequirementSystem : EntitySystem -{ - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnCheck); - } - - private void OnCheck(EntityUid uid, SpiderChargeTargetRequirementComponent comp, ref RequirementCheckEvent args) - { - if (args.Cancelled) - return; - - if (!TryComp(args.MindId, out var role) || role.SpiderChargeTarget == null) - args.Cancelled = true; - } -} diff --git a/Content.Server/Roles/NinjaRoleComponent.cs b/Content.Server/Roles/NinjaRoleComponent.cs index dcc55d0fb4..0fa2e5395e 100644 --- a/Content.Server/Roles/NinjaRoleComponent.cs +++ b/Content.Server/Roles/NinjaRoleComponent.cs @@ -2,15 +2,7 @@ using Content.Shared.Roles; namespace Content.Server.Roles; -/// -/// Stores the ninja's objectives on the mind so if they die the rest of the greentext persists. -/// [RegisterComponent] public sealed partial class NinjaRoleComponent : AntagonistRoleComponent { - /// - /// Warp point that the spider charge has to target - /// - [DataField("spiderChargeTarget")] - public EntityUid? SpiderChargeTarget; } diff --git a/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl b/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl index cdc3cfda96..2c4305df9c 100644 --- a/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl +++ b/Resources/Locale/en-US/objectives/conditions/spider-charge.ftl @@ -1 +1,2 @@ +objective-condition-spider-charge-title-no-target = Detonate the spider clan charge (no target) objective-condition-spider-charge-title = Detonate the spider clan charge in {$location} diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index a7291645c9..43def65d7a 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -54,7 +54,6 @@ icon: sprite: Objects/Weapons/Bombs/spidercharge.rsi state: icon - - type: SpiderChargeTargetRequirement - type: SpiderChargeCondition - type: entity -- 2.52.0