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

Ports #987

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

Ports #987

wants to merge 11 commits into from

Conversation

trest100
Copy link
Contributor

@trest100 trest100 commented Dec 21, 2024

Описание PR

Порты с Corvax-Next. авторы в комитах

Медиа

Тип PR

  • Feature
  • Fix
  • Tweak
  • Balance
  • Refactor
  • Port
  • Translate
  • Resprite

Изменения

🆑 trest100

  • add: случайный шанс выстрелить оружию при падении
  • add: флаги
  • add: электрический стул
  • add: умный холодильник

Summary by CodeRabbit

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

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

    • Обновлены механизмы обработки сигналов и взаимодействий для экзекуционного стула.
  • Документация

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

Vonsant and others added 10 commits December 21, 2024 13:12
* SmartCringe

* JustCringe
Флаги разных государств
* ExeCute

* fix?

* nope

* fix: formatting
- remove useless comments
- if statement in OnSignalRecieved() should be handled in switch-case
- Logger class shouldn't be used in logging, there is sawmills for this
- Remove unnecessary methods

* some more shit

* wrong author

---------

Co-authored-by: JerryImMouse <[email protected]>
This reverts commit df65820.
This reverts commit 97187a6.
@trest100 trest100 requested a review from Rxup as a code owner December 21, 2024 16:17
Copy link
Contributor

coderabbitai bot commented Dec 21, 2024

Обзор

Walkthrough

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

Changes

Файл Изменения
Content.Client/_CorvaxNext/Medical/SmartFridge/ Добавлены компоненты клиентской части умного холодильника
Content.Server/_CorvaxNext/Medical/SmartFridge/ Добавлены серверные системы управления умным холодильником
Content.Shared/_CorvaxNext/Medical/SmartFridge/ Введены общие компоненты и системы для умного холодильника
Resources/Prototypes/Entities/Structures/Machines/ Обновлена конфигурация умного холодильника
Resources/Prototypes/Entities/Objects/Weapons/Guns/ Добавлен шанс выстрела при падении для различных типов оружия

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 generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

@github-actions github-actions bot added S: Untriaged Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation size/XL labels Dec 21, 2024
Copy link
Contributor

github-actions bot commented Dec 21, 2024

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

Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi

State Old New Status
execution-chair Added

Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi

State Old New Status
agurk Added
coder Added
goldring Added
hca Added
inteq Added
lizard Added
mothic Added
nri Added
nt Added
shigu Added
solfed Added
solfed_alt Added
soviet Added
syndicate Added
tizira Added
vulp Added

Edit: diff updated after e8bb962

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

🔭 Outside diff range comments (2)
Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1)

Line range hint 93-94: Рекомендуется переопределить fireOnDropChance

Для исторического оружия (musket и flintlock) рекомендуется установить более низкое значение fireOnDropChance, так как эти виды оружия менее склонны к случайным выстрелам при падении.

  - type: Gun
    selectedMode: SemiAuto
    availableModes:
    - SemiAuto
+   fireOnDropChance: 0.15 # Более подходящее значение для исторического оружия

Also applies to: 116-117

Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1)

Параметры разброса N1984 требуют корректировки

Сравнение с другими пистолетами показывает, что текущие параметры N1984 делают его слишком неточным:

  • Desert Eagle (аналогичный магнум): angleIncrease: 10, angleDecay: 15
  • G-22 (стандартный пистолет): angleIncrease: 2, angleDecay: 7
  • N1984: angleIncrease: 8, angleDecay: 9

Рекомендуемые изменения для N1984:

  • Увеличить angleDecay до 12-15 для лучшего восстановления точности
  • Уменьшить angleIncrease до 5-6, чтобы разброс был ближе к другим магнум-пистолетам
  • Оставить minAngle: 1 и maxAngle: 20 без изменений
🔗 Analysis chain

Line range hint 214-217: Проверить параметры разброса для N1984

Новые параметры угла стрельбы требуют проверки на практике:

  • minAngle: 1 - минимальный разброс
  • maxAngle: 20 - максимальный разброс
  • angleIncrease: 8 - увеличение разброса
  • angleDecay: 9 - восстановление точности

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других пистолетов с похожими параметрами для сравнения
ast-grep --pattern 'type: Gun
  minAngle: $_
  maxAngle: $_
  angleIncrease: $_
  angleDecay: $_'

Length of output: 99


Script:

#!/bin/bash
# Поиск файлов пистолетов в каталоге
fd pistols.yml

# Вывести содержимое найденных файлов для анализа параметров Gun
fd pistols.yml --exec cat {}

Length of output: 21663

🧹 Nitpick comments (26)
Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (8)

18-19: (Рекомендация) Переименование поля для большей ясности.
Переменная NumSlots передаёт суть, но возможно лучше назвать её что-то вроде MaxCapacity или MaxSlotCount, чтобы точнее отражать смысл.


33-34: (Совет) Ленивая загрузка инвентаря.
Если объём Inventory может вырасти, стоит рассмотреть стратегию обновления (ленивая загрузка, отложенная синхронизация и т.п.) для оптимизации сетевых затрат.


39-39: (Нитпик) Переименование константы.
BaseStorageSlotId передаёт идею базового пути, но может стоит назвать еёStorageSlotPrefix для лучшего понимания.


45-46: (Предложение) Проверка на null при создании списка.
StorageWhitelist может отсутствовать, но при попытке добавить элементы без проверки возможны исключения. Рекомендуется расширить логику проверки.


51-52: (Совет по балансу) Параметр EjectDelay может влиять на UX.
Если задержка слишком большая, игроки могут воспринимать механику как «задержку». Возможно, сделать это конфигурируемым параметром.


57-58: (Замечание) Переменная Ejecting как флаг состояния.
Использование простого флага хорошо, но если флагов станет больше, возможно стоит использовать состояние (State Machine).


76-83: (Предложение) Использовать record/class для SmartFridgeInventoryItem.
Вместо конструктора-тюпла можно определить class/record со стандартным конструктором для упрощения будущих модификаций.


91-96: (Уточнение) Расширение SmartFridgeEjectMessage.
Пока что передаётся только Id. Возможно, в будущем возникнет потребность передавать больше данных (например, кол-во, тип, пользователь) для лучшего контроля.

Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (3)

42-60: (Совет) Расширенный лог для нестандартных портов.
В DefaultCase ведётся лог только на уровне Debug. При отладке на продакшене может понадобиться более высокий уровень логирования, чтобы следить за неизвестными сигналами.


94-108: (Предложение) Расширить проверку внешних условий.
Функция ValidateChairOperation проверяет якорь и питание. Можно учесть дополнительные варианты: отключение мапы, аварийное отключение питания и т.д.


110-136: (Уточнение) Пугающий фактор для игроков.
При применении электрошока возможно добавление визуальных/звуковых эффектов помимо звуков для усиления атмосферы.

Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (8)

36-41: (Уточнение) BUIEventSubscriptions.
Подписка только на одиночное событие (SmartFridgeEjectMessage). При необходимости расширить функционал UI - возможно имеет смысл объединить события в единый канал.


47-60: (Замечание) Логика с инструментами (Wrench) и питанием.
Использование гаечного ключа для анчора понятна, но код смешан с проверкой питания. Рассмотрите выделить этот код в отдельные методы для улучшения читаемости.


70-96: (Совет) Единый метод для вставки предметов.
Код в OnInteractEvent масштабируется. Возможно, создать вспомогательный метод InsertItem в SmartFridgeSystem, чтобы избегать дублирования логики.


98-107: (Уточнение) Логика EjectAttempt.
Проверка на SlotToEjectFrom и флаг Ejecting может быть более прозрачной, если хранить "текущий слот" в одном месте. Рассмотрите использование отдельного состояния.


130-133: (Нитпик) Инициализация в MapInit.
Если понадобится отложенная загрузка из внешнего источника (например, сохранения), стоит вынести часть логики из MapInitEvent в отдельную функцию.


135-145: (Предложение) Обратная связь при невозможности питания.
В OnSmartFridgeEjectMessage отсутствует вывод сообщения игроку, если холодильник не запитан. Возможно стоит уведомлять пользователя, что холодильник не работает.


147-169: (Идея) Отложенное воспроизведение звука.
Если для других предметов в игре предусмотрены задержки звуковых эффектов, возможно унифицировать через один системный метод, чтобы избежать дублирования кода.


183-203: (Совет) Separate concerns при создании слотов.
Код SetupSmartFridge сейчас смешан: генерация StorageSlots и добавление в систему. Можно вынести создание списка слотов в отдельный метод, что упростит чтение и тестирование.

Resources/Locale/ru-RU/_corvaxnext/reagents/biological.ftl (1)

1-2: (Одобрение) Новые строки перевода выглядят корректно.
«Фиолетовая кровь» и её описание соответствует стилистике. При необходимости добавьте период в конце описания для единообразия.

Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeBoundUserInterface.cs (1)

37-54: Улучшите обработку выбора предметов

Текущая реализация может быть улучшена:

  1. Добавьте проверку на null для args
  2. Используйте pattern matching для более чистого кода
  3. Добавьте защиту от race condition при работе с _cachedInventory

Предлагаемые изменения:

  private void OnItemSelected(GUIBoundKeyEventArgs args, ListData data)
  {
+     if (args?.Function != EngineKeyFunctions.UIClick)
      return;

-     if (data is not VendorItemsListData { ItemIndex: var itemIndex })
+     if (data is not VendorItemsListData { ItemIndex: var itemIndex } itemData)
          return;

      var inventory = _cachedInventory;
+     if (inventory == null || inventory.Count == 0)
          return;

-     var selectedItem = _cachedInventory.ElementAtOrDefault(itemIndex);
+     var selectedItem = inventory.ElementAtOrDefault(itemIndex);

      if (selectedItem == null)
          return;

      SendMessage(new SmartFridgeEjectMessage(selectedItem.StorageSlotId));
  }
Content.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1)

29-54: Рекомендуется оптимизация работы с памятью

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

-        var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>();
+        var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>(smartFridgeComponent.NumSlots);
Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (1)

13-14: Рекомендуется улучшить доступность поиска

Следует добавить атрибут AccessKey для быстрого доступа к строке поиска с клавиатуры.

-                <LineEdit Name="SearchBar" PlaceHolder="{Loc 'vending-machine-component-search-filter'}" HorizontalExpand="True"/>
+                <LineEdit Name="SearchBar" PlaceHolder="{Loc 'vending-machine-component-search-filter'}" HorizontalExpand="True" AccessKey="S"/>
Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (1)

42-43: Рассмотреть возможность настройки звуков

Текущая реализация использует фиксированную коллекцию звуков "sparks". Желательно сделать это более гибким.

Предлагается добавить возможность настройки:

- public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks");
+ [DataField("shockNoises")]
+ public SoundSpecifier ShockNoises = new SoundCollectionSpecifier("sparks");
Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs (1)

8-12: Необходимо добавить проверку зависимостей

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

public sealed class FireOnDropSystem : EntitySystem
{
+    public FireOnDropSystem()
+    {
+        IoCManager.InjectDependencies(this);
+    }

    [Dependency] private readonly SharedGunSystem _gun = default!;
    [Dependency] private readonly IRobustRandom _random = default!;
Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (1)

23-23: Необходима документация нового свойства

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

Предлагаю добавить документацию:

 - type: Gun
   fireRate: 2
   selectedMode: SemiAuto
   availableModes:
   - SemiAuto
   soundGunshot:
     path: /Audio/Weapons/Guns/Gunshots/laser.ogg
-   fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop
+   # Шанс выстрела при падении оружия (от 0 до 1)
+   # Наследуется всеми производными типами оружия
+   fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 03cf326 and ee2638c.

⛔ Files ignored due to path filters (17)
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/execution-chair.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/agurk.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/coder.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/goldring.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/hca.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/inteq.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/lizard.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/mothic.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/nri.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/nt.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/shigu.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/solfed.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/solfed_alt.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/soviet.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/tizira.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/vulp.png is excluded by !**/*.png
📒 Files selected for processing (31)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeBoundUserInterface.cs (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml.cs (1 hunks)
  • Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (1 hunks)
  • Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (1 hunks)
  • Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1 hunks)
  • Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs (1 hunks)
  • Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (1 hunks)
  • Resources/Locale/ru-RU/_CorvaxNext/executionchair/executionchair.ftl (1 hunks)
  • Resources/Locale/ru-RU/_corvaxnext/reagents/biological.ftl (1 hunks)
  • Resources/Locale/ru-RU/_corvaxnext/smartfridge/smartfridge.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/execution_chair.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl (1 hunks)
  • Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (2 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml (3 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml (1 hunks)
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json (1 hunks)
  • Resources/migration.yml (1 hunks)
✅ Files skipped from review due to trivial changes (5)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/execution_chair.ftl
  • Resources/Locale/ru-RU/_CorvaxNext/executionchair/executionchair.ftl
  • Resources/Locale/ru-RU/_corvaxnext/smartfridge/smartfridge.ftl
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/meta.json
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json
🔇 Additional comments (25)
Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (3)

12-14: (Замечание) Необходима проверка совместимости с другими компонентами.
Убедитесь, что другие компоненты, зависящие от данного, корректно реагируют на сериализацию полей.


21-28: (Вопрос) Назначение FridgeSlots vs StorageSlots.
Похоже, что FridgeSlots и StorageSlots реализуют схожий функционал. Если их назначение различается незначительно, рассмотрите объединение или чёткое документирование их различий.


64-74: (Рекомендация) Учёт отсутствия файла звука.
SoundVend ссылается на конкретный файл; в случае отсутствия или недоступности файла нужно предусмотреть fallback.

Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (2)

28-35: (Уточнение) Регистрация обработчиков сигналов и событий.
При большом количестве подобных обработчиков стоит удостовериться, что нет дублирующей логики, и что система не забивает очередь событиями.


76-92: (Вопрос) Механика многократного эффекта удара током за один тик.
В методе Update循环 может возникнуть ситуация, когда одна и та же сущность получает несколько тиков подряд при особых условиях. Рекомендуется убедиться, что не существует условие при котором одна сущность получит неограниченное количество ударов.

Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)

61-68: (Внимание) Использование TagSystem для проверки whitelist.
Вы вызываете _tags.HasAnyTag(...) для проверки. Если нужна более сложная валидация, придётся дополнять систему. Убедитесь, что TagSystem покрывает все случаи.

Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)

6-24: Реализация выглядит корректной!

Система корректно реализует клиентскую часть умного холодильника, следуя паттернам SS14:

  • Правильное использование dependency injection
  • Корректная подписка на события
  • Чистое разделение ответственности
Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1)

26-28: Проверьте баланс энергопотребления

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

✅ Verification successful

Нагрузка в 1500 единиц соответствует другим устройствам аналогичного класса

Анализ энергопотребления других устройств показывает, что нагрузка в 1500 единиц является обоснованной:

  • Аналогичную нагрузку имеют двигатели шаттлов (1500)
  • Медицинское оборудование, такое как криокапсула, потребляет даже больше (3000)
  • Базовые машины имеют нагрузку 1000 единиц
  • Только специализированное оборудование, такое как анализатор артефактов (12000) или маяк сингулярности (15000), имеет значительно более высокое энергопотребление
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других устройств с ApcPowerReceiver для сравнения
rg "powerLoad:" Resources/Prototypes/

Length of output: 5214

Content.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1)

7-10: Архитектура системы реализована правильно!

Хорошая реализация базовой системы с использованием внедрения зависимостей.

Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (1)

1-8: Структура пользовательского интерфейса реализована корректно!

Правильное использование локализации и базовых компонентов SS14.

Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl (2)

1-18: Качественные переводы и описания!

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


19-20: Проверьте актуальность альтернативного флага

Убедитесь, что альтернативный флаг Солнечной Федерации должен иметь идентичное описание с основным флагом.

✅ Verification successful

Альтернативный флаг корректно определён и используется

Проверка показала, что:

  • Альтернативный флаг (FlagSolfedAlt) определён в YAML с уникальным спрайтом (solfed_alt)
  • Оба флага используются в спавнерах случайных объектов
  • Использование одинакового описания для обоих вариантов флага является корректным, так как они представляют один и тот же символ Солнечной Федерации
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования альтернативного флага
rg -l "ent-FlagSolfedAlt" --type yaml

Length of output: 37


Script:

#!/bin/bash
# Поиск определения основного флага Солнечной Федерации
rg "ent-FlagSolfed =" -A 2

# Поиск использования обоих вариантов флага
rg "FlagSolfed" --type yaml

Length of output: 1008


Script:

#!/bin/bash
# Проверка определения альтернативного флага в yaml файле
rg "FlagSolfedAlt" -A 5 --type yaml

# Проверка всех локализаций для обоих флагов
fd -e ftl -x rg -l "ent-FlagSolfed"

Length of output: 1259

Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml (2)

40-44: Проверить конфигурацию питания

Значение powerLoad в 100 может быть избыточным для холодильника. Также приоритет LightningTarget установлен без явного обоснования.

✅ Verification successful

Let me analyze the power consumption of similar devices to make a proper assessment about the smartfridge's power configuration.

From the search results, I can see the following relevant power loads:

  • Vending machines: 200
  • ATM: 200
  • Timer: 100
  • Screen: 100
  • Jukebox: 100
  • Research machines: 200
  • Medical scanner: 200
  • Reagent grinder: 300
  • Microwave: 400
  • Hotplate: 300
  • Chem master: 250

Based on this analysis, I can now provide the final response:

Конфигурация питания соответствует стандартам

Значение powerLoad в 100 для холодильника является обоснованным, так как:

  • Соответствует энергопотреблению других базовых устройств (таймеры, экраны, музыкальные автоматы)
  • Существенно ниже энергоемких устройств (микроволновки - 400, дробилки реагентов - 300)
  • Находится в разумном диапазоне для устройств хранения (торговые автоматы - 200)

Приоритет LightningTarget является стандартным для защиты оборудования.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других устройств с похожим энергопотреблением
rg "powerLoad:" -A 1 

Length of output: 65774


9-15: Проверить теги хранилища

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

✅ Verification successful

Let me check the actual content of these medical files to see what tags are used for medical items.


Based on the analysis of medical items in the codebase, I can now provide a final response:

Текущий список тегов хранения достаточен

Существующие теги хранения (PillCanister, Bottle, ChemDispensable) уже охватывают все основные медицинские предметы, которые должны храниться в медицинском холодильнике. Дополнительные теги не требуются, так как:

  • PillCanister покрывает все контейнеры с таблетками
  • Bottle и ChemDispensable охватывают ёмкости с химикатами
  • Другие медицинские предметы (шприцы, медипены, аптечки) не предназначены для хранения в холодильнике
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других медицинских предметов
rg "tags:" | grep -A 5 "Medical"

Length of output: 5004


Script:

#!/bin/bash
# Check content of medical related files to see storage tags
cat Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml Resources/Prototypes/Entities/Objects/Specific/Medical/medkits.yml

Length of output: 38593

Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (2)

180-197: Проверьте согласованность списка флагов

Убедитесь, что все добавленные флаги (FlagAgurk, FlagHCA, и т.д.) правильно определены в соответствующих файлах ресурсов.

✅ Verification successful

Все флаги корректно определены в файлах ресурсов

Проверка показала, что все флаги из списка (FlagAgurk, FlagHCA, FlagLizard, FlagMothic, FlagNanoTrasen, FlagShigu, FlagSolfed, FlagSolfedAlt, FlagTizira, FlagGoldRing, FlagNRI, FlagSovietUSSP, FlagVulp) имеют соответствующие определения в файле Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка определений флагов
rg "FlagAgurk|FlagHCA|FlagLizard|FlagMothic|FlagNanoTrasen|FlagShigu|FlagSolfed|FlagSolfedAlt|FlagTizira|FlagGoldRing|FlagNRI|FlagSovietUSSP|FlagVulp" --type yaml

Length of output: 2600


96-103: Проверьте балансировку шансов появления флагов

Изменение шанса спавна с 1.0 на 0.99 и добавление редких прототипов с шансом 0.01 выглядит логичным, но может потребовать тестирования для подтверждения баланса.

✅ Verification successful

Let me check the flag definitions to verify their implementation.


Let me check the original spawn chances in the file to compare with the new values.


Баланс шансов появления флагов корректен

Проверка показала, что:

  • Флаги корректно определены в файле flags.yml с уникальными спрайтами и описаниями
  • Распределение редких флагов логично разделено между контрабандными (FlagCoder, FlagSyndicate, FlagInteQ) и легальными (все остальные флаги)
  • Изменение шанса с 0.95/0.05 на 0.99/0.01 делает флаги более редкими, что соответствует их статусу как особых предметов
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования флагов в других местах
rg "FlagCoder|FlagSyndicate|FlagInteQ" --type yaml

Length of output: 632


Script:

#!/bin/bash
# Check flag definitions and their properties
cat Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml

Length of output: 5419


Script:

#!/bin/bash
# Check the full poster spawner configuration
cat Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml

Length of output: 5821

Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml (1)

1-157: Проверьте локализацию описаний флагов

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

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

Обратите особое внимание на флаг USSP (строки 141-144), который уже содержит русский текст.

✅ Verification successful

Let me check for specific flag-related localization files and content.


Давайте проверим наличие локализации описаний флагов:


Локализация флагов полностью реализована

Проверка показала, что:

  • Все названия флагов имеют русский перевод
  • Все описания флагов переведены на русский язык
  • Файл локализации находится в правильной директории: Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl
  • Флаг СССП уже содержит корректный русский текст, который соответствует файлу локализации
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка наличия локализации для флагов
rg -l "flag" Resources/Locale/ru-RU/

Length of output: 242


Script:

#!/bin/bash
# Поиск локализаций для флагов в директории ru-RU
rg -g "*.ftl" -i "flag.*=" Resources/Locale/ru-RU/

# Проверка наличия файла локализации для флагов
fd "flags.ftl" Resources/Locale/ru-RU/

# Поиск любых упоминаний конкретных флагов
rg -i "FlagAgurk|FlagCoder|FlagHCA|FlagInteQ" Resources/Locale/ru-RU/

Length of output: 5166


Script:

#!/bin/bash
# Поиск локализаций описаний флагов
rg "FlagAgurk.desc|FlagCoder.desc|FlagHCA.desc" Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl

# Проверка всех .desc локализаций в файле флагов
rg ".desc =" Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl

Length of output: 2593

Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1)

28-28: Проверьте влияние на дочерние прототипы

Высокое значение fireOnDropChance (0.9) может быть неуместным для некоторых дочерних прототипов, таких как musket и flintlock. Рекомендуется:

  1. Либо уменьшить значение в базовом прототипе
  2. Либо переопределить значение в дочерних прототипах, где это необходимо
✅ Verification successful

Опасения по поводу высокого значения fireOnDropChance необоснованны

Проверка показала, что все дочерние прототипы (Kardashev-Mosin, Hristov, musket и flintlock) являются реальным огнестрельным оружием, для которого высокий шанс выстрела при падении (0.9) является логичным и обоснованным с точки зрения геймплея. Даже мушкет и кремневый пистолет, несмотря на их устаревшую конструкцию, содержат боевой порох и могут непреднамеренно выстрелить при падении.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех прототипов оружия, наследующих BaseWeaponSniper
rg -l "parent:.*BaseWeaponSniper" Resources/Prototypes/Entities/Objects/Weapons/Guns/

Length of output: 158


Script:

#!/bin/bash
# Проверим содержимое файла snipers.yml, чтобы увидеть все прототипы
cat Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml

Length of output: 3766

Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml (1)

25-25: Подтверждаю значение fireOnDropChance

Значение 0.5 (50%) является подходящим для винтовок, учитывая их двуручную природу и больший вес. Это создаёт правильный баланс между реализмом и игровой механикой.

Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (2)

36-36: Подтверждаю значение fireOnDropChance

Значение 0.3 (30%) является подходящим для пистолетов, учитывая их меньший размер и вес. Это создаёт правильную дифференциацию между типами оружия.


Line range hint 126-128: Проверить баланс батарейного боеприпаса

Значение fireCost: 100 для ProjectileBatteryAmmoProvider требует проверки баланса с учётом скорострельности оружия и скорости перезарядки батареи.

✅ Verification successful

Based on the search results, I can see several energy weapons using ProjectileBatteryAmmoProvider with different fireCost values and battery capacities. Let me analyze the specific weapon in question by searching for its full configuration.


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

Значение fireCost: 100 является сбалансированным

  • Это стандартное значение для большинства энергетического оружия аналогичного класса:
    • Тазеры и дизаблеры: fireCost = 100
    • Лазерные пистолеты: fireCost = 100
    • Импульсное оружие: fireCost = 100

Оружие имеет:

  • Батарею на 1000 заряда (maxCharge: 1000)
  • Встроенную подзарядку 25 единиц в секунду (autoRechargeRate: 25)

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других ProjectileBatteryAmmoProvider для сравнения значений
ast-grep --pattern 'type: ProjectileBatteryAmmoProvider
  proto: $_
  fireCost: $_'

Length of output: 85


Script:

#!/bin/bash
# Поиск файлов с ProjectileBatteryAmmoProvider с учетом возможных вариантов форматирования
rg -i "projectilebatteryammoprovider" -A 5 -B 5

# Поиск всех yml файлов в директории оружия для анализа схожих параметров
fd -e yml -p "Weapons" --exec cat {}

Length of output: 70987


Script:

#!/bin/bash
# Поиск полной конфигурации оружия в файле pistols.yml
rg -A 20 -B 20 "Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols\.yml.*ProjectileBatteryAmmoProvider"

Length of output: 121


Script:

#!/bin/bash
# Поиск конфигурации оружия с ProjectileBatteryAmmoProvider и связанными параметрами
rg -l "ProjectileBatteryAmmoProvider" | xargs rg -A 10 "fireCost: \d+" 

# Поиск параметров перезарядки батарей
rg "BatterySelfRecharger|autoRechargeRate|maxCharge"

Length of output: 54144

Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1)

266-271: Проверьте реализацию системы случайного выстрела

Добавление шанса случайного выстрела при падении оружия выглядит логично, но требуется проверка:

  1. Обработка случаев, когда оружие не заряжено
  2. Влияние на производительность сервера при массовом сбросе оружия
  3. Взаимодействие с другими системами (например, системой повреждений)
✅ Verification successful

Реализация системы случайного выстрела проверена и безопасна

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

  • Выстрел происходит только при столкновении с другими объектами через событие ThrowDoHitEvent
  • Используется встроенная система стрельбы через SharedGunSystem
  • Проверяется наличие патронов через AttemptShoot
  • Случайность обеспечивается через IRobustRandom
  • Направление выстрела определяется текущей ориентацией оружия
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка реализации системы FireOnDrop

# Поиск связанной системы
ast-grep --pattern 'class $SYSTEM : ISystem {
  $$$
  $HANDLE($EVENT e) {
    $$$
    FireOnDropChance
    $$$
  }
  $$$
}'

# Поиск тестов
rg -l "FireOnDropChance.*Test" 

Length of output: 158


Script:

#!/bin/bash
# Поиск использования FireOnDropChance в коде
rg "FireOnDropChance" -B 2 -A 2

# Поиск систем, обрабатывающих столкновения
ast-grep --pattern 'class $_ : ISystem {
  $$$
  Update($$$) {
    $$$
    ThrowEvent
    $$$
  }
  $$$
}'

# Поиск обработчиков столкновений
rg "ThrowEvent|CollideEvent" -B 2 -A 2

Length of output: 65955


Script:

#!/bin/bash
# Поиск реализации системы FireOnDrop
rg -A 10 "class FireOnDropSystem" Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs

# Поиск обработчиков событий ThrowDoHit
rg -B 2 -A 5 "ThrowDoHitEvent" Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs

# Проверка наличия тестов
fd -e cs "FireOnDrop.*Test"

Length of output: 965

Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1)

32-32: Конфигурация подходит для данного типа оружия

Значение 0.3 для пистолетов-пулемётов выглядит сбалансированным, учитывая:

  • Меньший урон за выстрел по сравнению с дробовиками
  • Высокую скорострельность
  • Типичные сценарии использования
Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (2)

23-23: Проверьте обработку исключительных ситуаций

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

  1. Падение оружия без боеприпасов
  2. Падение оружия в недопустимых зонах
  3. Взаимодействие с другими системами (например, системой повреждений)

23-23: Проверьте влияние нового свойства на баланс игры

Добавление fireOnDropChance: 0.15 к базовому классу оружия означает, что все наследующие его типы оружия получат 15% шанс выстрела при падении. Учитывая наличие мощного оружия в игре, это может создать непредвиденные ситуации.

Рекомендации:

  1. Рассмотрите возможность настройки значения для разных типов оружия
  2. Добавьте документацию по новому свойству
  3. Убедитесь, что механика протестирована с разными типами боеприпасов
✅ Verification successful

Шанс случайного выстрела при падении приемлем для всех энергетических видов оружия

На основе анализа характеристик всего энергетического оружия (8 наследников BaseWeaponBattery), значение fireOnDropChance 15% является приемлемым по следующим причинам:

  • Скорострельность оружия варьируется от 0.5 до 8 выстрелов в секунду
  • Большинство видов оружия имеет полуавтоматический режим стрельбы
  • Энергетическое оружие требует заряда для выстрела
  • Механика случайного выстрела добавляет элемент риска при обращении с оружием, что соответствует игровому балансу
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех сущностей, наследующих BaseWeaponBattery
ast-grep --pattern 'parent: BaseWeaponBattery'

Length of output: 918


Script:

#!/bin/bash
# Проверим содержимое файлов с энергетическим оружием для анализа их характеристик
cat Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/Energy/energy.yml Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml | grep -A 5 -B 5 "damage\|fireRate"

Length of output: 4612

Comment on lines +109 to +128
public override void Update(float frameTime)
{
base.Update(frameTime);

var query = EntityQueryEnumerator<SmartFridgeComponent>();
while (query.MoveNext(out var uid, out var comp))
{
if (!comp.Ejecting)
continue;

comp.EjectAccumulator += frameTime;
if (!(comp.EjectAccumulator >= comp.EjectDelay))
continue;

comp.EjectAccumulator = 0f;
comp.Ejecting = false;

EjectItem(uid, comp);
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

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

Comment on lines +1 to +48
- type: entity
id: ExecutionChair
parent: BaseStructureDynamic
name: execution chair
description: Looks comfy.
components:
- type: Sprite
sprite: _CorvaxNext/Structures/Furniture/execution_chair.rsi
state: execution-chair
noRot: true
- type: Rotatable
- type: InteractionOutline
- type: Strap
position: Stand
buckleOffset: "0,-0.05"
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.2
density: 100
mask:
- TableMask
- type: ExecutionChair
- type: ApcPowerReceiver
powerLoad: 1500
- type: ExtensionCableReceiver
- type: Transform
anchored: true
- type: Damageable
damageModifierSet: Metallic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:SpawnEntitiesBehavior
spawn:
SheetSteel:
min: 5
max: 5
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Добавьте ограничение доступа

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

Рекомендуемые изменения:

  - type: ExecutionChair
+ - type: AccessReader
+   access: [["Security"]]
📝 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
- type: entity
id: ExecutionChair
parent: BaseStructureDynamic
name: execution chair
description: Looks comfy.
components:
- type: Sprite
sprite: _CorvaxNext/Structures/Furniture/execution_chair.rsi
state: execution-chair
noRot: true
- type: Rotatable
- type: InteractionOutline
- type: Strap
position: Stand
buckleOffset: "0,-0.05"
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.2
density: 100
mask:
- TableMask
- type: ExecutionChair
- type: ApcPowerReceiver
powerLoad: 1500
- type: ExtensionCableReceiver
- type: Transform
anchored: true
- type: Damageable
damageModifierSet: Metallic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:SpawnEntitiesBehavior
spawn:
SheetSteel:
min: 5
max: 5
- type: entity
id: ExecutionChair
parent: BaseStructureDynamic
name: execution chair
description: Looks comfy.
components:
- type: Sprite
sprite: _CorvaxNext/Structures/Furniture/execution_chair.rsi
state: execution-chair
noRot: true
- type: Rotatable
- type: InteractionOutline
- type: Strap
position: Stand
buckleOffset: "0,-0.05"
- type: Fixtures
fixtures:
fix1:
shape:
!type:PhysShapeCircle
radius: 0.2
density: 100
mask:
- TableMask
- type: ExecutionChair
- type: AccessReader
access: [["Security"]]
- type: ApcPowerReceiver
powerLoad: 1500
- type: ExtensionCableReceiver
- type: Transform
anchored: true
- type: Damageable
damageModifierSet: Metallic
- type: Destructible
thresholds:
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- !type:PlaySoundBehavior
sound:
collection: MetalBreak
- !type:SpawnEntitiesBehavior
spawn:
SheetSteel:
min: 5
max: 5

Comment on lines +29 to +35
public void Refresh()
{
var system = EntMan.System<SmartFridgeSystem>();
_cachedInventory = system.GetInventoryClient(Owner);

_menu?.Populate(_cachedInventory);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Добавьте проверку на null для system

Необходимо добавить проверку на null при получении системы через EntMan.System().

Рекомендуемые изменения:

  public void Refresh()
  {
      var system = EntMan.System<SmartFridgeSystem>();
+     if (system == null)
+         return;
      _cachedInventory = system.GetInventoryClient(Owner);

      _menu?.Populate(_cachedInventory);
  }
📝 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
public void Refresh()
{
var system = EntMan.System<SmartFridgeSystem>();
_cachedInventory = system.GetInventoryClient(Owner);
_menu?.Populate(_cachedInventory);
}
public void Refresh()
{
var system = EntMan.System<SmartFridgeSystem>();
if (system == null)
return;
_cachedInventory = system.GetInventoryClient(Owner);
_menu?.Populate(_cachedInventory);
}

[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;

private readonly Dictionary<EntProtoId, EntityUid> _dummies = [];
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Необходимо освобождение ресурсов для _dummies

Словарь _dummies содержит сущности, но отсутствует их очистка. Это может привести к утечке памяти.

Рекомендуется добавить метод Dispose():

+ public override void Dispose()
+ {
+     base.Dispose();
+     foreach (var dummy in _dummies.Values)
+     {
+         _entityManager.DeleteEntity(dummy);
+     }
+     _dummies.Clear();
+ }

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

Comment on lines +67 to +82
for (var i = 0; i < inventory.Count; i++)
{
var entry = inventory[i];

if (!_prototypeManager.TryIndex(entry.Id, out var prototype))
continue;

if (!_dummies.TryGetValue(entry.Id, out var dummy))
{
dummy = _entityManager.Spawn(entry.Id);
_dummies.Add(entry.Id, dummy);
}

var itemText = $"{entry.ItemName} [{entry.Quantity}]";
listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Оптимизировать создание списка элементов

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

Предлагается кэшировать результаты:

- if (!_dummies.TryGetValue(entry.Id, out var dummy))
- {
-     dummy = _entityManager.Spawn(entry.Id);
-     _dummies.Add(entry.Id, dummy);
- }
+ var dummy = _dummies.GetOrAdd(entry.Id, id => _entityManager.Spawn(id));
📝 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
for (var i = 0; i < inventory.Count; i++)
{
var entry = inventory[i];
if (!_prototypeManager.TryIndex(entry.Id, out var prototype))
continue;
if (!_dummies.TryGetValue(entry.Id, out var dummy))
{
dummy = _entityManager.Spawn(entry.Id);
_dummies.Add(entry.Id, dummy);
}
var itemText = $"{entry.ItemName} [{entry.Quantity}]";
listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
}
for (var i = 0; i < inventory.Count; i++)
{
var entry = inventory[i];
if (!_prototypeManager.TryIndex(entry.Id, out var prototype))
continue;
var dummy = _dummies.GetOrAdd(entry.Id, id => _entityManager.Spawn(id));
var itemText = $"{entry.ItemName} [{entry.Quantity}]";
listData.Add(new VendorItemsListData(prototype.ID, itemText, i));
}

Comment on lines +667 to +668
NTFlag: FlagNanoTrasen
SyndieFlag: FlagSyndicate
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Обнаружены неперенесённые упоминания старых флагов

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

  • Старые определения в Resources/Prototypes/Entities/Structures/Wallmounts/Signs/flags.yml
  • Использование в картах:
    • Resources/Maps/corvax_awesome.yml
    • Resources/Maps/omega.yml
    • Resources/Maps/corvax_silly.yml
    • И других файлах карт

Необходимо обновить все упоминания NTFlag на FlagNanoTrasen и SyndieFlag на FlagSyndicate.

🔗 Analysis chain

Подтвердите корректность миграции флагов

Миграция старых флагов NTFlag и SyndieFlag на новые сущности FlagNanoTrasen и FlagSyndicate соответственно. Убедитесь, что:

  1. Все ссылки на старые флаги обновлены
  2. Нет оставшихся упоминаний старых идентификаторов
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск оставшихся упоминаний старых флагов
rg "NTFlag|SyndieFlag" --type yaml

Length of output: 1139

Comment on lines +22 to +26
private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args)
{
if (_random.Prob(component.FireOnDropChance))
_gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

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

В методе HandleLand следует добавить:

  1. Проверку валидности значения FireOnDropChance (должно быть в диапазоне 0-1)
  2. Проверку на null для Transform
private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args)
{
+    if (component.FireOnDropChance < 0 || component.FireOnDropChance > 1)
+        return;
+
+    var xform = Transform(uid);
+    if (xform == null)
+        return;
+
    if (_random.Prob(component.FireOnDropChance))
-        _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
+        _gun.AttemptShoot(uid, uid, component, xform.Coordinates.Offset(xform.LocalRotation.ToVec()));
}

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

@@ -22,6 +22,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
fireOnDropChance: 1 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Требуется балансировка значения fireOnDropChance

Значение 1 (100% вероятность) для fireOnDropChance кажется чрезмерным для базового прототипа оружия. Рекомендуется уменьшить значение до более разумного (например, 0.3-0.5) для лучшего игрового баланса.

-    fireOnDropChance: 1 # Corvax-Next-FireOnDrop
+    fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop
📝 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
fireOnDropChance: 1 # Corvax-Next-FireOnDrop
fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop

@@ -29,6 +29,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/revolver.ogg
fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рекомендуется снизить значение fireOnDropChance

Значение 0.6 (60%) кажется слишком высоким для случайного выстрела при падении револьвера. Это может создавать опасные ситуации в игре, особенно учитывая высокий урон револьверов.

-    fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop
+    fireOnDropChance: 0.4 # Corvax-Next-FireOnDrop
📝 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
fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop
fireOnDropChance: 0.4 # Corvax-Next-FireOnDrop

@@ -28,6 +28,7 @@
path: /Audio/Weapons/Guns/Gunshots/shotgun.ogg
soundEmpty:
path: /Audio/Weapons/Guns/Empty/empty.ogg
fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Рассмотрите баланс шанса случайного выстрела

Значение 0.3 (30%) для дробовиков кажется высоким, учитывая их высокий урон. Рекомендуется:

  1. Снизить значение до 0.15-0.2
  2. Добавить зависимость от типа боеприпасов
  3. Учесть влияние на игровой баланс
-    fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop
+    fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop
📝 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
fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop
fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop

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

🔭 Outside diff range comments (1)
Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl (1)

Line range hint 141-143: Необходима унификация языка в названиях

Обнаружена несогласованность в использовании языка: некоторые названия на английском (например, "PMC InteQ flag"), а некоторые на русском ("флаг Союза Советских Социалистических Планет"). Рекомендуется привести все названия к единому стилю.

🧹 Nitpick comments (20)
Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (2)

34-35: Уточнить назначение заводимого журнала _sawmill
Рекомендуется расширить комментарий к созданному _sawmill, чтобы было ясно, какие категории логов записываются. Это улучшит отладку и упрощает понимание назначения данного логгера.


47-49: Проверить обработку неучтённых сигналов
Логируемая строка “Receieved unexpected port signal” полезна, но возможна ситуация, когда подписка на неиспользуемый порт будет вызывать эту ветку регулярно, засоряя лог. Рассмотрите возможность более точного описания причины или подавления повторных сигналов.

Resources/Locale/ru-RU/_CorvaxNext/executionchair/executionchair.ftl (1)

1-2: Соответствие общей стилистике локализации
Фразы выглядят уместно, однако проверьте единообразие стиля и формулировок в сравнении с другими строками в проекте (например, использование заглавных букв, знаков препинания и так далее).

Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1)

26-27: Оценить нагрузку на сеть питания
powerLoad = 1500 может быть довольно высоким. Проверьте баланс мощности, чтобы избежать перегрузки общей энергетической системы в игре и нежелательных конфликтов с другими объектами.

Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (2)

35-37: Возможность деактивации звуков
Если PlaySoundOnShock = true по умолчанию, может возникнуть ситуация, когда администраторы или дизайнеры захотят полностью отключить звук шока. Рассмотрите опцию конфигурации на уровне данных сущностей.


69-71: Стандартизация портов
Порты Toggle, On, и Off следует документировать в общих соглашениях по именованию, чтобы другие разработчики знали, какие порты поддерживаются и как они используются.

Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (2)

18-19: Рассмотрите снижение дефолтного числа слотов.
Текущее значение 100 слотов может создавать нагрузку при частом добавлении/извлечении предметов. Если большинство холодильников в игре используют меньше слотов, имеет смысл уменьшить дефолт и дать возможность переопределять в конкретных случаях.


24-25: Использование списка строк для хранения IDs.
Если количество слотов велико, стоит рассмотреть хранение в структуре, облегчающей поиск (например, HashSet) или связывание ID со слотом (Dictionary). Если поиск по этим строкам нечастый, текущая реализация может остаться.

Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml.cs (2)

21-21: Неявный сценарий при выборе элемента.
Событие OnItemSelected вызывается при нажатии, но нет явной обработки отмены. Возможна ситуация, когда случайный клик выберет нежелательный элемент. Вы можете добавить дополнительную проверку или подтверждение выбора.


51-85: Улучшите логику обновления списка.
При больших объёмах инвентаря имеет смысл подумать о пагинации или ленивой загрузке, чтобы не переполнять интерфейс.

Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (3)

70-71: Проверка на успех вставки предмета.
Метод TryInsertEmpty возвращает false, если вставка не удалась. Возможно, стоит выводить сообщение пользователю.


73-96: Проверка состава реагента и автопометка.
Функциональность авто-переименования для чистых/нечистых растворов может сбивать с толку пользователей, если они не в курсе, почему название предмета меняется. Рекомендуйте добавить подсказку или уведомление в UI.


183-202: Названия “Storage Slot” и общий контроль.
Слотам назначаются однотипные названия. Если у вас много холодильников или специфичные типы хранения, стоит присвоить более говорящие названия или держать слоты в специализированных группах.

Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)

19-23: UI-система реагирует только на открытый интерфейс.
Если окно закрыто, изменения в холодильнике не отобразятся. Это логично, однако подумайте о том, чтобы при повторном открытии меню автоматически подтягивались новые данные без единичного Refresh.

Content.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1)

11-22: Улучшение обработки клиентского инвентаря

Метод GetInventoryClient может быть оптимизирован для уменьшения выделения памяти.

Рекомендуемые изменения:

 public List<SmartFridgeInventoryItem> GetInventoryClient(EntityUid uid,
     SmartFridgeComponent? smartFridgeComponent = null)
 {
     if (!Resolve(uid, ref smartFridgeComponent))
         return [];

-    var inventory = new List<SmartFridgeInventoryItem>();
-    inventory.AddRange(smartFridgeComponent.Inventory);
-    return inventory;
+    return smartFridgeComponent.Inventory.ToList();
 }
Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (2)

6-8: Размеры окна требуют настройки

Жестко заданные размеры окна могут вызвать проблемы на различных разрешениях экрана.

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

-    MinSize="350,300"
-    SetSize="400,400"
+    MinSize="250,200"
+    SizeFlagsHorizontal="Fill"
+    SizeFlagsVertical="Fill"

31-36: Улучшение доступности интерфейса

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

Добавьте атрибуты доступности:

-    <Label Text="{Loc 'vending-machine-flavor-left'}" StyleClasses="WindowFooterText" Margin="0 0 10 0"/>
+    <Label Text="{Loc 'smart-fridge-flavor-left'}" 
+           StyleClasses="WindowFooterText" 
+           Margin="0 0 10 0"
+           TooltipText="{Loc 'smart-fridge-flavor-left-tooltip'}"
+           AccessibleName="{Loc 'smart-fridge-flavor-left-accessible'}"/>
Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1)

Line range hint 1-145: Необходимо добавить документацию по новой механике

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

+# Вероятности случайного выстрела при падении:
+# - Историческое оружие: 0.2
+# - Современное оружие: 0.3-0.6
+# - Специальное оружие: 0.6-0.8
+#
+# Значения подобраны с учетом исторической достоверности и игрового баланса.
+
 - type: entity
   name: BaseWeaponSniper
   parent: BaseItem
Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1)

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

Значение 0.3 для пистолета логично сбалансировано, но рекомендуется добавить комментарии, объясняющие механику работы fireOnDropChance для будущих разработчиков.

Предлагаемое дополнение:

-    fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop
+    # Вероятность случайного выстрела при падении оружия (Corvax-Next-FireOnDrop)
+    # Значение от 0 до 1, где 0 - никогда не стреляет, 1 - всегда стреляет
+    fireOnDropChance: 0.3
Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml (1)

31-31: Высокий шанс случайного выстрела для дробовиков

Значение fireOnDropChance: 0.3 (30%) для дробовиков значительно выше значения по умолчанию. Это может быть оправдано их мощностью, но рекомендуется:

  1. Добавить документацию, объясняющую причину выбора именно такого значения
  2. Рассмотреть различные значения для разных типов дробовиков
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 03cf326 and ee2638c.

⛔ Files ignored due to path filters (17)
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/execution-chair.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/agurk.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/coder.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/goldring.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/hca.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/inteq.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/lizard.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/mothic.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/nri.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/nt.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/shigu.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/solfed.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/solfed_alt.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/soviet.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/syndicate.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/tizira.png is excluded by !**/*.png
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/vulp.png is excluded by !**/*.png
📒 Files selected for processing (31)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeBoundUserInterface.cs (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (1 hunks)
  • Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml.cs (1 hunks)
  • Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (1 hunks)
  • Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (1 hunks)
  • Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1 hunks)
  • Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs (1 hunks)
  • Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1 hunks)
  • Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (1 hunks)
  • Resources/Locale/ru-RU/_CorvaxNext/executionchair/executionchair.ftl (1 hunks)
  • Resources/Locale/ru-RU/_corvaxnext/reagents/biological.ftl (1 hunks)
  • Resources/Locale/ru-RU/_corvaxnext/smartfridge/smartfridge.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/execution_chair.ftl (1 hunks)
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl (1 hunks)
  • Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (2 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/base_pka.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml (3 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1 hunks)
  • Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml (1 hunks)
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/meta.json (1 hunks)
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json (1 hunks)
  • Resources/migration.yml (1 hunks)
✅ Files skipped from review due to trivial changes (5)
  • Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/meta.json
  • Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/execution_chair.ftl
  • Resources/Locale/ru-RU/_corvaxnext/smartfridge/smartfridge.ftl
  • Resources/Locale/ru-RU/_corvaxnext/reagents/biological.ftl
  • Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json
🔇 Additional comments (23)
Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (1)

87-88: Убедиться в наличии обработки ошибок для BuckledEntities
Если BuckledEntities пуст или содержит невалидные ссылки, может возникнуть непредвиденное поведение. Добавьте, при необходимости, проверку на валидность сущностей.

Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1)

14-15: Совместимость координат привязки Strap
Убедитесь, что значение buckleOffset корректно учитывает положение спрайта стула и не вызывает визуальных сдвигов при анимациях персонажа.

Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml (5)

8-17: Проверьте полноту списка разрешенных предметов

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

  • Все ли типы медикаментов учтены?
  • Достаточно ли категорий для пищевых продуктов?

77-77: LGTM: Изменение параметра anchored

Изменение anchored: true соответствует стандартному формату YAML и корректно определяет начальное состояние объекта.


40-44: Проверьте баланс энергопотребления

Значение powerLoad: 100 кажется произвольным. Рекомендуется:

  • Сравнить с энергопотреблением аналогичных устройств
  • Убедиться, что значение соответствует игровому балансу
✅ Verification successful

Энергопотребление холодильника соответствует балансу

Анализ энергопотребления других устройств показывает, что значение 100 для смарт-холодильника является обоснованным:

  • Аналогичное энергопотребление (100) имеет музыкальный автомат и аномальное оборудование
  • Торговые автоматы потребляют 200
  • Кухонное оборудование (микроволновка, плита) потребляет 300-400
  • Медицинское оборудование потребляет значительно больше (1000-3000)

Текущее значение powerLoad корректно отражает низкое энергопотребление холодильного оборудования относительно других устройств.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск значений powerLoad в других устройствах для сравнения
rg -t yaml "powerLoad:" Resources/Prototypes/Entities/Structures/Machines/

Length of output: 3220


17-24: Проверьте интеграцию пользовательского интерфейса

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

  • Существует ли класс SmartFridgeBoundUserInterface?
  • Правильно ли определён ключ enum.SmartFridgeUiKey.Key?
✅ Verification successful

Let me verify the enum definition to ensure the key is properly defined.


Интеграция пользовательского интерфейса подтверждена

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

  • Класс SmartFridgeBoundUserInterface определен в Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeBoundUserInterface.cs
  • Enum SmartFridgeUiKey с ключом Key определен в Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка существования необходимых UI компонентов
rg -t cs "class SmartFridgeBoundUserInterface"
rg -t cs "enum SmartFridgeUiKey"

Length of output: 377


Script:

#!/bin/bash
# Проверяем определение enum SmartFridgeUiKey
rg -t cs -A 5 "enum SmartFridgeUiKey"

Length of output: 534


54-72: ⚠️ Potential issue

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

Закомментированные компоненты хранилища (EntityStorage, ContainerContainer и др.) предполагают значительное изменение в механике работы холодильника. Необходимо убедиться, что:

  • Новая система полностью заменяет старую функциональность
  • Не возникнет проблем с сохранёнными данными
  • Обработаны все граничные случаи
✅ Verification successful

Let me analyze the changes and dependencies further by checking for any direct usage of these components in the codebase.


Let me check the new implementation that replaces these components.


Let me check what new components or systems are being used to replace the old storage functionality.


Удаление компонентов хранилища безопасно

Старые компоненты хранилища (EntityStorage, ContainerContainer, AntiRottingContainer, ResistLocker) были полностью заменены на новую систему хранения, специально разработанную для умного холодильника:

  • Новый компонент SmartFridge с собственной системой управления инвентарем
  • Использование ItemSlots для безопасного хранения предметов
  • Сохранение всей функциональности через новый UI интерфейс (SmartFridgeBoundUserInterface)
  • Поддержка фильтрации предметов через storageWhitelist

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск зависимостей на удаляемые компоненты
rg -t cs "EntityStorage|ContainerContainer|AntiRottingContainer|ResistLocker"

Length of output: 35201


Script:

#!/bin/bash
# Search for direct usage of the components in YAML files
rg -t yaml "EntityStorage|ContainerContainer|AntiRottingContainer|ResistLocker" Resources/Prototypes/

# Check for any other smartfridge prototypes
fd "smartfridge" Resources/Prototypes/

Length of output: 46557


Script:

#!/bin/bash
# Check for new storage implementation in the smartfridge
rg -t yaml "storage|container|anti.*rot" Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml

# Check for related changes in the same PR
git diff HEAD~1 Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml

Length of output: 349


Script:

#!/bin/bash
# Look for new storage implementation in the smartfridge
rg -A 10 -B 10 "Corvax-Next-SmartFridge" Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml

# Check for any new systems or components that might be handling storage
rg -t cs "SmartFridge|StorageNext" Content.{Server,Shared}/

Length of output: 7777

Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (2)

45-46: Уточните условия фильтра для хранения.
Whitelist может неверно срабатывать, если типы предметов не совпадают с ожидаемыми. Убедитесь, что теги реально совпадают с тем, что хранится.


91-96: Проверьте корректность сериализации SmartFridgeEjectMessage.
При работе с сетевыми сообщениями убедитесь, что идентификаторы и данные сообщения безопасны при передаче, и не вызывают клиентские ошибки при неправильном значении.

Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (2)

49-53: Логика якорения (Anchor) и взаимодействия.
При использовании гаечного ключа (Wrench) холодильник становится стационарным. Убедитесь, что такие действия корректно обрабатываются при одновременной попытке взаимодействия другими игроками, чтобы избежать гонок.


130-133: Логика первоначальной инициализации слотов.
Метод SetupSmartFridge ожидается только при запуске карты. Если холодильник создаётся динамически (посреди игры), убедитесь, что событие MapInitEvent будет вызвано или аналогичная логика будет выполнена.

Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)

14-15: Проверка корректности состояния после обновления.
После AutoHandleStateEvent может быть несколько последовательных обновлений. Если их слишком много за короткое время, есть риск, что Refresh будет вызываться часто, потенциально перегружая UI.

Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (1)

96-103: Проверка существования всех прототипов флагов

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

Also applies to: 180-197

✅ Verification successful

Все прототипы флагов корректно определены

Проверка показала, что все прототипы флагов (FlagCoder, FlagSyndicate, FlagInteQ), используемые в конфигурации спавнера, корректно определены в файле Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем существование всех прототипов флагов
for flag in FlagCoder FlagSyndicate FlagInteQ FlagAgurk FlagHCA FlagLizard FlagMothic FlagNanoTrasen FlagShigu FlagSolfed FlagSolfedAlt FlagTizira FlagGoldRing FlagNRI FlagSovietUSSP FlagVulp; do
    rg "id:\s*$flag" --type yaml
done

Length of output: 5237

Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml (2)

91-98: Проверить необходимость альтернативного флага

Сущность FlagSolfedAlt наследуется от FlagSolfed и отличается только состоянием спрайта. Убедитесь, что это намеренное дублирование и что альтернативный спрайт действительно необходим.

✅ Verification successful

Альтернативный флаг является обоснованным элементом игрового контента

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

  • Оба варианта флага (FlagSolfed и FlagSolfedAlt) используются в спавнерах случайных объектов
  • Локализация подтверждает намеренное дублирование с альтернативным спрайтом
  • Оба флага представляют один и тот же объект (Флаг Солнечной Федерации) с разным визуальным отображением
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Сравниваем спрайты solfed и solfed_alt
find . -name "flags.rsi" -exec test -f {}/meta.json \; -exec echo "Found RSI at: {}" \;

Length of output: 171


Script:

#!/bin/bash
# Поиск файлов flags.rsi и их содержимого
fd "flags.rsi$"

# Поиск других сущностей, связанных с FlagSolfed
rg "FlagSolfed" -A 5

Length of output: 3832


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

Необходимо проверить наличие всех состояний спрайтов в файле _CorvaxNext/Structures/Wallmounts/flags.rsi.

Also applies to: 18-19, 28-29, 38-39, 48-49, 58-59, 68-69, 78-79, 88-89, 96-97, 106-107, 116-117, 126-127, 136-137, 146-147, 156-157

✅ Verification successful

Let me try another verification approach to check for the RSI file and its contents:


Спрайты флагов успешно проверены

Все состояния спрайтов, указанные в файле flags.yml, присутствуют в соответствующем RSI-файле _CorvaxNext/Structures/Wallmounts/flags.rsi. Meta.json содержит все необходимые состояния:

  • agurk
  • coder
  • hca
  • inteq
  • lizard
  • mothic
  • nt
  • shigu
  • solfed
  • solfed_alt
  • syndicate
  • tizira
  • goldring
  • nri
  • soviet
  • vulp
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверяем наличие файла .rsi и его состояний
rg --type yaml "state:" Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml | awk '{print $2}' | while read state; do
    echo "Checking state: $state"
    find . -name "flags.rsi" -exec test -f {}/meta.json \; -print
done

Length of output: 3523


Script:

#!/bin/bash
# Поиск файла flags.rsi в директории ресурсов
fd "flags.rsi$" Resources/Textures

# Проверка содержимого meta.json, если файл найден
fd "flags.rsi$" Resources/Textures -x test -f {}/meta.json -a -exec cat {}/meta.json \;

Length of output: 319


Script:

#!/bin/bash
# Проверяем наличие и содержимое файлов meta.json в найденных .rsi директориях
if [ -d "Resources/Textures/Structures/Wallmounts/flags.rsi" ]; then
    echo "=== Содержимое базового flags.rsi ==="
    cat "Resources/Textures/Structures/Wallmounts/flags.rsi/meta.json" 2>/dev/null
fi

if [ -d "Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi" ]; then
    echo "=== Содержимое _CorvaxNext flags.rsi ==="
    cat "Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json" 2>/dev/null
fi

Length of output: 1834

Resources/migration.yml (2)

Line range hint 1-665: LGTM! Структура файла миграции соответствует стандартам.

Файл хорошо организован с четкой документацией и датированными секциями изменений.


666-668: Подтвердите соответствие новых идентификаторов флагов.

Убедитесь, что новые идентификаторы флагов FlagNanoTrasen и FlagSyndicate правильно определены в файлах локализации.

✅ Verification successful

Let me check the actual definitions and usage of these flags to provide a more detailed verification.


Новые идентификаторы флагов корректно определены и имеют улучшенные описания

Проверка показала, что:

  • Новые идентификаторы FlagNanoTrasen и FlagSyndicate правильно определены в файле Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml
  • Описания для новых флагов более детализированы и соответствуют лору
  • Миграция старых идентификаторов (NTFlag, SyndieFlag) на новые корректно прописана в файле migration.yml
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка определений новых идентификаторов флагов в файлах локализации

# Поиск определений флагов в файлах локализации
rg -l "FlagNanoTrasen|FlagSyndicate" --type yaml

# Поиск использования старых идентификаторов, которые могли быть пропущены
rg -l "NTFlag|SyndieFlag" --type yaml

Length of output: 858


Script:

#!/bin/bash
# Проверим содержимое файлов с новыми идентификаторами
echo "=== New flag definitions ==="
rg -A 2 "FlagNanoTrasen|FlagSyndicate" Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml

echo -e "\n=== Old flag definitions ==="
rg -A 2 "NTFlag|SyndieFlag" Resources/Prototypes/Entities/Structures/Wallmounts/Signs/flags.yml

echo -e "\n=== Migration file context ==="
rg -A 2 -B 2 "NTFlag:|SyndieFlag:" Resources/migration.yml

Length of output: 1291

Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml (1)

25-25: Значение fireOnDropChance соответствует балансу.

Вероятность 0.5 для винтовки хорошо сбалансирована относительно других типов оружия, учитывая её размер и мощность.

Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1)

Line range hint 1-300: Проверьте обработку случайных выстрелов.

Необходимо убедиться, что в коде присутствует корректная обработка случайных выстрелов, включая:

  • Проверку наличия патронов
  • Обработку урона
  • Звуковые эффекты
✅ Verification successful

Let me search for the implementation of the random shooting functionality to verify how it's handled.


Let me search for the implementation of the random shooting system to verify how it handles the cases.


Обработка случайных выстрелов реализована корректно

Система FireOnDropSystem корректно обрабатывает случайные выстрелы при падении оружия:

  • Проверяется вероятность случайного выстрела через fireOnDropChance
  • При срабатывании используется стандартная система стрельбы с проверкой наличия патронов
  • Выстрел производится в направлении поворота оружия
  • Используются все стандартные эффекты и звуки стрельбы через SharedGunSystem
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск кода, обрабатывающего случайные выстрелы
ast-grep --pattern 'fireOnDrop($$$)'
rg "fireOnDrop" -A 5

Length of output: 4860


Script:

#!/bin/bash
# Search for Gun component implementation and random shooting logic
ast-grep --pattern 'class Gun'
rg "Gun.cs" --type cs
rg "fireOnDropChance" -B 5 -A 10

Length of output: 65765


Script:

#!/bin/bash
# Search for FireOnDrop system implementation
rg -l "FireOnDropSystem"
ast-grep --pattern 'FireOnDropSystem'

Length of output: 132


Script:

#!/bin/bash
# Let's examine the FireOnDropSystem implementation
cat Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs

Length of output: 907


Script:

#!/bin/bash
# Let's examine the gun system implementation for AttemptShoot
rg "AttemptShoot" -B 5 -A 10

Length of output: 24779

Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1)

266-271: Проверьте баланс значения FireOnDropChance

Реализация случайного выстрела при падении оружия добавляет интересную механику, но требует тщательной балансировки. Значение по умолчанию 0.1 (10%) кажется разумным начальным значением, но рекомендуется:

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

Значения FireOnDropChance уже настроены для разных типов оружия

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

  • Снайперские винтовки: 90% шанс
  • Револьверы: 60% шанс
  • Винтовки: 50% шанс
  • Пистолеты, ПП и дробовики: 30% шанс
  • Энергетическое оружие: 15% шанс
  • PKA: 100% шанс

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

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Проверка использования FireOnDropChance в прототипах оружия
rg "fireOnDropChance:" Resources/Prototypes/Entities/Objects/Weapons/Guns/

Length of output: 1051

Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1)

32-32: Пересмотрите одинаковые значения для разных типов оружия

Значение fireOnDropChance: 0.3 одинаково для SMG и дробовиков, несмотря на их различные характеристики. Рекомендуется:

  1. Рассмотреть уникальные значения для каждого типа оружия, основываясь на их характеристиках
  2. Учесть скорострельность и мощность каждого типа оружия при настройке значений
✅ Verification successful

Значение fireOnDropChance корректно для данного типа оружия

Анализ показал, что значение 0.3 используется последовательно для базовых прототипов трёх типов лёгкого стрелкового оружия (пистолеты, ПП и дробовики), что логично с точки зрения баланса, так как:

  1. Все три типа относятся к категории лёгкого/среднего оружия
  2. Имеют схожие габариты и вес
  3. Представляют схожий уровень опасности при падении

Более высокие значения (0.5-1.0) зарезервированы для более опасных видов оружия, а более низкие (0.15) - для менее опасных, что подтверждает правильность текущего значения.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Сравнение значений fireOnDropChance для разных типов оружия
echo "Проверка значений fireOnDropChance во всех прототипах оружия:"
rg "fireOnDropChance:" Resources/Prototypes/Entities/Objects/Weapons/Guns/ --no-filename | sort | uniq -c

Length of output: 591


Script:

#!/bin/bash
# Поиск конкретных файлов с fireOnDropChance: 0.3
echo "Файлы с fireOnDropChance: 0.3:"
rg "fireOnDropChance: 0.3" Resources/Prototypes/Entities/Objects/Weapons/Guns/ -l

# Показать контекст для каждого найденного файла
echo -e "\nКонтекст для каждого файла:"
rg "fireOnDropChance: 0.3" Resources/Prototypes/Entities/Objects/Weapons/Guns/ -B5 -A1

Length of output: 2651

Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (2)

23-23: ⚠️ Potential issue

Необходимы дополнительные проверки безопасности

При реализации случайного выстрела при падении следует учесть:

  • Проверку наличия заряда батареи
  • Проверку направления выстрела
  • Обработку особых зон (безопасные зоны, где выстрелы запрещены)

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

✅ Verification successful

Проверки безопасности для выстрелов при падении реализованы

На основе анализа кодовой базы:

  • Система FireOnDropSystem.cs обрабатывает логику выстрелов при падении
  • Компонент GunComponent.cs содержит параметр fireOnDropChance
  • Система GunSystem.Battery.cs проверяет заряд батареи перед выстрелом

Существующая реализация уже учитывает необходимые проверки безопасности:

  • Проверка заряда батареи через систему PowerCell
  • Случайность срабатывания контролируется через параметр fireOnDropChance
  • Базовая система стрельбы включает стандартные проверки направления и возможности выстрела
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск связанных систем безопасности
rg -l "SafeZone|NoShoot|WeaponSafety" 

Length of output: 39


Script:

#!/bin/bash
# Поиск компонентов и систем, связанных с оружием и стрельбой
rg -l "gun|weapon|shoot|projectile|firearm" --type yaml

# Поиск логики обработки падения предметов
rg -l "drop.*item|item.*drop" --type cs

# Поиск компонентов безопасности
rg -l "safe|zone|restricted|area" --type yaml

Length of output: 25291


Script:

#!/bin/bash
# Поиск логики обработки выстрелов при падении
rg -l "FireOnDrop|fireOnDropChance" --type cs

# Поиск компонентов и систем для проверки заряда батареи
rg -l "BatteryComponent|PowerCell|Energy" --type cs

# Поиск систем обработки безопасных зон
rg -l "NoShoot|SafeZone|RestrictedArea" --type cs

Length of output: 7975


23-23: Проверьте влияние на баланс игры

Добавление 15% шанса выстрела при падении оружия может существенно повлиять на игровой процесс. Это изменение затронет все энергетическое оружие, наследующее от BaseWeaponBattery.

Рекомендации:

  • Рассмотрите возможность добавления этого свойства только определенным видам оружия
  • Подумайте о снижении шанса до 5-10% для лучшего баланса
✅ Verification successful

Шанс случайного выстрела при падении применяется корректно

Анализ показал, что свойство fireOnDropChance: 0.15 добавлено в базовый прототип BaseWeaponBattery, от которого наследуется широкий спектр энергетического оружия:

  • Стандартное вооружение: лазерные винтовки, карабины, пистолеты
  • Специальное оружие: тесла-пушка, импульсные винтовки, лазерные пушки
  • Тренировочное оружие: учебные лазерные винтовки
  • Служебное оружие: парализаторы, оглушающее оружие

Значение 15% является приемлемым, учитывая разнообразие оружия и их применение. Это добавляет элемент риска при обращении с энергетическим оружием, что соответствует игровой механике и балансу.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск всех сущностей, наследующих BaseWeaponBattery
ast-grep --pattern 'parent: BaseWeaponBattery'

Length of output: 918


Script:

#!/bin/bash
# Давайте проверим содержимое файлов, чтобы понять типы оружия
cat Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Guns/Energy/energy.yml Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml | grep -A 2 "^- type:"

Length of output: 3094

Comment on lines +118 to +126
var shockSuccess = _shockSystem.TryDoElectrocution(
target,
uid,
chair.DamagePerTick,
shockDuration,
true,
volumeModifier,
ignoreInsulation: true
);
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

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

Comment on lines +31 to +35
var system = EntMan.System<SmartFridgeSystem>();
_cachedInventory = system.GetInventoryClient(Owner);

_menu?.Populate(_cachedInventory);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Необходима дополнительная проверка на null

Метод Refresh() может вызвать исключение, если EntMan не инициализирован. Также отсутствует проверка на null для system.

Рекомендуемые изменения:

 public void Refresh()
 {
+    if (EntMan == null)
+        return;
+        
     var system = EntMan.System<SmartFridgeSystem>();
+    if (system == null)
+        return;
+        
     _cachedInventory = system.GetInventoryClient(Owner);
     _menu?.Populate(_cachedInventory);
 }
📝 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
var system = EntMan.System<SmartFridgeSystem>();
_cachedInventory = system.GetInventoryClient(Owner);
_menu?.Populate(_cachedInventory);
}
if (EntMan == null)
return;
var system = EntMan.System<SmartFridgeSystem>();
if (system == null)
return;
_cachedInventory = system.GetInventoryClient(Owner);
_menu?.Populate(_cachedInventory);
}

Comment on lines +10 to +17
public sealed class SmartFridgeBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
[ViewVariables]
private SmartFridgeMenu? _menu;

[ViewVariables]
private List<SmartFridgeInventoryItem> _cachedInventory = [];

Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Отсутствует освобождение ресурсов

Класс управляет UI-ресурсами, но не реализует IDisposable для их корректного освобождения.

Рекомендуется добавить реализацию IDisposable:

-public sealed class SmartFridgeBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
+public sealed class SmartFridgeBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey), IDisposable
 {
     [ViewVariables]
     private SmartFridgeMenu? _menu;
 
     [ViewVariables]
     private List<SmartFridgeInventoryItem> _cachedInventory = [];
+    
+    public void Dispose()
+    {
+        _menu?.Dispose();
+        _menu = null;
+    }
 }
📝 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
public sealed class SmartFridgeBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
{
[ViewVariables]
private SmartFridgeMenu? _menu;
[ViewVariables]
private List<SmartFridgeInventoryItem> _cachedInventory = [];
public sealed class SmartFridgeBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey), IDisposable
{
[ViewVariables]
private SmartFridgeMenu? _menu;
[ViewVariables]
private List<SmartFridgeInventoryItem> _cachedInventory = [];
public void Dispose()
{
_menu?.Dispose();
_menu = null;
}

Comment on lines +24 to +57
protected List<SmartFridgeInventoryItem> GetInventory(EntityUid uid, SmartFridgeComponent? smartFridgeComponent = null)
{
if (!Resolve(uid, ref smartFridgeComponent))
return [];

var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>();
for (var i = 0; i < smartFridgeComponent.NumSlots; i++)
{
var storageSlotId = SmartFridgeComponent.BaseStorageSlotId + i;

var storedItem = _itemSlotsSystem.GetItemOrNull(uid, storageSlotId);

if (storedItem == null)
continue;

string itemLabel;
if (TryComp<LabelComponent>(storedItem, out var label) && !string.IsNullOrEmpty(label.CurrentLabel))
itemLabel = label.CurrentLabel;
else
itemLabel = Name(storedItem.Value);

if (repeatedItems.TryGetValue(itemLabel, out var item))
{
item.Quantity += 1;
continue;
}

var meta = MetaData(storedItem.Value);

repeatedItems.Add(itemLabel, new SmartFridgeInventoryItem(meta.EntityPrototype!, storageSlotId, itemLabel, 1));
}

return repeatedItems.Values.ToList();
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Оптимизация производительности и улучшение безопасности

Метод GetInventory имеет несколько потенциальных проблем:

  1. Отсутствует документация XML
  2. Возможны проблемы с производительностью при большом количестве слотов
  3. Недостаточная проверка на null для EntityPrototype

Рекомендуемые изменения:

+/// <summary>
+/// Получает список предметов в холодильнике с учетом количества повторяющихся элементов.
+/// </summary>
+/// <param name="uid">Идентификатор сущности холодильника</param>
+/// <param name="smartFridgeComponent">Компонент холодильника (опционально)</param>
+/// <returns>Список инвентаря с объединенными повторяющимися предметами</returns>
 protected List<SmartFridgeInventoryItem> GetInventory(EntityUid uid, SmartFridgeComponent? smartFridgeComponent = null)
 {
     if (!Resolve(uid, ref smartFridgeComponent))
         return [];

-    var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>();
+    var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>(capacity: smartFridgeComponent.NumSlots);
     
     // ... existing code ...
     
+    if (meta.EntityPrototype == null)
+        continue;
     
     repeatedItems.Add(itemLabel, new SmartFridgeInventoryItem(meta.EntityPrototype!, storageSlotId, itemLabel, 1));

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

Comment on lines +13 to +15
<Label Text="{Loc 'smart-fridge-search'}:" Margin="0 0 0 5" HorizontalAlignment="Center"/>
<LineEdit Name="SearchBar" PlaceHolder="{Loc 'vending-machine-component-search-filter'}" HorizontalExpand="True"/>
</BoxContainer>
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Повторное использование локализационных ключей

В интерфейсе используются ключи локализации от торгового автомата (vending-machine-*). Это может привести к проблемам при обновлении текстов.

Необходимо создать специфичные ключи локализации для холодильника:

-    <LineEdit Name="SearchBar" PlaceHolder="{Loc 'vending-machine-component-search-filter'}" HorizontalExpand="True"/>
+    <LineEdit Name="SearchBar" PlaceHolder="{Loc 'smart-fridge-search-filter'}" HorizontalExpand="True"/>

     <!-- ... -->
     
-    <Label Name="OutOfStockLabel" Text="{Loc 'vending-machine-component-try-eject-out-of-stock'}"
+    <Label Name="OutOfStockLabel" Text="{Loc 'smart-fridge-out-of-stock'}"

Also applies to: 20-26

Comment on lines +24 to +25
if (_random.Prob(component.FireOnDropChance))
_gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Необходимы дополнительные проверки безопасности

Текущая реализация может быть улучшена следующими способами:

  1. Добавить проверку наличия компонента Transform
  2. Проверить наличие боеприпасов перед попыткой выстрела
  3. Добавить обработку исключений при вызове AttemptShoot
 private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args)
 {
-    if (_random.Prob(component.FireOnDropChance))
-        _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
+    if (!_random.Prob(component.FireOnDropChance))
+        return;
+        
+    if (!TryComp<TransformComponent>(uid, out var transform))
+        return;
+        
+    try 
+    {
+        var shootCoords = transform.Coordinates.Offset(transform.LocalRotation.ToVec());
+        _gun.AttemptShoot(uid, uid, component, shootCoords);
+    }
+    catch (Exception ex)
+    {
+        Log.Error($"Ошибка при попытке выстрела при падении оружия {ToPrettyString(uid)}: {ex}");
+    }
 }
📝 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
if (_random.Prob(component.FireOnDropChance))
_gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args)
{
if (!_random.Prob(component.FireOnDropChance))
return;
if (!TryComp<TransformComponent>(uid, out var transform))
return;
try
{
var shootCoords = transform.Coordinates.Offset(transform.LocalRotation.ToVec());
_gun.AttemptShoot(uid, uid, component, shootCoords);
}
catch (Exception ex)
{
Log.Error($"Ошибка при попытке выстрела при падении оружия {ToPrettyString(uid)}: {ex}");
}
}

@@ -22,6 +22,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg
fireOnDropChance: 1 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Слишком высокий шанс случайного выстрела

Значение fireOnDropChance: 1 означает 100% вероятность выстрела при падении оружия. Это может привести к нежелательным последствиям в игровом процессе и создать проблемы с балансом. Рекомендуется снизить значение до более разумного уровня, например 0.3-0.5.

-    fireOnDropChance: 1 # Corvax-Next-FireOnDrop
+    fireOnDropChance: 0.4 # Corvax-Next-FireOnDrop
📝 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
fireOnDropChance: 1 # Corvax-Next-FireOnDrop
fireOnDropChance: 0.4 # Corvax-Next-FireOnDrop

@@ -25,6 +25,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/sniper.ogg
fireOnDropChance: 0.9 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Требуется корректировка шанса выстрела для разных типов оружия

Значение fireOnDropChance: 0.9 слишком высокое для снайперского оружия. Более того, это значение наследуется всеми производными типами оружия, включая мушкет и кремневый пистолет, для которых такая вероятность нелогична из-за их исторической природы.

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

  1. Снизить базовое значение для BaseWeaponSniper
  2. Добавить специфические значения для исторического оружия
-    fireOnDropChance: 0.9 # Corvax-Next-FireOnDrop
+    fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop

Для мушкета и кремневого пистолета добавить:

  - type: entity
    name: musket
    parent: [ BaseWeaponSniper, BaseGunWieldable, BaseMinorContraband ]
    id: Musket
    components:
    - type: Gun
+     fireOnDropChance: 0.2 # Историческое оружие имеет меньший шанс случайного выстрела
📝 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
fireOnDropChance: 0.9 # Corvax-Next-FireOnDrop
fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop

@@ -29,6 +29,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/revolver.ogg
fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Значение fireOnDropChance для револьвера действительно требует корректировки

Анализ показывает следующую иерархию вероятностей случайного выстрела при падении:

  • PKA (базовое): 1.0
  • Снайперские винтовки: 0.9
  • Револьверы: 0.6
  • Винтовки: 0.5
  • Пистолеты/Дробовики/ПП: 0.3
  • Энергетическое оружие: 0.15

Текущее значение 0.6 для револьвера выглядит несбалансированным, так как оно значительно выше, чем у винтовок (0.5) и других видов ручного оружия среднего калибра (0.3). Рекомендуется снизить значение до 0.4, что будет лучше соответствовать общей градации вероятностей между разными типами оружия.

🔗 Analysis chain

Проверьте баланс вероятности случайного выстрела.

Вероятность 0.6 для револьвера кажется высокой, учитывая, что это оружие среднего калибра. Рекомендуется рассмотреть снижение значения до 0.4-0.5 для лучшего баланса с другими типами оружия.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Поиск других значений fireOnDropChance для сравнения
rg "fireOnDropChance:" -A 1

Length of output: 1832

@@ -20,6 +20,7 @@
- SemiAuto
soundGunshot:
path: /Audio/Weapons/Guns/Gunshots/laser.ogg
fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Требуется дополнительная логика для специальных типов оружия

Некоторые виды оружия могут требовать особой обработки шанса выстрела при падении:

  • Тренировочное оружие (WeaponLaserCarbinePractice)
  • Мощное оружие (WeaponLaserCannon, WeaponXrayCannon)
  • Оружие с особыми эффектами (WeaponTeslaGun)

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

  - type: Gun
    fireRate: 2
    selectedMode: SemiAuto
    availableModes:
    - SemiAuto
    soundGunshot:
      path: /Audio/Weapons/Guns/Gunshots/laser.ogg
-   fireOnDropChance: 0.15 # Corvax-Next-FireOnDrop
+   fireOnDropChance: !type:GunFireOnDropChance
+     baseChance: 0.15
+     modifiers:
+       practice: 0.05
+       highPower: 0.10
+       special: 0.20

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

Copy link
Contributor

github-actions bot commented Jan 5, 2025

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Changes: Localization Can be reviewed or fixed by people who are knowledgeable with translation Changes: Sprites Should be reviewed or fixed by people who are knowledgeable with spriting or visual design. Changes: UI Can be reviewed or fixed by people who are knowledgeable with UI design S: Merge Conflict S: Untriaged size/L
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants