Skip to content

Новая антаг-роль: Терминатор#56

Open
CREAsTIVE wants to merge 16 commits into
TheMaidDev:mainfrom
CREAsTIVE:feat-terminator-antag-role
Open

Новая антаг-роль: Терминатор#56
CREAsTIVE wants to merge 16 commits into
TheMaidDev:mainfrom
CREAsTIVE:feat-terminator-antag-role

Conversation

@CREAsTIVE

@CREAsTIVE CREAsTIVE commented May 15, 2026

Copy link
Copy Markdown
Contributor

Описание

Добавляет новую мид-раунд антаг-роль Терминатор.

Терминатор состоит из двух этапов:

Человеческая форма:
Имеет почти такие же статы, как и у человека, но не имеет состояние нокаута + не получает яды и клеточный урон. Медицинский сканер может легко спалить, что внутри человека находится робот.

Имеет действие "Перегрев", сжигающий кожаную оболочку и вскрывая титановый эндоскелет.

Форма робота, активируется после сжигания или смерти предыдущей формы:
Имеет сильный резист к большинству типов урона и 100 хп, но не имеет рук и возможности носить какую либо экипировку.

Имеет действие "Самоуничтожение", при активации которого взрывается сильным взрывом, способным нанести достаточно серьёзный урон.
При убийстве без триггера "самоуничтожения" происходит слабый взрыв, наносящий минорный урон и только вплотную.

При смерти выпадает "голова терминатора"

Имеет 2 цели: Самоуничтожение и Убийство рандомной цели.

Спрайты уже присутствовали, однако вся логика была вырезана.

Изменения

🆑

  • add: Мид-раунд антаг-роль Терминатор
  • add: Компонент HeatOverTime

Summary by CodeRabbit

New Features

  • Terminator Antagonist Role – New antagonist role with a terminator character type, complete with:
    • Heat-based damage mechanic applying continuous heat and fire stacks over time
    • Overheat implant for self-destruction with increasing damage multiplier
    • Objectives to eliminate a target and shut down after the mission
    • New Terminator species with distinct appearance and body composition
    • Exterminator ghost role for alternative spawning
    • Full English and Russian localization support

Review Change Stack

@coderabbitai

coderabbitai Bot commented May 15, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

This pull request introduces a complete Terminator antagonist archetype to the game, featuring: heat-cascade mechanics via HeatOverTimeComponent/System, trigger-reactive implant systems for popups and component injection, a playable Terminator species with body anatomy and damage tuning, two deadly implants (overheat self-destruct and micro-bomb), antagonist selection logic targeting humanoids with blacklist filtering, three mob variants (base, humanoid, endoskeleton), and full English/Russian localization.

Changes

Terminator Antagonist Role Implementation

Layer / File(s) Summary
Heat-over-time mechanics
Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs, Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs
HeatOverTimeComponent stores heat amount, fire stacks, and tick timing; HeatOverTimeSystem applies heat via TemperatureSystem, adjusts fire stacks, and escalates damage multiplier each tick interval.
Trigger-based component and popup systems
Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs, Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs, Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs, Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs
PopupOnTriggerComponent/System displays popup messages to implanted entities on trigger; AddComponentsOnTriggerComponent/System dynamically adds configured components to implanted entities, supporting both UI feedback and gameplay behavior injection.
Terminator species, body structure, and damage tuning
Resources/Prototypes/_Maid/Species/terminator.yml, Resources/Prototypes/_Maid/Body/Parts/terminator.yml, Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml, Resources/Prototypes/_Maid/Damage/modifier_sets.yml
Species defines Terminator anatomy with humanoid sprite variants (male/female head/chest/groin); body parts and prototypes wire slot hierarchy (flesh vs. endoskeleton); damage modifiers set high shock vulnerability (2.5) and reduced slashing/piercing on cybernetic parts.
Terminator implants and action prototypes
Resources/Prototypes/_Maid/Terminator/actions.yml, Resources/Prototypes/_Maid/Terminator/implants.yml
ActionActivateTerminatorOverheat triggers heat cascade; overheat implant applies HeatOverTime with popup; self-explode implant chains ExplodeOnTrigger with micro-bomb config and vacuum suppression.
Terminator role component and objective definitions
Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs, Resources/Prototypes/_Maid/Terminator/roles.yml, Resources/Prototypes/_Maid/Terminator/objectives.yml
TerminatorRoleComponent marks antag mind role; roles YAML establishes solo-exclusive antag status and ghost-role spawning; objectives YAML defines kill-target and self-shutdown end conditions.
Terminator antagonist selection and target assignment
Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs, Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs
TerminatorRuleComponent stores briefing sound and target blacklist; TerminatorRuleSystem selects alive humanoid targets via MindSystem, applies whitelist filtering, picks a random eligible target, assigns it via TargetOverrideComponent, and removes RespiratorComponent.
Terminator mob prototypes (base, humanoid, endoskeleton)
Resources/Prototypes/_Maid/Terminator/mobs.yml
MobTerminatorBase provides immunity grants; MobHumanTerminator configures humanoid combat with overheat implant auto-injection; MobTerminatorEndoskeleton sets up machine-form with repair behavior, micro-bomb self-destruct, and minibomb explosive on death.
Terminator game rule wiring and event integration
Resources/Prototypes/_Maid/GameRules/midround.yml, Resources/Prototypes/GameRules/events.yml
Midround game rule prototype configures Terminator spawn constraints, chaos scoring, antag selection, objectives, and briefing sound; event table registers TerminatorSpawn in BasicAntagEventsTable.
English and Russian localization strings
Resources/Locale/en-US/_Maid/mind/role-types.ftl, Resources/Locale/en-US/_Maid/Terminator/terminator.ftl, Resources/Locale/en-US/objectives/conditions/terminate.ftl, Resources/Locale/ru-RU/_Maid/mind/role-types.ftl, Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl, Resources/Locale/ru-RU/objectives/conditions/terminate.ftl, Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl, Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl
Role names, objective titles, greeting/briefing text, ghost-role descriptions, rules, popup messages, and body-part entity labels in English and Russian.

🎯 3 (Moderate) | ⏱️ ~25 minutes


Changes: Sprites


🐰 Behold the Terminator,
A mechanical creation so grand,
With heat and with fury,
It comes to this land. 🤖⚡
The hunt now begins!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'Новая антаг-роль: Терминатор' (New antag-role: Terminator) directly and accurately describes the main feature introduced: a new antagonist role called Terminator with multiple mechanics and forms.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@CREAsTIVE

Copy link
Copy Markdown
Contributor Author

Сложно немного по балансу. Он имеет некоторые очень сильные стороны, но как мне кажется они контрятся довольно не плохо.

Главным преимуществом человеческой формы является отсутствие нокаута. По сути у него суммарно в 2 раза больше ХП + нет необходимости дышать, но его легко обнаружить за счёт мед. сканера.

Во второй фазе он имеет очень мощный взрыв, но за счёт сообщения безопасности имеется минимальная задержка в пару секунд, что позволяет цели среагировать и отбежать, сам терминатор при этом движется чуть медленнее обычного человека.

Можно ещё сильне поднёрфить, потому что слабый антаг лучше сильного антага в большинстве случаев, но надо думать

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs (1)

1-10: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Normalize line endings to LF to unblock CI.

The current file encoding is failing CI (CRLF check). Please convert this file to LF line endings before merge.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs` around
lines 1 - 10, This file contains CRLF line endings causing CI failure; convert
the file to use LF line endings (e.g., change the TerminatorRoleComponent.cs
file's line endings to LF using your editor or run a git-normalize step) and
re-save/commit so the class/namespace declarations (TerminatorRoleComponent,
BaseMindRoleComponent, namespace Content.Server._Maid.Terminator.Roles) remain
unchanged but the file uses LF endings; ensure your commit does not include
other unrelated changes.
🧹 Nitpick comments (5)
Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs (1)

9-9: ⚡ Quick win

Prefer the built-in EntityManager property.

Line 9 injects IEntityManager as a dependency. Most entity systems in this codebase use the inherited EntityManager property from EntitySystem base class rather than injecting IEntityManager. While both work, using the inherited property is more idiomatic and consistent.

♻️ Proposed refactor
-    [Dependency] private IEntityManager _entityManager = default!;
     public override void Initialize()
     {
         base.Initialize();
 
         SubscribeLocalEvent<AddComponentsOnTriggerComponent, TriggerEvent>(OnAddComponentsTrigger);
     }
 
     private void OnAddComponentsTrigger(EntityUid uid, AddComponentsOnTriggerComponent component, ref TriggerEvent args)
     {
         if (!TryComp(uid, out SubdermalImplantComponent? implant) || implant.ImplantedEntity is null)
             return;
 
-        _entityManager.AddComponents(implant.ImplantedEntity.Value, component.Components, component.RemoveExisting);
+        EntityManager.AddComponents(implant.ImplantedEntity.Value, component.Components, component.RemoveExisting);
         args.Handled = true;
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs`
at line 9, The AddComponentsOnTriggerSystem currently injects a private field
_entityManager of type IEntityManager; remove the [Dependency] private
IEntityManager _entityManager = default! declaration and replace any usage of
_entityManager inside AddComponentsOnTriggerSystem with the inherited
EntityManager property from the EntitySystem base class (e.g., update methods
that call _entityManager.* to call EntityManager.*) so the system uses the
built-in EntityManager for idiomatic consistency.
Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs (1)

14-15: ⚡ Quick win

Remove redundant initialization of required field.

Line 15 initializes Components to new() even though line 14 marks it as required: true. The initialization is redundant and can mask configuration errors if the requirement fails to be enforced.

♻️ Proposed fix
     [DataField(serverOnly: true, readOnly: true, required: true)]
-    public ComponentRegistry Components = new();
+    public ComponentRegistry Components = default!;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs`
around lines 14 - 15, The Components field in AddComponentsOnTriggerComponent is
marked [DataField(..., required: true)] but is redundantly initialized to new(),
which can mask missing configuration; remove the default initialization so the
declaration is "public ComponentRegistry Components;" leaving the required
DataField attribute in place to ensure configuration must supply it, and keep
the field name Components and the AddComponentsOnTriggerComponent type as
references when locating the code to change.
Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs (1)

11-12: ⚡ Quick win

Remove redundant initialization of required field.

Line 12 marks Popup as required: true but also initializes it to string.Empty. The initialization is redundant because required: true enforces that the field must be provided during serialization. If the requirement fails to be enforced, the empty string masks configuration errors instead of failing clearly.

♻️ Proposed fix
     [DataField(required: true)]
-    public string Popup = string.Empty;
+    public string Popup = default!;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs` around
lines 11 - 12, The PopupOnTriggerComponent declares the field Popup with
[DataField(required: true)] but also initializes it to string.Empty; remove the
redundant initialization on the Popup field in the PopupOnTriggerComponent so
the required: true enforcement can surface missing configuration errors (i.e.,
change the declaration to a plain public string Popup; leaving the DataField
attribute intact).
Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs (1)

15-19: ⚡ Quick win

Use consistent property declarations.

Lines 16 and 19 declare Interval and NextTickTime as fields with direct initialization, while other data fields (lines 10, 13, 22, 25, 28, 31) use auto-properties with { get; set; }. This inconsistency can confuse maintainers and may lead to serialization surprises.

♻️ Proposed fix for consistency
-    [DataField(customTypeSerializer: typeof(TimespanSerializer))]
-    public TimeSpan Interval = TimeSpan.FromSeconds(1);
+    [DataField(customTypeSerializer: typeof(TimespanSerializer))]
+    public TimeSpan Interval { get; set; } = TimeSpan.FromSeconds(1);

     [DataField]
-    public TimeSpan NextTickTime = TimeSpan.Zero;
+    public TimeSpan NextTickTime { get; set; } = TimeSpan.Zero;
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs` around
lines 15 - 19, Change the two public fields Interval and NextTickTime to
auto-properties to match the other data fields: replace the field declarations
for Interval (currently annotated with [DataField(customTypeSerializer:
typeof(TimespanSerializer))]) and NextTickTime (annotated with [DataField]) with
public TimeSpan Interval { get; set; } = TimeSpan.FromSeconds(1); and public
TimeSpan NextTickTime { get; set; } = TimeSpan.Zero; so serialization and style
are consistent with the other properties in HeatOverTimeComponent.
Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs (1)

18-25: ⚡ Quick win

PopupOnTriggerComponent is implant-only but not documented.

The handler at line 20 silently returns if the entity lacks SubdermalImplantComponent or has no ImplantedEntity. The component's XML summary (line 6 in PopupOnTriggerComponent.cs) states it "displays a popup on a target entity when this entity is triggered," which does not mention the implant requirement. This can confuse developers who try to use this component on non-implant entities.

📝 Proposed documentation update

Update the summary in PopupOnTriggerComponent.cs:

 /// <summary>
-/// Displays a popup on a target entity when this entity is triggered.
+/// Displays a popup on the implanted entity when this subdermal implant is triggered.
 /// </summary>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs` around
lines 18 - 25, The PopupOnTriggerComponent is effectively implant-only because
OnPopupTrigger checks for SubdermalImplantComponent and a non-null
ImplantedEntity and returns silently otherwise; update the XML summary/comment
for PopupOnTriggerComponent to explicitly state it only works on implanted
entities (references: PopupOnTriggerComponent, OnPopupTrigger,
SubdermalImplantComponent, ImplantedEntity) so callers know the component
requires an implanted host and that the popup is displayed on the implanted
target.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs`:
- Around line 27-28: Multiplier is left at the default 0f which causes
component.Heat * component.Multiplier to always be zero; set a sensible non-zero
default (e.g., 1f or a documented game-appropriate value) by initializing the
Multiplier property in HeatOverTimeComponent (the Multiplier auto-property) so
that new instances have a usable multiplier; update the [DataField] public float
Multiplier { get; set; } declaration to provide the chosen default value.

In `@Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs`:
- Around line 38-52: The while loop in HeatOverTimeSystem that processes ticks
until component.NextTickTime is reached is unbounded and can spin many
iterations; add a safe iteration cap (e.g., MAX_TICKS_PER_UPDATE) and limit
processing to at most that many ticks per update, computing the number of ticks
to apply as the smaller of the elapsed intervals and the cap, then apply
heat/fire effects that many times (calling _temperature.ChangeHeat and
_flammable.AdjustFireStacks) and advance component.NextTickTime by Interval *
appliedTicks and increment component.Multiplier by MultiplierIncrease *
appliedTicks so state remains consistent even when we bail early.

In `@Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl`:
- Line 18: In the terminator.ftl localization string in
Resources/Locale/ru-RU/_Maid/Terminator, replace the incorrect two-word phrase
"так же" with the single-word "также" so the sentence reads "...Вам также
необходимо минимизировать изменения таймлайна..." to use the correct Russian
adverb form; update that specific line in terminator.ftl accordingly.
- Line 23: Replace the current string for terminator-overheat-popup which uses
"внутренности" and "нагреваться" with a robot-appropriate translation; update
the value of terminator-overheat-popup to use "внутренние системы" and the verb
"перегреваться" (e.g., "Ваши внутренние системы начинают перегреваться!") so the
phrasing matches the English "internal systems" and "overheat".
- Line 21: Add a comma before the participle phrase in the string
roles-antag-terminator-objective: change "Убейте цель минимизируя изменения в
таймлайне, от этого зависит будущее." to include a comma before "минимизируя" so
the sentence reads correctly with the participial clause separated.
- Line 7: In the translation string in
Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl that currently reads
"Устраните цель минимизируя изменения таймлайна.", insert a comma immediately
before the participle phrase starting with "минимизируя" so the sentence reads
correctly in Russian; locate the exact string and add the comma before
"минимизируя" within that entry.

In `@Resources/Prototypes/_Maid/Terminator/implants.yml`:
- Around line 24-26: The YAML for the PopupOnTrigger component includes an
unknown field "target" (target: ImplantedEntity) which is not defined on
PopupOnTriggerComponent (it only has Popup and PopupType); remove the target
line from the PopupOnTrigger entry (keeping popup: terminator-overheat-popup) so
the configuration matches the PopupOnTriggerComponent and relies on the existing
behavior in PopupOnTriggerSystem that targets the implanted entity.
- Around line 17-23: The HeatOverTime entry is missing the Multiplier field
(Multiplier in HeatOverTimeComponent.cs defaults to 0f), so add multiplier: 1 to
the HeatOverTime block in the YAML to ensure the first tick applies heat (see
HeatOverTimeComponent.cs and HeatOverTimeSystem.cs for how Multiplier is used).
- Around line 13-15: The YAML includes an unknown field "target" for the
AddComponentsOnTrigger component; either remove that key from the prototype (so
the fragment only uses the defined fields RemoveExisting and Components) or, if
you intended configurable targeting, add a corresponding property to
AddComponentsOnTriggerComponent and handle it in AddComponentsOnTriggerSystem.
Specifically, for the current behavior (system always targets the implanted
entity), delete the "target: ImplantedEntity" line from the
AddComponentsOnTrigger entry so deserialization/validation matches
AddComponentsOnTriggerComponent (which declares RemoveExisting and Components)
and the system code in AddComponentsOnTriggerSystem.

In `@Resources/Prototypes/_Maid/Terminator/mobs.yml`:
- Around line 24-38: The MobHumanTerminator currently lists "Stun" and
"KnockedDown" in its StatusEffects allowed list which contradicts the human-form
knockout immunity; update the MobHumanTerminator StatusEffects (the "allowed"
array) to remove "Stun" and "KnockedDown" so the human form cannot be stunned or
knocked down, or if the intent is different, add a clarifying comment in the
MobHumanTerminator definition explaining why those statuses remain and adjust
the implementation to match that intent.

---

Outside diff comments:
In `@Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs`:
- Around line 1-10: This file contains CRLF line endings causing CI failure;
convert the file to use LF line endings (e.g., change the
TerminatorRoleComponent.cs file's line endings to LF using your editor or run a
git-normalize step) and re-save/commit so the class/namespace declarations
(TerminatorRoleComponent, BaseMindRoleComponent, namespace
Content.Server._Maid.Terminator.Roles) remain unchanged but the file uses LF
endings; ensure your commit does not include other unrelated changes.

---

Nitpick comments:
In `@Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs`:
- Around line 15-19: Change the two public fields Interval and NextTickTime to
auto-properties to match the other data fields: replace the field declarations
for Interval (currently annotated with [DataField(customTypeSerializer:
typeof(TimespanSerializer))]) and NextTickTime (annotated with [DataField]) with
public TimeSpan Interval { get; set; } = TimeSpan.FromSeconds(1); and public
TimeSpan NextTickTime { get; set; } = TimeSpan.Zero; so serialization and style
are consistent with the other properties in HeatOverTimeComponent.

In `@Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs`:
- Around line 14-15: The Components field in AddComponentsOnTriggerComponent is
marked [DataField(..., required: true)] but is redundantly initialized to new(),
which can mask missing configuration; remove the default initialization so the
declaration is "public ComponentRegistry Components;" leaving the required
DataField attribute in place to ensure configuration must supply it, and keep
the field name Components and the AddComponentsOnTriggerComponent type as
references when locating the code to change.

In `@Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs`:
- Around line 11-12: The PopupOnTriggerComponent declares the field Popup with
[DataField(required: true)] but also initializes it to string.Empty; remove the
redundant initialization on the Popup field in the PopupOnTriggerComponent so
the required: true enforcement can surface missing configuration errors (i.e.,
change the declaration to a plain public string Popup; leaving the DataField
attribute intact).

In `@Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs`:
- Line 9: The AddComponentsOnTriggerSystem currently injects a private field
_entityManager of type IEntityManager; remove the [Dependency] private
IEntityManager _entityManager = default! declaration and replace any usage of
_entityManager inside AddComponentsOnTriggerSystem with the inherited
EntityManager property from the EntitySystem base class (e.g., update methods
that call _entityManager.* to call EntityManager.*) so the system uses the
built-in EntityManager for idiomatic consistency.

In `@Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs`:
- Around line 18-25: The PopupOnTriggerComponent is effectively implant-only
because OnPopupTrigger checks for SubdermalImplantComponent and a non-null
ImplantedEntity and returns silently otherwise; update the XML summary/comment
for PopupOnTriggerComponent to explicitly state it only works on implanted
entities (references: PopupOnTriggerComponent, OnPopupTrigger,
SubdermalImplantComponent, ImplantedEntity) so callers know the component
requires an implanted host and that the popup is displayed on the implanted
target.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 19aa7305-3e41-42cd-be2f-813ab334f11f

📥 Commits

Reviewing files that changed from the base of the PR and between c674a74 and c13c7ee.

📒 Files selected for processing (28)
  • Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs
  • Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs
  • Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleComponent.cs
  • Content.Server/_Maid/Terminator/GameTicking/Rules/TerminatorRuleSystem.cs
  • Content.Server/_Maid/Terminator/Roles/TerminatorRoleComponent.cs
  • Content.Server/_Maid/Triggers/Components/AddComponentsOnTriggerComponent.cs
  • Content.Server/_Maid/Triggers/Components/PopupOnTriggerComponent.cs
  • Content.Server/_Maid/Triggers/EntitySystems/AddComponentsOnTriggerSystem.cs
  • Content.Server/_Maid/Triggers/EntitySystems/PopupOnTriggerSystem.cs
  • Resources/Locale/en-US/_Maid/Terminator/terminator.ftl
  • Resources/Locale/en-US/_Maid/mind/role-types.ftl
  • Resources/Locale/en-US/objectives/conditions/terminate.ftl
  • Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl
  • Resources/Locale/ru-RU/_Maid/mind/role-types.ftl
  • Resources/Locale/ru-RU/_Maid/prototypes/entities/body/terminator.ftl
  • Resources/Locale/ru-RU/_Maid/prototypes/objectives/terminator.ftl
  • Resources/Locale/ru-RU/objectives/conditions/terminate.ftl
  • Resources/Prototypes/GameRules/events.yml
  • Resources/Prototypes/_Maid/Body/Parts/terminator.yml
  • Resources/Prototypes/_Maid/Body/Prototypes/terminator.yml
  • Resources/Prototypes/_Maid/Damage/modifier_sets.yml
  • Resources/Prototypes/_Maid/GameRules/midround.yml
  • Resources/Prototypes/_Maid/Species/terminator.yml
  • Resources/Prototypes/_Maid/Terminator/actions.yml
  • Resources/Prototypes/_Maid/Terminator/implants.yml
  • Resources/Prototypes/_Maid/Terminator/mobs.yml
  • Resources/Prototypes/_Maid/Terminator/objectives.yml
  • Resources/Prototypes/_Maid/Terminator/roles.yml

Comment thread Content.Server/_Maid/Terminator/Components/HeatOverTimeComponent.cs Outdated
Comment thread Content.Server/_Maid/Terminator/EntitySystems/HeatOverTimeSystem.cs Outdated
Comment thread Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl
Comment thread Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl Outdated
Comment thread Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl Outdated
Comment thread Resources/Locale/ru-RU/_Maid/Terminator/terminator.ftl
Comment thread Resources/Prototypes/_Maid/Terminator/implants.yml
Comment thread Resources/Prototypes/_Maid/Terminator/implants.yml
Comment thread Resources/Prototypes/_Maid/Terminator/implants.yml
Comment thread Resources/Prototypes/_Maid/Terminator/mobs.yml Outdated
@CREAsTIVE

Copy link
Copy Markdown
Contributor Author

Убрал AddComponentsOnTrigger, потому что его добавили в апстриме

@CREAsTIVE

Copy link
Copy Markdown
Contributor Author

В целом должно быть готово к мерджу

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant