Conversation
|
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 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. 📒 Files selected for processing (1)
WalkthroughЗаменены строковые prototype ID на типизированные Changes
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
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~30 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
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. Comment |
There was a problem hiding this comment.
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
📒 Files selected for processing (2)
Content.Server/Backmen/Vampiric/BkmVampireLevelingSystem.csContent.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%)
Формула выглядит корректной, но убедитесь, что:
- Значение
bloodDrained / 5fправильно отражает игровую механику- Минимальный порог
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 тира) делают риск дисбаланса менее критичным, чем предполагалось в исходном замечании.
There was a problem hiding this comment.
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
📒 Files selected for processing (11)
Content.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsionicInvisibilityPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.csContent.Server/Backmen/Vampiric/BkmVampireLevelingSystem.csResources/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:соответствует обновлённому APIDoAfterArgsи улучшает читаемость кода.Resources/Prototypes/Reagents/toxins.yml (1)
358-363: РеализацияChemRemovePsionicподтверждена и работает корректно.Эффект
ChemRemovePsionicполностью интегрирован в систему (Content.Shared/Backmen/EntityEffects/Effects/ChemRemovePsionic.cs) и правильно удаляет способности пионов из сущностей.Однако порог активации требует рассмотрения:
SoulbreakerToxinиспользуетChemRemovePsionicсmin: 5MindbreakerToxinиспользуетmin: 20(в 4 раза выше)Кроме того, в определении
MindbreakerToxinуказано# TODO: PROPER hallucinations, что свидетельствует о продолжающейся разработке. Убедитесь, что порог20соответствует игровому балансу и намерениям дизайна перед слиянием.
There was a problem hiding this comment.
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
📒 Files selected for processing (82)
Content.Client/Backmen/Blob/BlobChemSwapMenu.xaml.csContent.Client/Backmen/Blob/BlobCoreActionSystem.csContent.Client/Backmen/Blob/BlobObserverSystem.csContent.Client/Backmen/Flesh/FleshCultist.csContent.Client/Backmen/GhostTheme/GhostThemeSystem.csContent.Client/Backmen/Overlays/Shaders/EtherealOverlay.csContent.Client/Backmen/Overlays/Systems/NearsightedSystem.csContent.Client/Backmen/SponsorManager/UI/SponsorWindow.csContent.Client/Backmen/StationAI/AiEnemySystem.csContent.Client/Backmen/Teams/TdmTeamSystem.csContent.Client/Backmen/Vampiric/BloodSuckerSystem.csContent.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.csContent.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.csContent.Server/Backmen/Abilities/Felinid/FelinidSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.csContent.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.csContent.Server/Backmen/Antag/SuperPsi/AutoPsiSystem.csContent.Server/Backmen/Arachne/ArachneSystem.csContent.Server/Backmen/Arrivals/Centcomm/CentCommSpawnSystem.csContent.Server/Backmen/Arrivals/CentcommSystem.csContent.Server/Backmen/Blob/Systems/BlobCarrierSystem.csContent.Server/Backmen/Blob/Systems/BlobCoreSystem.csContent.Server/Backmen/Blob/Systems/BlobFactorySystem.csContent.Server/Backmen/Blob/Systems/BlobObserverSystem.csContent.Server/Backmen/Blob/Systems/BlobTileSystem.csContent.Server/Backmen/Chapel/SacrificialAltarSystem.csContent.Server/Backmen/Cloning/MetempsychoticMachineSystem.csContent.Server/Backmen/Disease/DiseaseDiagnosisSystem.csContent.Server/Backmen/Drone/BSSDroneSystem.csContent.Server/Backmen/Economy/ATM/ATMSystem.csContent.Server/Backmen/Economy/EconomySystem.csContent.Server/Backmen/EvilTwin/EvilTwinSystem.csContent.Server/Backmen/Flesh/FleshCultistSystem.csContent.Server/Backmen/FootPrint/PuddleFootPrintsSystem.csContent.Server/Backmen/Fugitive/FugitiveSystem.csContent.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.csContent.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.csContent.Server/Backmen/Item/Optic/OpticZoomEffectSystem.csContent.Server/Backmen/Mood/MoodSystem.csContent.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.csContent.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.csContent.Server/Backmen/Psionics/PsionicsSystem.csContent.Server/Backmen/Reinforcement/ReinforcementSystem.csContent.Server/Backmen/Research/Oracle/OracleSystem.csContent.Server/Backmen/RoleWhitelist/WhitelistSystem.csContent.Server/Backmen/ShipVsShip/ShipVsShipGame.csContent.Server/Backmen/Shipwrecked/NPCZombieSystem.csContent.Server/Backmen/Shipwrecked/ShipwreckedRuleSystem.csContent.Server/Backmen/Soul/GolemSystem.csContent.Server/Backmen/SpecForces/SpecForcesSystem.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.csContent.Server/Backmen/Spider/SpiderVampireSystem.csContent.Server/Backmen/StationAI/AICameraSystem.csContent.Server/Backmen/StationAI/AiEnemySystem.csContent.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.csContent.Server/Backmen/Surgery/Consciousness/Systems/ServerConsciousnessSystem.csContent.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.csContent.Server/Backmen/Vampiric/BkmVampireLevelingSystem.csContent.Server/Backmen/Vampiric/BloodSuckerSystem.csContent.Server/Backmen/Xeno/XenoAgentSystem.csContent.Server/Corvax/GuideGenerator/ReactionJsonGenerator.csContent.Server/Tools/Innate/InnateToolSystem.csContent.Server/Zombies/ZombieSystem.csContent.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.csContent.Shared/Backmen/Blob/SharedBlobMobSystem.csContent.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.csContent.Shared/Backmen/Language/Systems/SharedLanguageSystem.csContent.Shared/Backmen/Psionics/SharedPsionicsSystem.csContent.Shared/Backmen/Supermatter/SharedSupermatterSystem.csContent.Shared/Backmen/Teams/SharedTdmTeamSystem.csContent.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)
| private readonly EntProtoId ActionMindSwap = "ActionMindSwapPsionic"; | ||
| private readonly EntProtoId ActionMindSwapReturn = "ActionMindSwapReturn"; |
There was a problem hiding this comment.
🧩 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.
| private readonly EntProtoId FugitiveMindRole = "MindRoleFugitive"; | ||
| private readonly EntProtoId EscapeObjective = "EscapeShuttleObjectiveFugitive"; | ||
| private readonly ProtoId<JobPrototype> FugitiveRole = "Fugitive"; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Поиск YAML файлов с прототипами
find . -type f -name "*.yml" -o -name "*.yaml" | head -20Repository: Rxup/space-station-14
Length of output: 811
🏁 Script executed:
# Поиск определений прототипов
rg -i "MindRoleFugitive|EscapeShuttleObjectiveFugitive" -A 2 -B 2Repository: Rxup/space-station-14
Length of output: 2898
🏁 Script executed:
# Проверка файла FugitiveSystem.cs на предмет корректности типизации
head -100 Content.Server/Backmen/Fugitive/FugitiveSystem.csRepository: 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.csRepository: Rxup/space-station-14
Length of output: 1114
🏁 Script executed:
# Проверка наличия файлов с определением работ
find Resources/Prototypes -name "*job*" -type f | head -10Repository: 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.
There was a problem hiding this comment.
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отсутствуют в:
SharedDispelPowerSystemSharedMindSwapPowerSystemSharedNoosphericZapPowerSystemSharedPsychokinesisPowerSystemSharedPyrokinesisPowerSystemВ
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>— это правильное решение. Однако стоит учесть два момента:
Исходное поле было
const(неявно статическое), а новое полеreadonlyявляется полем экземпляра. Рекомендуется добавитьstatic, чтобы сохранить исходное поведение и избежать дублирования значения в каждом экземпляре системы.Для соответствия соглашениям об именовании (см. строку 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
📒 Files selected for processing (83)
Content.Client/Backmen/Blob/BlobChemSwapMenu.xaml.csContent.Client/Backmen/Blob/BlobCoreActionSystem.csContent.Client/Backmen/Blob/BlobObserverSystem.csContent.Client/Backmen/Flesh/FleshCultist.csContent.Client/Backmen/GhostTheme/GhostThemeSystem.csContent.Client/Backmen/Overlays/Shaders/EtherealOverlay.csContent.Client/Backmen/Overlays/Systems/NearsightedSystem.csContent.Client/Backmen/SponsorManager/UI/SponsorWindow.csContent.Client/Backmen/StationAI/AiEnemySystem.csContent.Client/Backmen/Teams/TdmTeamSystem.csContent.Client/Backmen/Vampiric/BloodSuckerSystem.csContent.Client/HealthAnalyzer/UI/HealthAnalyzerWindow.xaml.csContent.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.csContent.Server/Backmen/Abilities/Felinid/FelinidSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/DispelPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/NoosphericZapPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsionicRegenerationPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PsychokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/PyrokinesisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/Abilities/TelegnosisPowerSystem.csContent.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.csContent.Server/Backmen/Administration/Bwoink/Gpt/GptCommands.csContent.Server/Backmen/Antag/SuperPsi/AutoPsiSystem.csContent.Server/Backmen/Arachne/ArachneSystem.csContent.Server/Backmen/Arrivals/Centcomm/CentCommSpawnSystem.csContent.Server/Backmen/Arrivals/CentcommSystem.csContent.Server/Backmen/Blob/Systems/BlobCarrierSystem.csContent.Server/Backmen/Blob/Systems/BlobCoreSystem.csContent.Server/Backmen/Blob/Systems/BlobFactorySystem.csContent.Server/Backmen/Blob/Systems/BlobObserverSystem.csContent.Server/Backmen/Blob/Systems/BlobTileSystem.csContent.Server/Backmen/Chapel/SacrificialAltarSystem.csContent.Server/Backmen/Cloning/MetempsychoticMachineSystem.csContent.Server/Backmen/Disease/DiseaseDiagnosisSystem.csContent.Server/Backmen/Drone/BSSDroneSystem.csContent.Server/Backmen/Economy/ATM/ATMSystem.csContent.Server/Backmen/Economy/EconomySystem.csContent.Server/Backmen/EvilTwin/EvilTwinSystem.csContent.Server/Backmen/Flesh/FleshCultistSystem.csContent.Server/Backmen/FootPrint/PuddleFootPrintsSystem.csContent.Server/Backmen/Fugitive/FugitiveSystem.csContent.Server/Backmen/GameTicking/Rules/FleshCultRuleSystem.csContent.Server/Backmen/GibOnCollide/Systems/GibOnCollideSystem.csContent.Server/Backmen/Item/Optic/OpticZoomEffectSystem.csContent.Server/Backmen/Mood/MoodSystem.csContent.Server/Backmen/Psionics/Glimmer/GlimmerReactiveSystem.csContent.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.csContent.Server/Backmen/Psionics/PsionicsSystem.csContent.Server/Backmen/Reinforcement/ReinforcementSystem.csContent.Server/Backmen/Research/Oracle/OracleSystem.csContent.Server/Backmen/RoleWhitelist/WhitelistSystem.csContent.Server/Backmen/ShipVsShip/ShipVsShipGame.csContent.Server/Backmen/Shipwrecked/NPCZombieSystem.csContent.Server/Backmen/Shipwrecked/ShipwreckedRuleSystem.csContent.Server/Backmen/Soul/GolemSystem.csContent.Server/Backmen/SpecForces/SpecForcesSystem.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Rest.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.Teleport.csContent.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.csContent.Server/Backmen/Spider/SpiderVampireSystem.csContent.Server/Backmen/StationAI/AICameraSystem.csContent.Server/Backmen/StationAI/AiEnemySystem.csContent.Server/Backmen/StationEvents/Events/GlimmerWispSpawnRule.csContent.Server/Backmen/Surgery/Consciousness/Systems/ServerConsciousnessSystem.csContent.Server/Backmen/Surgery/Wounds/Systems/ServerWoundSystem.csContent.Server/Backmen/Vampiric/BkmVampireLevelingSystem.csContent.Server/Backmen/Vampiric/BloodSuckerSystem.csContent.Server/Backmen/Xeno/XenoAgentSystem.csContent.Server/Corvax/GuideGenerator/ReactionJsonGenerator.csContent.Server/Tools/Innate/InnateToolSystem.csContent.Server/Zombies/ZombieSystem.csContent.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.csContent.Shared/Backmen/Blob/SharedBlobMobSystem.csContent.Shared/Backmen/Eye/NightVision/Systems/NightVisionSystem.csContent.Shared/Backmen/Language/Systems/SharedLanguageSystem.csContent.Shared/Backmen/Psionics/SharedPsionicsSystem.csContent.Shared/Backmen/Supermatter/SharedSupermatterSystem.csContent.Shared/Backmen/Teams/SharedTdmTeamSystem.csContent.Shared/Fluids/SharedAbsorbentSystem.csResources/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 приведёт к ошибке типа или некорректному сравнению.Необходимо либо:
- Изменить
AllowedEffectsнаList<ProtoId<StatusEffectPrototype>>- Использовать явное преобразование:
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в строку. Изменение согласуется с общим рефакторингом в рамках проекта.
Чек-лист после апстрима:
опционально(но надо бы):
Summary by CodeRabbit
New Features
Изменения
Изменения в реактивах
Refactor
✏️ Tip: You can customize this high-level summary in your review settings.