Conversation
WalkthroughСерия обновлений добавляет BreakOnWeightlessMove к DoAfterArgs, переупорядочивает инициализацию состояния в системах NPC, внедряет стан-функциональность в GlimmerWisp, и расширяет конфигурацию прототипов врагов с новыми HTN параметрами, fixture-параметрами и флагами PolymorphOnTrigger. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes Poem
🚥 Pre-merge checks | ✅ 1 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (1 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
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
🤖 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
⛔ Files ignored due to path filters (1)
Resources/Audio/Backmen/Bosses/uriildeath.oggis excluded by!**/*.ogg
📒 Files selected for processing (7)
Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.csContent.Server/Backmen/Psionics/NPC/GlimmerWisp/GlimmerWispSystem.csResources/Prototypes/_Backmen/Entities/Mobs/NPCs/glimmer_monsters.ymlResources/Prototypes/_Backmen/Entities/Mobs/NPCs/gutter.ymlResources/Prototypes/_Backmen/Entities/Mobs/NPCs/root.ymlResources/Prototypes/_Lavaland/Entities/Mobs/Bosses/bigjohninator.ymlResources/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. Изменения обеспечивают единообразное поведение полиморф-триггеров для всех подобных сущностей.
| 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 |
There was a problem hiding this comment.
Отсутствует 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.
| 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.
Summary by CodeRabbit
Release Notes
New Features
Bug Fixes
Balance Changes
✏️ Tip: You can customize this high-level summary in your review settings.