Skip to content

[FIX] Vent Teleport, Hemophilia, PointLight IPC, Attachable Estoc, Revenant#2651

Merged
Darkiich merged 8 commits intoAdventureTimeSS14:masterfrom
CrimeMoot:23123123
Mar 27, 2026
Merged

[FIX] Vent Teleport, Hemophilia, PointLight IPC, Attachable Estoc, Revenant#2651
Darkiich merged 8 commits intoAdventureTimeSS14:masterfrom
CrimeMoot:23123123

Conversation

@CrimeMoot
Copy link
Copy Markdown
Contributor

@CrimeMoot CrimeMoot commented Mar 23, 2026

Техническая информация

  • Изменения были протестированы на локальном сервере, и всё работает отлично.
  • PR закончен и требует просмотра изменений.

Чейнджлог

🆑 CrimeMoot

  • fix: Жертвы умершие в трубах теперь возможно телепортировать, и через время они придут в норму, а не будут считать в трубе.
  • fix: Квирк Гемофилия корректно учитывает очки.
  • fix: Фонарики КПБ после излечение от аномалии не тратят свой фонарик
  • fix: Оружие Эсток теперь корректно снимает обвесы.
  • fix: Способность ревенанта "непоколебимость" при изучении теперь даёт щит, который возместит урон и даёт возможность выжить за счёт эссенции.
  • fix: Живая аномалия будучи на существе возвращает ему цвет глаз, если те были изменены.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 23, 2026

Caution

Review failed

The head commit changed during the review from 95d9501 to 0976547.

Walkthrough

Внесён рефакторинг очистки при выходе из труб в системе vent crawling: логика перемещена в приватный метод ExitVentCrawler и добавлена дополнительная переборная очистка BeingVentCrawlerComponent по полю Holder. InnerBodyAnomalySystem теперь добавляет и удаляет компоненты по их сетевым ID, записывая добавленные ID в новое поле InnerBodyAnomalyComponent.AddedComponentNetIds. SharedVentCrawableSystem добавил ранние проверки выхода в начале Update. В прототип оружия Estoc DMR добавлен родитель ADTBaseAttachableHolder. Трейты Hemophilia и ImpairedMobility переклассифицированы из Disabilities в Quirks. Также добавлена логика щита-ревенанта при смерти и соответствующая локализация RU.

Possibly related PRs

Suggested labels

size/S

Suggested reviewers

  • Darkiich
  • Unlumy
  • Schrodinger71
🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title concisely covers all five main fixes addressed in the changeset: vent teleport, hemophilia, pointlight IPC, attachable estoc, and revenant shield.
Description check ✅ Passed The description in Russian clearly relates to the changeset, detailing the fixes for vent teleport, hemophilia quirk, pointlight anomaly cure, estoc attachments, revenant shield, and inner body anomaly eye color restoration.

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

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

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

❤️ Share

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

Copy link
Copy Markdown
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: 3

🧹 Nitpick comments (2)
Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs (1)

26-32: Несоответствие в документации: "UIDs" vs "NetIDs".

В строке 28 документация говорит "component UIDs", но поле хранит network IDs (сетевые идентификаторы компонентов). Название поля AddedComponentNetIds корректное, но комментарий вводит в заблуждение.

📝 Предлагаемое исправление документации
 /// <summary>
 /// ADT-Tweak
-/// List of component UIDs that were added by the anomaly.
+/// List of component net IDs that were added by the anomaly.
 /// Used to remove only the specific components added by the anomaly, not all components of the same type.
 /// </summary>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs` around lines
26 - 32, The XML summary for the AddedComponentNetIds field is misleading—change
the text to say these are network IDs (NetIDs) rather than component UIDs;
update the summary on the AddedComponentNetIds field in
InnerBodyAnomalyComponent (the comment starting "List of component UIDs...") to
clearly state "List of component network IDs (NetIDs) that were added by the
anomaly" and keep the existing explanation about using them to remove only the
specific components added by the anomaly.
Content.Server/ADT/VentCrawling/VentCrawableSystem.cs (1)

70-91: Добавьте /// <summary> документацию для метода ExitVentCrawler.

Согласно рекомендациям, важные функции должны иметь XML-документацию. Метод ExitVentCrawler выполняет критическую логику очистки при выходе сущности из вентиляции.

📝 Предлагаемая документация
+    /// <summary>
+    /// Обрабатывает выход отдельной сущности из вентиляционного ползуна.
+    /// Удаляет компонент BeingVentCrawlerComponent, извлекает сущность из контейнера,
+    /// прикрепляет к сетке/карте и сбрасывает состояние InTube.
+    /// </summary>
+    /// <param name="entity">EntityUid сущности, выходящей из вентиляции.</param>
+    /// <param name="container">Контейнер холдера вентиляционного ползуна.</param>
     private void ExitVentCrawler(EntityUid entity, Container container)
     {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/ADT/VentCrawling/VentCrawableSystem.cs` around lines 70 - 91,
Add an XML documentation comment (/// <summary>...</summary>) to the
ExitVentCrawler method describing its purpose: that it removes the
BeingVentCrawlerComponent, detaches the entity from its vent container via
_containerSystem.Remove, reattaches it to the grid or map with
_xformSystem.AttachToGridOrMap if appropriate, clears
VentCrawlerComponent.InTube and marks it dirty, and wakes the physics body with
_physicsSystem.WakeBody; reference the method name ExitVentCrawler and the
related components (BeingVentCrawlerComponent, VentCrawlerComponent) in the
summary so callers and maintainers understand the cleanup steps performed.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Server/ADT/VentCrawling/VentCrawableSystem.cs`:
- Line 74: Удалите неиспользуемую локальную переменную meta, объявленную через
вызов MetaData(entity) в методе VentCrawableSystem (строка с "var meta =
MetaData(entity);"); либо если значение нужно — используйте его в последующем
коде, иначе просто убрать объявление (или заменить на discard `_ =
MetaData(entity);`), чтобы устранить мёртвый код.

In `@Resources/Prototypes/Traits/disabilities.yml`:
- Line 127: В строке с ключом "category: Quirks" комментарий не соответствует
coding guidelines; замените существующий комментарий "#ADT Quirks; fix by Prunt"
на формат с префиксом "# ADT-Tweak:" — например "# ADT-Tweak: Quirks; fix by
Prunt" (оставьте остальную подсказку автора), чтобы соответствовать требованию
одиночных строк помечать через "# ADT-Tweak:".
- Line 140: Строка комментария после "category: Quirks" использует неверный
формат "#ADT Quirks; fix by Prunt"; замените её на формат с префиксом "#
ADT-Tweak:" (например "# ADT-Tweak: Quirks; fix by Prunt") чтобы соответствовать
правилам для одиночных строк; найдите и обновите фрагмент "category: Quirks `#ADT`
Quirks; fix by Prunt" в файле и сохраните остальной текст комментария
неизменным.

---

Nitpick comments:
In `@Content.Server/ADT/VentCrawling/VentCrawableSystem.cs`:
- Around line 70-91: Add an XML documentation comment (///
<summary>...</summary>) to the ExitVentCrawler method describing its purpose:
that it removes the BeingVentCrawlerComponent, detaches the entity from its vent
container via _containerSystem.Remove, reattaches it to the grid or map with
_xformSystem.AttachToGridOrMap if appropriate, clears
VentCrawlerComponent.InTube and marks it dirty, and wakes the physics body with
_physicsSystem.WakeBody; reference the method name ExitVentCrawler and the
related components (BeingVentCrawlerComponent, VentCrawlerComponent) in the
summary so callers and maintainers understand the cleanup steps performed.

In `@Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs`:
- Around line 26-32: The XML summary for the AddedComponentNetIds field is
misleading—change the text to say these are network IDs (NetIDs) rather than
component UIDs; update the summary on the AddedComponentNetIds field in
InnerBodyAnomalyComponent (the comment starting "List of component UIDs...") to
clearly state "List of component network IDs (NetIDs) that were added by the
anomaly" and keep the existing explanation about using them to remove only the
specific components added by the anomaly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 16dde178-2ccf-4dc7-8f0e-f8b62d2ce28e

📥 Commits

Reviewing files that changed from the base of the PR and between ab2858c and 680225a.

📒 Files selected for processing (6)
  • Content.Server/ADT/VentCrawling/VentCrawableSystem.cs
  • Content.Server/Anomaly/Effects/InnerBodyAnomalySystem.cs
  • Content.Shared/ADT/VentCrawling/SharedVentCrawableSystem.cs
  • Content.Shared/Anomaly/Components/InnerBodyAnomalyComponent.cs
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml
  • Resources/Prototypes/Traits/disabilities.yml

@github-actions github-actions bot added the Changes: Localization Изменение локализации label Mar 23, 2026
@CrimeMoot CrimeMoot changed the title [FIX] Vent Teleport, Hemophilia, PointLight IPC, Attachable Estoc [FIX] Vent Teleport, Hemophilia, PointLight IPC, Attachable Estoc, Revenant Mar 23, 2026
@Unlumy
Copy link
Copy Markdown
Collaborator

Unlumy commented Mar 23, 2026

@CrimeMoot у новакидов проблема как у КПБ. Их тоже почини если не уже

@CrimeMoot
Copy link
Copy Markdown
Contributor Author

у новакидов проблема как у КПБ. Их тоже почини если не уже

Это глобальное исправление. Оно не только к КПБ. Если ты про light

@Unlumy
Copy link
Copy Markdown
Collaborator

Unlumy commented Mar 23, 2026

у новакидов проблема как у КПБ. Их тоже почини если не уже

Это глобальное исправление. Оно не только к КПБ. Если ты про light

Дай я тебя засосу

@Unlumy
Copy link
Copy Markdown
Collaborator

Unlumy commented Mar 23, 2026

Но добавь в CL тогда и про них

@CrimeMoot
Copy link
Copy Markdown
Contributor Author

Но добавь в CL тогда и про них

А что конкретно у новакидов ломалось?

@Unlumy
Copy link
Copy Markdown
Collaborator

Unlumy commented Mar 23, 2026

Но добавь в CL тогда и про них

А что конкретно у новакидов ломалось?

У них собственный свет в зависимости от цвета кожи новакида

@CrimeMoot
Copy link
Copy Markdown
Contributor Author

перепроверю

@CrimeMoot
Copy link
Copy Markdown
Contributor Author

Да. Всё сохраняется и после убрать аномалию возвращает и цвет и прочее обратно как было.

Copy link
Copy Markdown
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

🧹 Nitpick comments (3)
Content.Server/Revenant/EntitySystems/RevenantSystem.cs (3)

195-213: Дублирование логики щита.

Логика активации щита (проверка RevenantShieldComponent, установка Used, удаление статусов, восстановление эссенции) дублируется в двух местах:

  1. OnMobStateChanged (строки 126-139)
  2. ChangeEssenceAmount (строки 198-207)

Это необходимо для обработки двух разных сценариев смерти (смена MobState vs истощение эссенции), но дублирование увеличивает риск рассинхронизации при будущих изменениях.

♻️ Рекомендация: вынести общую логику в приватный метод
/// <summary>
/// Пытается активировать щит Неколебимости для спасения ревенанта.
/// </summary>
/// <returns>true если щит был успешно активирован.</returns>
private bool TryActivateShield(EntityUid uid, RevenantComponent component)
{
    if (!TryComp<RevenantShieldComponent>(uid, out var shield) || shield.Used)
        return false;
    
    if (component.Essence + ShieldEssenceRestore <= 0)
        return false;
    
    shield.Used = true;
    _status.TryRemoveStatusEffect(uid, "Stun");
    _status.TryRemoveStatusEffect(uid, "Corporeal");
    ChangeEssenceAmount(uid, ShieldEssenceRestore, component, allowDeath: false);
    _popup.PopupEntity(Loc.GetString("revenant-shield-activated"), uid, uid);
    return true;
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/Revenant/EntitySystems/RevenantSystem.cs` around lines 195 -
213, Duplicate shield activation logic exists in OnMobStateChanged and
ChangeEssenceAmount; extract it into a private helper (e.g., TryActivateShield)
inside RevenantSystem and have both OnMobStateChanged and ChangeEssenceAmount
call it. The helper should check TryComp<RevenantShieldComponent>(uid, out
shield) and shield.Used, verify component.Essence + ShieldEssenceRestore > 0,
set shield.Used = true, remove statuses via _status.TryRemoveStatusEffect(uid,
"Stun") and "Corporeal", call ChangeEssenceAmount(uid, ShieldEssenceRestore,
component, allowDeath: false) (or the appropriate overload), and show the popup;
replace the duplicated blocks in OnMobStateChanged and ChangeEssenceAmount with
a single call to TryActivateShield(uid, component).

142-143: Избыточная проверка Exists(uid).

Проверка Exists(uid) на строке 142 избыточна — идентичная проверка уже выполнена на строках 123-124, и между ними нет кода, который мог бы удалить сущность.

♻️ Предложенное исправление
         }
 
-        if (Exists(uid))
-            Spawn(component.SpawnOnDeathPrototype, Transform(uid).Coordinates);
+        Spawn(component.SpawnOnDeathPrototype, Transform(uid).Coordinates);
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/Revenant/EntitySystems/RevenantSystem.cs` around lines 142 -
143, Remove the redundant Exists(uid) check before spawning: since Exists(uid)
was already verified earlier in the same method (lines 123-124) and no code
in-between can delete the entity, delete the extra conditional and call Spawn
using component.SpawnOnDeathPrototype and Transform(uid).Coordinates directly;
update the RevenantSystem logic to rely on the earlier existence check and keep
the Spawn(component.SpawnOnDeathPrototype, Transform(uid).Coordinates) call as
the sole spawn invocation.

117-145: Зависимость _status уже объявлена в partial классе

Код использует _status.TryRemoveStatusEffect корректно. Поскольку RevenantSystem.cs является partial классом, зависимость StatusEffectsSystem _status из RevenantSystem.Abilities.cs (строка 62) доступна во всех частях класса. Это стандартная практика в C# и дополнительная проверка не требуется.

Рекомендуется рассмотреть вынесение магического числа 50 в именованную константу для улучшения читаемости:

♻️ Предложение: константа для значения эссенции
 public sealed partial class RevenantSystem : EntitySystem
 {
+    /// <summary>
+    /// Количество эссенции, восстанавливаемое при активации щита Неколебимости.
+    /// </summary>
+    private const float ShieldEssenceRestore = 50f;

Использовать ShieldEssenceRestore в строках 128, 135, 200, 205.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/Revenant/EntitySystems/RevenantSystem.cs` around lines 117 -
145, The _status field is fine as-is (it's declared in the partial class), but
replace the magic literal 50 with a named constant to improve readability: add a
private const int ShieldEssenceRestore = 50 to the RevenantSystem class and use
it instead of the literal in OnMobStateChanged (the component.Essence + 50 check
and the ChangeEssenceAmount call) and in the other places where 50 is used for
shield/essence logic (e.g., other ChangeEssenceAmount or essence-check sites in
RevenantSystem), preserving behavior and allowDeath parameter.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Server/Revenant/EntitySystems/RevenantSystem.cs`:
- Line 137: The code calls Loc.GetString("revenant-shield-activated") in
RevenantSystem (RevenantSystem.cs) but the English FTL file is missing the
corresponding entries; open Resources/Locale/en-US/ADT/Revenant/revenant.ftl and
add English translations for the keys revenant-shield-effect-name,
revenant-shield-effect-desc, and revenant-shield-activated (matching the Russian
keys already present) so Loc.GetString can resolve them at runtime; ensure the
message IDs exactly match those symbols and provide clear English text for the
effect name, description, and activation message.

---

Nitpick comments:
In `@Content.Server/Revenant/EntitySystems/RevenantSystem.cs`:
- Around line 195-213: Duplicate shield activation logic exists in
OnMobStateChanged and ChangeEssenceAmount; extract it into a private helper
(e.g., TryActivateShield) inside RevenantSystem and have both OnMobStateChanged
and ChangeEssenceAmount call it. The helper should check
TryComp<RevenantShieldComponent>(uid, out shield) and shield.Used, verify
component.Essence + ShieldEssenceRestore > 0, set shield.Used = true, remove
statuses via _status.TryRemoveStatusEffect(uid, "Stun") and "Corporeal", call
ChangeEssenceAmount(uid, ShieldEssenceRestore, component, allowDeath: false) (or
the appropriate overload), and show the popup; replace the duplicated blocks in
OnMobStateChanged and ChangeEssenceAmount with a single call to
TryActivateShield(uid, component).
- Around line 142-143: Remove the redundant Exists(uid) check before spawning:
since Exists(uid) was already verified earlier in the same method (lines
123-124) and no code in-between can delete the entity, delete the extra
conditional and call Spawn using component.SpawnOnDeathPrototype and
Transform(uid).Coordinates directly; update the RevenantSystem logic to rely on
the earlier existence check and keep the Spawn(component.SpawnOnDeathPrototype,
Transform(uid).Coordinates) call as the sole spawn invocation.
- Around line 117-145: The _status field is fine as-is (it's declared in the
partial class), but replace the magic literal 50 with a named constant to
improve readability: add a private const int ShieldEssenceRestore = 50 to the
RevenantSystem class and use it instead of the literal in OnMobStateChanged (the
component.Essence + 50 check and the ChangeEssenceAmount call) and in the other
places where 50 is used for shield/essence logic (e.g., other
ChangeEssenceAmount or essence-check sites in RevenantSystem), preserving
behavior and allowDeath parameter.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1b065fdf-36b3-4118-af60-96d1f86cec35

📥 Commits

Reviewing files that changed from the base of the PR and between 680225a and f08f43c.

📒 Files selected for processing (2)
  • Content.Server/Revenant/EntitySystems/RevenantSystem.cs
  • Resources/Locale/ru-RU/ADT/Revenant/revenant.ftl
✅ Files skipped from review due to trivial changes (1)
  • Resources/Locale/ru-RU/ADT/Revenant/revenant.ftl

revenant-shield-effect-name = Неколебимость
revenant-shield-effect-desc = Получите возможность обмануть смерть ещё один раз.
revenant-shield-activated = Неколебимость активирована! Вы обманули смерть.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Мб ты имел в виду "непоколебимость"?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Скилл называется Неколебимость. Буквально выше написан.

@Darkiich Darkiich merged commit 8fadbc6 into AdventureTimeSS14:master Mar 27, 2026
16 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Changes: Localization Изменение локализации size/M Status: Needs Review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants