Skip to content

Comments

Fixes#1412

Merged
KayzelW merged 6 commits intomasterfrom
fixes
Jan 6, 2026
Merged

Fixes#1412
KayzelW merged 6 commits intomasterfrom
fixes

Conversation

@KayzelW
Copy link
Collaborator

@KayzelW KayzelW commented Jan 6, 2026

Чек-лист после апстрима:

  • починить технологии
  • mindbreaker не оказывает эффекта(реворк entityeffect)
  • Берёшь фелинида, заходишь в игру, берёшь вещмешок, залезть в него, вылезть, место где ты был ничего нельзя положить, вроде там пусто но игре пофиг, из-за этой же фигни я не могу повторно в вещмешок залезть с которой выбрался
  • иконки в админ панели сломались
  • какая-то неведомая хуйня с протокинетиком. На него больше не вешается фонарик и нож.
  • игрок просил добавить СЛР из-за убогости дефиба
  • добавить новые исследования в ветки
  • UI треста слетел после апстрима
  • ксеноборги: языки у матери и локализация у радио-каналов ( /Resources/Prototypes/radio_channels.yml)
  • обращение у вампиров сломано(нет целевой крови)

опционально(но надо бы):

  • починить культ плоти

Summary by CodeRabbit

  • New Features

    • «Материнский корабль» теперь поддерживает дальний радиус действия.
  • Изменения

    • Изменены горячие клавиши радиоканалов (Xenoborg / Mothership).
    • Админ‑интерфейс теперь отображает начальную профессию иначе (изменено поведение локализации).
    • Обновлено поведение вампиризма: более точные проверки крови, уведомления при отсутствии крови и перерасчёт наград.
  • Изменения в реактивах

    • Mindbreaker-токсин теперь может удалять психические эффекты при заданных условиях.
  • Refactor

    • Массовый перенос строковых идентификаторов на типизированные prototype-id (без видимых изменений поведения).

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 6, 2026

Warning

Rate limit exceeded

@KayzelW has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 10 minutes and 51 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 863bef7 and 77ea447.

📒 Files selected for processing (1)
  • Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs

Walkthrough

Заменены строковые prototype ID на типизированные ProtoId/EntProtoId во множестве файлов; удалены подписки OnShutdown в ряде псонических систем; исправлена логика вампиризма (проверки крови, операции с растворами, расчёт валюты); убрана локализация StartingJob в админском оверлее; обновлены радиоканалы и токсин Metabolism.

Changes

Cohort / File(s) Описание изменений
Админский оверлей
Content.Client/Administration/AdminNameOverlay.cs
Убрана локализация StartingJob — теперь DrawString получает исходную строку вместо Loc.GetString(...); мелкое форматирование вызова.
Радиоканалы (ресурсы)
Resources/Prototypes/radio_channels.yml
Изменены keycode: Xenoborg 'x''ч', Mothership 'z''я'; у Mothership добавлен longRange: true.
Токсины / метаболизм
Resources/Prototypes/Reagents/toxins.yml
В MindbreakerToxin: ModifyStatusEffect тип изменён на Update и добавлен шаг ChemRemovePsionic при min: 20.
Вампиризм (сервер)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs
Существенные изменения: проверки крови используют BloodReferenceSolution и проверку прототипа Blood; параметр bloodstream переименован в victimBloodstream; все операции с растворами и объёмы ориентированы на жертву; обновлён вызов DoAfter (eventTarget/target/used); добавлена формула расчёта валюты при успешном succ.
Псонические системы — shutdown cleanup удалён
Content.Server/.../Abilities/Psionics/*PowerSystem.cs (несколько файлов)
Удалены подписки на ComponentShutdown и OnShutdown-хэндлеры; поля action/proto заменены с const string на EntProtoId/ProtoId<T>; инициализация действий остаётся, удаление при shutdown убрано.
Массовая замена prototype ID типов
множество файлов (см. raw summary)
e.g. Content.Server/..., Content.Client/..., Content.Shared/...
В большом количестве файлов private const string с [ValidatePrototypeId<...>] заменены на private readonly EntProtoId или ProtoId<T>; атрибуты валидации удалены; поведение вызовов сохранено, иногда добавлены обращения к .Id.
Клиентские UI / overlay / shader
Content.Client/... (несколько)
Поля prototype ID заменены на ProtoId<T>/EntProtoId (фракции, шейдеры, и т.п.); форматирование; логика UI не изменилась.
Прочие серверные изменения
примеры: Arrivals/*, Blob/*, Economy/*, OracleSystem.cs, Psionics/*, Shadowkin/*, GibOnCollideSystem.cs, и др.
Аналогичные рефакторы типов prototype ID (строка → ProtoId/EntProtoId), импорт Robust.Shared.Prototypes там, где нужно; в некоторых местах скорректированы сравнения (использование .Id).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant S as Bloodsucker (entity)
  participant V as Victim (entity)
  participant BS as VictimBloodSolution
  participant ST as SuckerStomach (solution)
  participant DA as DoAfterSystem
  participant M as Mind/VampireRoleSystem

  S->>V: TrySucc(victim)
  V->>BS: Resolve BloodReferenceSolution & check prototype "Blood" and volume
  alt no valid blood
    BS-->>S: Fail → popup "нет крови"
  else sufficient blood
    S->>DA: Start DoAfter (eventTarget: ent, target: args.Target, used: ent)
    DA-->>S: DoAfter completes
    S->>BS: Split/transfer amount from victimBloodSolution
    S->>ST: Transfer into sucker stomach (suckerStomachList.Owner)
    S->>M: Check VampireRoleComponent on mind
    alt Vampire role present
      M-->>S: Award currency (BasePoints * tier^exp * BloodPrice modifier)
    end
    S->>V: Optionally inject reagent into victimBloodSolution
    S-->>V: Show popups / finalize
  end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~30 minutes

Poem

🐰 Я норкой шуршу в патче ночном,
Заменил строки на ProtoId враз.
Кровь посчитал, DoAfter обновлён — скромно, но сочно,
Кнопки странные — и дальность у нас!
Морковкой топаю: код прыгнул в раз.

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.91% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive The title 'Fixes' is too vague and generic; it does not clearly convey what specific changes or issues are being addressed in this pull request. Provide a more descriptive title that clearly indicates the main focus or primary fix, such as 'Fix upstream prototype ID refactoring and vampiric targeting issues' or similar to summarize the key changes.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)

126-131: Используйте константу вместо строкового литерала

Строковый литерал "Blood" следует заменить на типобезопасную константу. В файле BloodSuckerSystem.cs (строка 291) определена константа private static readonly ProtoId<ReagentPrototype> Blood = "Blood";. Рекомендуется создать аналогичную константу или использовать общую константу из shared-модуля.

🔎 Предлагаемое исправление

Добавьте константу в начало класса:

+    private static readonly ProtoId<ReagentPrototype> Blood = "Blood";
+
     public override void Initialize()

Затем используйте её в проверке:

     var bloodReferenceSolution = bloodstream.BloodReferenceSolution;
-    if (bloodReferenceSolution == null || !bloodReferenceSolution.ContainsPrototype("Blood"))
+    if (bloodReferenceSolution == null || !bloodReferenceSolution.ContainsPrototype(Blood))
     {
🤖 Fix all issues with AI Agents
In @Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs:
- Line 1: Уберите неиспользуемый импорт: удалите строку "using System.Linq;" из
начала файла BkmVampireLevelingSystem.cs (в файле с классом
BkmVampireLevelingSystem) — никаких LINQ-методов в коде не используется; после
удаления пересоберите проект/запустите анализатор, чтобы убедиться, что никаких
лишних зависимостей не осталось.
🧹 Nitpick comments (1)
Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs (1)

419-419: Форматирование: отсутствует пробел после запятой

В строке Math.Min(victimBloodstreamVolume.Float(),bloodsuckerComp.UnitsToSucc) отсутствует пробел после запятой.

🔎 Предлагаемое исправление
-        var unitsToDrain = Math.Min(victimBloodstreamVolume.Float(),bloodsuckerComp.UnitsToSucc);
+        var unitsToDrain = Math.Min(victimBloodstreamVolume.Float(), bloodsuckerComp.UnitsToSucc);
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 9035969 and 8c925e7.

📒 Files selected for processing (2)
  • Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
  • Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs
🧰 Additional context used
🧬 Code graph analysis (1)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)
Content.Shared/Chemistry/Components/Solution.cs (1)
  • ContainsPrototype (228-237)
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (8)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)

148-149: Проверка корректности параметров DoAfter

Использование именованного параметра eventTarget: ent выглядит корректно, но убедитесь, что семантика соответствует ожидаемому поведению: eventTarget должен быть сущностью-инициатором события (вампир), а target — целью действия (жертва).

Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs (7)

388-388: Улучшена читаемость через переименование параметра

Переименование параметра bloodstream в victimBloodstream повышает ясность кода и соответствует victim-centric подходу к именованию в остальной части метода.


395-408: Улучшена валидация кровотока

Добавлены явные проверки на victimBloodSolution и bloodReferenceSolution с ранним выходом при нулевом объёме крови. Это улучшает обработку пограничных случаев и предоставляет пользователю понятную обратную связь.


411-430: Улучшена читаемость проверок желудка

Переименование переменных (suckerStomachList, suckerStomachSolution, suckerStomachAvailableVolume) делает код более понятным и явно разделяет сущности вампира и жертвы.


475-483: Корректное использование обновлённых ссылок на решения

Передача раствора из victimBloodSolution в suckerStomachList выполнена корректно с учётом переименованных переменных. Обработка случая переполнения через TrySpillAt с передачей ДНК также реализована правильно.


522-557: Проверьте корректность расчёта штрафов ДНК

Формула экспоненциального штрафа MathF.Pow(SuckDnaPenaltyFrom1, bloodDrained / 5f) реализует убывающую отдачу от выпитой крови одного и того же источника. При SuckDnaPenaltyFrom1 = 0.85:

  • 5 единиц крови: множитель 0.85 (−15%)
  • 10 единиц: множитель 0.72 (−28%)
  • 20 единиц: множитель 0.52 (−48%)

Формула выглядит корректной, но убедитесь, что:

  1. Значение bloodDrained / 5f правильно отражает игровую механику
  2. Минимальный порог SuckDnaMaxPenalty = 0.2f (20%) достаточен для предотвращения слишком сильного штрафа

501-501: Корректное добавление реагента в кровь жертвы

Использование victimBloodSolution вместо устаревшей ссылки bloodSolution корректно и соответствует общему рефакторингу victim-centric именования.


439-465: Формула содержит экспоненциальный рост, но его масштаб переоценен

Ваше замечание о экспоненциальном росте MathF.Pow(1.5f, vpm.Tier) обоснованно, однако пример неточен. Максимально достижимый тир вампира в текущей реализации — 3 (из store: Tier1Upgrade, Tier2Upgrade, Tier3Upgrade), что дает множитель 3.375x, а не 7.6x для тира 5.

При тире 3 с учётом модификаторов BloodPrice эффективный прирост валюты дополнительно снижается:

  • Штраф за питьё у других вампиров (-75%)
  • Штраф за отсутствие ДНК (-50%)
  • Экспоненциальный штраф за повторное питьё одной ДНК (0.85^(кровь/5))
  • Минимальный порог: 20% от базовой ценности

Рекомендация остаётся актуальной: убедитесь, что итоговый баланс экономики вампиров соответствует игровым целям, но текущие ограничения (максимум 3 тира) делают риск дисбаланса менее критичным, чем предполагалось в исходном замечании.

@github-actions github-actions bot added size/M and removed size/S labels Jan 6, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

⚠️ Outside diff range comments (2)
Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs (2)

64-68: Ошибка логики: устанавливается кулдаун для другой способности.

В обработчике события PyrokinesisPowerActionEvent устанавливается кулдаун для NoosphericZapPowerComponent вместо PyrokinesisPowerComponent. Это приводит к тому, что использование пирокинеза влияет на кулдаун ноосферического разряда, что является некорректным поведением.

🔎 Предлагаемое исправление
-        if (TryComp<NoosphericZapPowerComponent>(args.Performer, out var powerComponent))
-        {
-            var actionEnt = _actions.GetAction(powerComponent.NoosphericZapPowerAction);
-            _actions.SetCooldown(powerComponent.NoosphericZapPowerAction, actionEnt?.Comp.UseDelay ?? TimeSpan.FromMinutes(1));
-        }
+        var actionEnt = _actions.GetAction(ent.Comp.PyrokinesisPowerAction);
+        if (actionEnt?.Comp.UseDelay is {} delay)
+            _actions.SetCooldown(ent.Comp.PyrokinesisPowerAction, delay);

24-29: Исправьте несогласованность: добавьте очистку действия при удалении компонента.

PyrokinesisPowerSystem отличается от других систем псионических способностей (PsionicInvisibilityPowerSystem, MetapsionicPowerSystem) отсутствием обработчика ComponentShutdown. Действие удаляется только через метод RemovePsionics() в PsionicAbilitiesSystem, что является ручной очисткой, а не автоматической при удалении компонента.

Если PyrokinesisPowerComponent удалить без вызова RemovePsionics(), действие останется в системе (orphaned action). Это приводит к архитектурной несогласованности с другими системами и потенциальным утечкам памяти.

Добавьте подписку на ComponentShutdown и обработчик удаления действия аналогично другим псионическим системам:

SubscribeLocalEvent<PyrokinesisPowerComponent, ComponentShutdown>(OnShutdown);
🤖 Fix all issues with AI Agents
In @Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs:
- Around line 125-126: The literal "Blood" is passed to ContainsPrototype which
violates the [ForbidLiteral] rule; define a const string with the
prototype-validating attribute and use it instead. Add a field like
'[ValidatePrototypeId<ReagentPrototype>] private const string BloodReagentId =
"Blood";' to the BkmVampireLevelingSystem (or nearest relevant class) and
replace the literal in the call to ContainsPrototype("Blood") with
ContainsPrototype(BloodReagentId) so the prototype ID is validated at compile
time.

In @Resources/Prototypes/Reagents/toxins.yml:
- Line 356: YAML validation fails because the ModifyStatusEffect entry includes
an invalid field named `refresh`; locate the ModifyStatusEffect block in
Resources/Prototypes/Reagents/toxins.yml that contains the `refresh: false` line
and remove that `refresh` key (or replace it with a valid field defined by the
ModifyStatusEffect schema) so the mapping conforms to the expected type.
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 8c925e7 and b91f1d4.

📒 Files selected for processing (11)
  • Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs
  • Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
  • Resources/Prototypes/Reagents/toxins.yml
💤 Files with no reviewable changes (8)
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.cs
🧰 Additional context used
🧬 Code graph analysis (1)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)
Content.Shared/Chemistry/Components/Solution.cs (1)
  • ContainsPrototype (228-237)
🪛 GitHub Actions: YAML Linter
Resources/Prototypes/Reagents/toxins.yml

[error] 356-356: Field "refresh" not found in "Content.Shared.EntityEffects.Effects.StatusEffects.ModifyStatusEffect".

⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (3)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (2)

14-14: LGTM!

Импорт необходим для использования ContainsPrototype в новой логике валидации крови.


147-156: LGTM!

Использование именованного параметра eventTarget: соответствует обновлённому API DoAfterArgs и улучшает читаемость кода.

Resources/Prototypes/Reagents/toxins.yml (1)

358-363: Реализация ChemRemovePsionic подтверждена и работает корректно.

Эффект ChemRemovePsionic полностью интегрирован в систему (Content.Shared/Backmen/EntityEffects/Effects/ChemRemovePsionic.cs) и правильно удаляет способности пионов из сущностей.

Однако порог активации требует рассмотрения:

  • SoulbreakerToxin использует ChemRemovePsionic с min: 5
  • MindbreakerToxin использует min: 20 (в 4 раза выше)

Кроме того, в определении MindbreakerToxin указано # TODO: PROPER hallucinations, что свидетельствует о продолжающейся разработке. Убедитесь, что порог 20 соответствует игровому балансу и намерениям дизайна перед слиянием.

@github-actions github-actions bot added the Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design label Jan 6, 2026
@KayzelW KayzelW removed the Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design label Jan 6, 2026
@github-actions github-actions bot added the Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design label Jan 6, 2026
@KayzelW KayzelW removed the Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design label Jan 6, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

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

⚠️ Outside diff range comments (3)
Content.Server/Backmen/Fugitive/FugitiveSystem.cs (1)

261-292: Обнаружено дублирование добавления роли.

Метод дважды вызывает _roleSystem.MindAddRole(mindId, FugitiveMindRole, mind, true) на строках 271 и 282. Вторая попытка добавить ту же роль FugitiveMindRole после проверки существования прототипа FugitiveRole выглядит избыточной или ошибочной.

Возможные проблемы:

  • Дублирование роли может привести к неожиданному поведению системы ролей
  • Неясна логика повторного добавления той же роли

Возможно, на строке 282 планировалось добавить роль работы (JobRole), а не снова FugitiveMindRole.

🔎 Предлагаемое исправление

Если вторая роль не нужна, удалите дублирующий вызов:

 _roleSystem.MindAddRole(mindId, FugitiveMindRole, mind, true);

 _mindSystem.TryAddObjective(mindId, mind, EscapeObjective);

 if (_prototypeManager.TryIndex<JobPrototype>(FugitiveRole, out _))
 {
     if (_roleSystem.MindHasRole<JobRoleComponent>(mindId))
     {
         _roleSystem.MindRemoveRole<JobRoleComponent>(mindId);
     }
-
-    _roleSystem.MindAddRole(mindId, FugitiveMindRole, mind, true);
 }

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

Content.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.cs (1)

115-119: Несоответствие в использовании API после рефакторинга.

Строка 115 использует старый паттерн вызова TryIndex<WeightedRandomPrototype>(...) с явным указанием generic-параметра, в то время как строка 94 уже обновлена на новый паттерн TryIndex(RandomPsionicPowerPool, ...) без явного типа. Поскольку RandomPsionicPowerPool теперь типизирован как ProtoId<WeightedRandomPrototype>, явное указание типа избыточно и создаёт несоответствие в коде.

🔎 Предлагаемое исправление
-        if (!_prototypeManager.TryIndex<WeightedRandomPrototype>(RandomPsionicPowerPool, out var pool))
+        if (!_prototypeManager.TryIndex(RandomPsionicPowerPool, out var pool))
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)

125-130: Нарушение атрибута [ForbidLiteral] — используйте типизированную константу вместо строкового литерала.

Метод ContainsPrototype помечен атрибутом [ForbidLiteral] на параметре prototype (см. файл Content.Shared/Chemistry/Components/Solution.cs), что запрещает передачу строковых литералов напрямую. Текущий код на строке 126 передаёт литерал "Blood", нарушая это правило. Атрибут предназначен для предотвращения опечаток и обеспечения валидации прототипов на этапе компиляции.

🔎 Предлагаемое исправление

Добавьте типизированное поле в класс:

+    private readonly ProtoId<ReagentPrototype> BloodReagentId = "Blood";

Затем используйте его:

         var bloodReferenceSolution = bloodstream.BloodReferenceSolution;
-        if (bloodReferenceSolution == null || !bloodReferenceSolution.ContainsPrototype("Blood"))
+        if (bloodReferenceSolution == null || !bloodReferenceSolution.ContainsPrototype(BloodReagentId))
🤖 Fix all issues with AI Agents
In @Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs:
- Around line 57-58: In OnMobStateChanged, remove the lingering MindSwapReturn
action before removing the MindSwappedComponent to avoid action leaks: locate
the MindSwappedComponent check in OnMobStateChanged, call
_actions.RemoveAction(uid, mindSwappedComp.MindSwapReturn) (guarded by
TryComp<MindSwappedComponent>) and then call RemComp<MindSwappedComponent>(uid);
also add equivalent cleanup for MindSwapPowerComponent by removing any actions
it registers when that component is removed or when the entity dies.

In @Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs:
- Around line 59-61: The code passes a ProtoId<CurrencyPrototype> (BlobMoney)
into StoreSystem.TryAddCurrency which currently expects Dictionary<string,
FixedPoint2>, causing mismatch with store.CurrencyWhitelist
(HashSet<ProtoId<CurrencyPrototype>>); fix by changing TryAddCurrency to accept
Dictionary<ProtoId<CurrencyPrototype>, FixedPoint2> (update its signature and
internal logic to use ProtoId keys and call
store.CurrencyWhitelist.Contains(key) directly) and update all callers (the
places around the current uses of BlobMoney at the lines referenced) to pass the
existing BlobMoney ProtoId values instead of strings.

In @Content.Server/Backmen/Fugitive/FugitiveSystem.cs:
- Around line 61-63: OnMindAdded currently adds FugitiveMindRole twice: once
unconditionally and again inside the block that checks for the FugitiveRole
prototype; fix by ensuring FugitiveMindRole is added only once — either remove
the second Add call inside the if or move the initial unconditional addition
into the if that checks for ProtoId<JobPrototype> FugitiveRole (and the related
EscapeObjective handling) so the role is only added when the job prototype
exists; update the method to keep a single AddRole/FugitiveMindRole call and
preserve the existing EscapeObjective/job assignment logic.

In @Content.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.cs:
- Around line 343-345: The code assigns FleshChannel
(ProtoId<RadioChannelPrototype>) to PsionicComponent.Channel which is a string?;
fix by either converting the proto id to string when assigning (e.g. set
PsionicComponent.Channel = FleshChannel.ToString() or equivalent string
representation) or change the PsionicComponent.Channel type to
ProtoId<RadioChannelPrototype> and update any usages accordingly; locate the
assignment that sets PsionicComponent.Channel and update it or adjust the
PsionicComponent.Channel declaration to the ProtoId<RadioChannelPrototype> type
so types match.

In @Content.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.cs:
- Line 267: The field Electrocution was converted to
ProtoId<StatusEffectPrototype> but StatusEffectsComponent.AllowedEffects is
still List<string>, causing a type mismatch at the Contains(Electrocution) call;
update StatusEffectsComponent to use List<ProtoId<StatusEffectPrototype>> for
AllowedEffects (and any serialization/deserialization or initialization sites)
so Contains(Electrocution) compiles, and adjust any code that builds or compares
AllowedEffects to use ProtoId<StatusEffectPrototype> instead of string.
🧹 Nitpick comments (12)
Content.Server/Backmen/Shipwrecked/NPCZombieSystem.cs (1)

113-113: Отличное улучшение типобезопасности!

Замена строкового константы на типизированное поле EntProtoId повышает безопасность типов и согласуется с общей стратегией рефакторинга в PR. Изменение корректно и не вносит функциональных изменений.

💡 Опциональная оптимизация: сделать поле статическим

Поскольку это поле является константой времени компиляции и не зависит от состояния экземпляра, его можно сделать static readonly:

-    private readonly EntProtoId ZombieSurpriseDetector = "ZombieSurpriseDetector";
+    private static readonly EntProtoId ZombieSurpriseDetector = "ZombieSurpriseDetector";

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

Content.Server/Zombies/ZombieSystem.cs (1)

53-53: Изменение соответствует цели PR.

Удаление атрибута [ValidatePrototypeId<NpcFactionPrototype>] соответствует описанию PR о переносе функциональности валидации в тип ProtoId<T>. Значение поля и его использование не изменились.

Опционально: убедитесь, что валидация прототипа "Zombie" всё ещё выполняется через механизм ProtoId<NpcFactionPrototype> во время запуска или компиляции.

Скрипт для проверки существования прототипа Zombie
#!/bin/bash
# Поиск определения прототипа фракции "Zombie"
rg -nP --type=yaml -C3 'id:\s*Zombie' -g '**/Prototypes/**/*.yml'
Content.Server/Corvax/GuideGenerator/ReactionJsonGenerator.cs (1)

25-25: Можно упростить для согласованности с остальным кодом.

Явный параметр универсального типа <MixingCategoryPrototype> избыточен, поскольку ProtoId<T> уже содержит информацию о типе. Для согласованности со строкой 20, где используется prototype.Index(category) без явного указания типа, можно упростить вызов.

🔎 Предлагаемое упрощение
-                mixingCategories.Add(prototype.Index<MixingCategoryPrototype>(DefaultMixingCategory));
+                mixingCategories.Add(prototype.Index(DefaultMixingCategory));
Content.Server/Backmen/Xeno/XenoAgentSystem.cs (1)

20-20: Миграция на строго типизированный ProtoId улучшает безопасность типов.

Замена const string на readonly ProtoId<LanguagePrototype> обеспечивает валидацию идентификатора прототипа на этапе компиляции/загрузки вместо атрибута [ValidatePrototypeId]. Логика работы остаётся неизменной, неявное преобразование типов работает корректно на строках 24-25.

При желании можно дополнительно проверить наличие прототипа "Xeno" в кодовой базе с помощью следующего скрипта:

#!/bin/bash
# Описание: Проверка существования прототипа языка "Xeno"

# Поиск определения прототипа Xeno в YAML-файлах
rg -n --type=yaml -A 3 -B 1 'id:\s*Xeno' | rg -A 3 -B 1 'type:\s*language'
Content.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.cs (1)

45-46: Улучшение типобезопасности, но рекомендуется сделать поля статическими.

Замена строковых констант на типизированные ProtoId<NpcFactionPrototype> улучшает типобезопасность и обеспечивает валидацию прототипов на этапе компиляции. Однако, поскольку эти поля представляют константные идентификаторы прототипов, рекомендуется сделать их static readonly вместо просто readonly. Изначально они были const (неявно статическими), и создание копии этих полей для каждого экземпляра системы неэффективно.

🔎 Предлагаемое улучшение
-    private readonly ProtoId<NpcFactionPrototype> PsionicInterloper = "PsionicInterloper";
-    private readonly ProtoId<NpcFactionPrototype> GlimmerMonster = "GlimmerMonster";
+    private static readonly ProtoId<NpcFactionPrototype> PsionicInterloper = "PsionicInterloper";
+    private static readonly ProtoId<NpcFactionPrototype> GlimmerMonster = "GlimmerMonster";
Content.Shared/Backmen/Supermatter/SharedSupermatterSystem.cs (1)

70-70: EntProtoId обеспечивает встроенную валидацию прототипов.

Замена const string на readonly EntProtoId улучшает типобезопасность. Удаление атрибута [ValidatePrototypeId<EntityPrototype>] корректно, так как EntProtoId имеет встроенную валидацию при индексировании и использовании прототипов.

Рассмотрите применение static readonly для повышения эффективности памяти, так как значение одинаково для всех экземпляров класса:

-    protected readonly EntProtoId Ash = "Ash";
+    protected static readonly EntProtoId Ash = "Ash";
Content.Server/Backmen/Research/Oracle/OracleSystem.cs (1)

76-124: Рекомендуется использовать collection expression для единообразия.

Поля RewardReagents и DemandMessages были обновлены до collection expression синтаксиса [...], но BlacklistedProtos всё ещё использует new EntProtoId[]. Для единообразия стиля рекомендуется привести к общему виду.

🔎 Предлагаемое исправление
-    public readonly IReadOnlyList<EntProtoId> BlacklistedProtos = new EntProtoId[]
-    {
+    public readonly IReadOnlyList<EntProtoId> BlacklistedProtos =
+    [
         "MobTomatoKiller",
         "Drone",
         // ... остальные элементы ...
         "MechEquipmentGrabber",
-    };
+    ];
Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (1)

24-24: Несогласованность: OnShutdown сохранён в этом файле.

В отличие от PsychokinesisPowerSystem и PyrokinesisPowerSystem, где обработчики ComponentShutdown были удалены, в этом файле он сохранён (строки 24 и 48-51). Это создаёт несогласованность в обработке жизненного цикла действий между разными системами псионических способностей.

Рекомендуется унифицировать подход: либо удалить OnShutdown и здесь, если очистка действий теперь централизована, либо вернуть обработчики в другие системы.

Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs (1)

29-29: Используйте константу UniversalPrototype вместо жестко заданной строки.

На строке 29 используется жестко заданная строка "Universal", хотя теперь есть типизированная константа UniversalPrototype (строка 17). Это нарушает согласованность и снижает пользу от рефакторинга.

🔎 Предлагаемое исправление
-    Universal = _prototype.Index<LanguagePrototype>("Universal");
+    Universal = _prototype.Index(UniversalPrototype);
Content.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.cs (1)

154-163: Упростите логику возврата.

Метод корректно использует типизированный DefaultRuleset, но line 162 содержит избыточный оператор non-null assertion (!), так как guideEntryPrototype всегда инициализируется на line 158 перед возвратом на line 159.

🔎 Предлагаемое упрощение
 public GuideEntryPrototype GetCoreRuleEntry(string rule)
 {
     if (!_prototype.TryIndex<GuideEntryPrototype>(rule, out var guideEntryPrototype))
     {
-        guideEntryPrototype = _prototype.Index(DefaultRuleset);
-        return guideEntryPrototype;
+        return _prototype.Index(DefaultRuleset);
     }
 
-    return guideEntryPrototype!;
+    return guideEntryPrototype;
 }
Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs (1)

74-81: Рекомендуется сделать поля static readonly для оптимизации.

Поля реагентов не зависят от состояния экземпляра класса, поэтому их можно объявить как static readonly вместо просто readonly. Это уменьшит накладные расходы памяти, так как значения будут разделяться между всеми экземплярами BlobFactorySystem, а не дублироваться в каждом.

