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

[феатуре] ms paint #279

Merged
merged 8 commits into from
Mar 5, 2025
Merged

Conversation

RedFoxIV
Copy link
Contributor

@RedFoxIV RedFoxIV commented Mar 5, 2025

Описание PR

Даёт возможность поворачивать рисунки мелками.


Медиа

12X2pLMozL.mp4

Изменения

🆑

  • add: Возможность поворачивать рисунки при использовании мелков.
  • tweak: Теперь мелков хватает на вдвое больше рисунков
  • fix: Значимый рефактор системы рисования мелками. Знаете, какое сейчас время? Время нестабильных фич! По поводу любых багов, связанных с рисованием мелками, просба обратиться в канал #bugreporting в дискорде.

@RedFoxIV RedFoxIV requested a review from Remuchi as a code owner March 5, 2025 06:09
Copy link
Contributor

coderabbitai bot commented Mar 5, 2025

Warning

Rate limit exceeded

@RedFoxIV has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 13 minutes and 29 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 7a2f8bf and 3aaa49d.

⛔ Files ignored due to path filters (1)
  • Resources/Fonts/_White/Bedstead/Bedstead-bold.otf is excluded by !**/*.otf
📒 Files selected for processing (1)
  • Resources/Prototypes/Entities/Objects/Fun/crayons.yml (1 hunks)

Walkthrough

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

Changes

Файл Изменения
Content.Client/…/CrayonComponent.cs
Content.Server/…/CrayonComponent.cs
В клиентской версии удалена переменная UIUpdateNeeded, а в серверной добавлен комментарий о том, что компонент объединён в общий CrayonComponent.
Content.Client/…/CrayonSystem.cs
Content.Server/…/CrayonSystem.cs
Обновлены подписки на события и обработчики взаимодействия с креоном: добавлены новые методы (CrayonAfterInteract, CrayonRemoved, CrayonEntRemoved, CrayonAfterAutoState), изменены ссылки на UI-кей и закомментированы устаревшие события.
Content.Client/…/HandsSystem.cs
Content.Server/…/HandsSystem.cs
Добавлена подписка на сетевое событие HandDeselectedNetworkCrutchWrap и реализован вызов HandDeselectedEvent для корректной обработки деселекции рук.
Content.Client/_White/…/CrayonPreviewOverlay.cs Новый класс оверлея для предпросмотра креона с отрисовкой текстур, динамическим обновлением состояния и регулировкой прозрачности.
Content.Shared/Crayon/CrayonComponent.cs
Content.Shared/Crayon/SharedCrayonSystem.cs
Компонент креона преобразован в sealed-класс с новыми полями (Angle, UseSound, SelectableColor, Charges, Capacity, DeleteEmpty, UIUpdateNeeded) и обновлённым конструктором; добавлены обработчики событий, включая управление углом через колесико мыши.
Content.Shared/_White/Hands/HandDeselectedNetworkCrutchWrap.cs Новый сериализуемый класс для сетевой передачи событий деселекции руки, содержащий поля Target и User.
Resources/…/crayons.yml Ёмкость креона увеличена с 25 до 50.

Suggested labels

Changes: UI

Suggested reviewers

  • Spatison
  • Remuchi

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

❤️ Share
🪧 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.
  • @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

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

🧹 Nitpick comments (8)
Content.Client/Hands/Systems/HandsSystem.cs (1)

77-87: Качественная реализация обработчика сетевого события деселекции.

Метод OnHandDeselectedCrutchWrap правильно преобразует полученное сетевое событие в локальное событие HandDeselectedEvent. Комментарий хорошо объясняет проблему и решение: код выбрасывания не выполняется на клиенте, поэтому HandDeselectedEvent не вызывается на клиентской стороне.

Возможно, стоит рассмотреть более элегантное решение в будущем, но текущий подход работоспособен и эффективен.

Content.Shared/Crayon/SharedCrayonSystem.cs (3)

47-56: Проверка валидности указателя на прототип может быть расширена.

Сейчас при неудачном поиске DecalPrototype или отсутствии нужного Tag просто выполняется return. Возможно, следует добавить сообщение пользователю или лог при ошибке, чтобы упростить отладку.


57-66: Добавить более строгую валидацию цвета.

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


104-115: Пересмотреть сброс угла при выборе/снятии с руки.

Сейчас угол при OnCrayonHandSelected и OnCrayonHandDeselected сбрасывается в 0. Если нужен сохранённый угол между переключениями предметов, возможно, стоит хранить и восстанавливать прежнее значение.

Content.Shared/Crayon/CrayonComponent.cs (2)

30-32: Рассмотрите нормализацию значения угла.

Если предполагается беспрерывная прокрутка колеса, угол может выйти за ожидаемый диапазон. Можно нормализовать угол (например, через Angle.Normalized) или использовать более жёсткие ограничения.


57-61: Поле UIUpdateNeeded может быть выпилено или перенесено на клиентскую сторону.

Так как по комментариям это надо только на клиенте, вместо хранения в Shared-компоненте можно рассмотреть вариант отсеять такое поле из общего состояния.

Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (2)

46-62: Убедитесь в корректной обработке изменений состояния мелка

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


73-76: Подавление предупреждения компилятора

Отключение предупреждения RA0002 может быть необходимым для данного случая, но желательно документировать причину подавления предупреждения для облегчения будущего сопровождения.

-#pragma warning disable RA0002 // ffs
+#pragma warning disable RA0002 // Необходимо для правильного рендеринга текстуры с вращением и прозрачностью
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 84daa7a and 7c6ce28.

📒 Files selected for processing (11)
  • Content.Client/Crayon/CrayonComponent.cs (1 hunks)
  • Content.Client/Crayon/CrayonSystem.cs (2 hunks)
  • Content.Client/Hands/Systems/HandsSystem.cs (2 hunks)
  • Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (1 hunks)
  • Content.Server/Crayon/CrayonComponent.cs (2 hunks)
  • Content.Server/Crayon/CrayonSystem.cs (5 hunks)
  • Content.Server/Hands/Systems/HandsSystem.cs (2 hunks)
  • Content.Shared/Crayon/CrayonComponent.cs (3 hunks)
  • Content.Shared/Crayon/SharedCrayonSystem.cs (1 hunks)
  • Content.Shared/_White/Hands/HandDeselectedNetworkCrutchWrap.cs (1 hunks)
  • Resources/Prototypes/Entities/Objects/Fun/crayons.yml (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • Content.Server/Crayon/CrayonComponent.cs
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (24)
Content.Shared/_White/Hands/HandDeselectedNetworkCrutchWrap.cs (2)

1-7: Корректное определение необходимых пространств имен.

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


10-15: Хорошая реализация сетевого события для синхронизации деселекции руки.

Класс корректно наследуется от EntityEventArgs и правильно помечен атрибутами [Serializable] и [NetSerializable]. Использование первичного конструктора делает код лаконичным. Поля Target и User хранят необходимую информацию для правильной обработки события деселекции на клиенте.

Content.Server/Hands/Systems/HandsSystem.cs (2)

30-31: Корректное добавление необходимых пространств имен.

Импорты Robust.Shared.Serialization и Content.Shared._White.Hands необходимы для работы с новым сетевым событием HandDeselectedNetworkCrutchWrap.


293-296: Правильная реализация распространения события деселекции руки на клиент.

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

Content.Client/Hands/Systems/HandsSystem.cs (2)

31-31: Добавлен импорт для работы с сетевым событием.

Корректно добавлено пространство имен Content.Shared._White.Hands для обработки сетевого события HandDeselectedNetworkCrutchWrap.


72-72: Корректная подписка на сетевое событие.

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

Content.Shared/Crayon/SharedCrayonSystem.cs (3)

26-27: Отличная реализация абстрактного системного класса.

Код соответствует шаблону ECS, и объявление abstract class SharedCrayonSystem выглядит корректно.


33-45: Правильное связывание событий и команд ввода.

Подписки и бинды для событий (HandSelectedEvent, HandDeselectedEvent и т.д.) и привязки мышиного колеса выглядят грамотно реализованными.


67-71: Убедитесь, что интерфейс действительно закрывается только для соответствующего пользователя.

В текущем виде происходят вызовы _uiSystem.CloseUi(...) без явной проверки, что args.User - это тот, кто открыл меню. В большинстве случаев это корректно, но иногда может потребоваться дополнительная логика для много-пользовательских сценариев.

Content.Shared/Crayon/CrayonComponent.cs (1)

12-13: Лаконичное и последовательное сетевое объявление компонента.

Использование [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] выглядит целесообразно и упрощает синхронизацию состояния.

Resources/Prototypes/Entities/Objects/Fun/crayons.yml (1)

24-24: Проверьте согласованность значения capacity.

Значение увеличено до 50, однако в файле CrayonComponent.cs по умолчанию Capacity = 30. Убедитесь, что это не создаёт противоречий при инициализации таких объектов.

Content.Client/Crayon/CrayonComponent.cs (1)

5-16: Архитектурное изменение, обеспечивающее улучшенное разделение компонентов

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

Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (3)

15-44: Хорошая реализация и инициализация предпросмотра мелков

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


63-72: Корректная реализация позиционирования и прозрачности

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


65-65: Новая функциональность вращения рисунков

Добавление угла поворота (Angle) в отрисовку предпросмотра хорошо реализовано. Корректно учитывается текущее вращение камеры с помощью _eye.CurrentEye.Rotation.

Content.Server/Crayon/CrayonSystem.cs (4)

74-82: Успешная реализация вращения рисунков мелком

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


36-41: Аккуратное управление подписками на события

Перенос подписок на события в общий класс логично соответствует архитектурным изменениям, связанным с переносом компонента в shared-часть. Комментарии четко объясняют причины этих изменений.


44-49: Переход на систему AutoState

Комментирование метода OnCrayonGetState и переход на систему AutoState является хорошим архитектурным решением, сокращающим объем повторяющегося кода для управления состоянием компонента.


81-81:

❓ Verification inconclusive

Проверьте корректность смещения позиции декали

Сдвиг позиции на (-0.5f, -0.5f) необходим для правильного центрирования декали, однако стоит убедиться, что это смещение соответствует размеру текстуры и ожидаемому положению.


🏁 Script executed:

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

echo "Проверка использования смещения (-0.5f, -0.5f) в декалях:"
rg -A 2 "TryAddDecal.*Offset\(" --glob "*.cs"

Length of output: 508


Проверьте корректность смещения (-0.5f, -0.5f) для декалей
Проведён поиск по всему кодовому основанию, и удалось установить, что фиксированное смещение (-0.5f, -0.5f) используется только в файле Content.Server/Crayon/CrayonSystem.cs. Несмотря на то, что данный сдвиг применяется для центрирования декали, необходимо убедиться, что он соответствует половине размеров используемой текстуры и обеспечивает ожидаемое позиционирование. Если в будущем текстура изменится или появятся другие алгоритмы центрирования, рекомендуется параметризовать или рассчитать смещение динамически.

Content.Client/Crayon/CrayonSystem.cs (5)

37-43: Корректная инициализация обработчиков событий

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


73-78: Корректное управление визуальным отображением при выборе мелка

Обработка событий выбора мелка (OnCrayonHandSelected) реализована правильно. Дополнительное удаление оверлея перед добавлением нового - хорошая практика для предотвращения дублирования.


80-84: Корректное удаление визуального отображения при отмене выбора мелка

Обработка события отмены выбора мелка (OnCrayonHandDeselected) реализована корректно и удаляет предпросмотр, что предотвращает появление "призрачных" предпросмотров.


68-71:

❓ Verification inconclusive

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

В методе CrayonAfterAutoState устанавливается флаг UIUpdateNeeded = true, что может быть несовместимо с архитектурными изменениями, учитывая, что UIUpdateNeeded было удалено из CrayonComponent класса в Client. Убедитесь, что это поле объявлено в общем компоненте.


🏁 Script executed:

#!/bin/bash
# Проверка наличия поля UIUpdateNeeded в Shared компоненте

echo "Проверка объявления UIUpdateNeeded в Shared компоненте:"
rg "UIUpdateNeeded.*{.*get.*set" --glob "*Shared*Crayon*"

Length of output: 307


Обратите внимание: Проверьте корректность объявления поля UIUpdateNeeded в общем (Shared) компоненте

В методе CrayonAfterAutoState (Content.Client/Crayon/CrayonSystem.cs, строки 68-71) устанавливается флаг UIUpdateNeeded = true. Согласно архитектурным изменениям, это поле было удалено из клиентской версии CrayonComponent. Необходимо удостовериться, что поле UIUpdateNeeded объявлено в общем (Shared) компоненте, чтобы избежать проблемы несовместимости.

  • Проверьте, что в файлах, относящихся к общей логике (Shared), присутствует объявление поля UIUpdateNeeded.
  • Если поле отсутствует, рассмотрите возможность его добавления или изменение логики обновления UI в методе CrayonAfterAutoState.

Обратите внимание на первоначальный скрипт проверки:

rg "UIUpdateNeeded.*{.*get.*set" --glob "*Shared*Crayon*"

Он завершился с ошибкой из-за некорректного регулярного выражения. Пожалуйста, используйте исправленный запрос, экранирующий фигурную скобку, например:

rg "UIUpdateNeeded.*\\{.*get.*set" --glob "*Shared*Crayon*"

46-50:

❓ Verification inconclusive

Упрощенная логика закрытия UI

Закрытие UI, когда количество зарядов меньше или равно 1, помогает улучшить опыт пользователя, но необходимо проверить, что это соответствует бизнес-логике. Возможно, UI должен закрываться только когда заряды полностью исчерпаны (равны 0).


🏁 Script executed:

#!/bin/bash
# Проверка логики закрытия UI в других местах

echo "Проверка логики закрытия UI для мелков:"
rg -A 5 "CloseUi.*CrayonUiKey" --glob "*.cs"

Length of output: 1120


Обратите внимание: Проверьте соответствие бизнес-логики

В методе CrayonAfterInteract (Content.Client/Crayon/CrayonSystem.cs, строки 46–50) UI закрывается при условии if (comp.Charges <= 1). Аналогичный вызов закрытия UI обнаружен в Content.Shared/Crayon/SharedCrayonSystem.cs. Это свидетельствует о согласованном использовании данной проверки во всех местах.

Если по требованиям бизнес-логики UI должен закрываться только при полном исчерпании зарядов (то есть, когда comp.Charges == 0), то условие следует пересмотреть и скорректировать. В противном случае, если закрытие при одном оставшемся заряде соответствует улучшению пользовательского опыта, логику можно оставить без изменений.

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

🧹 Nitpick comments (5)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (5)

15-18: Рекомендация по модификатору sealed
Если класс в перспективе может расширяться другими наследниками, стоит рассмотреть удаление sealed.


19-28: Рекомендация: использовать readonly там, где это возможно
Если значения _crayonComp и _crayonUid не меняются в рантайме, имеет смысл объявить их как readonly для большей надёжности.


32-44: Добавить логирование для отсутствующего DecalPrototype
При неудаче TryIndex, стоит логировать предупреждение, чтобы понимать причину прозрачной текстуры при отладке.

 if (_proto.TryIndex<DecalPrototype>(_currentState, out var proto))
 {
     _tex = _sprite.Frame0(proto.Sprite);
 }
 else
 {
+    Logger.Warning($"DecalPrototype {_currentState} не найден. Использую прозрачную текстуру.");
     _tex = Texture.Transparent;
 }

52-61: Устранить дублирование кода при смене текстуры
Аналогичный блок кода с TryIndex<DecalPrototype> есть и в конструкторе. Можно вынести в отдельный метод для упрощения поддержки.

 private void UpdateTexture(string state)
 {
     if (_proto.TryIndex<DecalPrototype>(state, out var proto))
         _tex = _sprite.Frame0(proto.Sprite);
     else
         _tex = Texture.Transparent;
 }
 
 // И использовать:
 if (_currentState != _crayonComp.SelectedState)
 {
     _currentState = _crayonComp.SelectedState;
     UpdateTexture(_currentState);
 }

63-72: Улучшить визуальную индикацию выхода за радиус
Можно реализовать плавное уменьшение прозрачности вместо резкого снижения до 0.1 при удалении от игрока.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 7c6ce28 and 66160ba.

📒 Files selected for processing (1)
  • Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
🔇 Additional comments (4)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (4)

1-14: Подключаемые модули и пространство имён выглядят корректно
Здесь нет очевидных проблем или конфликтов.


29-31: Инициализация полей
_sprite уже помечено как readonly, что соответствует хорошей практике. Без замечаний.


46-51: Проверка валидности сущностей
Условие выхода при несуществующем креоне или неверном playerUid выглядит разумно и предотвращает потенциальные ошибки.


73-77: Проверка оправданности отключения предупреждения
Использование #pragma warning disable RA0002 желательно подкрепить пониманием отключаемой диагностики, чтобы впоследствии избежать ошибок, которые она могла предотвратить.

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

🧹 Nitpick comments (9)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (3)

20-25: Убедитесь в необходимости прямых зависимостей.
Внедрение нескольких сервисов напрямую (IInputManager, IPlayerManager, IEyeManager, IEntityManager, IPrototypeManager) может усложнить поддержку кода, если потребности в них будут меняться. Рассмотрите вариант инкапсуляции подобных зависимостей в отдельный сервис или класс-«фасад», чтобы упростить тестирование и расширяемость.


26-32: Сгруппируйте поля инициализации или упростите их настройку.
Переменные _crayonComp, _crayonUid, _currentState и _tex тесно связаны между собой. Рассмотрите возможность инициализировать их в едином месте (например, в конструкторе), чтобы упростить понимание кода и избежать рассинхронизации.


71-74: Используйте константы или настройки для значений прозрачности.
Текущее решение жёстко задаёт alpha = 0.6f и в противном случае alpha = 0.1f, что может потребовать ручного пересмотра при изменении игровых условий. Рассмотрите вынесение этих значений в константы, конфигурацию или параметры, чтобы упростить балансировку игры.

Content.Shared/Crayon/SharedCrayonSystem.cs (3)

47-65: Проверка валидности состоиния и цвета креона.

Методы OnCrayonBoundUI и OnCrayonBoundUIColor корректно валидируют входные данные (например, проверка, что выбранный decal прототип имеет тег "crayon"). Убедитесь, что для невалидного цвета выбрасываются нужные уведомления, если этого требует логика.


67-71: Закрытие интерфейса при сбросе креона.

Метод OnCrayonDropped грамотно закрывает UI. Учтите, что существует TODO-комментарий о переиспользовании общего события — возможно, стоит дополнительно уточнить сроки его реализации, чтобы избежать дублирования кода.


106-116: Сброс угла при выборе/снятии креона в руке.

В OnCrayonHandSelected и OnCrayonHandDeselected угол сбрасывается в ноль. Это может быть нежелательным, если игрок ожидает, что угол сохранится между действиями. Рекомендуется уточнить требования UX и, при необходимости, сохранять угол.

Content.Server/Crayon/CrayonSystem.cs (3)

30-30: Новая зависимость: SharedTransformSystem.

Проверьте, действительно ли требуется SharedTransformSystem в этом файле. Если это задел на будущее, стоит добавить краткий комментарий, чтобы избежать путаницы в коде.


73-84: Добавлена поддержка вращения при рисовании.

Получение TargetRelativeRotation из InputMoverComponent и учёт component.Angle при добавлении decal. Это даёт гибкость пользователю задавать наклон рисунка. Проверьте, не возникнет ли конфликтов в случаях, когда пользователь уже повернул креон через колесо мыши.


112-119: Тоггл окна интерфейса креона.

Метод OnCrayonUse открывает или закрывает UI, а также устанавливает начальное состояние. Логика актуальна, однако стоит подтвердить, что при повторном вызове не произойдёт конфликт между синхронизацией состояния на клиенте и сервере.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 66160ba and 9e5f896.

📒 Files selected for processing (3)
  • Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (1 hunks)
  • Content.Server/Crayon/CrayonSystem.cs (5 hunks)
  • Content.Shared/Crayon/SharedCrayonSystem.cs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: Test Packaging
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (12)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (2)

33-45: Проверьте механизм выбора текстуры.
Код повторяет логику TryIndex<DecalPrototype> и при неудаче подгружает Texture.Transparent. Если предполагается, что состояние иногда не будет найдено, то текущее поведение корректно. Однако если это нежелательная ситуация, имеет смысл логгировать предупреждение, чтобы упростить диагностику ошибок.


65-68: Уточните смысл вычисляемого угла.
Текущая реализация вычитает _eye.CurrentEye.Rotation из _crayonComp.Angle. Если цель — повернуть текстуру относительно направления камеры, код корректен. Однако убедитесь, что это поведение согласуется с остальным игровым процессом (например, другие инструменты могут использовать иной подход).

Content.Shared/Crayon/SharedCrayonSystem.cs (6)

1-21: Импорты выглядят упорядоченно.

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


25-28: Добавление абстрактного системного класса.

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


29-32: Проверить использование всех зависимостей.

Поля _hands, _prototypeManager и _uiSystem корректно внедрены через [Dependency]. Убедитесь, что все зависимости действительно используются и не вызывают дополнительных накладных расходов.


33-45: Инициализация систем и привязка команд.

Метод Initialize() связывает колесо мыши с методами вращения и подписывается на локальные события. Для долгоживущих систем обычно не требуется отписка от этих событий, однако при необходимости переинициализации стоит добавить соответствующий код в метод Shutdown().


73-88: Вращение креона при прокрутке колеса мыши (увеличение угла).

Логика в MouseWheelUp выглядит корректно: проверяется, что игрок держит предмет, и что это действительно CrayonComponent. Возможно, стоит убедиться, что возвращаемое значение (false) верно, и в дальнейшем не нужно прерывать обработку события.


90-104: Вращение креона при прокрутке колеса мыши (уменьшение угла).

Метод MouseWheelDown аналогичен предыдущему, но уменьшает угол. При необходимости запрета дальнейшей обработки события можно возвращать true — убедитесь, что текущая логика (return false) удовлетворяет вашей концепции управления.

Content.Server/Crayon/CrayonSystem.cs (4)

12-12: Добавлен импорт для движения.

Подключение using Content.Shared.Movement.Components; указывает на необходимость работы с компонентом InputMoverComponent. Убедитесь, что логика движения тесно связана с системой креона и не вынесена в ненужную зависимость.


36-37: Перенос подписки на события в общую систему.

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


40-41: Подписки на события сброшены.

Удалены подписки на DroppedEvent и ComponentGetState — согласно комментариям, их заменили механизмы в SharedCrayonSystem и AutoState. Убедитесь, что новая реализация покрывает все кейсы, которые обрабатывались раньше.


103-103: Отправка сообщения интерфейсу о использовании креона.

Строка _uiSystem.ServerSendUiMessage информирует UI о том, что креон был использован, передавая состояние CrayonUsedMessage. Убедитесь, что это не приводит к дублированию сообщений при массовом использовании креона.

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

🧹 Nitpick comments (2)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (2)

33-45: Избежать дублирования кода при загрузке спрайта
Код для получения DecalPrototype и установки _tex повторяется в конструкторе и в блоке проверки _currentState != _crayonComp.SelectedState. Рекомендуется вынести эту логику в отдельный метод, чтобы повысить удобочитаемость и облегчить внесение изменений.

Пример возможного рефакторинга:

+private void UpdateTextureFromState(string newState)
+{
+    if (_proto.TryIndex<DecalPrototype>(newState, out var proto))
+        _tex = _sprite.Frame0(proto.Sprite);
+    else
+        _tex = Texture.Transparent;
+}

 public CrayonPreviewOverlay(SpriteSystem sprite, CrayonComponent comp)
 {
     ...
-    if (_proto.TryIndex<DecalPrototype>(_currentState, out var proto))
-        _tex = _sprite.Frame0(proto.Sprite);
-    else
-        _tex = Texture.Transparent;
+    UpdateTextureFromState(_currentState);
 }

 protected override void Draw(in OverlayDrawArgs args)
 {
     ...
-    if (_proto.TryIndex<DecalPrototype>(_crayonComp.SelectedState, out var proto))
-        _tex = _sprite.Frame0(proto.Sprite);
-    else
-        _tex = Texture.Transparent;
+    UpdateTextureFromState(_crayonComp.SelectedState);
 }

Also applies to: 56-63


76-78: Избавиться от лишней директивы подавления предупреждения
Директива #pragma warning disable RA0002 может скрывать потенциально важные замечания анализатора. Проверьте, можно ли устранить первопричину предупреждения (например, с помощью корректировки аргументов или другим способом), чтобы избежать необходимости в явном подавлении.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 9e5f896 and 7a2f8bf.

📒 Files selected for processing (1)
  • Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: YAML Linter
  • GitHub Check: YAML map schema validator
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Test Packaging
  • GitHub Check: build (ubuntu-latest)
🔇 Additional comments (2)
Content.Client/_White/Overlays/CrayonPreviewOverlay.cs (2)

18-18: Убедиться, что отрисовка под сущностями действительно оправдана
Текущее значение OverlaySpace.WorldSpaceBelowEntities означает, что оверлей будет отображаться под объектами. Проверьте, совпадает ли это с желаемым визуальным эффектом, поскольку элементы интерфейса могут быть визуально перекрыты другими спрайтами.


49-52: Уточнить логику прерывания отрисовки
В случае, если объект креона не существует или игрок невалиден, оверлей просто завершается. При этом, если игрок держит компонент HoldingDropComponent, отрисовка тоже отключается. Убедитесь, что это согласуется со сценарием использования, и в таких случаях оверлей действительно должен скрываться.

@DVOniksWyvern DVOniksWyvern merged commit efca951 into WWhiteDreamProject:master Mar 5, 2025
8 of 10 checks passed
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.

3 participants