Skip to content

Comments

hotfix#1413

Merged
Rxup merged 1 commit intomasterfrom
hotfix-070126
Jan 7, 2026
Merged

hotfix#1413
Rxup merged 1 commit intomasterfrom
hotfix-070126

Conversation

@Rxup
Copy link
Owner

@Rxup Rxup commented Jan 7, 2026

Summary by CodeRabbit

Release Notes

  • New Features

    • Добавлены новые механики поведения для Глиммер Висп, включая улучшенную систему простоя и побега из контейнеров.
    • Расширена функциональность полиморф-эффектов для босс-проектилей с улучшенной поддержкой множественных целей.
  • Bug Fixes

    • Улучшена надёжность последовательности инициализации зомбификации в боевых системах.
    • Оптимизирована обработка столкновений проектилей с новым лимитом срабатываний.
  • Balance Changes

    • Обновлена физика врагов и параметры боевого поведения в соответствии с новой системой планирования.

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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 7, 2026

Walkthrough

Серия обновлений добавляет BreakOnWeightlessMove к DoAfterArgs, переупорядочивает инициализацию состояния в системах NPC, внедряет стан-функциональность в GlimmerWisp, и расширяет конфигурацию прототипов врагов с новыми HTN параметрами, fixture-параметрами и флагами PolymorphOnTrigger.

Changes

Cohort / File(s) Описание изменений
Система боба-зомби
Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs
StartZombify переупорядочена: DoAfter задача теперь запускается первой; инициализация состояния, попапы, аудио и флаг IsZombifying теперь выполняются только при успехе DoAfter. Добавлен BreakOnWeightlessMove = false к DoAfterArgs.
Система GlimmerWisp
Content.Server/Backmen/Psionics/NPC/GlimmerWisp/GlimmerWispSystem.cs
Добавлена зависимость StunSystem и кэшированный запрос _psiQuery для проверок HasComp. Заменены прямые проверки HasComp на _psiQuery.HasComp. Добавлено выполнение knockdown при начале жизненного дренирования. Расширен DoAfterArgs с BreakOnWeightlessMove = false. Переупорядочена последовательность дренирования: попап/аудио → стан → начало дренирования.
Конфигурация HTN GlimmerWisp
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/glimmer_monsters.yml
Добавлена новая HTN конфигурация для GlimmerWisp/Mob: planCooldown: 10 и блокаду параметров (IdleRange, IdleTime, MinimumIdleTime, AggroVisionRadius, RangedRange) для управления поведением планировщика и холостого хода.
Конфигурация Gutterman
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/gutter.yml
Удалён компонент Physics (bodyType: KinematicController). Добавлен targetUser: true к PolymorphOnTrigger. Введена новая fly-by fixture с PhysShapeCircle (radius: 1.5) на слоях Impassable и производных; hard: False.
Обновление HTN задач
Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/root.yml
WispCombatCompound теперь использует WispIdleCompound вместо IdleCompound. WispRangedCombatCompound: удалена ветка IdleCompound; добавлены две новые ветки с InContainerPrecondition (EscapeCompound) и PulledPrecondition (UnPullOperator).
Конфигурация BigJohninator
Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/bigjohninator.yml
Добавлен maxTriggers: 1 к TriggerOnCollide. Добавлен targetUser: true к PolymorphOnTrigger. Введён явный компонент Projectile с пустым damage. Добавлена новая fly-by fixture с Circle (radius: 1.5) на слоях Impassable и производных; hard: False.
Конфигурация URIIL
Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/uriil.yml
Добавлен targetUser: true к PolymorphOnTrigger в RageActivator. Введена новая fly-by fixture с PhysShapeCircle (radius: 1.5) на слоях Impassable и производных; hard: False.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

Кролик скачет по кодам с улыбкой,
Враги теперь с новых умений не вскрикнут—
DoAfter, стан, дренирование синхронны,
Fixture летящие кружат в законном вихре,
HTN планы танцуют гармонично! 🐰✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive Название «hotfix» является слишком расплывчатым и не описывает основные изменения в pull request. Замените название на более конкретное описание, отражающее суть изменений, например: «Fix blob pod and wisp AI behavior with DoAfter ordering» или аналогичное описание.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch hotfix-070126

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

❤️ Share

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

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In @Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/glimmer_monsters.yml:
- Around line 113-124: The blackboard for this NPC is missing the
MaximumIdleTime key referenced by WispIdleCompound (maxKey: MaximumIdleTime), so
RandomOperator will fail to find it; add a MaximumIdleTime entry to the
blackboard in glimmer_monsters.yml using the same !type:Single format as
MinimumIdleTime (e.g., a value >= MinimumIdleTime) so the
RandomOperator/WispIdleCompound can read maxKey correctly.
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

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

📥 Commits

Reviewing files that changed from the base of the PR and between 56dfcb0 and 3031f24.

⛔ Files ignored due to path filters (1)
  • Resources/Audio/Backmen/Bosses/uriildeath.ogg is excluded by !**/*.ogg
📒 Files selected for processing (7)
  • Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs
  • Content.Server/Backmen/Psionics/NPC/GlimmerWisp/GlimmerWispSystem.cs
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/glimmer_monsters.yml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/gutter.yml
  • Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/root.yml
  • Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/bigjohninator.yml
  • Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/uriil.yml
🧰 Additional context used
🧬 Code graph analysis (1)
Content.Server/Backmen/Psionics/NPC/GlimmerWisp/GlimmerWispSystem.cs (2)
Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs (1)
  • HasComp (1046-1053)
Content.Shared/Stunnable/SharedStunSystem.cs (1)
  • TryKnockdown (248-260)
⏰ 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). (4)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
🔇 Additional comments (9)
Content.Server/Backmen/Psionics/NPC/GlimmerWisp/GlimmerWispSystem.cs (2)

37-47: Хорошая оптимизация производительности.

Использование EntityQuery<PsionicComponent> вместо прямого вызова HasComp<PsionicComponent> — это правильный подход для часто используемых проверок компонентов, так как EntityQuery кэширует результат и работает быстрее.


161-184: Улучшенная логика последовательности drain.

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

Параметр DrainDelay + 1 обеспечивает, что цель остаётся обездвиженной на протяжении всего процесса drain.

Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs (1)

161-191: Согласованный рефакторинг последовательности DoAfter.

Изменения следуют тому же паттерну, что и в GlimmerWispSystem: сначала пытаемся запустить DoAfter, и только при успехе инициализируем состояние (ZombifyTarget, IsZombifying) и запускаем UI/аудио эффекты.

Это предотвращает несогласованное состояние, когда IsZombifying = true, но DoAfter не был запущен.

Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/uriil.yml (1)

1297-1322: Добавлен fly-by fixture и targetUser флаг.

Изменения согласованы с аналогичными изменениями в bigjohninator.yml и gutter.yml. Якорь &flybyfixture определён, но не используется в этом файле — возможно, для будущего переиспользования или унификации между файлами.

Resources/Prototypes/_Lavaland/Entities/Mobs/Bosses/bigjohninator.yml (2)

117-130: Правильная настройка триггера полиморфа.

  • maxTriggers: 1 предотвращает множественные срабатывания при столкновении с несколькими сущностями.
  • targetUser: true гарантирует, что полиморф применяется к пользователю, а не к цели столкновения.
  • Projectile с пустым damage: {} — это корректно, так как снаряд существует для триггера, а не для нанесения урона.

141-149: Согласованный fly-by fixture.

Fixture использует тот же паттерн (круг радиусом 1.5, слои Impassable/MidImpassable/HighImpassable/LowImpassable, hard: False), что и в других файлах PR.

Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/root.yml (2)

20-32: Хорошее расширение поведения NPC.

Добавлены важные прекондиции для обработки особых ситуаций:

  • InContainerPrecondition + EscapeCompound — виспу может выбраться из контейнера
  • PulledPrecondition + UnPullOperator — висп может освободиться от притягивания

Это улучшает выживаемость и автономность NPC.


54-58: Проверьте определение MaximumIdleTime.

RandomOperator использует maxKey: MaximumIdleTime, который должен быть определён в blackboard сущности MobGlimmerWisp. Как отмечено выше, этот ключ отсутствует в glimmer_monsters.yml.

Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/gutter.yml (1)

388-417: Согласованные изменения с другими файлами PR.

Добавление targetUser: true и fly-by fixture следует тому же паттерну, что и в bigjohninator.yml и uriil.yml. Изменения обеспечивают единообразное поведение полиморф-триггеров для всех подобных сущностей.

Comment on lines +113 to +124
planCooldown: 10
blackboard:
IdleRange: !type:Single
10
IdleTime: !type:Single
2.0
MinimumIdleTime: !type:Single
1.0
AggroVisionRadius: !type:Single
30.0
RangedRange: !type:Single
15.0
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Отсутствует MaximumIdleTime в blackboard.

В root.yml (WispIdleCompound) используется maxKey: MaximumIdleTime, но в blackboard определён только MinimumIdleTime. Это приведёт к тому, что RandomOperator не найдёт ключ MaximumIdleTime.

🐛 Предлагаемое исправление
       MinimumIdleTime: !type:Single
         1.0
+      MaximumIdleTime: !type:Single
+        3.0
       AggroVisionRadius: !type:Single
         30.0
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
planCooldown: 10
blackboard:
IdleRange: !type:Single
10
IdleTime: !type:Single
2.0
MinimumIdleTime: !type:Single
1.0
AggroVisionRadius: !type:Single
30.0
RangedRange: !type:Single
15.0
planCooldown: 10
blackboard:
IdleRange: !type:Single
10
IdleTime: !type:Single
2.0
MinimumIdleTime: !type:Single
1.0
MaximumIdleTime: !type:Single
3.0
AggroVisionRadius: !type:Single
30.0
RangedRange: !type:Single
15.0
🤖 Prompt for AI Agents
In @Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/glimmer_monsters.yml around
lines 113 - 124, The blackboard for this NPC is missing the MaximumIdleTime key
referenced by WispIdleCompound (maxKey: MaximumIdleTime), so RandomOperator will
fail to find it; add a MaximumIdleTime entry to the blackboard in
glimmer_monsters.yml using the same !type:Single format as MinimumIdleTime
(e.g., a value >= MinimumIdleTime) so the RandomOperator/WispIdleCompound can
read maxKey correctly.

@Rxup Rxup merged commit d679503 into master Jan 7, 2026
14 of 16 checks passed
@KayzelW KayzelW deleted the hotfix-070126 branch January 8, 2026 11:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant