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
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
return;
}
- _target.SetTarget(uid, _random.Pick(traitors), target);
+ _target.SetTarget(uid, _random.Pick(traitors).Id, target);
}
private float GetProgress(EntityUid target)
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)
using Content.Shared.Objectives.Components;
using Robust.Shared.Configuration;
using Robust.Shared.Random;
+using System.Linq;
namespace Content.Server.Objectives.Systems;
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;