🔎 Предлагаемое исправление
-    private readonly ProtoId<ReagentPrototype> Phlogiston = "Phlogiston";
-    private readonly ProtoId<ReagentPrototype> TearGas = "TearGas";
-    private readonly ProtoId<ReagentPrototype> Lexorin = "Lexorin";
-    private readonly ProtoId<ReagentPrototype> Mold = "Mold";
-    private readonly ProtoId<ReagentPrototype> Bicaridine = "Bicaridine";
-    private readonly ProtoId<ReagentPrototype> Aluminium = "Aluminium";
-    private readonly ProtoId<ReagentPrototype> Iron = "Iron";
-    private readonly ProtoId<ReagentPrototype> Uranium = "Uranium";
+    private static readonly ProtoId<ReagentPrototype> Phlogiston = "Phlogiston";
+    private static readonly ProtoId<ReagentPrototype> TearGas = "TearGas";
+    private static readonly ProtoId<ReagentPrototype> Lexorin = "Lexorin";
+    private static readonly ProtoId<ReagentPrototype> Mold = "Mold";
+    private static readonly ProtoId<ReagentPrototype> Bicaridine = "Bicaridine";
+    private static readonly ProtoId<ReagentPrototype> Aluminium = "Aluminium";
+    private static readonly ProtoId<ReagentPrototype> Iron = "Iron";
+    private static readonly ProtoId<ReagentPrototype> Uranium = "Uranium";
Content.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.cs (1)

26-26: Рекомендуется привести имя поля к стандартному соглашению об именовании.

Приватное поле SwitchNightVisionAction использует PascalCase, тогда как другие приватные поля класса (строки 13-15) следуют convention _camelCase. Рекомендуется переименовать в _switchNightVisionAction для согласованности.

🔎 Предлагаемое исправление
-    private readonly EntProtoId SwitchNightVisionAction = "SwitchNightVision";
+    private readonly EntProtoId _switchNightVisionAction = "SwitchNightVision";

И соответственно обновить использование на строке 31:

-            _actionsSystem.AddAction(uid, ref component.ActionContainer, SwitchNightVisionAction);
+            _actionsSystem.AddAction(uid, ref component.ActionContainer, _switchNightVisionAction);
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between b91f1d4 and 2dc0d15.

📒 Files selected for processing (82)
  • Content.Client/Backmen/Blob/BlobChemSwapMenu.xaml.cs
  • Content.Client/Backmen/Blob/BlobCoreActionSystem.cs
  • Content.Client/Backmen/Blob/BlobObserverSystem.cs
  • Content.Client/Backmen/Flesh/FleshCultist.cs
  • Content.Client/Backmen/GhostTheme/GhostThemeSystem.cs
  • Content.Client/Backmen/Overlays/Shaders/EtherealOverlay.cs
  • Content.Client/Backmen/Overlays/Systems/NearsightedSystem.cs
  • Content.Client/Backmen/SponsorManager/UI/SponsorWindow.cs
  • Content.Client/Backmen/StationAI/AiEnemySystem.cs
  • Content.Client/Backmen/Teams/TdmTeamSystem.cs
  • Content.Client/Backmen/Vampiric/BloodSuckerSystem.cs
  • Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs
  • Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs
  • Content.Server/Backmen/Abilities/Felinid/FelinidSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.cs
  • Content.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.cs
  • Content.Server/Backmen/Antag/SuperPsi/AutoPsiSystem.cs
  • Content.Server/Backmen/Arachne/ArachneSystem.cs
  • Content.Server/Backmen/Arrivals/Centcomm/CentCommSpawnSystem.cs
  • Content.Server/Backmen/Arrivals/CentcommSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs
  • Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs
  • Content.Server/Backmen/Cloning/MetempsychoticMachineSystem.cs
  • Content.Server/Backmen/Disease/DiseaseDiagnosisSystem.cs
  • Content.Server/Backmen/Drone/BSSDroneSystem.cs
  • Content.Server/Backmen/Economy/ATM/ATMSystem.cs
  • Content.Server/Backmen/Economy/EconomySystem.cs
  • Content.Server/Backmen/EvilTwin/EvilTwinSystem.cs
  • Content.Server/Backmen/Flesh/FleshCultistSystem.cs
  • Content.Server/Backmen/FootPrint/PuddleFootPrintsSystem.cs
  • Content.Server/Backmen/Fugitive/FugitiveSystem.cs
  • Content.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.cs
  • Content.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.cs
  • Content.Server/Backmen/Item/Optic/OpticZoomEffectSystem.cs
  • Content.Server/Backmen/Mood/MoodSystem.cs
  • Content.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.cs
  • Content.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.cs
  • Content.Server/Backmen/Psionics/PsionicsSystem.cs
  • Content.Server/Backmen/Reinforcement/ReinforcementSystem.cs
  • Content.Server/Backmen/Research/Oracle/OracleSystem.cs
  • Content.Server/Backmen/RoleWhitelist/WhitelistSystem.cs
  • Content.Server/Backmen/ShipVsShip/ShipVsShipGame.cs
  • Content.Server/Backmen/Shipwrecked/NPCZombieSystem.cs
  • Content.Server/Backmen/Shipwrecked/ShipwreckedRuleSystem.cs
  • Content.Server/Backmen/Soul/GolemSystem.cs
  • Content.Server/Backmen/SpecForces/SpecForcesSystem.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs
  • Content.Server/Backmen/Spider/SpiderVampireSystem.cs
  • Content.Server/Backmen/StationAI/AICameraSystem.cs
  • Content.Server/Backmen/StationAI/AiEnemySystem.cs
  • Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs
  • Content.Server/Backmen/Surgery/Consciousness/Systems/ServerConsciousnessSystem.cs
  • Content.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.cs
  • Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
  • Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs
  • Content.Server/Backmen/Xeno/XenoAgentSystem.cs
  • Content.Server/Corvax/GuideGenerator/ReactionJsonGenerator.cs
  • Content.Server/Tools/Innate/InnateToolSystem.cs
  • Content.Server/Zombies/ZombieSystem.cs
  • Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs
  • Content.Shared/Backmen/Blob/SharedBlobMobSystem.cs
  • Content.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.cs
  • Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs
  • Content.Shared/Backmen/Psionics/SharedPsionicsSystem.cs
  • Content.Shared/Backmen/Supermatter/SharedSupermatterSystem.cs
  • Content.Shared/Backmen/Teams/SharedTdmTeamSystem.cs
  • Content.Shared/Fluids/SharedAbsorbentSystem.cs
💤 Files with no reviewable changes (2)
  • Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs
  • Content.Shared/Fluids/SharedAbsorbentSystem.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs
🧰 Additional context used
🧬 Code graph analysis (6)
Content.Server/Backmen/Fugitive/FugitiveSystem.cs (1)
Content.Client/Lobby/LobbyUIController.cs (1)
  • JobPrototype (351-356)
Content.Server/Backmen/Flesh/FleshCultistSystem.cs (1)
Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs (1)
  • LanguagePrototype (32-36)
Content.Server/Backmen/Xeno/XenoAgentSystem.cs (1)
Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs (1)
  • LanguagePrototype (32-36)
Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs (1)
Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs (1)
  • LanguagePrototype (32-36)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs (1)
Content.Shared/Chemistry/Components/Solution.cs (1)
  • ContainsPrototype (228-237)
Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs (1)
Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (1)
  • TryTransferSolution (567-585)
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)

Comment on lines +57 to +58
private readonly EntProtoId ActionMindSwap = "ActionMindSwapPsionic";
private readonly EntProtoId ActionMindSwapReturn = "ActionMindSwapReturn";
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for ActionMindSwap and related action usage
rg -n -C5 --type=cs 'ActionMindSwap|MindSwapPowerAction|MindSwapReturn'

Repository: Rxup/space-station-14

Length of output: 13117


🏁 Script executed:

#!/bin/bash
# First, let's examine the MindSwapPowerSystem.cs file structure
wc -l "Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs"

Repository: Rxup/space-station-14

Length of output: 143


🏁 Script executed:

#!/bin/bash
# Let's look at the full MindSwapPowerSystem.cs file to understand the current state
cat -n "Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs"

Repository: Rxup/space-station-14

Length of output: 13764


Потенциальная утечка действий в OnMobStateChanged требует исправления.

Удаление обработчика ComponentShutdown оставило критический пробел в управлении жизненным циклом действий. В методе OnMobStateChanged (строка 139) компонент MindSwappedComponent удаляется без предварительного удаления связанного действия MindSwapReturn. Это приводит к утечке действий, когда поменявшийся телом персонаж умирает.

Рекомендуется добавить удаление действия перед RemComp<MindSwappedComponent>(uid):

if (TryComp<MindSwappedComponent>(uid, out var mindSwappedComp))
    _actions.RemoveAction(uid, mindSwappedComp.MindSwapReturn);
RemComp<MindSwappedComponent>(uid);

Аналогично следует проверить MindSwapPowerComponent — для неё также отсутствует механизм очистки при удалении компонента.

🤖 Prompt for AI Agents
In @Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs
around lines 57 - 58, In OnMobStateChanged, remove the lingering MindSwapReturn
action before removing the MindSwappedComponent to avoid action leaks: locate
the MindSwappedComponent check in OnMobStateChanged, call
_actions.RemoveAction(uid, mindSwappedComp.MindSwapReturn) (guarded by
TryComp<MindSwappedComponent>) and then call RemComp<MindSwappedComponent>(uid);
also add equivalent cleanup for MindSwapPowerComponent by removing any actions
it registers when that component is removed or when the entity dies.

Comment on lines +61 to +63
private readonly EntProtoId FugitiveMindRole = "MindRoleFugitive";
private readonly EntProtoId EscapeObjective = "EscapeShuttleObjectiveFugitive";
private readonly ProtoId<JobPrototype> FugitiveRole = "Fugitive";
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Поиск YAML файлов с прототипами
find . -type f -name "*.yml" -o -name "*.yaml" | head -20

Repository: Rxup/space-station-14

Length of output: 811


🏁 Script executed:

# Поиск определений прототипов
rg -i "MindRoleFugitive|EscapeShuttleObjectiveFugitive" -A 2 -B 2

Repository: Rxup/space-station-14

Length of output: 2898


🏁 Script executed:

# Проверка файла FugitiveSystem.cs на предмет корректности типизации
head -100 Content.Server/Backmen/Fugitive/FugitiveSystem.cs

Repository: Rxup/space-station-14

Length of output: 4170


🏁 Script executed:

# Поиск использования этих полей в коде
rg "FugitiveMindRole|EscapeObjective|FugitiveRole" Content.Server/Backmen/Fugitive/

Repository: Rxup/space-station-14

Length of output: 1059


🏁 Script executed:

# Поиск прототипа работы Fugitive в YAML
rg -i "id:\s*Fugitive" -A 2 -B 2 Resources/Prototypes/

Repository: Rxup/space-station-14

Length of output: 1854


🏁 Script executed:

# Чтение кода вокруг строк 260-295 для анализа дублирования
sed -n '260,295p' Content.Server/Backmen/Fugitive/FugitiveSystem.cs

Repository: Rxup/space-station-14

Length of output: 1114


🏁 Script executed:

# Проверка наличия файлов с определением работ
find Resources/Prototypes -name "*job*" -type f | head -10

Repository: Rxup/space-station-14

Length of output: 634


Удалите дублирование добавления роли в методе OnMindAdded.

Рефакторинг на типизированные EntProtoId и ProtoId<JobPrototype> корректен — все три прототипа существуют в определениях (MindRoleFugitive, EscapeShuttleObjectiveFugitive, Fugitive). Однако в коде присутствует критическая ошибка:

FugitiveMindRole добавляется дважды:

  • Строка 271: безусловно добавляется роль
  • Строка 282: роль добавляется снова внутри блока if

Вторая попытка добавления (строка 282) избыточна. Проверьте логику: должна ли роль быть добавлена только при наличии прототипа работы, или первое добавление на строке 271 должно быть перемещено внутрь блока if?

🤖 Prompt for AI Agents
In @Content.Server/Backmen/Fugitive/FugitiveSystem.cs around lines 61 - 63,
OnMindAdded currently adds FugitiveMindRole twice: once unconditionally and
again inside the block that checks for the FugitiveRole prototype; fix by
ensuring FugitiveMindRole is added only once — either remove the second Add call
inside the if or move the initial unconditional addition into the if that checks
for ProtoId<JobPrototype> FugitiveRole (and the related EscapeObjective
handling) so the role is only added when the job prototype exists; update the
method to keep a single AddRole/FugitiveMindRole call and preserve the existing
EscapeObjective/job assignment logic.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (4)
Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs (1)

64-68: Критическая ошибка: проверяется и используется неправильный компонент и действие.

В методе OnPowerUsed для PyrokinesisPowerComponent код проверяет наличие NoosphericZapPowerComponent и устанавливает кулдаун на NoosphericZapPowerAction. Это явная ошибка копирования кода, которая полностью нарушает логику установки кулдауна для способности пирокинеза.

🔎 Предлагаемое исправление
-        if (TryComp<NoosphericZapPowerComponent>(args.Performer, out var powerComponent))
+        if (TryComp<PyrokinesisPowerComponent>(args.Performer, out var powerComponent))
         {
-            var actionEnt = _actions.GetAction(powerComponent.NoosphericZapPowerAction);
-            _actions.SetCooldown(powerComponent.NoosphericZapPowerAction, actionEnt?.Comp.UseDelay ?? TimeSpan.FromMinutes(1));
+            var actionEnt = _actions.GetAction(powerComponent.PyrokinesisPowerAction);
+            _actions.SetCooldown(powerComponent.PyrokinesisPowerAction, actionEnt?.Comp.UseDelay ?? TimeSpan.FromMinutes(1));
         }

Либо, если этот код вообще не нужен (т.к. кулдаун уже установлен в OnInit), его следует полностью удалить.

Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs (2)

60-64: Исправьте ошибку копирования: проверяется неправильный компонент.

Код проверяет PyrokinesisPowerComponent и PyrokinesisPowerAction вместо NoosphericZapPowerComponent и NoosphericZapPowerAction. Это ошибка копирования кода, из-за которой время восстановления (cooldown) никогда не устанавливается для способности Noospheric Zap.

🔎 Предлагаемое исправление
-        if (TryComp<PyrokinesisPowerComponent>(args.Performer, out var powerComponent)
-            && _actions.GetAction(powerComponent.PyrokinesisPowerAction) is {} action)
+        if (TryComp<NoosphericZapPowerComponent>(args.Performer, out var powerComponent)
+            && _actions.GetAction(powerComponent.NoosphericZapPowerAction) is {} action)
         {
-            _actions.SetCooldown(powerComponent.PyrokinesisPowerAction, action.Comp.UseDelay ?? TimeSpan.FromMinutes(1));
+            _actions.SetCooldown(powerComponent.NoosphericZapPowerAction, action.Comp.UseDelay ?? TimeSpan.FromMinutes(1));
         }

26-31: Добавьте обработчик ComponentShutdown для очистки действия.

Метод OnInit() добавляет действие NoosphericZapPowerAction через _actions.AddAction() (строка 37), но отсутствует соответствующий обработчик ComponentShutdown для его удаления. Это противоречит сложившемуся паттерну в других системах способностей псионики (например, PsionicInvisibilityPowerSystem, MetapsionicPowerSystem), где все добавленные действия удаляются при уничтожении компонента через _actions.RemoveAction().

Реализуйте подписку на ComponentShutdown с обработчиком, который вызывает RemoveAction() для очистки component.NoosphericZapPowerAction, чтобы избежать утечки памяти.

Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (1)

24-24: Удалите ненужную подписку на ComponentShutdown.

Проверка других систем псионических способностей показывает, что подписки OnShutdown отсутствуют в:

  • SharedDispelPowerSystem
  • SharedMindSwapPowerSystem
  • SharedNoosphericZapPowerSystem
  • SharedPsychokinesisPowerSystem
  • SharedPyrokinesisPowerSystem

В MassSleepPowerSystem подписка на ComponentShutdown (строка 24) и обработчик (строки 48-51) являются исключением и не соответствуют общему паттерну. Удалите эту подписку и метод OnShutdown для консистентности.

🤖 Fix all issues with AI Agents
In
@Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs:
- Line 33: The toggling logic incorrectly checks for PyrokinesisPowerComponent
and sets PyrokinesisPowerAction; update the check and assignment to use
NoosphericZap equivalents (check NoosphericZapPowerComponent and set
NoosphericZapPowerAction / use ActionNoosphericZap) or remove the entire
Pyrokinesis-based branch if toggling is not needed for NoosphericZap; ensure all
references to PyrokinesisPowerComponent and PyrokinesisPowerAction in the
NoosphericZapPowerSystem class are replaced with NoosphericZapPowerComponent and
NoosphericZapPowerAction (or removed) so the switch logic targets the correct
ability.
🧹 Nitpick comments (10)
Content.Server/Backmen/FootPrint/PuddleFootPrintsSystem.cs (1)

25-25: Рекомендуется сделать поле static readonly.

Поле WaterId не зависит от состояния экземпляра и имеет одинаковое значение для всех экземпляров класса. Использование static readonly вместо readonly немного оптимизирует память и делает намерение более явным.

🔎 Предлагаемое исправление
-    private readonly ProtoId<ReagentPrototype> WaterId = "Water";
+    private static readonly ProtoId<ReagentPrototype> WaterId = "Water";
Content.Server/Backmen/Antag/SuperPsi/AutoPsiSystem.cs (3)

70-70: Хорошее изменение — типизированный ProtoId.

Переход от строковых констант с атрибутом [ValidatePrototypeId] к типизированным ProtoId<JobPrototype> обеспечивает проверку типов на этапе компиляции.

Поле можно сделать static readonly, так как оно не зависит от состояния экземпляра:

-    private readonly ProtoId<JobPrototype> JobPrisoner = "Prisoner";
+    private static readonly ProtoId<JobPrototype> JobPrisoner = "Prisoner";

172-172: Корректное использование EntProtoId для сущности.

EntProtoId — правильный выбор для прототипа сущности, используемого в методе Spawn().

Аналогично предыдущему замечанию, поле можно сделать статическим:

-    private readonly EntProtoId JobPrisonerSuperPsi = "UristMcNars";
+    private static readonly EntProtoId JobPrisonerSuperPsi = "UristMcNars";

269-269: Корректное использование EntProtoId для игрового правила.

EntProtoId подходит для прототипа игрового правила (game rule entity).

Рекомендуется добавить static:

-    private readonly EntProtoId DefaultSuperPsiRule = "SuperPsiRule";
+    private static readonly EntProtoId DefaultSuperPsiRule = "SuperPsiRule";
Content.Client/Backmen/GhostTheme/GhostThemeSystem.cs (1)

31-31: Улучшение типобезопасности — отличное изменение.

Замена string на EntProtoId обеспечивает проверку типов на этапе компиляции и предотвращает случайное неправильное использование идентификаторов прототипов. Изменение хорошо согласуется с общей рефакторинговой стратегией в PR.

Опционально: имя приватного поля обычно следует конвенции _camelCase вместо PascalCase, но если это соответствует стилю кодовой базы, можно оставить как есть.

Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs (1)

125-125: Рекомендуется сделать поле статическим.

Поскольку значение ShadowkinDarkSwap является константой и одинаково для всех экземпляров системы, поле следует объявить как private static readonly EntProtoId. Текущая реализация создаёт копию поля в каждом экземпляре, что неэффективно и семантически некорректно для константных идентификаторов прототипов.

🔎 Предлагаемое исправление
-    private readonly EntProtoId ShadowkinDarkSwap = "ShadowkinDarkSwap";
+    private static readonly EntProtoId ShadowkinDarkSwap = "ShadowkinDarkSwap";
Content.Client/Backmen/Flesh/FleshCultist.cs (1)

21-21: Переход на типизированный ProtoId улучшает безопасность типов.

Замена строкового идентификатора на ProtoId<FactionIconPrototype> — это правильное решение. Однако стоит учесть два момента:

  1. Исходное поле было const (неявно статическое), а новое поле readonly является полем экземпляра. Рекомендуется добавить static, чтобы сохранить исходное поведение и избежать дублирования значения в каждом экземпляре системы.

  2. Для соответствия соглашениям об именовании (см. строку 13: _prototype) рассмотрите использование нижнего регистра с префиксом подчёркивания.

🔎 Предлагаемое улучшение
-    private readonly ProtoId<FactionIconPrototype> FleshcultistFaction = "FleshcultistFaction";
+    private static readonly ProtoId<FactionIconPrototype> _fleshcultistFaction = "FleshcultistFaction";

И обновить использование на строке 25:

-        args.StatusIcons.Add(_prototype.Index<FactionIconPrototype>(FleshcultistFaction));
+        args.StatusIcons.Add(_prototype.Index<FactionIconPrototype>(_fleshcultistFaction));
Content.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.cs (1)

31-31: Хороший рефакторинг: замена строки на типизированный ProtoId.

Изменение с const string на ProtoId<DamageContainerPrototype> улучшает типобезопасность и согласуется с общей стратегией рефакторинга в PR.

🔎 Опциональное улучшение: сделать поле static readonly

Поскольку значение константное и не зависит от экземпляра, можно оптимизировать:

-    private readonly ProtoId<DamageContainerPrototype> BiologicalDamageContainerPrototype = "Biological";
+    private static readonly ProtoId<DamageContainerPrototype> BiologicalDamageContainerPrototype = "Biological";
Content.Server/Tools/Innate/InnateToolSystem.cs (2)

107-125: Логика сброса рук выполняется избыточно.

В методе Cleanup код для сброса всех рук (строки 118-124) находится внутри цикла foreach, который итерирует по инструментам. Это приводит к тому, что все руки сбрасываются повторно для каждого инструмента, что неэффективно. Логику сброса рук следует вынести за пределы цикла по инструментам.

🔎 Предлагаемое исправление
 public void Cleanup(EntityUid uid, InnateToolComponent component)
 {
     foreach (var tool in component.ToolUids)
     {
         if (_tagSystem.HasTag(tool, InnateDontDeleteTag))
         {
             RemComp<UnremoveableComponent>(tool);
         }
         else
         {
             Del(tool);
         }
+    }
 
-        if (TryComp<HandsComponent>(uid, out var hands))
+    if (TryComp<HandsComponent>(uid, out var hands))
+    {
+        foreach (var hand in hands.Hands.Keys)
         {
-            foreach (var hand in hands.Hands.Keys)
-            {
-                _sharedHandsSystem.TryDrop((uid, hands), hand, checkActionBlocker: false);
-            }
+            _sharedHandsSystem.TryDrop((uid, hands), hand, checkActionBlocker: false);
         }
     }
 
     component.ToolUids.Clear();
 }

43-43: Удалите неиспользуемое поле DefaultHandPrototype.

Поле объявлено на строке 43, но не используется ни в одном методе этого класса. Похожее поле существует в AddHandCommand.cs, но это отдельное объявление в другом классе.

📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 2dc0d15 and 863bef7.

📒 Files selected for processing (83)
  • Content.Client/Backmen/Blob/BlobChemSwapMenu.xaml.cs
  • Content.Client/Backmen/Blob/BlobCoreActionSystem.cs
  • Content.Client/Backmen/Blob/BlobObserverSystem.cs
  • Content.Client/Backmen/Flesh/FleshCultist.cs
  • Content.Client/Backmen/GhostTheme/GhostThemeSystem.cs
  • Content.Client/Backmen/Overlays/Shaders/EtherealOverlay.cs
  • Content.Client/Backmen/Overlays/Systems/NearsightedSystem.cs
  • Content.Client/Backmen/SponsorManager/UI/SponsorWindow.cs
  • Content.Client/Backmen/StationAI/AiEnemySystem.cs
  • Content.Client/Backmen/Teams/TdmTeamSystem.cs
  • Content.Client/Backmen/Vampiric/BloodSuckerSystem.cs
  • Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs
  • Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs
  • Content.Server/Backmen/Abilities/Felinid/FelinidSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.cs
  • Content.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.cs
  • Content.Server/Backmen/Antag/SuperPsi/AutoPsiSystem.cs
  • Content.Server/Backmen/Arachne/ArachneSystem.cs
  • Content.Server/Backmen/Arrivals/Centcomm/CentCommSpawnSystem.cs
  • Content.Server/Backmen/Arrivals/CentcommSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs
  • Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs
  • Content.Server/Backmen/Cloning/MetempsychoticMachineSystem.cs
  • Content.Server/Backmen/Disease/DiseaseDiagnosisSystem.cs
  • Content.Server/Backmen/Drone/BSSDroneSystem.cs
  • Content.Server/Backmen/Economy/ATM/ATMSystem.cs
  • Content.Server/Backmen/Economy/EconomySystem.cs
  • Content.Server/Backmen/EvilTwin/EvilTwinSystem.cs
  • Content.Server/Backmen/Flesh/FleshCultistSystem.cs
  • Content.Server/Backmen/FootPrint/PuddleFootPrintsSystem.cs
  • Content.Server/Backmen/Fugitive/FugitiveSystem.cs
  • Content.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.cs
  • Content.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.cs
  • Content.Server/Backmen/Item/Optic/OpticZoomEffectSystem.cs
  • Content.Server/Backmen/Mood/MoodSystem.cs
  • Content.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.cs
  • Content.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.cs
  • Content.Server/Backmen/Psionics/PsionicsSystem.cs
  • Content.Server/Backmen/Reinforcement/ReinforcementSystem.cs
  • Content.Server/Backmen/Research/Oracle/OracleSystem.cs
  • Content.Server/Backmen/RoleWhitelist/WhitelistSystem.cs
  • Content.Server/Backmen/ShipVsShip/ShipVsShipGame.cs
  • Content.Server/Backmen/Shipwrecked/NPCZombieSystem.cs
  • Content.Server/Backmen/Shipwrecked/ShipwreckedRuleSystem.cs
  • Content.Server/Backmen/Soul/GolemSystem.cs
  • Content.Server/Backmen/SpecForces/SpecForcesSystem.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs
  • Content.Server/Backmen/Spider/SpiderVampireSystem.cs
  • Content.Server/Backmen/StationAI/AICameraSystem.cs
  • Content.Server/Backmen/StationAI/AiEnemySystem.cs
  • Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs
  • Content.Server/Backmen/Surgery/Consciousness/Systems/ServerConsciousnessSystem.cs
  • Content.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.cs
  • Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
  • Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs
  • Content.Server/Backmen/Xeno/XenoAgentSystem.cs
  • Content.Server/Corvax/GuideGenerator/ReactionJsonGenerator.cs
  • Content.Server/Tools/Innate/InnateToolSystem.cs
  • Content.Server/Zombies/ZombieSystem.cs
  • Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs
  • Content.Shared/Backmen/Blob/SharedBlobMobSystem.cs
  • Content.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.cs
  • Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs
  • Content.Shared/Backmen/Psionics/SharedPsionicsSystem.cs
  • Content.Shared/Backmen/Supermatter/SharedSupermatterSystem.cs
  • Content.Shared/Backmen/Teams/SharedTdmTeamSystem.cs
  • Content.Shared/Fluids/SharedAbsorbentSystem.cs
  • Resources/Prototypes/Reagents/toxins.yml
💤 Files with no reviewable changes (2)
  • Content.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.cs
  • Content.Shared/Fluids/SharedAbsorbentSystem.cs
🚧 Files skipped from review as they are similar to previous changes (35)
  • Content.Shared/Backmen/Psionics/SharedPsionicsSystem.cs
  • Content.Shared/Backmen/Teams/SharedTdmTeamSystem.cs
  • Content.Shared/Backmen/Blob/SharedBlobMobSystem.cs
  • Content.Server/Backmen/Shipwrecked/NPCZombieSystem.cs
  • Content.Server/Backmen/Arachne/ArachneSystem.cs
  • Content.Server/Backmen/Shipwrecked/ShipwreckedRuleSystem.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.cs
  • Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.cs
  • Content.Server/Backmen/Surgery/Consciousness/Systems/ServerConsciousnessSystem.cs
  • Content.Server/Backmen/Arrivals/Centcomm/CentCommSpawnSystem.cs
  • Content.Server/Backmen/Drone/BSSDroneSystem.cs
  • Content.Client/Backmen/Blob/BlobChemSwapMenu.xaml.cs
  • Content.Server/Backmen/Chapel/SacrificialAltarSystem.cs
  • Content.Server/Backmen/Flesh/FleshCultistSystem.cs
  • Content.Shared/Backmen/Supermatter/SharedSupermatterSystem.cs
  • Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs
  • Content.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.cs
  • Content.Server/Backmen/Spider/SpiderVampireSystem.cs
  • Content.Client/Backmen/Overlays/Shaders/EtherealOverlay.cs
  • Content.Server/Backmen/Blob/Systems/BlobTileSystem.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.cs
  • Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.cs
  • Content.Server/Backmen/ShipVsShip/ShipVsShipGame.cs
  • Content.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobFactorySystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobObserverSystem.cs
  • Content.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.cs
  • Content.Client/Backmen/SponsorManager/UI/SponsorWindow.cs
  • Content.Server/Backmen/Research/Oracle/OracleSystem.cs
  • Content.Server/Backmen/RoleWhitelist/WhitelistSystem.cs
  • Content.Server/Backmen/Item/Optic/OpticZoomEffectSystem.cs
  • Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
  • Content.Server/Backmen/Blob/Systems/BlobCarrierSystem.cs
  • Content.Server/Backmen/Economy/EconomySystem.cs
🧰 Additional context used
🧬 Code graph analysis (2)
Content.Server/Backmen/Xeno/XenoAgentSystem.cs (1)
Content.Shared/Backmen/Language/Systems/SharedLanguageSystem.cs (1)
  • LanguagePrototype (32-36)
Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs (1)
Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (1)
  • TryTransferSolution (567-585)
⏰ Context from checks skipped due to timeout of 300000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (56)
Content.Server/Backmen/FootPrint/PuddleFootPrintsSystem.cs (2)

11-11: LGTM!

Добавление using Robust.Shared.Prototypes; необходимо для использования ProtoId<T>.


60-60: Корректное использование типизированного ProtoId.

Сравнение sol.Reagent.Prototype == WaterId работает корректно благодаря операторам равенства в ProtoId<T>. Логика фильтрации сохранена.

Content.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.cs (1)

25-25: Отличное улучшение типобезопасности!

Замена строкового типа на EntProtoId обеспечивает проверку прототипов на этапе компиляции и устраняет необходимость в атрибуте [ValidatePrototypeId]. Это хорошая практика для предотвращения ошибок с несуществующими прототипами.

Content.Server/Backmen/Reinforcement/ReinforcementSystem.cs (1)

251-251: Улучшение типобезопасности одобрено.

Замена const string на EntProtoId обеспечивает строгую типизацию для идентификатора прототипа и соответствует общей схеме рефакторинга в PR.

Content.Client/Backmen/StationAI/AiEnemySystem.cs (1)

25-25: LGTM! Правильная миграция на типизированные prototype ID.

Замена строкового константного поля на ProtoId<SecurityIconPrototype> улучшает типобезопасность во время компиляции и устраняет необходимость в атрибуте валидации во время выполнения. Использование на строке 32 остаётся совместимым.

Content.Server/Backmen/StationAI/AICameraSystem.cs (1)

128-128: LGTM! Корректная миграция на типизированные entity prototype ID.

Замена строкового константного поля на EntProtoId улучшает типобезопасность во время компиляции и устраняет необходимость в атрибуте валидации. Использование в Spawn() на строке 164 остаётся совместимым.

Content.Server/Backmen/EvilTwin/EvilTwinSystem.cs (1)

672-675: Улучшение типобезопасности выглядит хорошо!

Замена строковых идентификаторов прототипов на типизированные EntProtoId улучшает проверку типов на этапе компиляции и снижает вероятность ошибок при использовании невалидных идентификаторов.

Content.Client/Backmen/Vampiric/BloodSuckerSystem.cs (1)

24-24: Отличное улучшение типобезопасности!

Замена const string с атрибутом валидации на типизированный ProtoId<FactionIconPrototype> улучшает безопасность типов на этапе компиляции и упрощает рефакторинг. Использование на строке 20 остаётся корректным.

Content.Server/Backmen/Xeno/XenoAgentSystem.cs (2)

5-5: LGTM!

Добавление using-директивы необходимо для поддержки типа ProtoId<T>, который используется далее в файле.


20-20: Отличное улучшение типобезопасности!

Замена строкового константного идентификатора на строго типизированный ProtoId<LanguagePrototype> улучшает типобезопасность кода. Валидация прототипа теперь встроена в сам тип вместо использования атрибута [ValidatePrototypeId]. Изменение согласуется с общим паттерном рефакторинга в PR.

Content.Server/Backmen/Mood/MoodSystem.cs (1)

44-44: Отличное улучшение типобезопасности!

Переход от строковой константы к типизированному ProtoId<AlertCategoryPrototype> обеспечивает проверку типов на этапе компиляции вместо runtime-валидации. Это согласуется с общим паттерном миграции в PR и устраняет необходимость в атрибуте [ValidatePrototypeId].

Content.Server/Backmen/Fugitive/FugitiveSystem.cs (1)

441-442: Типизация прототипов спавна корректна.

Миграция SpawnPointPrototype и SpawnMobPrototype на EntProtoId соответствует паттерну, применённому для остальных прототипов в файле. Использование на строке 177 работает корректно благодаря неявному преобразованию.

Content.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.cs (2)

14-14: Правильное добавление импорта для поддержки ProtoId.

Импорт необходим для использования типизированного ProtoId<DamageContainerPrototype> на строке 31.


48-48: Корректное обновление логики сравнения для ProtoId.

Использование ?.Id правильно обрабатывает случай, когда DamageContainerID равен null (в этом случае проверка вернёт true и сущность не будет расчленена). Сравнение через .Id корректно сопоставляет строковые идентификаторы прототипов.

Content.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.cs (1)

31-31: Отличное улучшение типобезопасности!

Замена строкового идентификатора на типизированный EntProtoId добавляет проверки на этапе компиляции вместо валидации во время выполнения. Прототип сущности "Blunt" существует и правильно определён в Resources/Prototypes/_Backmen/Entities/Surgery/wounds.yml. Это соответствует общему паттерну рефакторинга в PR.

Content.Server/Corvax/GuideGenerator/ReactionJsonGenerator.cs (1)

8-8: Отличное улучшение типобезопасности.

Миграция от строкового константы с атрибутом валидации к строго типизированному ProtoId<MixingCategoryPrototype> улучшает типобезопасность и согласуется с общим паттерном рефакторинга в PR. Использование ProtoId обеспечивает проверку типов на этапе компиляции вместо runtime-валидации.

Content.Server/Backmen/Cloning/MetempsychoticMachineSystem.cs (1)

36-37: Тип безопасности улучшен переходом на ProtoId<WeightedRandomPrototype>.

Переход от const string к ProtoId<WeightedRandomPrototype> на строках 36-37 правильный. Оба идентификатора прототипов соответствуют фактическим определениям в Resources/Prototypes/_Backmen/:

  • Строка 36: "MetempsychoticHumanoidPool"
  • Строка 37: "MetempsychoticNonhumanoidPool" ✓ (с строчной 'h' в соответствии с прототипом)

Никаких исправлений не требуется.

Likely an incorrect or invalid review comment.

Resources/Prototypes/Reagents/toxins.yml (2)

352-355: LGTM!

Изменение типа с Add на Update для StatusEffectSeeingRainbow корректно — эффект теперь будет обновлять/продлевать длительность существующего статуса вместо добавления новых стеков, что соответствует ожидаемому поведению токсина.


356-362: Добавление ChemRemovePsionic подтверждено как корректное.

Класс ChemRemovePsionic существует в кодовой базе (Content.Shared/Backmen/EntityEffects/Effects/ChemRemovePsionic.cs) и правильно интегрирован. YAML-синтаксис верен, условие с порогом в 20 единиц обеспечивает удаление псионических эффектов только при значительной дозе токсина. Проблема с невалидным полем refresh из предыдущего ревью устранена.

Content.Server/Zombies/ZombieSystem.cs (1)

53-53: Изменение типа с string на ProtoId<NpcFactionPrototype> корректно.

Поле Faction теперь использует типизированный ProtoId<NpcFactionPrototype> вместо строки. Проверка совместимости подтверждает, что ProtoId<T> имеет неявное преобразование в string, что обеспечивает полную совместимость с методом AddFaction(), принимающим string параметр. Этот паттерн последовательно применяется по всему кодовому базису (DragonComponent, RevolutionaryRuleSystem и др.), подтверждая, что это стандартный подход для типизирования прототипов.

Content.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.cs (1)

26-26: Изменение типа на readonly EntProtoId корректно.

Переход от const string к readonly EntProtoId улучшает типобезопасность. Прототип SwitchNightVision существует в Resources/Prototypes/_Backmen/Entities/Clothing/Eyes/PNV.yml, а метод AddAction на строке 31 корректно принимает тип EntProtoId.

Content.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.cs (1)

31-31: Корректное изменение типа идентификатора действия.

Переход от const string к EntProtoId обеспечивает типобезопасность и соответствует общему паттерну рефакторинга в PR.

Content.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.cs (1)

32-32: Корректное изменение типа идентификатора действия.

Переход от строкового константного идентификатора к EntProtoId улучшает типобезопасность и соответствует общему паттерну рефакторинга.

Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs (1)

57-58: Корректное изменение типов идентификаторов действий.

Переход от строковых констант к EntProtoId полям улучшает типобезопасность и соответствует общему паттерну рефакторинга в PR.

Content.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.cs (1)

45-45: Корректное изменение типа идентификатора действия.

Переход от строкового константного идентификатора к EntProtoId улучшает типобезопасность и соответствует общему паттерну рефакторинга. Удаление обработчика ComponentShutdown означает, что очистка действий теперь должна управляться явно в местах удаления компонента.

Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.cs (2)

47-47: Корректное изменение типа идентификатора действия.

Переход от строкового константного идентификатора к EntProtoId обеспечивает типобезопасность и соответствует общему паттерну рефакторинга.


76-76: Корректное изменение типа идентификатора прототипа.

Переход от строкового константного идентификатора к EntProtoId для прототипа пепла улучшает типобезопасность.

Content.Server/Backmen/StationAI/AiEnemySystem.cs (2)

6-6: Корректное добавление using-директивы.

Добавление using Robust.Shared.Prototypes; необходимо для поддержки типизированных ProtoId<T>, используемых в строке 36.


36-36: Отличная типизация ID прототипа.

Замена строкового ID на типизированный ProtoId<NpcFactionPrototype> повышает типобезопасность и согласуется с общей целью рефакторинга. Прототип "AiEnemy" существует в кодовой базе (Resources/Prototypes/_Backmen/ai_factions.yml, строка 112) и корректно определён как npcFaction. Использование readonly модификатора уместно.

Content.Server/Backmen/SpecForces/SpecForcesSystem.cs (1)

92-92: Одобрено: улучшение типобезопасности.

Замена строкового константа на типизированный ProtoId<SpecForceTeamPrototype> — правильная практика, переносящая валидацию прототипа с runtime на compile-time. Тип свойства StationBlobConfigComponent.SpecForceTeam уже совместим: он также использует ProtoId<SpecForceTeamPrototype>, поэтому присваивание на строке 100 (var specForceTeam = blobConfig?.SpecForceTeam ?? Rxbzz;) работает корректно. Все типы согласованы.

Content.Client/Backmen/Overlays/Systems/NearsightedSystem.cs (2)

6-6: Отличное улучшение типобезопасности!

Замена строкового идентификатора прототипа на типизированный ProtoId<TagPrototype> — правильный подход. Это обеспечивает проверку на этапе компиляции и снижает риск опечаток.

Also applies to: 23-23


38-47: Логика корректна.

Оверлей всегда добавляется, но это правильно. В методе Draw класса NearsightedOverlay (строки 39–48) происходит проверка свойства component.Glasses: если оно true (очки надеты), используются значения gRadius и gAlpha (пониженная интенсивность), если false — используются обычные Radius и Alpha. Таким образом, эффект условно применяется через параметры, а не через условное добавление самого оверлея.

Likely an incorrect or invalid review comment.

Content.Server/Backmen/Arrivals/CentcommSystem.cs (4)

203-203: Отличное улучшение типобезопасности!

Замена строкового константного идентификатора на типизированный EntProtoId улучшает проверку типов на этапе компиляции и соответствует общему паттерну рефакторинга в этом PR.


207-207: Корректное использование типизированного ProtoId.

Обращение к .Id для получения строкового идентификатора из EntProtoId выполнено правильно.


251-252: Отличная типизация идентификаторов прототипов.

Переход на ProtoId<WeightedRandomPrototype> и ProtoId<GameMapPrototype> усиливает безопасность типов и соответствует архитектуре рефакторинга.


84-84: Использование ProtoId в коде совместимо с API.

Проверка кода показала, что все использованные операции с типизированными полями ProtoId<T> работают корректно:

  • Строка 84: Index<WeightedRandomPrototype>(ProtoId<WeightedRandomPrototype>)
  • Строки 268–272: переменная mapPickId успешно работает со строками (из Pick()) и ProtoId<GameMapPrototype> благодаря поддержке неявных преобразований ✓
  • Строка 272: Index<GameMapPrototype>(ProtoId<GameMapPrototype>)
  • Строка 370: сравнение с использованием оператора != работает корректно ✓

Тип ProtoId<T> имеет встроенную поддержку неявного преобразования из строк и совместим с методами Index<T>() и TryIndex<T>(). Код успешно компилируется и работает в текущей версии репозитория.

Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs (2)

53-53: Рефакторинг на ProtoId<DamageContainerPrototype> типизирует Biological корректно.

Сравнение на строке 68 совместимо: свойство DamageContainerID в DamageableComponent имеет тип ProtoId<DamageContainerPrototype>?, что позволяет безопасно сравниваться с ProtoId<DamageContainerPrototype> через оператор !=.


30-30: Рефакторинг на типизированные ProtoId одобрен.

Замена const string на readonly EntProtoId (строка 30) и readonly ProtoId<DamageContainerPrototype> (строка 53) улучшает типобезопасность и соответствует современным практикам кодовой базы. Метод _actions.AddAction корректно принимает EntProtoId благодаря неявному преобразованию в строку, что подтверждается использованием этого паттерна во всей кодовой базе. Все типы совместимы с их использованием.

Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs (1)

11-11: Отличное улучшение типобезопасности!

Переход от строкового идентификатора прототипа к строго типизированному EntProtoId улучшает безопасность типов и соответствует общему паттерну рефакторинга в данном PR.

Also applies to: 19-19

Content.Server/Backmen/Psionics/PsionicsSystem.cs (1)

13-13: LGTM! Правильное использование типизированных идентификаторов фракций.

Конвертация строковых констант фракций в ProtoId<NpcFactionPrototype> повышает безопасность типов. Использование в методах _npcFactonSystem корректно совместимо с новыми типами.

Also applies to: 121-122

Content.Server/Backmen/Disease/DiseaseDiagnosisSystem.cs (1)

349-349: Корректный переход на типизированный идентификатор прототипа.

Изменение поля ResearchDisk5000 на EntProtoId соответствует общему паттерну рефакторинга для повышения типобезопасности.

Content.Server/Backmen/Economy/ATM/ATMSystem.cs (1)

73-74: Отличная миграция на типизированные идентификаторы валют.

Переход от строковых идентификаторов к ProtoId<MaterialPrototype> и ProtoId<CurrencyPrototype> повышает безопасность типов при работе с валютами и материалами. Сохранение устаревшего метода GetCurrencyValueOld обеспечивает обратную совместимость.

Also applies to: 81-87

Content.Server/Backmen/Soul/GolemSystem.cs (2)

118-119: Правильная конвертация с корректным использованием .Id.

Переход на типизированные идентификаторы прототипов выполнен корректно. Особенно важно отметить правильное использование .Id в строке 131 для сравнения EntProtoId с результатом Prototype(args.User)?.ID.

Also applies to: 131-131


181-181: LGTM! Добавлен типизированный идентификатор для пепла.

Новое поле Ash следует тому же паттерну типобезопасности, что и остальные изменения в файле.

Content.Client/Backmen/Teams/TdmTeamSystem.cs (1)

25-27: LGTM!

Миграция на типизированные ProtoId<FactionIconPrototype> корректна. Использование с _prototype.Index<T>() работает благодаря неявному преобразованию ProtoId в строку.

Content.Client/Backmen/Blob/BlobObserverSystem.cs (1)

35-39: LGTM!

Корректная миграция на ProtoId<FactionIconPrototype>. Использование с _prototype.Index<T>() соответствует ожидаемому паттерну.

Content.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.cs (2)

45-46: LGTM!

Миграция на ProtoId<NpcFactionPrototype> корректна. Использование с NpcFactionSystem.IsMember, RemoveFaction и AddFaction должно работать, так как система фракций обычно поддерживает типизированные ProtoId.


56-70: Проверьте тип коллекции SuppressedFactions.

В строках 61 и 67 код добавляет значения PsionicInterloper и GlimmerMonster в component.SuppressedFactions. Убедитесь, что тип свойства SuppressedFactions в PsionicInsulationComponent соответствует типам добавляемых значений (должен быть List<ProtoId<NpcFactionPrototype>> или аналогичный тип).

Content.Server/Backmen/Vampiric/BloodSuckerSystem.cs (3)

87-87: LGTM!

Миграция на EntProtoId для идентификаторов прототипов корректна и соответствует общему паттерну рефакторинга в PR.

Also applies to: 126-127


385-421: Улучшена читаемость кода.

Переименование переменных (victimBloodstream, victimBloodSolution, suckerStomachList, suckerStomachSolution) улучшает понимание потока данных между жертвой и вампиром.


472-480: Параметры передаются корректно.

Метод TryTransferSolution в StomachSystem имеет сигнатуру TryTransferSolution(EntityUid uid, Solution solution, StomachComponent? stomach = null, ...). Вызов на строке 474 передаёт корректные параметры: EntityUid (Owner), Solution (temp) и Entity<StomachComponent> (Value). Сигнатура соответствует ожидаемой.

Content.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.cs (2)

236-236: LGTM!

Миграция на EntProtoId для MaterialBluespace, SuperchargedLightning, HyperchargedLightning и ChargedLightning корректна. Методы Spawn() и ShootLightning() принимают EntProtoId.

Also applies to: 302-304


267-267: Несовместимость типов ProtoId с AllowedEffects.

Эта проблема уже была отмечена в предыдущем ревью. Поле Electrocution теперь имеет тип ProtoId<StatusEffectPrototype>, но StatusEffectsComponent.AllowedEffects остаётся List<string>. Вызов comp.AllowedEffects.Contains(Electrocution) на строке 283 приведёт к ошибке типа или некорректному сравнению.

Необходимо либо:

  1. Изменить AllowedEffects на List<ProtoId<StatusEffectPrototype>>
  2. Использовать явное преобразование: comp.AllowedEffects.Contains(Electrocution.Id)

Also applies to: 279-287

Likely an incorrect or invalid review comment.

Content.Server/Backmen/Blob/Systems/BlobCoreSystem.cs (1)

59-61: Проблема совместимости типов с ProtoId.

Эта проблема уже была отмечена в предыдущем ревью. Поле BlobMoney типа ProtoId<CurrencyPrototype> используется как ключ в Dictionary<string, FixedPoint2> (строки 123-128, 581-586), а также для поиска в store.Balance (строки 190, 578, 611).

Хотя ProtoId<T> имеет неявное преобразование в строку, необходимо убедиться, что TryAddCurrency и Balance корректно работают с ProtoId ключами, либо обновить сигнатуры методов для использования Dictionary<ProtoId<CurrencyPrototype>, FixedPoint2>.

Likely an incorrect or invalid review comment.

Content.Client/Backmen/Blob/BlobCoreActionSystem.cs (1)

20-27: Исправьте тип параметра анимации — должен быть строка, а не EntProtoId.

Метод MeleeWeaponSystem.DoLunge принимает параметр типа string?, а не EntProtoId. Передайте Animation.Id вместо Animation.

Content.Server/Backmen/Abilities/Felinid/FelinidSystem.cs (1)

76-77: Улучшение типобезопасности подтверждено.

Замена строковых констант на типизированные EntProtoId поля улучшает типобезопасность. Код в строках 81 и 95 корректно передает EntProtoId значения методу AddAction, который ожидает параметры типа string — это возможно благодаря неявному преобразованию EntProtoId в строку. Изменение согласуется с общим рефакторингом в рамках проекта.

@github-actions github-actions bot added the Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design label Jan 6, 2026
@KayzelW KayzelW merged commit 56dfcb0 into master Jan 6, 2026
14 of 15 checks passed
@KayzelW KayzelW deleted the fixes branch January 8, 2026 11:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design S: Untriaged size/M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants