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

Revert "Revert "Upstreams"" #577

Merged
merged 1 commit into from
Nov 10, 2024
Merged

Conversation

CrimeMoot
Copy link
Collaborator

@CrimeMoot CrimeMoot commented Nov 10, 2024

Reverts #570

Summary by CodeRabbit

  • Новые функции

    • Улучшено управление маркировкой частей тела, добавлены новые методы для применения и удаления маркировок.
    • В интерфейсе хирургии упрощено обновление UI и обработка сообщений.
    • Введены новые события для управления прикреплением и отсоединением частей тела.
    • Добавлены новые свойства для компонентов частей тела, включая вид и цвет глаз.
  • Исправления ошибок

    • Устранены проблемы с отображением и взаимодействием элементов интерфейса.
  • Документация

    • Обновлены комментарии и документация для улучшения понимания кода.
  • Общие улучшения

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

Copy link

coderabbitai bot commented Nov 10, 2024

Walkthrough

В данном пулл-реквесте внесены значительные изменения в несколько классов, касающихся системы хирургии и обработки частей тела. Основные изменения включают добавление новых методов и параметров для управления маркировками частей тела, упрощение логики обработки сообщений в интерфейсе хирургии, а также улучшение управления внешним видом гуманоидов. Также были добавлены новые события для обработки прикрепления и удаления частей тела, а также обновлены существующие компоненты и сущности для улучшения взаимодействия с игровыми механиками.

Changes

Файл Изменения
Content.Client/Backmen/Body/BodySystem.cs Добавлен метод ApplyMarkingToPart, обновлен метод ApplyPartMarkings, добавлен метод RemovePartMarkings (пока без реализации).
Content.Client/Backmen/Surgery/SurgeryBui.cs Удалена зависимость от HandsSystem, обновлен метод ReceiveMessage, упрощена логика обновления UI.
Content.Client/Backmen/Surgery/SurgerySystem.cs Удалено событие OnStep, изменен метод Initialize, удален метод OnRefresh.
Content.Client/Humanoid/HumanoidAppearanceSystem.cs Добавлен параметр overrideSkin в метод SetLayerData, обновлена логика применения цвета кожи.
Content.Server/Backmen/Surgery/SurgerySystem.cs Удалена подписка на событие PrototypesReloadedEventArgs, обновлен метод RefreshUI, добавлены проверки в методах взаимодействия.
Content.Server/Body/Systems/BodySystem.cs Обновлен метод GibBody, добавлены методы ApplyPartMarkings и RemovePartMarkings, закомментирован метод UpdateAppearance.
Content.Server/Destructible/Thresholds/Behaviors/GibBehavior.cs Добавлены поля GibType и GibContents, обновлен метод Execute.
Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs Добавлены новые свойства для визуальных слоев и маркировок.
Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs Обновлен метод InitializePartAppearances, добавлены новые методы для управления состоянием частей тела.
Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs Добавлены проверки для операций с частями тела, обновлены методы для управления шагами хирургии.
Content.Shared/Backmen/Surgery/SurgeryUI.cs Добавлен новый класс SurgeryBuiRefreshMessage.
Content.Shared/Body/Part/BodyPartComponent.cs Добавлены свойства Species и Sex.
Content.Shared/Body/Part/BodyPartEvents.cs Добавлены события BodyPartAttachedEvent и BodyPartDroppedEvent.
Content.Shared/Body/Systems/SharedBodySystem.Body.cs Добавлены новые подписки на события и обновлены методы инициализации.
Content.Shared/Body/Systems/SharedBodySystem.Parts.cs Обновлены методы для управления состоянием частей тела и их взаимодействиями.
Content.Shared/Body/Systems/SharedBodySystem.cs Добавлен вызов InitializePartAppearances в методе инициализации.
Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs Добавлен новый класс ProfileLoadFinishedEvent.
Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs Обновлен метод LoadProfile, добавлен метод SetTTSVoice.
Resources/Changelog/ChangelogBkm.yml Обновлен журнал изменений с новыми записями о исправлениях и улучшениях.
Resources/Locale/en-US/surgery/surgery-ui.ftl Изменено сообщение об ошибке, связанное с отсутствующими инструментами.
Resources/Prototypes/Body/Parts/skeleton.yml Добавлен компонент Destructible к PartSkeleton.
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml Добавлены новые сущности и обновлены существующие.
Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml Добавлена новая сущность PlayerSiliconHumanoidBase.
Resources/Prototypes/Entities/Mobs/Species/skeleton.yml Обновлены свойства сущностей Urist McSkelly и MobSkeletonPersonDummy.
Resources/Prototypes/_Backmen/Body/Parts/shadowkin.yml Обновлены компоненты PartShadowkin и производные сущности.
Resources/Prototypes/_Backmen/Entities/Objects/Misc/handcuffs.yml Удален атрибут breakoutTime из компонента Handcuff.
Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml Закомментировано поле requirement в SurgeryAttachHead, исправлена опечатка в SurgeryAttachLeftHand, закомментированы некоторые операции.

Poem

В норке новой, где светит луна,
Изменения ждут, как весна.
Системы хирургии, части тела,
В мире кодов — всё заиграло!
Пусть каждый код, как зайчонок, скачет,
Впереди — только радость и удача! 🐇✨


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

@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: 12

🧹 Outside diff range and nitpick comments (29)
Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs (1)

1-9: Реализация выглядит правильной!

Класс события корректно реализован и хорошо документирован. Он правильно наследуется от EntityEventArgs и помечен как sealed.

Предложение по улучшению:

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

 public sealed class ProfileLoadFinishedEvent : EntityEventArgs
 {
+    /// <summary>
+    /// Время, затраченное на загрузку профиля в миллисекундах
+    /// </summary>
+    public float LoadDurationMs { get; }
+
+    public ProfileLoadFinishedEvent(float loadDurationMs)
+    {
+        LoadDurationMs = loadDurationMs;
+    }
 }
Content.Server/Destructible/Thresholds/Behaviors/GibBehavior.cs (1)

19-19: Рекомендуется добавить документацию

Вызов метода корректно использует новые параметры, но было бы полезно добавить XML-документацию, объясняющую влияние различных типов GibType и GibContentsOption на поведение системы.

+    /// <summary>
+    /// Выполняет расчленение сущности с заданными параметрами.
+    /// </summary>
+    /// <param name="owner">Сущность для расчленения</param>
+    /// <param name="system">Система разрушения</param>
+    /// <param name="cause">Причина расчленения (опционально)</param>
     public void Execute(EntityUid owner, DestructibleSystem system, EntityUid? cause = null)
Content.Shared/Backmen/Surgery/SurgeryUI.cs (1)

18-21: Атрибуты корректны, но класс требует документации.

Класс правильно помечен атрибутами [Serializable] и [NetSerializable], что необходимо для сетевой сериализации.

Рекомендуется добавить XML-документацию, объясняющую назначение этого сообщения:

 [Serializable, NetSerializable]
+/// <summary>
+/// Сообщение, отправляемое для обновления интерфейса хирургии.
+/// </summary>
 public sealed class SurgeryBuiRefreshMessage : BoundUserInterfaceMessage
 {
 }
Content.Shared/Body/Part/BodyPartEvents.cs (1)

15-18: LGTM: Оптимизация обработки событий отсоединения частей тела

Добавление отдельного события для DropPart() - хорошее решение для оптимизации производительности, так как уменьшает количество срабатываний BodyPartRemovedEvent при работе PVS.

Рекомендуется добавить документацию, описывающую конкретные случаи использования BodyPartDroppedEvent vs BodyPartRemovedEvent для других разработчиков.

Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs (2)

12-16: Новое свойство Type требует документации использования.

Свойство Type определяет визуальный слой для части тела, но не указано, как это влияет на рендеринг и взаимодействие с другими компонентами.

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


18-22: Проверьте инициализацию словаря Markings.

Словарь инициализируется пустым, что может привести к проблемам при сериализации/десериализации. Рекомендуется добавить проверку на null.

-public Dictionary<HumanoidVisualLayers, List<Marking>> Markings = new();
+public Dictionary<HumanoidVisualLayers, List<Marking>> Markings { get; set; } = new();
Resources/Prototypes/Entities/Mobs/Species/skeleton.yml (1)

Line range hint 1-150: Рекомендации по архитектуре системы

Текущая реализация хорошо документирована и логически структурирована, однако есть несколько моментов для рассмотрения:

  1. Механика взаимодействия с молоком может быть вынесена в отдельный компонент для лучшей модульности
  2. Значения лечения (-2 для Burn, -1.5 для Brute) лучше вынести в конфигурационные параметры
  3. Рассмотрите возможность создания отдельного прототипа для реакций на молоко
Resources/Prototypes/_Backmen/Body/Parts/shadowkin.yml (1)

85-85: Рассмотрите добавление локализации для toolName

Все части тела используют английские названия в формате "a [part]". Рекомендуется:

  1. Добавить поддержку локализации для toolName
  2. Создать соответствующие ключи локализации в языковых файлах
- toolName: "a left arm"
+ toolName: "body-part-left-arm"  # Использовать ключ локализации

Also applies to: 107-107, 121-121, 135-135, 149-149, 163-163, 178-178, 193-193, 207-207

Content.Shared/Body/Part/BodyPartComponent.cs (2)

153-158: Рекомендуется добавить валидацию Species

Пустая строка по умолчанию для Species может привести к неопределенному поведению. Предлагаю добавить проверку на пустое значение или установить значение по умолчанию.

Пример реализации:

 [DataField, AutoNetworkedField]
-public string Species { get; set; } = "";
+public string Species
+{
+    get => _species;
+    set => _species = string.IsNullOrEmpty(value) ? "Unknown" : value;
+}
+private string _species = "Unknown";

159-163: Необходимо обновить документацию

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

Предлагаемый вариант:

-    /// Do not make a stupid joke do not make a stupid joke do not make a stupid joke.
+    /// Biological sex of the body part. Affects appearance and other characteristics.
Content.Server/Backmen/Surgery/SurgerySystem.cs (3)

81-83: Комментарий в коде может быть улучшен

Текущий комментарий описывает проблему с откатом состояния BUI, но использует неформальный язык ("I love shitcode"). Рекомендуется переписать комментарий более профессионально.

-            /* Reason we do this is because when applying a BUI State, it rolls back the state on the entity temporarily,
-            which just so happens to occur right as we're checking for step completion, so we end up with the UI
-            not updating at all until you change tools or reopen the window. I love shitcode. */
+            /* При применении BUI State происходит временный откат состояния сущности,
+            что совпадает с проверкой завершения шага операции. Это приводит к тому,
+            что UI не обновляется до смены инструмента или переоткрытия окна.
+            Данный вызов обеспечивает принудительное обновление UI. */

Line range hint 153-171: Улучшить обработку специального урона

Текущая реализация использует магические строки для типов урона ("Rot", "Eye"). Рекомендуется вынести эти значения в константы или перечисление.

+    private const string ROT_DAMAGE_TYPE = "Rot";
+    private const string EYE_DAMAGE_TYPE = "Eye";

     private void OnSurgerySpecialDamageChange(Entity<SurgerySpecialDamageChangeEffectComponent> ent, ref SurgeryStepEvent args)
     {
         // ... existing code ...

-        if (ent.Comp.DamageType == "Rot")
+        if (ent.Comp.DamageType == ROT_DAMAGE_TYPE)
         {
             _rot.ReduceAccumulator(args.Body, TimeSpan.FromSeconds(2147483648));
         }
-        else if (ent.Comp.DamageType == "Eye")
+        else if (ent.Comp.DamageType == EYE_DAMAGE_TYPE)
         {
             // ... existing code ...
         }
     }

Line range hint 193-197: Рассмотреть добавление журналирования для отладки

В методе OnStepScreamComplete рекомендуется добавить журналирование для упрощения отладки в случае проблем с эмоциями.

     private void OnStepScreamComplete(Entity<SurgeryStepEmoteEffectComponent> ent, ref SurgeryStepEvent args)
     {
+        Log.Debug($"Attempting to emote {ent.Comp.Emote} for entity {args.Body}");
         if (!HasComp<ForcedSleepingComponent>(args.Body))
             _chat.TryEmoteWithChat(args.Body, ent.Comp.Emote);
     }
Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml (3)

37-53: Необходимо принять решение по закомментированным компонентам

Закомментированные компоненты Recyclable, EyeProtection и Silicon содержат важную функциональность. Рекомендуется:

  • Определить необходимость каждого компонента
  • Добавить TODO комментарии с объяснением, почему они отключены
  • Создать задачу для реализации необходимых компонентов

Хотите, чтобы я создал GitHub issue для отслеживания этой задачи?


83-141: Оптимизировать структуру слоев спрайта

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

  • Группировать связанные слои
  • Использовать атлас текстур
  • Рассмотреть возможность кэширования составных спрайтов

142-157: Рассмотреть альтернативу системе кровотока

Закомментированная система Bloodstream может быть заменена более подходящей для роботов системой:

  • Система охлаждающей жидкости
  • Система смазки
  • Система энергии
Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml (1)

Line range hint 1-447: Общие замечания по структуре файла

В файле присутствует комментарий разработчика о сложности поддержки хирургической системы BUI. Рекомендуется:

  1. Создать задачу для рефакторинга системы
  2. Рассмотреть возможность использования наследования для уменьшения дублирования кода
  3. Перенести общие органы в shared прототипы, как указано в комментарии

Желаете, чтобы я создал issue для отслеживания этих улучшений?

Content.Client/Humanoid/HumanoidAppearanceSystem.cs (1)

77-78: Добавьте документацию для новых параметров

Новые параметры color и overrideSkin играют важную роль в управлении отображением слоев. Рекомендуется добавить XML-документацию, объясняющую:

  • Назначение параметра overrideSkin
  • Взаимодействие между color и overrideSkin
  • Случаи использования каждого параметра

Пример документации:

 private void SetLayerData(
     HumanoidAppearanceComponent component,
     SpriteComponent sprite,
     HumanoidVisualLayers key,
     string? protoId,
     bool sexMorph = false,
+    /// <param name="color">Явный цвет для слоя. Если указан, переопределяет цвет кожи.</param>
+    /// <param name="overrideSkin">Если true, игнорирует цвет кожи даже для слоев с MatchSkin=true.</param>
     Color? color = null,
     bool overrideSkin = false)
Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs (1)

308-309: Добавьте документацию к новому событию

Реализация события BodyPartAttachedEvent корректна, но рекомендуется добавить XML-документацию, описывающую назначение события и его параметры.

Content.Client/Backmen/Body/BodySystem.cs (2)

45-55: Добавьте логирование при использовании цвета по умолчанию

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


67-76: Удалите неиспользуемую переменную visualLayer

Переменная visualLayer объявлена в цикле foreach, но нигде не используется внутри блока. Это может вызывать путаницу и снижает читаемость кода.

Примените следующий дифф для удаления неиспользуемой переменной:

-            foreach (var (visualLayer, markingList) in component.Markings)
+            foreach (var markingList in component.Markings.Values)
Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs (3)

24-24: Пожалуйста, удалите или измените неподобающий комментарий.

Комментарий на этой строке содержит выражения, которые могут быть сочтены непрофессиональными. Рекомендуется переписать комментарий более нейтрально, чтобы он отражал суть проблемы и сохранял профессиональный тон.


26-31: Улучшите читаемость сложного условного выражения.

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

Предлагаемый вариант:

if (!TryComp(uid, out BodyPartComponent? part))
    return;

if (part.OriginalBody == null || TerminatingOrDeleted(part.OriginalBody.Value))
    return;

if (!TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance))
    return;

if (HumanoidVisualLayersExtension.ToHumanoidLayers(part) is not { } relevantLayer)
    return;

73-73: Пожалуйста, удалите или измените неподобающий комментарий.

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

Content.Client/Backmen/Surgery/SurgeryBui.cs (2)

45-46: Рекомендуется использовать фигурные скобки в условном операторе if.

Даже для однострочных блоков использование фигурных скобок повышает читабельность и предотвращает возможные ошибки при дальнейшем изменении кода.

Предлагаю изменить код следующим образом:

 if (_window == null)
-    return;
+{
+    return;
+}

48-49: Рекомендуется использовать фигурные скобки в условном операторе if.

Использование фигурных скобок улучшает читаемость и снижает риск ошибок при добавлении новых строк к условию.

Предлагаю изменить код следующим образом:

 if (message is SurgeryBuiRefreshMessage)
-    RefreshUI();
+{
+    RefreshUI();
+}
Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (1)

Line range hint 475-483: Переместить присвоение humanoid.Voice вне блока проверки компонента TTSComponent

В методе SetTTSVoice, присвоение humanoid.Voice = voiceId; происходит внутри блока проверки наличия компонента TTSComponent. Рекомендуется вынести это присвоение вне данного блока, чтобы свойство humanoid.Voice всегда обновлялось, независимо от наличия компонента TTSComponent.

Content.Shared/Body/Systems/SharedBodySystem.Parts.cs (2)

175-177: Удалите неуместный комментарий на строке 176

Комментарий содержит ненормативную лексику и является непрофессиональным. Рекомендуется удалить его или заменить на более подходящее объяснение.

Примените следующий дифф для удаления комментария:

-            // though I really just want the compiler to shut the fuck up.

642-645: Рефакторинг повторяющегося кода для улучшения читаемости

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

Примените следующий рефакторинг:

private void EnsureBodyPartAppearanceComponent(EntityUid partId, EntityUid body)
{
    if (TryComp(body, out HumanoidAppearanceComponent? bodyAppearance)
        && !HasComp<BodyPartAppearanceComponent>(partId)
        && !TerminatingOrDeleted(body)
        && !TerminatingOrDeleted(partId))
    {
        EnsureComp<BodyPartAppearanceComponent>(partId);
    }
}

Затем вызовите этот метод в необходимых местах:

-                if (TryComp(body, out HumanoidAppearanceComponent? bodyAppearance)
-                    && !HasComp<BodyPartAppearanceComponent>(partEnt)
-                    && !TerminatingOrDeleted(body)
-                    && !TerminatingOrDeleted(partEnt))
-                    EnsureComp<BodyPartAppearanceComponent>(partEnt);
+                EnsureBodyPartAppearanceComponent(partEnt, body);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 4bdcaa6 and 7409c32.

📒 Files selected for processing (27)
  • Content.Client/Backmen/Body/BodySystem.cs (1 hunks)
  • Content.Client/Backmen/Surgery/SurgeryBui.cs (2 hunks)
  • Content.Client/Backmen/Surgery/SurgerySystem.cs (0 hunks)
  • Content.Client/Humanoid/HumanoidAppearanceSystem.cs (3 hunks)
  • Content.Server/Backmen/Surgery/SurgerySystem.cs (2 hunks)
  • Content.Server/Body/Systems/BodySystem.cs (4 hunks)
  • Content.Server/Destructible/Thresholds/Behaviors/GibBehavior.cs (2 hunks)
  • Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs (1 hunks)
  • Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs (1 hunks)
  • Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs (2 hunks)
  • Content.Shared/Backmen/Surgery/SurgeryUI.cs (1 hunks)
  • Content.Shared/Body/Part/BodyPartComponent.cs (3 hunks)
  • Content.Shared/Body/Part/BodyPartEvents.cs (1 hunks)
  • Content.Shared/Body/Systems/SharedBodySystem.Body.cs (8 hunks)
  • Content.Shared/Body/Systems/SharedBodySystem.Parts.cs (2 hunks)
  • Content.Shared/Body/Systems/SharedBodySystem.cs (1 hunks)
  • Content.Shared/Humanoid/Events/ProfileLoadFinishedEvent.cs (1 hunks)
  • Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (2 hunks)
  • Resources/Changelog/ChangelogBkm.yml (1 hunks)
  • Resources/Locale/en-US/surgery/surgery-ui.ftl (1 hunks)
  • Resources/Prototypes/Body/Parts/skeleton.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Species/skeleton.yml (1 hunks)
  • Resources/Prototypes/_Backmen/Body/Parts/shadowkin.yml (11 hunks)
  • Resources/Prototypes/_Backmen/Entities/Objects/Misc/handcuffs.yml (0 hunks)
  • Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml (2 hunks)
💤 Files with no reviewable changes (2)
  • Content.Client/Backmen/Surgery/SurgerySystem.cs
  • Resources/Prototypes/_Backmen/Entities/Objects/Misc/handcuffs.yml
✅ Files skipped from review due to trivial changes (1)
  • Resources/Locale/en-US/surgery/surgery-ui.ftl
🔇 Additional comments (41)
Content.Server/Destructible/Thresholds/Behaviors/GibBehavior.cs (2)

2-2: Корректное добавление зависимости!

Добавление пространства имен для событий gibbing логично дополняет новую функциональность.


11-12: Проверьте корректность значений перечислений

Новые поля правильно оформлены, но стоит убедиться, что значения по умолчанию GibType.Gib и GibContentsOption.Drop соответствуют ожидаемому поведению.

✅ Verification successful

Значения перечислений корректны и соответствуют ожидаемому поведению

Значения по умолчанию GibType.Gib и GibContentsOption.Drop являются валидными членами соответствующих перечислений и логически согласуются с их предназначением:

  • GibType.Gib - один из трёх вариантов: Skip, Drop, Gib
  • GibContentsOption.Drop - один из трёх вариантов: Skip, Drop, Gib
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка определений перечислений
rg -A 10 "enum (GibType|GibContentsOption)"

Length of output: 786

Content.Shared/Body/Part/BodyPartEvents.cs (1)

8-10: LGTM: Корректное добавление события для хирургического присоединения

Событие правильно реализовано и соответствует существующим паттернам. Использование атрибута [ByRefEvent] и Entity обеспечивает оптимальную производительность и типобезопасность.

Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs (3)

9-9: Изменение в атрибуте AutoGenerateComponentState требует внимания.

Добавление параметра true в AutoGenerateComponentState может повлиять на сетевую синхронизацию компонента. Убедитесь, что все сетевые события обрабатываются корректно.


1-1: Проверьте необходимость новых using директив.

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

Also applies to: 3-3

✅ Verification successful

Директива using Content.Shared.Humanoid необходима и используется корректно

Анализ показывает, что импорт Content.Shared.Humanoid активно используется в компоненте для доступа к:

  • Перечислению HumanoidVisualLayers
  • Другим типам из пространства имен Humanoid

Компонент содержит несколько полей и свойств, которые напрямую зависят от этого пространства имен, включая:

  • Type типа HumanoidVisualLayers
  • Markings использующий HumanoidVisualLayers в качестве ключа
  • Ссылки на HumanoidSpeciesSpriteLayer в документации
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования новых пространств имен
rg -l "Content\.Shared\.Humanoid\.Prototypes\." --type cs
rg -l "Content\.Shared\.Humanoid\.Markings\." --type cs

Length of output: 117


Script:

#!/bin/bash
# Поиск использования типов из пространства имен Humanoid
rg "using Content\.Shared\.Humanoid" --type cs -A 5

# Поиск использования типов Humanoid в файле
rg "Humanoid" "Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs"

# Проверка содержимого файла
cat "Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs"

Length of output: 73748


42-42: Свойство OriginalBody требует дополнительной валидации.

Ссылка на оригинальное тело может стать недействительной. Необходимо добавить обработку случая, когда оригинальное тело уничтожено.

✅ Verification successful

Проверка ссылки на оригинальное тело реализована корректно

В системе SharedBodySystem уже реализована проверка на недействительность ссылки на оригинальное тело в методе OnPartAppearanceStartup:

if (!TryComp(uid, out BodyPartComponent? part)
    || part.OriginalBody == null
    || TerminatingOrDeleted(part.OriginalBody.Value)
    || !TryComp(part.OriginalBody.Value, out HumanoidAppearanceComponent? bodyAppearance)
    ...

Код проверяет:

  • Наличие ссылки на оригинальное тело (part.OriginalBody == null)
  • Уничтожение оригинального тела (TerminatingOrDeleted(part.OriginalBody.Value))
  • Наличие необходимых компонентов
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск обработки уничтожения тела
rg "OriginalBody.*null" --type cs
rg "EntityDeleted.*OriginalBody" --type cs

Length of output: 192


Script:

#!/bin/bash
# Поиск использования OriginalBody в системах и компонентах
ast-grep --pattern 'OriginalBody'

# Поиск обработчиков удаления сущностей в системах хирургии
rg "EntityDeleted|OnRemove" -A 5 --type cs Content.Shared/Backmen/Surgery/

Length of output: 33


Script:

#!/bin/bash
# Поиск файла компонента для просмотра полного контекста
cat Content.Shared/Backmen/Surgery/Body/BodyPartAppearanceComponent.cs

# Поиск связанных систем
fd ".*System.*\.cs$" Content.Shared/Backmen/Surgery/

Length of output: 2257


Script:

#!/bin/bash
# Проверим содержимое системных файлов на предмет обработки OriginalBody
cat Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs
cat Content.Shared/Backmen/Surgery/Body/SharedBodySystem.Integrity.cs

Length of output: 20759

Content.Shared/Body/Systems/SharedBodySystem.cs (2)

46-47: Проверьте влияние очереди задач на инициализацию внешнего вида.

Комментарий указывает на использование очереди задач для снижения нагрузки при проверке целостности. Убедитесь, что инициализация внешнего вида частей тела правильно интегрируется с этой системой очередей.


47-47: Проверить реализацию InitializePartAppearances.

Необходимо убедиться, что метод InitializePartAppearances корректно реализован в частичном классе, учитывая его важность для инициализации системы.

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

✅ Verification successful

Метод InitializePartAppearances корректно реализован

Реализация метода найдена в файле Content.Shared/Backmen/Surgery/Body/SharedBodySystem.PartAppearance.cs. Метод:

  • Является частью частичного класса SharedBodySystem
  • Корректно инициализирует базовый класс через base.Initialize()
  • Подписывается на необходимые события:
    • ComponentStartup для BodyPartAppearanceComponent
    • AfterAutoHandleStateEvent для обработки состояния
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Описание: Поиск реализации метода InitializePartAppearances

# Поиск файла с реализацией метода
echo "Поиск файла с реализацией InitializePartAppearances:"
ast-grep --pattern 'partial class SharedBodySystem {
  $$$
  void InitializePartAppearances() {
    $$$
  }
  $$$
}'

# Поиск связанных событий
echo -e "\nПоиск обработчиков событий:"
rg "BodyPartAttachedEvent|BodyPartDroppedEvent|AfterAutoHandleStateEvent" -A 3

Length of output: 233


Script:

#!/bin/bash
# Поиск реализации InitializePartAppearances с более широким контекстом
echo "Поиск реализации InitializePartAppearances во всех файлах:"
rg "InitializePartAppearances" -A 5

# Поиск всех файлов, связанных с SharedBodySystem
echo -e "\nПоиск файлов SharedBodySystem:"
fd "SharedBodySystem"

# Поиск использования метода
echo -e "\nПоиск вызовов InitializePartAppearances:"
rg "InitializePartAppearances\(" -A 2

Length of output: 2359

Resources/Prototypes/Entities/Mobs/Species/skeleton.yml (1)

44-45: Проверьте влияние параметра gibContents: Skip

Добавление параметра gibContents: Skip может существенно повлиять на игровой процесс. Убедитесь, что это изменение:

  1. Не нарушает баланс игры
  2. Соответствует ожидаемому поведению скелетов
  3. Корректно обрабатывается серверной логикой

Давайте проверим использование этого параметра в других файлах:

✅ Verification successful

Параметр gibContents: Skip корректно используется в системе

Анализ кода показывает, что:

  1. Параметр gibContents: Skip уже используется в других сущностях (например, в animals.yml)
  2. Компонент GibBehavior имеет встроенную поддержку этого параметра через поле GibContents
  3. Значение по умолчанию - Drop, поэтому явное указание Skip для скелетов является осознанным выбором
  4. Изменение соответствует логике, так как скелеты имеют меньший порог урона (150) по сравнению с базовыми мобами (400)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других сущностей с GibBehavior для сравнения
rg -l "!type:GibBehavior" "Resources/Prototypes/Entities"

# Поиск связанной серверной логики
ast-grep --pattern 'class $_ {
  $$$
  GibBehavior($_) {
    $$$
  }
  $$$
}'

Length of output: 348


Script:

#!/bin/bash
# Проверим содержимое файлов с GibBehavior для сравнения реализации
rg -B2 -A2 "!type:GibBehavior" "Resources/Prototypes/Entities/Mobs/"

# Поищем определение компонента GibBehavior
fd -e cs -e yaml "GibBehavior" --exec cat {}

Length of output: 2918

Resources/Prototypes/_Backmen/Body/Parts/shadowkin.yml (3)

14-55: Проверьте балансировку урона и поведение разрушения

Новая конфигурация компонента Destructible добавляет сложную систему повреждений с различными порогами:

  • Тупой урон: 50
  • Режущий урон: 100
  • Тепловой урон: 200

Рекомендуется проверить:

  1. Соответствие порогов урона общему балансу игры
  2. Корректность работы GibPartBehavior
  3. Целесообразность спавна пепла при тепловом уроне

Line range hint 163-178: Проверьте компоненты движения для ног и ступней

Обнаружена потенциальная несогласованность:

  • Ноги имеют компонент MovementBodyPart
  • Ступни не имеют компонентов, связанных с движением

Необходимо уточнить:

  1. Должны ли ступни также влиять на движение
  2. Как отсутствие ступней влияет на мобильность персонажа

Also applies to: 193-207


68-69: ⚠️ Potential issue

Проверьте корректность атрибутов жизненно важных органов

Обратите внимание на следующие важные изменения:

  • Добавлен атрибут vital: true для головы
  • Добавлен containerName: "torso_slot" для торса

Убедитесь, что:

  1. Система хирургии корректно обрабатывает vital части тела
  2. Слот торса правильно интегрируется с существующей системой инвентаря

Also applies to: 85-86

Resources/Prototypes/Body/Parts/skeleton.yml (2)

21-49: Проверьте последствия наследования для специальных частей

Особое внимание следует обратить на сущность HeadSkeleton, которая имеет дополнительные компоненты (Speech, Input, Actions и др.). Текущая реализация Destructible может повлиять на функциональность этих компонентов.

#!/bin/bash
# Поиск специальных обработчиков для частей скелета
rg "HeadSkeleton" "Content/Server/"

# Проверка систем, взаимодействующих с компонентами головы
ast-grep --pattern 'class $_ : ISystem {
  $$$
  Head$_($$$) {
    $$$
  }
  $$$
}'

Also applies to: 77-106


21-49: Проверьте баланс урона и поведение компонента Destructible

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

  1. Пороговые значения урона (50/100/200) кажутся несбалансированными относительно друг друга. Возможно, стоит рассмотреть более равномерное распределение.

  2. Поведение при достижении порога Heat (200) включает спавн пепла и звуковой эффект, что логично, но стоит убедиться, что контейнер не переполнится при множественном срабатывании.

Рекомендуется:

  1. Вынести значения порогов урона в отдельный конфигурационный файл для упрощения балансировки
  2. Добавить документацию по взаимодействию различных типов урона
✅ Verification successful

Let's analyze the damage thresholds and behaviors in other body part prototypes to make a more informed decision about the balance.


Пороги урона для скелетных частей соответствуют базовым значениям

После анализа кодовой базы можно сделать следующие выводы:

  1. Значения порогов урона (50/100/200) для компонента Destructible в skeleton.yml полностью соответствуют базовым значениям, определенным в base.yml для всех частей тела.

  2. Поведение при различных типах урона (Blunt, Slash, Heat) логично структурировано и соответствует общей механике игры, что подтверждается анализом других прототипов с компонентом Destructible.

  3. Механика спавна пепла и воспроизведения звука при тепловом уроне является стандартной практикой, что видно из множества других прототипов в кодовой базе.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем использование аналогичных порогов урона в других прототипах

# Поиск других прототипов с компонентом Destructible
rg -l "type: Destructible" "Resources/Prototypes"

# Поиск конкретных значений порогов урона
rg "damage: (50|100|200)" "Resources/Prototypes"

Length of output: 175


Script:

#!/bin/bash
# Search for Destructible components in YAML files
rg -l "type: Destructible" --type yaml

# Search for damage thresholds in YAML files
rg "damage: (50|100|200)" --type yaml

# Search specifically for skeleton-related prototypes
rg -l "PartSkeleton" --type yaml

# Look for other body part prototypes with Destructible
rg "type: Destructible" "Resources/Prototypes/Body/Parts/" -C 5

Length of output: 49077

Content.Server/Body/Systems/BodySystem.cs (2)

112-114: Корректное расширение функциональности метода GibBody!

Добавление параметров GibType и GibContentsOption с значениями по умолчанию - это хорошее решение, которое расширяет возможности управления процессом уничтожения тела, сохраняя обратную совместимость.

Also applies to: 128-129


181-191: Проверьте синхронизацию с клиентом

Реализация RemovePartMarkings выглядит корректно, но параметр sync: false в вызове RemoveMarking может привести к рассинхронизации состояния между сервером и клиентом. Убедитесь, что это ожидаемое поведение.

Content.Shared/Body/Part/BodyPartComponent.cs (1)

11-11: Добавление пространства имен выглядит корректно!

Добавление Content.Shared.Humanoid необходимо для использования перечисления Sex и потенциально других функций, связанных с гуманоидами.

Content.Server/Backmen/Surgery/SurgerySystem.cs (2)

109-109: Добавлена важная проверка компонента цели операции

Добавление проверки SurgeryTargetComponent является критически важным изменением, которое предотвращает выполнение хирургических действий на неподходящих целях.


Line range hint 173-191: Проверить корректность восстановления части тела

В методе OnStepAffixPartComplete используется множитель 2 для исцеления (healing * 2). Необходимо убедиться, что это значение корректно и не приводит к чрезмерному восстановлению здоровья.

✅ Verification successful

Let me search for more context about healing mechanics to better understand if this multiplier is reasonable.


Let me check the implementation of GetHealingSpecifier to understand the base healing values.


Множитель исцеления x2 является обоснованным

Анализ кода показывает, что множитель 2 для исцеления в методе OnStepAffixPartComplete является корректным по следующим причинам:

  • Базовое исцеление (GetHealingSpecifier) уже сбалансировано и имеет встроенные ограничения:
    • Использует SelfHealingAmount компонента части тела
    • Имеет пониженный коэффициент (0.1) для химического урона
    • Включает защиту от избыточного лечения через ClampMin(partEnt.Comp.MinIntegrity)
  • Двойное исцеление при хирургическом вмешательстве логично компенсирует серьезный урон, получаемый при отсечении части тела
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других мест использования множителей исцеления
rg -A 2 "GetHealingSpecifier.*\*\s*[0-9]+"

Length of output: 443


Script:

#!/bin/bash
# Поиск определения GetHealingSpecifier и связанных методов
ast-grep --pattern 'GetHealingSpecifier($_) {
  $$$
}'

# Поиск других методов, связанных с исцелением частей тела
rg -A 5 "TryChangeIntegrity|GetHealingSpecifier"

# Поиск тестов, связанных с исцелением
fd "test" -e cs -x rg -l "healing|TryChangeIntegrity|GetHealingSpecifier" {}

Length of output: 5782


Script:

#!/bin/bash
# Поиск содержимого GetHealingSpecifier для понимания базовых значений лечения
cat Content.Shared/Backmen/Surgery/Body/SharedBodySystem.Integrity.cs

# Поиск использования множителей урона в других местах для сравнения
rg "DamageSpecifier.*\*\s*[0-9]+" -A 2

Length of output: 14526

Resources/Prototypes/Entities/Mobs/Player/silicon_base.yml (1)

1-6: Базовая конфигурация сущности требует уточнения

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

  • Добавить документацию, описывающую назначение каждого родительского типа
  • Проверить необходимость всех родительских типов, особенно MobFlammable, учитывая природу силиконовой сущности
Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml (2)

152-152: Исправлена опечатка в названии

Корректное исправление опечатки в названии операции с "Left Han" на "Left Hand".


Line range hint 236-252: Проверьте влияние удаления SurgeryAlienEmbryoRemoval

Сущность SurgeryAlienEmbryoRemoval закомментирована. Необходимо убедиться, что:

  1. Это намеренное изменение
  2. Все зависимые системы обновлены соответствующим образом
  3. Нет оставшихся ссылок на эту операцию в других частях кода
✅ Verification successful

Удаление SurgeryAlienEmbryoRemoval безопасно

Поиск по кодовой базе показал, что все упоминания SurgeryAlienEmbryoRemoval и связанных терминов находятся только в файле surgeries.yml, где эта сущность была закомментирована. Отсутствие ссылок в других файлах указывает на то, что удаление этой операции не повлияет на другие части системы.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск возможных ссылок на удаленную операцию
rg "SurgeryAlienEmbryoRemoval|Alien Embryo Removal" --type-not yml

Length of output: 190


Script:

#!/bin/bash
# Поиск возможных ссылок на удаленную операцию во всех файлах
rg -i "SurgeryAlienEmbryoRemoval|Alien Embryo Removal"

# Поиск файлов с возможными ссылками на эмбрионы пришельцев
rg -i "alien.*embryo|embryo.*alien"

Length of output: 583

Resources/Changelog/ChangelogBkm.yml (1)

226-235: Запись в changelog корректна!

Запись правильно структурирована и содержит всю необходимую информацию о исправлении проблемы с отображением Popup на мягких наручниках.

Content.Client/Humanoid/HumanoidAppearanceSystem.cs (1)

58-59: Правильное исправление игнорирования цвета кожи!

Важное исправление, которое решает проблему с неправильной обработкой цвета кожи для пользовательских базовых слоев. Комментарий хорошо объясняет причину изменения.

Content.Shared/Backmen/Surgery/SharedSurgerySystem.Steps.cs (1)

163-174: Проверка брони реализована корректно!

Реализация проверки наличия брони в целевых слотах выполнена правильно. Код использует контейнерный энумератор и корректно обрабатывает локализованные сообщения об ошибках.

Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (1)

403-404: Проверьте логику гибели таракана

Добавление GibBehavior с параметром gibContents: Skip означает, что при получении значительного дробящего урона таракан будет уничтожен без создания внутренних предметов. Убедитесь, что это соответствует желаемому игровому поведению.

✅ Verification successful

Поведение таракана соответствует существующей механике

Параметр gibContents: Skip уже используется в других сущностях игры (например, в скелетах), что указывает на устоявшийся паттерн для существ, которые не должны оставлять после уничтожения внутренние предметы. Такое поведение логично для таракана и соответствует общей механике игры.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем, есть ли другие сущности с похожей конфигурацией
rg --type yaml "GibBehavior.*\n.*gibContents:\s*Skip"

Length of output: 247


Script:

#!/bin/bash
# Проверяем сущности с GibBehavior и параметром Skip, используя multiline режим
rg -U --type yaml "GibBehavior.*[\n\r].*gibContents:\s*Skip"

# Поиск других сущностей с GibBehavior для сравнения
rg -U --type yaml "GibBehavior.*[\n\r].*gibContents:"

Length of output: 758

Content.Client/Backmen/Body/BodySystem.cs (1)

33-35: Проверьте правильность индекса слоя при добавлении спрайта

В методе AddLayer вы используете j + 1 в качестве индекса слоя. Убедитесь, что это соответствует вашей системе слоев и не приводит к нежелательным последствиям в отображении спрайтов.

Content.Shared/Body/Systems/SharedBodySystem.Body.cs (9)

16-17: Добавлены необходимые пространства имён

Новые using директивы Content.Shared.Humanoid.Events и Content.Shared.Humanoid.Prototypes корректно импортированы для использования соответствующих компонентов и событий.


58-58: Подписка на событие ProfileLoadFinishedEvent успешно реализована

Подписка на локальное событие позволит корректно обработать завершение загрузки профиля для BodyComponent.


132-132: Установка свойства OriginalBody для корневой части тела

Свойство OriginalBody корректно присвоено rootPart, что позволит отслеживать исходное тело для каждой части.


136-136: Вызов метода MapInitParts обновлён

Метод MapInitParts вызывается с правильными параметрами (rootPartUid, rootPart, prototype) для инициализации частей тела.


Line range hint 190-230: Обновление метода MapInitParts и установка OriginalBody для дочерних частей

В методе MapInitParts свойство OriginalBody устанавливается для каждой дочерней части тела, обеспечивая целостность данных и отслеживание оригинального тела.


370-372: Добавлены параметры для расширения функциональности метода GibBody

Нововведенные параметры gibSoundOverride, gib и contents в методе GibBody позволяют более гибко управлять процессом гиббирования и его последствиями.


389-389: Актуализация вызова метода _gibbingSystem.TryGibEntityWithRef

Вызов метода обновлен в соответствии с новыми параметрами, что обеспечивает корректное функционирование гиббирования с учетом новых возможностей.


460-463: Убедитесь в корректной инициализации компонента BodyPartAppearanceComponent

При добавлении компонента BodyPartAppearanceComponent к каждой части тела важно гарантировать, что все необходимые свойства инициализированы правильно для предотвращения возможных ошибок при отображении.

Проверьте, что все компоненты BodyPartAppearanceComponent настроены корректно и не вызывают нежелательных последствий в дальнейшем.


456-458: ⚠️ Potential issue

Исправьте синтаксическую ошибку в условном операторе

В условии отсутствует закрывающая скобка, что приведет к ошибке компиляции.

Примените следующий дифф для исправления:

-if (!TryComp<HumanoidAppearanceComponent>(uid, out var appearance)
+if (!TryComp<HumanoidAppearanceComponent>(uid, out var appearance))

Likely invalid or redundant comment.

Content.Shared/Humanoid/SharedHumanoidAppearanceSystem.cs (2)

Line range hint 421-452: Изменение метода LoadProfile на virtual

Добавление ключевого слова virtual к методу LoadProfile позволяет подклассам переопределять его. Убедитесь, что это изменение не приведет к неожиданному поведению в наследующих классах и что все переопределения корректно реализованы.


452-452: Проверка инициализации свойства profile.Voice

При вызове SetTTSVoice(uid, profile.Voice, humanoid); необходимо убедиться, что profile.Voice не является null или пустой строкой, чтобы избежать возможных ошибок во время выполнения.

Content.Shared/Body/Systems/SharedBodySystem.Parts.cs (3)

181-183: Корректное отключение части тела

Отправка события BodyPartEnableChangedEvent(false) на partEnt соответствует логике отключения части тела при ее отделении и обеспечивает правильное информирование связанных систем.


184-189: Проверка и добавление компонента внешности части тела

Логика условной проверки наличия компонента BodyPartAppearanceComponent и его добавление при необходимости корректна. Это гарантирует, что внешность отделенной части тела будет правильно отображаться.


192-193: Отправка события о выпадении части тела

Создание и отправка события BodyPartDroppedEvent на body обеспечивает корректное уведомление системы о том, что часть тела была отделена, что важно для последующей обработки в системе.

Comment on lines +36 to +40
/// <summary>
/// Color of this custom base eye layer. Null implies eye colour if the corresponding <see cref="HumanoidSpeciesSpriteLayer"/> is set to match skin.
/// </summary>
[DataField, AutoNetworkedField]
public Color? EyeColor { get; set; }
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Добавление EyeColor требует синхронизации с существующим Color.

Новое свойство EyeColor дублирует логику Color. Рекомендуется объединить логику обработки цветов в отдельный метод.

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

Comment on lines +176 to +179
protected override void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component)
{
return;
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Реализуйте метод ApplyPartMarkings

Пустая реализация метода ApplyPartMarkings требует доработки. Метод должен применять маркировки к частям тела, аналогично тому, как это реализовано в клиентской части.

Нужна помощь в реализации этого метода?

Comment on lines +171 to +174
/*protected override void UpdateAppearance(EntityUid uid, BodyPartAppearanceComponent component)
{
return;
}*/
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Удалите закомментированный код

Вместо комментирования метода UpdateAppearance, его следует полностью удалить, если он больше не используется. Сохранение закомментированного кода затрудняет поддержку и создает путаницу.

-    /*protected override void UpdateAppearance(EntityUid uid, BodyPartAppearanceComponent component)
-    {
-        return;
-    }*/
📝 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
/*protected override void UpdateAppearance(EntityUid uid, BodyPartAppearanceComponent component)
{
return;
}*/

Comment on lines +158 to +164
- type: Flammable
fireSpread: true
canResistFire: true
damage:
types:
Heat: 0.75 #per second, scales with number of fire 'stacks'
# - type: Barotrauma # Not particularly modifiable. In the future, some response to pressure changes would be nice.
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Проверить логику воспламеняемости

Компонент Flammable может быть нелогичным для силиконового существа:

  • fireSpread: true может быть опасным
  • canResistFire: true противоречит высокому урону от тепла

Comment on lines +274 to +291
- type: StatusEffects
allowed:
- Stun
- KnockedDown
- SlowedDown
- Stutter
- SeeingRainbows
- Electrocution
# - Drunk
- SlurredSpeech
- PressureImmunity
- Muted
# - ForcedSleep
- TemporaryBlindness
- Pacified
# - PsionicsDisabled
# - PsionicallyInsulated
- type: Blindable
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Пересмотреть список разрешенных эффектов статуса

Некоторые эффекты могут быть нелогичными для робота:

  • SlurredSpeech требует обоснования
  • SeeingRainbows может быть неуместным
  • Закомментированные эффекты требуют пояснений

@@ -69,7 +69,7 @@
categories: [ HideSpawnMenu ]
components:
- type: Surgery
requirement: SurgeryOpenIncision
#requirement: SurgeryOpenIncision
Copy link

Choose a reason for hiding this comment

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

💡 Codebase verification

⚠️ Potential issue

Обнаружено отклонение от стандартной структуры хирургических операций

Анализ кодовой базы показывает, что операция присоединения головы (SurgeryAttachHead) является единственной операцией, где требование SurgeryOpenIncision закомментировано. Все остальные хирургические операции требуют предварительного разреза. Это нарушает установленную механику хирургической системы:

  • Операция включает шаг SurgeryStepInsertFeature, который обычно выполняется только после разреза
  • Все аналогичные операции по присоединению частей тела (SurgeryStepInsertFeature) требуют SurgeryOpenIncision
  • Отсутствие требования разреза противоречит логике игрового процесса
🔗 Analysis chain

Проверьте удаление зависимости SurgeryOpenIncision

Удаление требования SurgeryOpenIncision для операции присоединения головы может иметь серьезные последствия для игрового процесса. Это позволит выполнять операцию без предварительного разреза.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем, есть ли другие хирургические операции, которые не требуют разреза
rg -l "requirement: SurgeryOpenIncision" | wc -l

Length of output: 190


Script:

#!/bin/bash
# Check for SurgeryOpenIncision requirements in yml files
rg "requirement.*SurgeryOpenIncision" --type yaml -A 2 -B 2

# Also check for any surgery-related files
fd -e yml -e yaml . | grep -i surg

Length of output: 6779


Script:

#!/bin/bash
# Let's check the specific surgery entity and its context
rg -A 10 -B 10 "SurgeryAttachHead" Resources/Prototypes/_Backmen/Entities/Surgery/surgeries.yml

# Also check for any related surgery steps
rg -A 5 -B 5 "SurgeryStepInsertFeature" Resources/Prototypes/_Backmen/Entities/Surgery/surgery_steps.yml

Length of output: 952

Comment on lines +79 to +82
protected override void RemovePartMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance)
{
return;
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Реализуйте метод RemovePartMarkings или удалите его переопределение

Метод RemovePartMarkings переопределен, но содержит только пустой return;, не выполняя никакой логики. Если метод необходим, следует реализовать его функциональность. Если нет, можно удалить его переопределение, чтобы избежать потенциальной путаницы.

Comment on lines +88 to +91
private void HandleState(EntityUid uid, BodyPartAppearanceComponent component, ref AfterAutoHandleStateEvent args)
{
ApplyPartMarkings(uid, component);
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Вызов абстрактного метода может привести к ошибке во время выполнения.

Метод ApplyPartMarkings, вызываемый здесь, является абстрактным и не реализован в текущем классе. Это приведет к исключению NotImplementedException при выполнении. Пожалуйста, реализуйте этот метод или убедитесь, что класс, содержащий его реализацию, используется правильно.

Comment on lines +147 to +149
protected abstract void ApplyPartMarkings(EntityUid target, BodyPartAppearanceComponent component);

protected abstract void RemovePartMarkings(EntityUid target, BodyPartAppearanceComponent partAppearance, HumanoidAppearanceComponent bodyAppearance);
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Абстрактные методы в неабстрактном классе приведут к ошибке компиляции.

Класс SharedBodySystem содержит абстрактные методы, но не объявлен как абстрактный. Это вызовет ошибку компиляции. Пожалуйста, либо объявите класс абстрактным, либо реализуйте следующие методы:

  • ApplyPartMarkings
  • RemovePartMarkings

Могу ли я помочь с реализацией этих методов или открыть задачу в GitHub для отслеживания этой проблемы?

Comment on lines +40 to +43
if (bodyAppearance.Species.ToString() == "Felinid")
part.Species = "Human";
else
part.Species = bodyAppearance.Species;
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Избегайте хардкодинга строк при сравнении видов.

Для сравнения видов рекомендуется использовать константы или перечисления вместо строковых литералов. Это повысит надежность кода и упростит его поддержку.

Примените следующий дифф для исправления:

- if (bodyAppearance.Species.ToString() == "Felinid")
-     part.Species = "Human";
+ if (bodyAppearance.Species == Species.Felinid)
+     part.Species = Species.Human;

Committable suggestion skipped: line range outside the PR's diff.

@CrimeMoot CrimeMoot merged commit e9174a1 into master Nov 10, 2024
12 checks passed
@CrimeMoot CrimeMoot deleted the revert-570-revert-567-upstreams branch November 10, 2024 18:29
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