Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] Headcrabs #190

Open
wants to merge 8 commits into
base: master
Choose a base branch
from

Conversation

PuroSlavKing
Copy link
Member

@PuroSlavKing PuroSlavKing commented Dec 23, 2024

Описание PR

Супер крутые хедкраби!!!

Code elements taken from: Rxup/space-station-14#194


Медиа

Список

Example Media Embed


Изменения

🆑 PuroSlavKing

  • add: Added event "Headcrab Invasion", a nest appears on the station, spreading dangerous parasites throughout the station / Добавлен ивент "Нашествие хедкрабов", на станции появляется гнездо, распространяющее опасных паразитов по станции.

Copy link
Contributor

coderabbitai bot commented Dec 23, 2024

Warning

Rate limit exceeded

@PuroSlavKing has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 6 minutes and 2 seconds before requesting another review.

⌛ How to resolve this issue?

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

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

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

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

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 74433ae and 9ec3408.

📒 Files selected for processing (2)
  • Resources/Locale/en-US/_white/station-events/events/events.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/station-events/events/events.ftl (1 hunks)

Обзор

Этот pull request добавляет новую систему "Headcrab" в игру, включающую компоненты, системы, прототипы сущностей, локализацию и ресурсы для различных типов хедкрабов. Изменения охватывают серверную логику, игровые механики, спавн, события и руководство пользователя для новых antagonist-сущностей.

Изменения

Путь Краткое описание изменений
Content.Server/_White/Headcrab/ Добавлены компоненты HeadcrabComponent и HeadcrabSystem для управления поведением хедкрабов
Content.Shared/_White/Headcrab/ Создан общий класс события JumpActionEvent
Resources/Locale/ Добавлена локализация для хедкрабов на английском и русском языках
Resources/Prototypes/_White/ Созданы прототипы сущностей, игровых правил и руководств для хедкрабов
Resources/ServerInfo/_White/Guidebook/ Добавлена документация и описания для хедкрабов
Resources/Textures/_White/ Включены текстуры для разных типов хедкрабов и их гнезд

Рекомендуемые рецензенты

  • Spatison

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

github-actions bot commented Dec 23, 2024

RSI Diff Bot; head commit 9ec3408 merging into 82174d3
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/_White/Interface/Actions/headcrab.rsi

State Old New Status
jump Added

Resources/Textures/_White/Mobs/Animals/headcrab.rsi

State Old New Status
alive Added
dead Added
equipped-HELMET-vox Added
equipped-HELMET Added
equipped-MASK-vox Added
equipped-MASK Added

Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi

State Old New Status
alive Added
dead Added
equipped-HELMET-vox Added
equipped-HELMET Added
equipped-MASK-vox Added
equipped-MASK Added

Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi

State Old New Status
alive Added
dead Added
equipped-HELMET-vox Added
equipped-HELMET Added
equipped-MASK-vox Added
equipped-MASK Added

Resources/Textures/_White/Structures/Other/headcrab_nest.rsi

State Old New Status
icon Added

Edit: diff updated after 9ec3408

@PuroSlavKing PuroSlavKing marked this pull request as ready for review December 24, 2024 09:22
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: 3

🧹 Nitpick comments (19)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)

1-30: Рекомендация: убрать дублирование подключений
Тип Content.Server.NPC.Components импортируется как в строке 3, так и в строке 7. Это потенциально избыточно и может быть упрощено, чтобы избежать путаницы.


127-137: Реализация укуса при экипировке в руку (OnGotEquippedHand)
Код корректно проверяет, жив ли хедкраб, не является ли пользователь зомби, а затем наносит урон и отображает всплывающие сообщения. Можно рассмотреть единообразие поведения с другими методами экипировки, но в целом решение работает.

Resources/Locale/en-US/_white/popups/headcrab.ftl (2)

4-5: Обратите внимание на согласованность использования заглавных букв при работе с плейсхолдерами.

Вместо { CAPITALIZE($entity) } можно рассмотреть более гибкий способ форматирования, если потребуется отображать другие элементы строки в верхнем регистре. В остальном логика корректна.


11-11: Уточните формулировку «You cant take headcrab off your head.»

Добавьте апостроф в слове "can't" для корректного написания.

- headcrab-try-unequip = You cant take headcrab off your head.
+ headcrab-try-unequip = You can't take headcrab off your head.
Content.Server/_White/Headcrab/HeadcrabComponent.cs (3)

21-23: Проверьте возможную опечатку в названии переменной «ChansePounce».

Может имелось в виду «ChancePounce»? Уточните для единообразия и читаемости кода.

- public int ChansePounce = 33;
+ public int ChancePounce = 33;

28-28: Именование флага IsDeath может сбивать с толку.

Обычно в подобных случаях используется IsDead. Переименуйте для большей ясности.

- public bool IsDeath = false;
+ public bool IsDead = false;

30-30: Переменная EquipedOn может содержать ошибку правописания.

Рекомендуется заменить на EquippedOn для согласованности.

- public EntityUid EquipedOn;
+ public EntityUid EquippedOn;
Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json (1)

9-32: Проверка состояний спрайта

Рекомендуется добавить дополнительные состояния анимации:

  • Состояние прыжка (jumping)
  • Состояние приземления (landing)
  • Состояние атаки (attacking)

Это улучшит визуальную обратную связь для игроков.

Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml (2)

2-3: Форматирование заголовка

Рекомендуется использовать теги форматирования для заголовка:

-  # Быстрый хедкраб
+  <Box>
+    <Heading>Быстрый хедкраб</Heading>
+  </Box>

15-17: Форматирование характеристик

Рекомендуется использовать список с маркерами для лучшей читаемости:

-  - Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении.
-  - Имеет 50 ХП.
-  - Передвигается на 20% быстрее.
+  <Box>
+    <GuideReagentEmbed Reagent="Damage"/>
+    <List>
+      <ListItem>Наносит [color=#ff1f1f]2 режущего[/color] своими челюстями, в том числе при закреплении.</ListItem>
+      <ListItem>Имеет 50 ХП.</ListItem>
+      <ListItem>Передвигается на 20% быстрее.</ListItem>
+    </List>
+  </Box>
Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml (1)

11-17: Рекомендуется усилить уязвимость к огню

Для биологической сущности урон от огня (10) кажется заниженным. Рекомендуется увеличить урон от огня для баланса.

  - type: Flammable
    fireSpread: true
    damage:
     types:
-       Heat: 10
+       Heat: 25
Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml (1)

1-55: Рекомендуется добавить условия спавна

Текущая реализация спавнеров не учитывает условия окружающей среды. Рекомендуется добавить проверки для более сбалансированного геймплея.

Предлагаемые дополнения для каждого спавнера:

  - type: ConditionalSpawner
    prototypes:
      - HeadcrabNest
+    conditions:
+      - !type:AmbientTemperature
+        min: 280
+        max: 320
+      - !type:NotInSpace
+      - !type:Distance
+        target: Players
+        minimum: 10
Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml (2)

13-17: Рекомендуется дополнить информацию о механиках

В разделе особенностей следует добавить информацию о контрмерах и тактике борьбы с ядовитыми хедкрабами.

  ## Особенности
  
  - Наносит [color=#46A446]2 яда[/color] своими челюстями, в том числе при закреплении.
  - Имеет 50 ХП.
  - Передвигается на 40% медленее.
+ - [color=#FF0000]Внимание:[/color] Уязвим к:
+   - Огнестрельному оружию
+   - Энергетическому оружию
+   - Взрывчатке
+ - [color=#FFD700]Совет:[/color] Держитесь на расстоянии и атакуйте группой

2-2: Рекомендуется использовать стандартный формат заголовка

-  # Ядовитый хедкраб
+  <Title>Ядовитый хедкраб</Title>
Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml (1)

4-6: Рекомендуется улучшить форматирование документации

Для улучшения читаемости рекомендуется:

  • Добавить атрибут Scale для GuideEntityEmbed
  • Добавить описательный Caption
  <Box>
-   <GuideEntityEmbed Entity="MobHeadcrab" Caption=""/>
+   <GuideEntityEmbed Entity="MobHeadcrab" Scale="1.5" Caption="Обычный хедкраб"/>
  </Box>
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (4)

33-33: Рекомендации по балансировке параметров

Текущие параметры могут сделать хедкрабов слишком сильными:

  • Время паралича (3 секунды) кажется слишком коротким
  • Базовая скорость передвижения (2.9/3.9) выглядит высокой

Рекомендуется протестировать следующие значения:

-    paralyzeTime: 3
+    paralyzeTime: 5
-    baseWalkSpeed: 2.9
-    baseSprintSpeed: 3.9
+    baseWalkSpeed: 2.5
+    baseSprintSpeed: 3.5

Also applies to: 86-87


115-117: Раскомментируйте секцию GuideHelp

Документация важна для понимания механик игры. Рекомендуется раскомментировать секцию GuideHelp для базового хедкраба.

-#  - type: GuideHelp
-#    guides:
-#    - Headcrab
+  - type: GuideHelp
+    guides:
+    - Headcrab

144-151: Усильте урон ядовитого хедкраба

Текущий урон от яда (2 единицы) кажется слишком низким для специализированного ядовитого варианта хедкраба.

    damage:
      types:
-        Poison: 2
+        Poison: 4
  - type: MeleeWeapon
    damage:
      types:
-        Poison: 2
+        Poison: 4

1-157: Исправьте проблемы с отступами

Статический анализ выявил несколько проблем с отступами в файле. Рекомендуется использовать консистентные отступы по 4 пробела для всех уровней вложенности.

🧰 Tools
🪛 yamllint (1.35.1)

[warning] 16-16: wrong indentation: expected 4 but found 2

(indentation)


[error] 20-20: trailing spaces

(trailing-spaces)


[warning] 90-90: wrong indentation: expected 6 but found 4

(indentation)


[warning] 95-95: wrong indentation: expected 6 but found 4

(indentation)


[warning] 97-97: wrong indentation: expected 6 but found 4

(indentation)


[warning] 111-111: wrong indentation: expected 4 but found 2

(indentation)


[warning] 124-124: wrong indentation: expected 4 but found 2

(indentation)


[warning] 140-140: wrong indentation: expected 4 but found 2

(indentation)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 82174d3 and 50e0a8c.

⛔ Files ignored due to path filters (21)
  • Resources/Audio/_White/Misc/Headcrab/headcrab_jump.ogg is excluded by !**/*.ogg
  • Resources/Textures/_White/Interface/Actions/headcrab.rsi/jump.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/alive.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/dead.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/equipped-MASK.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/alive.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/dead.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/equipped-MASK.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/alive.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/dead.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-HELMET.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK-vox.png is excluded by !**/*.png
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/equipped-MASK.png is excluded by !**/*.png
  • Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/icon.png is excluded by !**/*.png
📒 Files selected for processing (31)
  • Content.Server/_White/Headcrab/HeadcrabComponent.cs (1 hunks)
  • Content.Server/_White/Headcrab/HeadcrabSystem.cs (1 hunks)
  • Content.Shared/_White/Headcrab/SharedHeadcrab.cs (1 hunks)
  • Resources/Locale/en-US/_white/popups/headcrab.ftl (1 hunks)
  • Resources/Locale/en-US/_white/prototypes/actions/types.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/guidbook/main.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/popups/headcrab.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl (1 hunks)
  • Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl (1 hunks)
  • Resources/Prototypes/_White/Actions/types.yml (1 hunks)
  • Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml (1 hunks)
  • Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1 hunks)
  • Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml (1 hunks)
  • Resources/Prototypes/_White/GameRules/events.yml (1 hunks)
  • Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml (1 hunks)
  • Resources/Prototypes/_White/Guidebook/WWDP.yml (1 hunks)
  • Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml (1 hunks)
  • Resources/ServerInfo/_White/Guidebook/WWDP.xml (1 hunks)
  • Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json (1 hunks)
  • Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json (1 hunks)
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json (1 hunks)
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json (1 hunks)
  • Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json (1 hunks)
✅ Files skipped from review due to trivial changes (12)
  • Resources/Textures/_White/Interface/Actions/headcrab.rsi/meta.json
  • Resources/ServerInfo/_White/Guidebook/WWDP.xml
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Antagonist.xml
  • Resources/Textures/_White/Mobs/Animals/headcrab_fast.rsi/meta.json
  • Resources/Locale/ru-RU/_white/guidbook/main.ftl
  • Resources/Locale/ru-RU/_white/prototypes/entities/markers/spawners/headcrabs.ftl
  • Resources/Textures/_White/Structures/Other/headcrab_nest.rsi/meta.json
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs.xml
  • Resources/Locale/ru-RU/_white/prototypes/entities/structures/other/headcrab.ftl
  • Resources/Textures/_White/Mobs/Animals/headcrab_poison.rsi/meta.json
  • Resources/Locale/ru-RU/_white/guidbook/antagonist.ftl
  • Resources/Locale/ru-RU/_white/popups/headcrab.ftl
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml

[warning] 16-16: wrong indentation: expected 4 but found 2

(indentation)


[error] 20-20: trailing spaces

(trailing-spaces)


[warning] 90-90: wrong indentation: expected 6 but found 4

(indentation)


[warning] 95-95: wrong indentation: expected 6 but found 4

(indentation)


[warning] 97-97: wrong indentation: expected 6 but found 4

(indentation)


[warning] 111-111: wrong indentation: expected 4 but found 2

(indentation)


[warning] 124-124: wrong indentation: expected 4 but found 2

(indentation)


[warning] 140-140: wrong indentation: expected 4 but found 2

(indentation)

🔇 Additional comments (36)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (11)

33-46: Проверка зависимостей
Зависимости, помеченные атрибутом [Dependency], корректно инициализируются и последовательно используются в методах системы.


47-58: Подписка на события
Метод Initialize() логично регистрирует локальные события, необходимые для работы HeadcrabSystem. Подход к подпискам выглядит систематичным и ясным.


60-63: Добавление экшена
OnStartup корректно добавляет действие JumpAction к сущности. Рекомендуется проверить, что component.JumpAction не равен null, чтобы избежать потенциальных исключений.


65-103: Логика при попадании хедкраба (OnHeadcrabDoHit)
Метод в целом выглядит логичным: проверяется, что цель не является зомби и что она жива, затем выполняется экипировка хедкраба в слот «mask». Однако стоит убедиться, что у цели не занят слот маски другим предметом (помимо IngestionBlockerComponent) для более полной валидации.


105-112: Слоты и фракции при экипировке
Когда хедкраб экипирован, компонент автоматически добавляет фракцию «Zombie». Это поведение выглядит обоснованным в игровом контексте, и логика корректна.


114-125: Запрет на снятие хедкраба
Метод OnUnequipAttempt грамотно предотвращает снятие, если носитель не является зомби, уведомляя игрока всплывающим сообщением. Логика отмены попытки здесь выглядит последовательно.


139-149: Логика при снятии (OnGotUnequipped)
При удалении хедкраба из слота «mask» корректно сбрасывается состояние Pacified и переводится сущность в боевой режим. Удаление фракции «Zombie» уместно и понятно.


151-197: Обработка удара в бою (OnMeleeHit)
Метод правильно обрабатывает вероятность «ChansePounce» и экипировку хедкраба на голову жертвы. Проверка на живое состояние цели перед экипировкой тоже реализована верно.


199-205: Состояние смерти (OnMobStateChanged)
Если моб умирает, флаг IsDeath в компоненте устанавливается в true. Простое и эффективное решение, соответствующее требованиям игровой логики.


206-221: Прыжок (OnJump)
Метод аккуратно обрабатывает действие прыжка, рассчитав направление и силу. При наличии звука прыжка он проигрывается локально. Логика выглядит завершённой.


223-255: Циклическое нанесение урона (Update)
Метод учитывает внутренний счётчик (Accumulator), и при превышении DamageFrequency наносит урон носителю хедкраба с помощью _damageableSystem. Также корректно удаляет хедкраба, если носитель мёртв. Реализация обновления в целом адекватна.

Resources/Locale/en-US/_white/prototypes/actions/types.ftl (1)

1-2: Локализация: действия для прыжка
Добавленные строки jump-action-name и jump-action-description корректно описывают действие «Jump». Сам текст выглядит понятным и соответствует назначению.

Content.Shared/_White/Headcrab/SharedHeadcrab.cs (1)

1-10: Новый класс JumpActionEvent
Класс JumpActionEvent унаследован от WorldTargetActionEvent и готов к сериализации. Дополнительных проблем не обнаружено.

Resources/Locale/ru-RU/_white/prototypes/entities/mobs/npcs/headcrab.ftl (1)

1-9: Локализация: типы хедкрабов
Добавлены корректные строки локализации, описывающие базового хедкраба и его варианты (быстрый, ядовитый). Формат Fluent соблюдён, семантика описаний понятна.

Resources/Locale/ru-RU/_white/prototypes/actions/types.ftl (1)

12-14: Локализация для прыжка
Добавлены строки jump-action-name и jump-action-description на русском языке. Текст точный и соответствует действию «Прыгнуть».

Resources/Locale/en-US/_white/popups/headcrab.ftl (3)

1-2: Название и описание выглядят корректно.

Похоже, что строки хорошо согласуются по смыслу с функционалом headcrab и не требуют корректировок.


7-7: Строка с использованием { CAPITALIZE($entity) }.

Похоже, что она согласуется с предыдущими строками. Нет критических замечаний.


9-9: Уведомление о том, что headcrab кусает руку, кажется верным.

Связь с игровым событием выглядит логичной.

Content.Server/_White/Headcrab/HeadcrabComponent.cs (8)

1-5: Проверка импорта.

Импорты выглядят релевантными, лишних или пропущенных не замечено.


8-10: Объявление класса HeadcrabComponent.

Сама структура класса верна, атрибуты [Access(...)] и [RegisterComponent] используются по назначению.


12-16: Проверьте использование поля JumpAction во внешнем коде.

Логика определения экшенов через PrototypeIdSerializer корректна. Убедитесь, что внешний код действительно вызывает ActionHeadcrabJump.


18-19: Параметр ParalyzeTime.

Установлено значение по умолчанию 3 секунды, что кажется разумным для оглушения.


24-26: Параметр Damage выглядит корректно.

Требуемое поле со спецификатором урона. Нет замечаний.


32-32: Параметр Accumulator.

Нет замечаний: используется стандартная логика накопления.


34-36: Параметр DamageFrequency.

Имеет разумное значение по умолчанию (5).


37-38: Звуковой эффект HeadcrabJumpSound.

Значение по умолчанию задано корректно. Нет проблем.

Resources/Prototypes/_White/Guidebook/WWDP.yml (1)

1-6: Новый раздел guideEntry с полем children, содержащим WhiteAntagonist.

Прототип выглядит логичным для организации справочной информации. Нет дополнительных замечаний.

Resources/Prototypes/_White/Guidebook/WhiteAntagonist.yml (2)

3-9: Раздел WhiteAntagonist с дочерним элементом Headcrabs.

Структура YAML корректна, связанный файл Antagonist.xml указан верно.


12-19: Новый раздел Headcrabs содержит три варианта: Headcrab, HeadcrabFast и HeadcrabPoison.

Логика организации нескольких разновидностей headcrab внутри одного блока кажется удобной и расширяемой.

Resources/Prototypes/_White/Guidebook/Antags/headcrab.yml (1)

1-14: Проверка наличия файлов руководства

Структура записей корректна, но необходимо убедиться в наличии всех XML файлов руководства.

✅ Verification successful

Все файлы руководства присутствуют и корректно размещены

Проверка показала, что все необходимые XML-файлы руководства для хедкрабов существуют по указанным путям:

  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml
  • Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if all referenced XML files exist

for file in \
  "ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml" \
  "ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml" \
  "ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabPoison.xml"
do
  if [ ! -f "Resources/$file" ]; then
    echo "Missing file: $file"
  fi
done

Length of output: 1032


Script:

#!/bin/bash
# Let's try using fd to find XML files related to headcrabs
fd -e xml -p "Headcrab.*\.xml$" Resources/ServerInfo

Length of output: 379


Script:

#!/bin/bash
# Also check the general structure of ServerInfo directory
fd . Resources/ServerInfo

Length of output: 8412


Script:

#!/bin/bash
# Check if the directory exists
ls -la Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/ 2>/dev/null || echo "Directory not found"

Length of output: 384

Resources/Textures/_White/Mobs/Animals/headcrab.rsi/meta.json (1)

3-4: Проверка лицензии и авторских прав

Лицензия CC-BY-SA-3.0 указана корректно. Информация об авторских правах содержит ссылку на исходный код и редактора.

Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/HeadcrabFast.xml (1)

11-11: Проверка баланса игры

Дальность прыжка 5-10 метров может быть слишком большой для игрового баланса. Рекомендуется провести тестирование и возможно уменьшить это значение.

Resources/Prototypes/_White/GameRules/events.yml (1)

48-61: Проверка конфигурации события HeadcrabInvasion

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

  • Баланс веса события (8) относительно других событий
  • Достаточность времени подготовки (earliestStart: 15)
  • Существование прототипа SpawnHeadcrabNest
✅ Verification successful

Конфигурация события HeadcrabInvasion корректна

Проверка показала:

  • Прототип SpawnHeadcrabNest существует и корректно настроен для спавна HeadcrabNest
  • Вес события (8) соответствует весам других событий в файле (6-8)
  • Время подготовки в 15 минут и длительность в 1 минуту являются разумными значениями
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования прототипа SpawnHeadcrabNest
rg -l "id:\s*SpawnHeadcrabNest" "Resources/Prototypes"

Length of output: 121


Script:

#!/bin/bash
# Проверяем содержимое файла с прототипом SpawnHeadcrabNest
cat "Resources/Prototypes/_White/Entities/Markers/Spawners/headcrab.yml"

# Проверяем веса других событий для сравнения
rg "weight:\s+\d+" "Resources/Prototypes/_White/GameRules/events.yml" -A 1

Length of output: 1483

Resources/ServerInfo/_White/Guidebook/Antagonist/Headcrab/Headcrabs/Headcrab.xml (1)

15-17: Необходима верификация характеристик хедкраба

Указанные характеристики требуют проверки на соответствие реализации:

  • Урон: 2 режущего
  • Здоровье: 50 ХП
  • Скорость: -10%
Resources/Prototypes/_White/Actions/types.yml (1)

59-71: Проверка конфигурации прыжка хедкраба

Необходимо проверить:

  • Существование локализации для "jump-action-name" и "jump-action-description"
  • Наличие иконки в указанном пути
  • Баланс параметров useDelay и range
✅ Verification successful

Конфигурация прыжка хедкраба корректна

Проверка показала:

  • Локализация присутствует в обоих языках (ru-RU и en-US)
  • Иконка найдена по указанному пути Resources/Textures/_White/Interface/Actions/headcrab.rsi
  • Параметры useDelay (6 секунд) и range (160 единиц) выглядят сбалансированными для механики прыжка
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка локализации и ресурсов
echo "Checking localizations..."
rg "jump-action-(name|description)" "Resources/Locale"

echo "Checking icon existence..."
fd "headcrab.rsi" "Resources"

Length of output: 695

Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1)

129-130: Проверьте баланс скорости быстрого хедкраба

Увеличение скорости на 0.3 единицы может сделать быстрого хедкраба слишком эффективным в погоне за игроками.

Пожалуйста, протестируйте эти значения в игровых условиях для подтверждения баланса.

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: 3

🧹 Nitpick comments (3)
Content.Server/_White/Headcrab/HeadcrabComponent.cs (1)

24-26: Требуется документация для параметра Damage

Добавьте XML-документацию, описывающую структуру и назначение спецификации урона.

+/// <summary>
+/// Определяет типы и количество урона, наносимого хедкрабом
+/// </summary>
 [DataField("damage", required: true)]
 [ViewVariables(VVAccess.ReadWrite)]
 public DamageSpecifier Damage = default!;
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)

3-3: Удалите дублирующийся импорт

Импорт Content.Server.NPC.Components дублируется.

 using Content.Server.NPC.Components;
 using Content.Server.Nutrition.Components;
 using Content.Server.Nutrition.EntitySystems;
 using Content.Server.Popups;
-using Content.Server.NPC.Components;
 using Content.Server.NPC.Systems;

Also applies to: 7-7


223-254: Оптимизируйте метод Update

Метод Update содержит вложенную логику, которую можно упростить:

  1. Используйте раннее возвращение для уменьшения уровня вложенности
  2. Выделите логику обработки урона в отдельный метод
 public override void Update(float frameTime)
 {
     base.Update(frameTime);
+    foreach (var comp in EntityQuery<HeadcrabComponent>())
+    {
+        UpdateHeadcrabDamage(comp, frameTime);
+    }
 }

+private void UpdateHeadcrabDamage(HeadcrabComponent comp, float frameTime)
+{
+    comp.Accumulator += frameTime;
+    if (comp.Accumulator <= comp.DamageFrequency)
+        return;
+
+    comp.Accumulator = 0;
+    if (comp.EquippedOn is not { Valid: true } targetId)
+        return;
+
+    if (HasComp<ZombieComponent>(comp.EquippedOn))
+        return;
+
+    if (!TryProcessTargetState(comp, targetId))
+        return;
+
+    ApplyDamageAndEffects(comp, targetId);
+}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 50e0a8c and ef5c81d.

📒 Files selected for processing (4)
  • Content.Server/_White/Headcrab/HeadcrabComponent.cs (1 hunks)
  • Content.Server/_White/Headcrab/HeadcrabSystem.cs (1 hunks)
  • Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1 hunks)
  • Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Resources/Prototypes/_White/Entities/Structures/Other/headcrab_nest.yml
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml

[warning] 16-16: wrong indentation: expected 4 but found 2

(indentation)


[error] 20-20: trailing spaces

(trailing-spaces)


[warning] 90-90: wrong indentation: expected 6 but found 4

(indentation)


[warning] 95-95: wrong indentation: expected 6 but found 4

(indentation)


[warning] 97-97: wrong indentation: expected 6 but found 4

(indentation)


[warning] 103-103: wrong indentation: expected 6 but found 4

(indentation)


[warning] 111-111: wrong indentation: expected 4 but found 2

(indentation)


[warning] 117-117: wrong indentation: expected 6 but found 4

(indentation)


[warning] 124-124: wrong indentation: expected 4 but found 2

(indentation)


[warning] 133-133: wrong indentation: expected 6 but found 4

(indentation)


[warning] 140-140: wrong indentation: expected 4 but found 2

(indentation)


[warning] 157-157: wrong indentation: expected 6 but found 4

(indentation)

🔇 Additional comments (1)
Resources/Prototypes/_White/Entities/Mobs/NPCs/headcrab.yml (1)

35-38: Проверьте баланс параметров урона

Значение урона Piercing: 2 кажется низким для данного типа существа. Рекомендуется пересмотреть баланс урона с учетом игровой механики.

✅ Verification successful

Значение урона соответствует балансу игры

Анализ показывает, что значение урона Piercing: 2 для хедкраба является сбалансированным, учитывая:

  • Это базовое существо с относительно высокой скоростью передвижения (2.9/3.9)
  • Имеет специальную способность прыжка (jumpAction) и паралича (paralyzeTime: 3)
  • Другие варианты хедкрабов (poison) имеют аналогичный урон, но другого типа
  • Существо предназначено для массового появления и не должно быть слишком сильным индивидуально
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других сущностей с похожим уроном для сравнения
rg -A 2 "Piercing:" "Resources/Prototypes/_White/Entities/Mobs/"

Length of output: 572


Script:

#!/bin/bash
# Поиск других типов урона у мобов для сравнения
rg -A 2 "damage:" "Resources/Prototypes/_White/Entities/Mobs/"

Length of output: 965


Script:

#!/bin/bash
# Поиск всех файлов мобов для полного анализа
fd . "Resources/Prototypes/_White/Entities/Mobs/" -e yml -x cat {}

Length of output: 22080

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (1)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (1)

156-196: ⚠️ Potential issue

Оптимизируйте обработку попаданий

Метод OnMeleeHit использует return внутри цикла, что может привести к пропуску обработки других целей. Рекомендуется использовать continue для корректной обработки всех целей.

 foreach (var entity in args.HitEntities)
 {
     if (!HasComp<HumanoidAppearanceComponent>(entity))
-        return;
+        continue;

     if (TryComp(entity, out MobStateComponent? mobState))
     {
         if (mobState.CurrentState is not MobState.Alive)
         {
-            return;
+            continue;
         }
     }
🧹 Nitpick comments (2)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)

3-3: Удалите дублирующийся импорт

Импорт Content.Server.NPC.Components объявлен дважды. Удалите дублирующуюся строку.

using Content.Server.NPC.Components;
-using Content.Server.NPC.Components;

Also applies to: 7-7


90-99: Оптимизируйте отображение сообщений

Три похожих вызова PopupEntity можно объединить в один метод для уменьшения дублирования кода.

-_popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"),
-    args.Target, args.Target, PopupType.LargeCaution);
-
-_popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head",
-        ("entity", args.Target)),
-    uid, uid, PopupType.LargeCaution);
-
-_popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face",
-    ("entity", args.Target)), args.Target, Filter.PvsExcept(uid), true, PopupType.Large);
+private void ShowHeadcrabAttackPopups(EntityUid headcrab, EntityUid target)
+{
+    _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head"), 
+        target, target, PopupType.LargeCaution);
+    _popup.PopupEntity(Loc.GetString("headcrab-hit-entity-head", ("entity", target)),
+        headcrab, headcrab, PopupType.LargeCaution);
+    _popup.PopupEntity(Loc.GetString("headcrab-eat-other-entity-face", ("entity", target)),
+        target, Filter.PvsExcept(headcrab), true, PopupType.Large);
+}
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef5c81d and 74433ae.

📒 Files selected for processing (2)
  • Content.Server/_White/Headcrab/HeadcrabSystem.cs (1 hunks)
  • Content.Shared/_White/Headcrab/SharedHeadcrab.cs (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Shared/_White/Headcrab/SharedHeadcrab.cs
🔇 Additional comments (2)
Content.Server/_White/Headcrab/HeadcrabSystem.cs (2)

47-58: Подписки на события корректны

Метод Initialize правильно подписывается на все необходимые события для работы хедкраба.


238-240: ⚠️ Potential issue

Исправьте поток управления

Использование return вместо continue приведет к преждевременному выходу из метода Update и пропуску обработки остальных сущностей.

 if (HasComp<ZombieComponent>(comp.EquippedOn))
-    return;
+    continue;

Likely invalid or redundant comment.

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