]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Store ninja objectives in conditions 2 (#20894)
authorVyacheslav Kovalevsky <40753025+Slava0135@users.noreply.github.com>
Mon, 29 Jan 2024 04:06:32 +0000 (07:06 +0300)
committerGitHub <noreply@github.com>
Mon, 29 Jan 2024 04:06:32 +0000 (15:06 +1100)
* 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 <comedian_vs_clown@hotmail.com>
Content.Server/GenericAntag/GenericAntagSystem.cs
Content.Server/Ninja/Systems/SpaceNinjaSystem.cs
Content.Server/Ninja/Systems/SpiderChargeSystem.cs
Content.Server/Objectives/Components/SpiderChargeConditionComponent.cs
Content.Server/Objectives/Components/SpiderChargeTargetRequirementComponent.cs [deleted file]
Content.Server/Objectives/Systems/NinjaConditionsSystem.cs
Content.Server/Objectives/Systems/SpiderChargeTargetRequirementSystem.cs [deleted file]
Content.Server/Roles/NinjaRoleComponent.cs
Resources/Locale/en-US/objectives/conditions/spider-charge.ftl
Resources/Prototypes/Objectives/ninja.yml

index d789153fbc454a3a5cd28613e84a959b6c45ec70..6b1774159c161e03c3b8d3c4fbda30b5ac7b07e2 100644 (file)
@@ -60,7 +60,7 @@ public sealed class GenericAntagSystem : EntitySystem
 }
 
 /// <summary>
-/// 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.
 /// </summary>
 [ByRefEvent]
index 716c98372cf15c1d11277663cf3874e989dd91be..835ac7ad6cdac1e357565f7bbc23734df5503b2d 100644 (file)
@@ -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<EntityUid>();
-        var query = EntityQueryEnumerator<BombingTargetComponent, WarpPointComponent>();
-        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
index 0182bd7ca78f0061067d74677d175f6f2421cd6c..948d715f0a7bd4fc5822443a91e6d9f41b3e943f 100644 (file)
@@ -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<NinjaRoleComponent>(user, out var role))
+        if (!_mind.TryGetRole<NinjaRoleComponent>(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<SpiderChargeConditionComponent>(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;
     }
 }
index 1c6f22ed57cbcf8c2397cf1cdee16c67b83d24ca..368c9f27ed4a599035e7f0d5c035a2717f1c33d4 100644 (file)
@@ -6,9 +6,15 @@ namespace Content.Server.Objectives.Components;
 /// <summary>
 /// Requires that the player is a ninja and blew up their spider charge at its target location.
 /// </summary>
-[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;
+
+    /// <summary>
+    /// Warp point that the spider charge has to target
+    /// </summary>
+    [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 (file)
index e148d77..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-using Content.Server.Objectives.Systems;
-
-namespace Content.Server.Objectives.Components;
-
-/// <summary>
-/// Requires the player to be a ninja that has a spider charge target assigned, which is almost always the case.
-/// </summary>
-[RegisterComponent, Access(typeof(SpiderChargeTargetRequirementSystem))]
-public sealed partial class SpiderChargeTargetRequirementComponent : Component
-{
-}
index 24eeb0542ec61c68f6e384ede705b90ebb354e4a..2bd8538af161f8e06d8fa04a19f08f1a93cab74f 100644 (file)
@@ -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<DoorjackConditionComponent, ObjectiveGetProgressEvent>(OnDoorjackGetProgress);
 
+        SubscribeLocalEvent<SpiderChargeConditionComponent, RequirementCheckEvent>(OnSpiderChargeRequirementCheck);
         SubscribeLocalEvent<SpiderChargeConditionComponent, ObjectiveAfterAssignEvent>(OnSpiderChargeAfterAssign);
         SubscribeLocalEvent<SpiderChargeConditionComponent, ObjectiveGetProgressEvent>(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<NinjaRoleComponent>(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<EntityUid>();
+        var query = EntityQueryEnumerator<BombingTargetComponent, WarpPointComponent>();
+        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<NinjaRoleComponent>(mindId, out var role) ||
-            role.SpiderChargeTarget == null ||
-            !TryComp<WarpPointComponent>(role.SpiderChargeTarget, out var warp))
+        string title;
+        if (comp.Target == null || !TryComp<WarpPointComponent>(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 (file)
index 107d889..0000000
+++ /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<SpiderChargeTargetRequirementComponent, RequirementCheckEvent>(OnCheck);
-    }
-
-    private void OnCheck(EntityUid uid, SpiderChargeTargetRequirementComponent comp, ref RequirementCheckEvent args)
-    {
-        if (args.Cancelled)
-            return;
-
-        if (!TryComp<NinjaRoleComponent>(args.MindId, out var role) || role.SpiderChargeTarget == null)
-            args.Cancelled = true;
-    }
-}
index dcc55d0fb4347f605561b397dc1daee01065883d..0fa2e5395e3aa682f9827a333e0acd53d96dfe43 100644 (file)
@@ -2,15 +2,7 @@ using Content.Shared.Roles;
 
 namespace Content.Server.Roles;
 
-/// <summary>
-/// Stores the ninja's objectives on the mind so if they die the rest of the greentext persists.
-/// </summary>
 [RegisterComponent]
 public sealed partial class NinjaRoleComponent : AntagonistRoleComponent
 {
-    /// <summary>
-    /// Warp point that the spider charge has to target
-    /// </summary>
-    [DataField("spiderChargeTarget")]
-    public EntityUid? SpiderChargeTarget;
 }
index cdc3cfda96ebaa32f6ee91fc3d4020abf9d0b336..2c4305df9cde3d9876d020a07550ce58e984c918 100644 (file)
@@ -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}
index a7291645c94aae4564ab03fc7689b206de992726..43def65d7a0cec53e9313cd9b7aa40d5c5a39986 100644 (file)
@@ -54,7 +54,6 @@
     icon:
       sprite: Objects/Weapons/Bombs/spidercharge.rsi
       state: icon
-  - type: SpiderChargeTargetRequirement
   - type: SpiderChargeCondition
 
 - type: entity