From 452e9572a3d9597c086a46d52fb47153cd70f5f1 Mon Sep 17 00:00:00 2001 From: kerfus-owo Date: Sun, 8 Feb 2026 21:20:28 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TargetObjectiveImmuneComponent.cs | 8 +++ .../Systems/PickObjectiveTargetSystem.cs | 52 ++++++++++++++++++- .../Locale/ru-RU/ADT/traits/categories.ftl | 2 +- Resources/Locale/ru-RU/ADT/traits/neutral.ftl | 5 ++ .../Prototypes/ADT/Traits/categories.yml | 6 ++- Resources/Prototypes/ADT/Traits/quirks.yml | 9 ++++ 6 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs diff --git a/Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs b/Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs new file mode 100644 index 00000000000..e1aebd765a3 --- /dev/null +++ b/Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs @@ -0,0 +1,8 @@ + +namespace Content.Server.ADT.Objectives.Components; + +/// +/// Use this to mark a player as immune to any target objectives, useful for ghost roles or events. +/// +[RegisterComponent] +public sealed partial class TargetObjectiveImmuneComponent : Component; diff --git a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs index 2977e10569d..10293edf83f 100644 --- a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs +++ b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs @@ -5,6 +5,10 @@ using Content.Server.Revolutionary.Components; using Robust.Shared.Random; using System.Linq; +//ADT-Tweak-Start +using Content.Server.ADT.Objectives.Components; +using Content.Shared.Mindshield.Components; +//ADT-Tweak-End namespace Content.Server.Objectives.Systems; @@ -31,6 +35,16 @@ public override void Initialize() SubscribeLocalEvent(OnRandomTraitorAliveAssigned); } + //ADT-Tweak-Start + private bool HasTargetImmunity(EntityUid? body) + { + if (body == null) + return false; + + return HasComp(body.Value) && !HasComp(body.Value); + } + //ADT-Tweak-End + private void OnSpecificPersonAssigned(Entity ent, ref ObjectiveAssignedEvent args) { // invalid objective prototype @@ -75,6 +89,11 @@ private void OnRandomPersonAssigned(Entity ent, ref O var allHumans = _mind.GetAliveHumans(args.MindId); + //ADT-Tweak-Start + // Filter out immune targets + allHumans.RemoveWhere(p => HasTargetImmunity(p.Comp.OwnedEntity)); + //ADT-Tweak-End + // Can't have multiple objectives to kill the same person foreach (var objective in args.Mind.Objectives) { @@ -109,6 +128,12 @@ private void OnRandomHeadAssigned(Entity ent, ref Objec // no other humans to kill var allHumans = _mind.GetAliveHumans(args.MindId); + + //ADT-Tweak-Start + // Filter out immune targets + allHumans.RemoveWhere(p => HasTargetImmunity(p.Comp.OwnedEntity)); + //ADT-Tweak-End + if (allHumans.Count == 0) { args.Cancelled = true; @@ -118,12 +143,15 @@ private void OnRandomHeadAssigned(Entity ent, ref Objec var allHeads = new HashSet>(); foreach (var person in allHumans) { - if (TryComp(person, out var mind) && mind.OwnedEntity is { } owned && HasComp(owned)) + //ADT-Tweak-Start + var mind = person.Comp; + if (mind.OwnedEntity is { } owned && HasComp(owned)) + //ADT-Tweak-End allHeads.Add(person); } if (allHeads.Count == 0) - allHeads = allHumans; // fallback to non-head target + allHeads = new HashSet>(allHumans); //ADT-Tweak _target.SetTarget(ent.Owner, _random.Pick(allHeads), target); } @@ -139,6 +167,16 @@ private void OnRandomTraitorProgressAssigned(Entity + { + if (!TryComp(t.Id, out var mindComp)) + return false; + return HasTargetImmunity(mindComp.OwnedEntity); + }); + //ADT-Tweak-End + // cant help anyone who is tasked with helping: // 1. thats boring // 2. no cyclic progress dependencies!!! @@ -188,6 +226,16 @@ private void OnRandomTraitorAliveAssigned(Entity en var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); + //ADT-Tweak-Start + // Filter out immune targets + traitors.RemoveWhere(t => + { + if (!TryComp(t.Id, out var mindComp)) + return false; + return HasTargetImmunity(mindComp.OwnedEntity); + }); + //ADT-Tweak-End + // Can't have multiple objectives to help/save the same person foreach (var objective in args.Mind.Objectives) { diff --git a/Resources/Locale/ru-RU/ADT/traits/categories.ftl b/Resources/Locale/ru-RU/ADT/traits/categories.ftl index ad62730731b..c5d64198e14 100644 --- a/Resources/Locale/ru-RU/ADT/traits/categories.ftl +++ b/Resources/Locale/ru-RU/ADT/traits/categories.ftl @@ -1,3 +1,3 @@ trait-category-quirks = Особенности trait-category-height = Рост - +trait-category-meta = Мета diff --git a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl index 9369fc788ee..2f0399407ff 100644 --- a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl +++ b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl @@ -34,3 +34,8 @@ trait-hushed-desc = Ваш голос не способен стать гром trait-pseudobulbar-affect-name = Псевдобульбарный аффект trait-pseudobulbar-affect-desc = Неврологическое расстройство из-за которого у вашего персонажа неконтролируемые приступы эмоций, как в речи так и в невербальном поведении. + + + +trait-protected-name = Метка защиты +trait-protected-desc = Вы не будете помечаться как цель для убийства. Не работает, если у вас есть имплант защиты разума. diff --git a/Resources/Prototypes/ADT/Traits/categories.yml b/Resources/Prototypes/ADT/Traits/categories.yml index fec1cdb72d5..59f5f4a97f0 100644 --- a/Resources/Prototypes/ADT/Traits/categories.yml +++ b/Resources/Prototypes/ADT/Traits/categories.yml @@ -1,4 +1,8 @@ - type: traitCategory id: Height name: trait-category-height - maxTraitPoints: 1 \ No newline at end of file + maxTraitPoints: 1 + +- type: traitCategory + id: Meta + name: trait-category-meta diff --git a/Resources/Prototypes/ADT/Traits/quirks.yml b/Resources/Prototypes/ADT/Traits/quirks.yml index b9f56eddd58..9b8757ee110 100644 --- a/Resources/Prototypes/ADT/Traits/quirks.yml +++ b/Resources/Prototypes/ADT/Traits/quirks.yml @@ -155,6 +155,15 @@ speciesBlacklist: - IPC +- type: trait + id: MarkedAsProtected + name: trait-protected-name + description: trait-protected-desc + category: Meta + components: + - type: TargetObjectiveImmune + cost: 0 + # - type: trait # id: ADTPotentialPoltergeist # name: trait-poltergeist-name From ce4fdb3ffaabaecd6822f52207e85627c0809100 Mon Sep 17 00:00:00 2001 From: kerfus-owo Date: Sun, 8 Feb 2026 22:31:56 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=AF=20=D0=94=D0=A3=D0=A0=D0=90=D0=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Objectives/Components/TargetObjectiveImmuneComponent.cs | 0 Resources/Locale/ru-RU/ADT/traits/neutral.ftl | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename Content.Server/{ => ADT}/Objectives/Components/TargetObjectiveImmuneComponent.cs (100%) diff --git a/Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs b/Content.Server/ADT/Objectives/Components/TargetObjectiveImmuneComponent.cs similarity index 100% rename from Content.Server/Objectives/Components/TargetObjectiveImmuneComponent.cs rename to Content.Server/ADT/Objectives/Components/TargetObjectiveImmuneComponent.cs diff --git a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl index 2f0399407ff..bfefdc515bb 100644 --- a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl +++ b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl @@ -37,5 +37,5 @@ trait-pseudobulbar-affect-desc = Неврологическое расстрой -trait-protected-name = Метка защиты -trait-protected-desc = Вы не будете помечаться как цель для убийства. Не работает, если у вас есть имплант защиты разума. +trait-protected-name = Неприметный +trait-protected-desc = Вы не будете помечаться как цель для убийства до тех пор, пока у вас не будет импланта защиты разума. From 2d2f11cb278d69742b9bc5121f8bb8f9f03c3bda Mon Sep 17 00:00:00 2001 From: kerfus-owo Date: Sun, 8 Feb 2026 22:33:50 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=A1=D0=BE=D1=80=D1=80=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Resources/Locale/ru-RU/ADT/traits/meta.ftl | 2 ++ Resources/Locale/ru-RU/ADT/traits/neutral.ftl | 5 ----- Resources/Prototypes/ADT/Traits/meta.yml | 8 ++++++++ Resources/Prototypes/ADT/Traits/quirks.yml | 9 --------- 4 files changed, 10 insertions(+), 14 deletions(-) create mode 100644 Resources/Locale/ru-RU/ADT/traits/meta.ftl create mode 100644 Resources/Prototypes/ADT/Traits/meta.yml diff --git a/Resources/Locale/ru-RU/ADT/traits/meta.ftl b/Resources/Locale/ru-RU/ADT/traits/meta.ftl new file mode 100644 index 00000000000..6b9ff7be665 --- /dev/null +++ b/Resources/Locale/ru-RU/ADT/traits/meta.ftl @@ -0,0 +1,2 @@ +trait-protected-name = Неприметный +trait-protected-desc = Вы не будете помечаться как цель для убийства до тех пор, пока у вас не будет импланта защиты разума. diff --git a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl index bfefdc515bb..9369fc788ee 100644 --- a/Resources/Locale/ru-RU/ADT/traits/neutral.ftl +++ b/Resources/Locale/ru-RU/ADT/traits/neutral.ftl @@ -34,8 +34,3 @@ trait-hushed-desc = Ваш голос не способен стать гром trait-pseudobulbar-affect-name = Псевдобульбарный аффект trait-pseudobulbar-affect-desc = Неврологическое расстройство из-за которого у вашего персонажа неконтролируемые приступы эмоций, как в речи так и в невербальном поведении. - - - -trait-protected-name = Неприметный -trait-protected-desc = Вы не будете помечаться как цель для убийства до тех пор, пока у вас не будет импланта защиты разума. diff --git a/Resources/Prototypes/ADT/Traits/meta.yml b/Resources/Prototypes/ADT/Traits/meta.yml new file mode 100644 index 00000000000..677c9e5d241 --- /dev/null +++ b/Resources/Prototypes/ADT/Traits/meta.yml @@ -0,0 +1,8 @@ +- type: trait + id: MarkedAsProtected + name: trait-protected-name + description: trait-protected-desc + category: Meta + components: + - type: TargetObjectiveImmune + cost: 0 diff --git a/Resources/Prototypes/ADT/Traits/quirks.yml b/Resources/Prototypes/ADT/Traits/quirks.yml index 9b8757ee110..b9f56eddd58 100644 --- a/Resources/Prototypes/ADT/Traits/quirks.yml +++ b/Resources/Prototypes/ADT/Traits/quirks.yml @@ -155,15 +155,6 @@ speciesBlacklist: - IPC -- type: trait - id: MarkedAsProtected - name: trait-protected-name - description: trait-protected-desc - category: Meta - components: - - type: TargetObjectiveImmune - cost: 0 - # - type: trait # id: ADTPotentialPoltergeist # name: trait-poltergeist-name From db674daf8857681bd77e06b12b5043fa3fb2db4c Mon Sep 17 00:00:00 2001 From: kerfus-owo Date: Sun, 8 Feb 2026 22:42:34 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=B2=D1=80=D0=BE=D0=B4=D0=B5=20=D0=B1?= =?UTF-8?q?=D1=8B=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Systems/PickObjectiveTargetSystem.cs | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs index 10293edf83f..1ab9021dcf8 100644 --- a/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs +++ b/Content.Server/Objectives/Systems/PickObjectiveTargetSystem.cs @@ -167,16 +167,6 @@ private void OnRandomTraitorProgressAssigned(Entity - { - if (!TryComp(t.Id, out var mindComp)) - return false; - return HasTargetImmunity(mindComp.OwnedEntity); - }); - //ADT-Tweak-End - // cant help anyone who is tasked with helping: // 1. thats boring // 2. no cyclic progress dependencies!!! @@ -226,16 +216,6 @@ private void OnRandomTraitorAliveAssigned(Entity en var traitors = _traitorRule.GetOtherTraitorMindsAliveAndConnected(args.Mind).ToHashSet(); - //ADT-Tweak-Start - // Filter out immune targets - traitors.RemoveWhere(t => - { - if (!TryComp(t.Id, out var mindComp)) - return false; - return HasTargetImmunity(mindComp.OwnedEntity); - }); - //ADT-Tweak-End - // Can't have multiple objectives to help/save the same person foreach (var objective in args.Mind.Objectives) {