]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Traitor can no longer get multiple objectives to save/help/kill the same person ...
authorpsykana <36602558+psykana@users.noreply.github.com>
Sat, 28 Dec 2024 14:49:03 +0000 (15:49 +0100)
committerGitHub <noreply@github.com>
Sat, 28 Dec 2024 14:49:03 +0000 (15:49 +0100)
* Deduplicate traitor objectives

* Remove redundant check

Content.Server/Objectives/Systems/HelpProgressConditionSystem.cs
Content.Server/Objectives/Systems/KeepAliveCondition.cs
Content.Server/Objectives/Systems/KillPersonConditionSystem.cs

index e0a56149b3e2525540f9f5f1b1afef1807b928bf..7639e69bfdaa3aa1cc42c4298b1c64a5a78fa96c 100644 (file)
@@ -45,10 +45,7 @@ public sealed class HelpProgressConditionSystem : EntitySystem
             return;
         }
 
-        var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind)
-            .Select(pair => pair.Item1)
-            .ToHashSet();
-        var removeList = new List<EntityUid>();
+        var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet();
 
         // cant help anyone who is tasked with helping:
         // 1. thats boring
@@ -56,19 +53,26 @@ public sealed class HelpProgressConditionSystem : EntitySystem
         foreach (var traitor in traitors)
         {
             // TODO: replace this with TryComp<ObjectivesComponent>(traitor) or something when objectives are moved out of mind
-            if (!TryComp<MindComponent>(traitor, out var mind))
+            if (!TryComp<MindComponent>(traitor.Id, out var mind))
                 continue;
 
             foreach (var objective in mind.Objectives)
             {
                 if (HasComp<HelpProgressConditionComponent>(objective))
-                    removeList.Add(traitor);
+                    traitors.RemoveWhere(x => x.Mind == mind);
             }
         }
 
-        foreach (var tot in removeList)
+        // Can't have multiple objectives to help/save the same person
+        foreach (var objective in args.Mind.Objectives)
         {
-            traitors.Remove(tot);
+            if (HasComp<RandomTraitorAliveComponent>(objective) || HasComp<RandomTraitorProgressComponent>(objective))
+            {
+                if (TryComp<TargetObjectiveComponent>(objective, out var help))
+                {
+                    traitors.RemoveWhere(x => x.Id == help.Target);
+                }
+            }
         }
 
         // no more helpable traitors
@@ -78,7 +82,7 @@ public sealed class HelpProgressConditionSystem : EntitySystem
             return;
         }
 
-        _target.SetTarget(uid, _random.Pick(traitors), target);
+        _target.SetTarget(uid, _random.Pick(traitors).Id, target);
     }
 
     private float GetProgress(EntityUid target)
index 48df96e742512745ccfb2b707def2876d502d60b..fad8aa6d18e150eb2b87031e7c35fa150cd1445c 100644 (file)
@@ -44,7 +44,19 @@ public sealed class KeepAliveConditionSystem : EntitySystem
             return;
         }
 
-        var traitors = Enumerable.ToList<(EntityUid Id, MindComponent Mind)>(_traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind));
+        var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet();
+
+        // Can't have multiple objectives to help/save the same person
+        foreach (var objective in args.Mind.Objectives)
+        {
+            if (HasComp<RandomTraitorAliveComponent>(objective) || HasComp<RandomTraitorProgressComponent>(objective))
+            {
+                if (TryComp<TargetObjectiveComponent>(objective, out var help))
+                {
+                    traitors.RemoveWhere(x => x.Id == help.Target);
+                }
+            }
+        }
 
         // You are the first/only traitor.
         if (traitors.Count == 0)
index f662d6a578c80763d0aabe244979416026001576..3aa4d606fc3bd40f2e8a782682955522cc839647 100644 (file)
@@ -6,6 +6,7 @@ using Content.Shared.Mind;
 using Content.Shared.Objectives.Components;
 using Robust.Shared.Configuration;
 using Robust.Shared.Random;
+using System.Linq;
 
 namespace Content.Server.Objectives.Systems;
 
@@ -52,8 +53,18 @@ public sealed class KillPersonConditionSystem : EntitySystem
         if (target.Target != null)
             return;
 
-        // no other humans to kill
         var allHumans = _mind.GetAliveHumans(args.MindId);
+
+        // Can't have multiple objectives to kill the same person
+        foreach (var objective in args.Mind.Objectives)
+        {
+            if (HasComp<KillPersonConditionComponent>(objective) && TryComp<TargetObjectiveComponent>(objective, out var kill))
+            {
+                allHumans.RemoveWhere(x => x.Owner == kill.Target);
+            }
+        }
+
+        // no other humans to kill
         if (allHumans.Count == 0)
         {
             args.Cancelled = true;