-
Notifications
You must be signed in to change notification settings - Fork 153
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 #986
Conversation
* 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]>
* FireOnDrop * whoopsy
ОбзорВ этом обновлении представлен целый ряд новых функций и компонентов, включая систему диктофона, умный холодильник, стул для казни, и множество других улучшений в игровом мире. Изменения
Последовательность диаграммsequenceDiagram
participant Пользователь
participant Диктофон
participant Кассета
Пользователь->>Диктофон: Вставить кассету
Диктофон->>Кассета: Инициализация
Пользователь->>Диктофон: Начать запись
Диктофон->>Кассета: Запись сообщений
Пользователь->>Диктофон: Остановить запись
Диктофон->>Кассета: Сохранить записанные данные
Стихотворение
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? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
RSI Diff Bot; head commit df65820 merging into 03cf326 Resources/Textures/Objects/Devices/cassette_tapes.rsi
Resources/Textures/Objects/Devices/tape_recorder.rsi
Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi
Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 27
🧹 Nitpick comments (45)
Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1)
268-269
: Улучшите документациюТекущий комментарий можно улучшить, добавив:
- Информацию о допустимом диапазоне значений
- Пример использования
- Ссылку на связанную систему FireOnDropSystem
/// <summary> - /// Corvax-Next. The percentage chance of a given gun to accidentally discharge if violently thrown into a wall or person + /// The probability (0-1) that a gun will accidentally discharge when violently thrown into a wall or person. + /// Example: 0.1 means 10% chance to fire on impact. + /// Used by <see cref="Content.Server.Weapons.Ranged.Systems.FireOnDropSystem"/>. /// </summary>Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml (1)
28-28
: Подтверждаю изменения, но нужно улучшить документациюЗначение 0.9 для снайперских винтовок логично обосновано их размером и конструкцией. Рекомендуется добавить краткое пояснение в комментарии.
- fireOnDropChance: 0.9 # Corvax-Next-FireOnDrop + fireOnDropChance: 0.9 # Corvax-Next-FireOnDrop - Высокий шанс из-за чувствительного спускового механизмаResources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1)
Line range hint
1-24
: Рассмотрите добавление документации для новой механикиДобавление комментария о механике случайного выстрела в описание базового класса
BaseSMG
поможет другим разработчикам.description: A rooty tooty point and shooty. + # This weapon has a 30% chance to fire when dropped, making it potentially dangerous to handle
Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml (1)
23-23
: Корректная реализация для энергетического оружияЗначение 0.15 (15%) для
fireOnDropChance
является более сбалансированным для энергетического оружия, учитывая его специфику.Рекомендации по безопасности:
- Убедитесь, что механика учитывает заряд батареи
- Рассмотрите добавление визуальных/звуковых эффектов при срабатывании
Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs (2)
8-12
: Добавьте документацию к классуРекомендуется добавить XML-документацию, описывающую назначение системы и её взаимодействие с другими компонентами.
+/// <summary> +/// Система, обрабатывающая случайные выстрелы оружия при падении. +/// </summary> public sealed class FireOnDropSystem : EntitySystem
14-19
: Рассмотрите использование констант для событийТекущая реализация корректна, но для улучшения поддерживаемости кода рекомендуется вынести название события в константу.
+private const string ThrowHitEvent = "ThrowDoHitEvent"; + public override void Initialize() { base.Initialize(); - SubscribeLocalEvent<GunComponent, ThrowDoHitEvent>(HandleLand); + SubscribeLocalEvent<GunComponent, ThrowDoHitEvent>(HandleLand, ThrowHitEvent); }Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (2)
21-28
: Уточнение структуры хранения
Использование списков для идентификаторов слотов и самих слотов может привести к потенциальным путаницам при доступе к элементам. Рассмотрите подход, когда идентификатор или индекс слота жёстко привязан к структуре, чтобы минимизировать несоответствия.
76-83
: Инкапсуляция свойств SmartFridgeInventoryItem
Поля в SmartFridgeInventoryItem объявлены как публичные и записываемые. Для безопасности данных и во избежание непреднамеренных изменений рекомендуем использовать автосвойства и конструктор, если нужна неизменяемость объекта.-public sealed class SmartFridgeInventoryItem(EntProtoId id, string storageSlotId, string itemName, FixedPoint2 quantity) -{ - public EntProtoId Id = id; - public string StorageSlotId = storageSlotId; - public string ItemName = itemName; - public FixedPoint2 Quantity = quantity; -} +public sealed class SmartFridgeInventoryItem +{ + public EntProtoId Id { get; } + public string StorageSlotId { get; } + public string ItemName { get; } + public FixedPoint2 Quantity { get; } + + public SmartFridgeInventoryItem(EntProtoId id, string storageSlotId, string itemName, FixedPoint2 quantity) + { + Id = id; + StorageSlotId = storageSlotId; + ItemName = itemName; + Quantity = quantity; + } +}Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (2)
35-44
: Аудиосигнал при шоке
Флаги «PlaySoundOnShock» и «ShockNoises» предоставляют гибкую систему звука. При рефакторинге можно рассмотреть возможность прогрессивного повышения громкости или вариации звука для большего эффекта реалистичности.
52-85
: Проверка портов Toggle, On, Off
Предусмотрена система портов для включения/отключения. Убедитесь, что подписки на эти порты и их сигналы (Toggle, On, Off) правильно обрабатываются, иначе возможны несоответствия между фактическим состоянием «Enabled» и внешними командами.Content.Client/TapeRecorder/Ui/TapeRecorderWindow.xaml.cs (1)
64-74
: Метод SetSlider
Вы отключаете PlaybackSlider, а затем меняете его значения. Если нужно взаимодействовать со слайдером в реальном времени, возможно, стоит сохранять допускаемый ввод, чтобы пользователи могли вручную искать нужный участок записи.Content.Server/TapeRecorder/TapeRecorderSystem.cs (2)
34-59
: Метод ReplayMessagesInSegment
Проигрывание записанных сообщений выглядит логичным. Следует гарантировать, что «timestamp» корректно синхронизирован при сетевых задержках, иначе клиенты могут слышать несвоевременное воспроизведение.
64-90
: Фильтры во время записи
Проверяется, что источник не совпадает со своим владельцем (строка 71). Возможны случаи, когда источник косвенно перенаправляет голос через другой компонент. Возможно, понадобится дополнительная логика для исключения «эхо».Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (1)
47-49
: Совет: уточнить сообщение об ошибке.
Печать отладочного сообщения в случае «неизвестного порта» может быть дополнена дополнительной информацией о том, откуда поступил сигнал либо о состоянии компонента, чтобы облегчить поиск проблемы.Content.Server/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (2)
55-59
: Проверка питания.
Вложенная проверка «IsPowered» выглядит корректно, но стоит продумать, что делать, если питание внезапно отключится во время работы холодильника, чтобы не допустить несогласованного состояния.
61-68
: Логика фильтрации предметов.
Использование тэгов для проверки совместимости хранится ли предмет в холодильнике (StorageWhitelist) достаточно гибко, однако стоит убедиться, что тэги ограничивают лишь нужные предметы (например, еду, медикаменты и т.п.), чтобы избежать хранения неподходящих сущностей.Content.Shared/TapeRecorder/SharedTapeRecorderSystem.cs (1)
140-145
: Повторное воспроизведение записей.
Функция «ReplayMessagesInSegment» пуста и помечена для серверной логики. Рекомендуется по крайней мере логировать вызовы, чтобы при отладке видеть, что воспроизведение сегмента действительно запрашивается.Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml (1)
25-29
: Конфигурация стартового снаряжения логична!Добавление диктофона и двух кассет в стартовое снаряжение журналиста является обоснованным решением. Размещение в заднем хранилище (рюкзаке) логично с точки зрения геймплея.
Рекомендация: добавьте комментарий, объясняющий почему выдаётся именно две кассеты.
Content.Client/TapeRecorder/TapeRecorderSystem.cs (1)
5-8
: Улучшить документацию классаТекущий комментарий слишком краток и не объясняет назначение класса. Рекомендуется добавить более подробное описание, включая:
- Основное назначение класса
- Взаимодействие с серверной частью
- Особенности клиентского предсказания
/// <summary> -/// Required for client side prediction stuff +/// Клиентская система диктофона, обеспечивающая синхронизацию состояния с сервером +/// и обработку клиентского предсказания для плавного воспроизведения. /// </summary>Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)
6-9
: Добавить документацию классаОтсутствует документация класса и его зависимостей. Необходимо добавить:
- XML-документацию для класса
- Описание зависимости _uiSystem
+/// <summary> +/// Клиентская система умного холодильника, управляющая обновлением пользовательского интерфейса +/// и синхронизацией состояния. +/// </summary> public sealed class SmartFridgeSystem : SharedSmartFridgeSystem { + /// <summary> + /// Система пользовательского интерфейса для управления UI холодильника + /// </summary> [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;Resources/Textures/Objects/Devices/tape_recorder.rsi/meta.json (1)
43-53
: Исправить форматирование JSONОбнаружена проблема с отступами в определении состояния "taperecorder_rewinding".
- { + { "name": "taperecorder_rewinding",Content.Client/TapeRecorder/Ui/TapeRecorderWindow.xaml (2)
13-13
: Переименуйте контейнер TestНазвание "Test" не описывает назначение контейнера. Используйте более информативное имя.
- <BoxContainer Name ="Test" Margin = "0 5 0 0" Orientation="Horizontal" VerticalExpand = "True"> + <BoxContainer Name="ControlsContainer" Margin = "0 5 0 0" Orientation="Horizontal" VerticalExpand = "True">
11-11
: Добавьте подсказки для элементов управленияСлайдер воспроизведения должен иметь всплывающую подсказку для улучшения доступности.
- <Slider Name="PlaybackSlider" HorizontalExpand="True" /> + <Slider Name="PlaybackSlider" HorizontalExpand="True" ToolTip="{Loc 'tape-recorder-playback-slider-tooltip'}" />Content.Shared/TapeRecorder/Events/TapeRecorderEvents.cs (2)
28-28
: Исправьте опечатку в названии свойстваВ названии свойства
HasCasette
допущена опечатка - пропущена буква 's'. Правильное написание:HasCassette
.- public bool HasCasette; + public bool HasCassette;
43-43
: Обновите использование свойства после исправления опечаткиПосле исправления опечатки в названии свойства
HasCasette
, необходимо обновить его использование в конструкторе.- HasCasette = hasCasette; + HasCassette = hasCassette;Resources/Locale/ru-RU/taperecorder/taperecorder.ftl (2)
10-10
: Исправьте грамматическую ошибкуВ сообщении "Нельзя извлечь кассету, пока диктофон работает" пропущена запятая после "извлечь".
-tape-recorder-locked = Нельзя извлечь кассету, пока диктофон работает. +tape-recorder-locked = Нельзя извлечь, кассету, пока диктофон работает.
20-20
: Уточните перевод для улучшения понятностиТекущий перевод "Распечатать расшифровку" можно улучшить для большей ясности.
-tape-recorder-menu-print-button = Распечатать расшифровку +tape-recorder-menu-print-button = Распечатать текст записиResources/Locale/en-US/taperecorder/taperecorder.ftl (2)
10-10
: Исправьте орфографическую ошибкуВ английском тексте пропущен апостроф в слове "Cant".
-tape-recorder-locked = Cant eject while the tape recorder is running. +tape-recorder-locked = Can't eject while the tape recorder is running.
16-16
: Уточните название кнопкиКнопка названа "Pause", но в контексте она останавливает воспроизведение. Рекомендуется использовать "Stop" для большей ясности.
-tape-recorder-menu-stopped-button = Pause +tape-recorder-menu-stopped-button = StopContent.Shared/_CorvaxNext/Medical/SmartFridge/SharedSmartFridgeSystem.cs (1)
45-49
: Оптимизировать сравнение строкИспользование StringComparer.Ordinal для оптимизации сравнения строк в Dictionary.
- var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>(); + var repeatedItems = new Dictionary<string, SmartFridgeInventoryItem>(StringComparer.Ordinal);Resources/Prototypes/Catalog/Fills/Boxes/security.yml (1)
93-100
: Оптимизируйте повторяющиеся записи кассетЧетыре идентичные записи CassetteTape можно объединить в одну запись с amount: 4, что сделает код более компактным и легким для поддержки.
- - id: CassetteTape - amount: 1 - - id: CassetteTape - amount: 1 - - id: CassetteTape - amount: 1 - - id: CassetteTape - amount: 1 + - id: CassetteTape + amount: 4Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml (1)
4-5
: Удалите дублирующийся импорт пространства именПространство имен controls импортируется дважды с разными псевдонимами (controls и co). Рекомендуется использовать единый псевдоним для улучшения читаемости кода.
- xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls" - xmlns:co="clr-namespace:Content.Client.UserInterface.Controls" + xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"Затем обновите использование
co:SearchListContainer
наcontrols:SearchListContainer
.Content.Shared/TapeRecorder/Components/TapeCassetteComponent.cs (2)
6-6
: Необходимо адресовать TODO комментарийКомментарий указывает на незавершенную работу с сетевым состоянием UI. Пожалуйста, определите необходимые поля для UI и добавьте их в сетевое состояние.
Хотите, чтобы я помог определить необходимые поля для UI и создал соответствующий issue?
9-10
: Добавьте XML документацию для компонентаОтсутствует XML документация, описывающая назначение и функциональность компонента TapeCassetteComponent.
+/// <summary> +/// Component that handles the functionality of a tape cassette, including +/// recording, playback, and damage management. +/// </summary> public sealed partial class TapeCassetteComponent : ComponentResources/Prototypes/Entities/Objects/Devices/tape_recorder.yml (2)
17-19
: Рассмотрите увеличение радиуса прослушиванияТекущий радиус 4 может быть недостаточным для записи разговоров в больших помещениях.
71-77
: Добавьте больше инструментов для ремонтаТекущий список инструментов для ремонта кассеты ограничен. Рекомендуется добавить больше вариантов, например:
repairWhitelist: tags: - Screwdriver - Write + - Wirecutter + - MultitoolResources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/wallmounts/flags.ftl (1)
29-30
: Уточните описание флага СССПТекущее описание содержит неоднозначные намёки. Рекомендуется сделать описание более конкретным и историческим.
- .desc = Флаг некогда великого Государства. От флага ощущается сильный запах... железа. Или крови? Из чего сделана эта красная краска? + .desc = Флаг некогда великого Государства. Красный цвет символизирует революционную борьбу и единство пролетариата всех планет.Content.Client/_CorvaxNext/Medical/SmartFridge/UI/SmartFridgeMenu.xaml.cs (1)
34-40
: Оптимизация метода фильтрацииТекущая реализация
DataFilterCondition
создает новые строки при каждом вызове Contains.Предлагается оптимизировать:
- return string.IsNullOrEmpty(filter) || text.Contains(filter, StringComparison.CurrentCultureIgnoreCase); + return string.IsNullOrEmpty(filter) || text.IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0;Content.Shared/TapeRecorder/Components/TapeRecorderComponent.cs (1)
85-101
: Централизация локализационных ключейЛокализационные ключи разбросаны по всему компоненту. Лучше их сгруппировать в отдельном месте.
Рекомендуется создать вложенный класс:
+ public static class Loc + { + public const string CantEject = "tape-recorder-locked"; + public const string ModePlaying = "tape-recorder-playing"; + // ... остальные ключи + }Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (1)
96-103
: Рекомендуется унифицировать стиль комментариевПредлагаю использовать единый стиль для комментариев Corvax-Next:
-# Сorvax-Next-EDIT - # Сorvax-Next-START - # Сorvax-Next-END +# Corvax-NextAlso applies to: 180-197
Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml (2)
141-144
: Проверьте локализацию названия и описания флага.Название и описание
FlagSovietUSSP
написаны на русском языке, в то время как остальные флаги используют английский. Рекомендуется перенести русский текст в файлы локализации для поддержания единообразия.
1-157
: Рекомендуется добавить категории для флагов.Для улучшения организации и фильтрации флагов в игре, рекомендуется добавить компонент категорий:
- type: entity parent: BaseFlag id: FlagAgurk + categories: ["Flags", "Decorative"]
Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)
Line range hint
32-159
: Рассмотрите добавление системы инвентаризации.Для
LockerSecurityFilled
и других шкафчиков службы безопасности рекомендуется добавить систему отслеживания инвентаря для контроля выдачи оружия.Resources/Prototypes/Entities/Objects/Misc/paper.yml (1)
710-714
: Требуется реализация уникального спрайта.Сущность
TapeRecorderTranscript
нуждается в уникальном спрайте для визуального отличия от обычной бумаги. TODO комментарий указывает на незавершенность реализации.Хотите, чтобы я помог с созданием задачи для отслеживания этой доработки?
Resources/Audio/Items/Taperecorder/attributions.yml (1)
17-17
: Добавьте пустую строку в конец файлаДля соответствия стандартам YAML необходимо добавить пустую строку в конец файла.
source: "https://freesound.org/people/acclivity/sounds/23393/" +
🧰 Tools
🪛 yamllint (1.35.1)
[error] 17-17: no new line character at the end of file
(new-line-at-end-of-file)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (30)
Resources/Audio/Items/Taperecorder/taperecorder_play.ogg
is excluded by!**/*.ogg
Resources/Audio/Items/Taperecorder/taperecorder_rewind.ogg
is excluded by!**/*.ogg
Resources/Audio/Items/Taperecorder/taperecorder_stop.ogg
is excluded by!**/*.ogg
Resources/Textures/Objects/Devices/cassette_tapes.rsi/tape_greyscale.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/cassette_tapes.rsi/tape_ribbonoverlay.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/inhand-left.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/inhand-right.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/taperecorder_empty.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/taperecorder_idle.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/taperecorder_playing.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/taperecorder_recording.png
is excluded by!**/*.png
Resources/Textures/Objects/Devices/tape_recorder.rsi/taperecorder_rewinding.png
is excluded by!**/*.png
Resources/Textures/Objects/Storage/boxes.rsi/recorder.png
is excluded by!**/*.png
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 (58)
Content.Client/TapeRecorder/TapeRecorderSystem.cs
(1 hunks)Content.Client/TapeRecorder/Ui/TapeRecorderBoundUserInterface.cs
(1 hunks)Content.Client/TapeRecorder/Ui/TapeRecorderWindow.xaml
(1 hunks)Content.Client/TapeRecorder/Ui/TapeRecorderWindow.xaml.cs
(1 hunks)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/TapeRecorder/TapeRecorderSystem.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/TapeRecorder/Components/ActiveTapeRecorderComponent.cs
(1 hunks)Content.Shared/TapeRecorder/Components/TapeCassetteComponent.cs
(1 hunks)Content.Shared/TapeRecorder/Components/TapeRecorderComponent.cs
(1 hunks)Content.Shared/TapeRecorder/Events/TapeRecorderEvents.cs
(1 hunks)Content.Shared/TapeRecorder/SharedTapeRecorderSystem.cs
(1 hunks)Content.Shared/TapeRecorder/TapeCassetteRecordedMessage.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/Audio/Items/Taperecorder/attributions.yml
(1 hunks)Resources/Locale/en-US/taperecorder/taperecorder.ftl
(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/Locale/ru-RU/ss14-ru/prototypes/catalog/fills/boxes/security.ftl
(1 hunks)Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/tape_recorder.ftl
(1 hunks)Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/misc/paper.ftl
(1 hunks)Resources/Locale/ru-RU/taperecorder/taperecorder.ftl
(1 hunks)Resources/Prototypes/Catalog/Fills/Boxes/security.yml
(1 hunks)Resources/Prototypes/Catalog/Fills/Lockers/security.yml
(1 hunks)Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml
(2 hunks)Resources/Prototypes/Entities/Objects/Devices/tape_recorder.yml
(1 hunks)Resources/Prototypes/Entities/Objects/Misc/paper.yml
(1 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/lathe.yml
(1 hunks)Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml
(3 hunks)Resources/Prototypes/Recipes/Lathes/misc.yml
(1 hunks)Resources/Prototypes/Roles/Jobs/Wildcards/reporter.yml
(1 hunks)Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml
(1 hunks)Resources/Prototypes/_CorvaxNext/Entities/Structures/Wallmounts/flags.yml
(1 hunks)Resources/Textures/Objects/Devices/cassette_tapes.rsi/meta.json
(1 hunks)Resources/Textures/Objects/Devices/tape_recorder.rsi/meta.json
(1 hunks)Resources/Textures/Objects/Storage/boxes.rsi/meta.json
(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 (7)
- Resources/Textures/Objects/Devices/cassette_tapes.rsi/meta.json
- Resources/Locale/ru-RU/_corvaxnext/smartfridge/smartfridge.ftl
- Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/structures/machines/execution_chair.ftl
- Resources/Locale/ru-RU/_CorvaxNext/executionchair/executionchair.ftl
- Resources/Textures/_CorvaxNext/Structures/Furniture/execution_chair.rsi/meta.json
- Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/tape_recorder.ftl
- Resources/Textures/_CorvaxNext/Structures/Wallmounts/flags.rsi/meta.json
🧰 Additional context used
🪛 yamllint (1.35.1)
Resources/Prototypes/Recipes/Lathes/misc.yml
[error] 232-232: no new line character at the end of file
(new-line-at-end-of-file)
Resources/Audio/Items/Taperecorder/attributions.yml
[error] 17-17: no new line character at the end of file
(new-line-at-end-of-file)
🔇 Additional comments (35)
Content.Shared/Weapons/Ranged/Components/GunComponent.cs (1)
267-271
: Проверьте граничные значения для FireOnDropChance
Реализация выглядит корректной, но рекомендуется добавить проверку значения в диапазоне [0, 1], чтобы предотвратить некорректные значения вероятности.
[DataField]
- public float FireOnDropChance = 0.1f;
+ [ViewVariables(VVAccess.ReadWrite)]
+ [DataField]
+ public float FireOnDropChance
+ {
+ get => _fireOnDropChance;
+ set => _fireOnDropChance = Math.Clamp(value, 0f, 1f);
+ }
+
+ private float _fireOnDropChance = 0.1f;
Resources/Prototypes/Entities/Objects/Weapons/Guns/Revolvers/revolvers.yml (1)
32-32
: Изменения утверждены
Значение 0.6 для револьверов хорошо сбалансировано и соответствует их размеру и механике. Наследование этого свойства всеми типами револьверов через BaseWeaponRevolver реализовано корректно.
Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml (1)
36-36
: Реализация выглядит корректной.
Значение вероятности 0.3 (30%) для пистолетов хорошо сбалансировано и соответствует их размеру и механизму.
Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml (1)
Line range hint 25-25
: Необходимо проверить реализацию во всех типах оружия.
Давайте убедимся, что свойство fireOnDropChance
корректно реализовано во всех типах оружия и значения согласованы между собой.
Also applies to: 36-36, 31-31
✅ Verification successful
Свойство fireOnDropChance реализовано корректно во всех основных типах оружия
Проверка показала, что:
- Все основные типы оружия (пистолеты, дробовики, винтовки, ПКА и т.д.) имеют определённое значение fireOnDropChance
- Значения логически согласованы между собой:
- Снайперские винтовки: 0.9 (высокий шанс)
- Револьверы: 0.6 (средний шанс)
- Винтовки: 0.5 (средний шанс)
- Пистолеты/ПП/Дробовики: 0.3 (низкий шанс)
- Энергетическое оружие: 0.15 (самый низкий шанс)
- ПКА: 1.0 (гарантированный выстрел)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Описание: Поиск всех реализаций fireOnDropChance в оружии
echo "Поиск всех реализаций fireOnDropChance:"
rg "fireOnDropChance:" Resources/Prototypes/Entities/Objects/Weapons/Guns/
echo -e "\nПоиск базовых классов оружия без fireOnDropChance:"
rg "parent: BaseWeapon" Resources/Prototypes/Entities/Objects/Weapons/Guns/ | grep -v -f <(rg -l "fireOnDropChance" Resources/Prototypes/Entities/Objects/Weapons/Guns/)
Length of output: 1481
Script:
#!/bin/bash
# Поиск всех файлов оружия и проверка наличия BaseWeapon
echo "=== Поиск всех файлов оружия ==="
fd -e yml -p "Guns/"
echo -e "\n=== Поиск всех базовых прототипов оружия ==="
rg "^- type: BaseWeapon" -A 5 Resources/Prototypes/Entities/Objects/Weapons/Guns/
echo -e "\n=== Проверка уникальных значений fireOnDropChance ==="
rg "fireOnDropChance: \d+\.?\d*" -o Resources/Prototypes/Entities/Objects/Weapons/Guns/ | sort | uniq
Length of output: 10849
Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml (1)
32-32
: Проверьте баланс механики случайного выстрела
Значение 0.3 (30%) для fireOnDropChance
является довольно высоким и может создавать опасные ситуации в игре. Рекомендуется провести тестирование баланса.
✅ Verification successful
Значение fireOnDropChance для ПП соответствует общему балансу оружия
Проверка показала, что значение 0.3 (30%) для ПП находится в разумных пределах относительно других типов оружия:
- Снайперские винтовки: 0.9 (90%)
- Револьверы: 0.6 (60%)
- Винтовки: 0.5 (50%)
- ПП и дробовики: 0.3 (30%)
- Пистолеты: 0.3 (30%)
- Энергетическое оружие: 0.15 (15%)
Значение для ПП соответствует общей системе баланса, где более тяжелое и мощное оружие имеет больший шанс выстрела при падении.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка значений fireOnDropChance во всех типах оружия
rg "fireOnDropChance: \d+\.\d+" --type yaml
Length of output: 903
Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs (2)
1-7
: Импорты и пространство имён корректны!
Все необходимые зависимости для функционала случайного выстрела при падении оружия присутствуют.
1-27
: Рекомендации по архитектуре и геймплею
- Рассмотрите добавление конфигурации шанса выстрела через файлы настроек, а не хардкод в компоненте.
- Подумайте о добавлении визуальных/звуковых эффектов при случайном выстреле.
- Рекомендуется добавить сетевую синхронизацию эффектов для мультиплеера.
✅ Verification successful
Рекомендации по реализации подтверждены
На основе анализа кодовой базы:
- Параметр
FireOnDropChance
уже реализован в базовом компонентеGunComponent
со значением по умолчанию 0.1f, что является приемлемым значением. - Система корректно интегрируется с существующей инфраструктурой оружия через
SharedGunSystem
. - Сетевая синхронизация не требуется, так как эффект выстрела уже обрабатывается базовой системой оружия, которая имеет необходимую сетевую логику.
Рекомендации:
- Текущая реализация соответствует архитектурным принципам проекта
- Дополнительная конфигурация через файлы не требуется, так как значение уже настраивается через компонент
- Визуальные эффекты уже обрабатываются базовой системой оружия
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Проверка интеграции с существующими системами оружия
ast-grep --pattern 'class $_ : IShootable {
$$$
}'
# Поиск похожих систем с вероятностными эффектами
rg -l "Prob\(" --type cs
Length of output: 6908
Script:
#!/bin/bash
# Проверка существующих компонентов оружия и их настроек
rg -l "FireOnDropChance" --type cs
# Поиск систем с сетевой синхронизацией эффектов оружия
ast-grep --pattern 'class $_ : SharedGunSystem {
$$$
}'
# Поиск конфигурации оружия
fd -e yml -e yaml | xargs rg "gun|weapon" -l
Length of output: 5148
Script:
#!/bin/bash
# Проверка реализации GunComponent и настроек выстрела при падении
rg -A 10 "FireOnDropChance" Content.Shared/Weapons/Ranged/Components/GunComponent.cs
# Поиск существующих систем обработки эффектов оружия
rg -l "class.*GunSystem" --type cs
# Проверка сетевой синхронизации
rg -A 5 "RaiseNetworkEvent|Dirty" Content.Server/_CorvaxNext/Weapons/Ranged/Systems/FireOnDropSystem.cs
Length of output: 2998
Content.Shared/_CorvaxNext/Medical/SmartFridge/SmartFridgeComponent.cs (3)
18-19
: Проверка значения по умолчанию для NumSlots
Параметр «NumSlots = 100» выглядит разумно для базовых потребностей хранения. Убедитесь, что другие части механики умещают реальное количество слотов.
64-73
: Проверка звука при выдаче
Определён нормальный звук для выдачи предмета («machine_vend.ogg»). Убедитесь, что громкость и вариация не вызывают проблем балансировки аудио в общем игровом процессе.
86-95
: Уточнение области применения SmartFridgeUiKey и SmartFridgeEjectMessage
Enum и класс сообщения выглядят упорядоченно и ясно. Убедитесь, что ключ UI («Key») и строка «id» в сообщении достаточно говорят о назначении, чтобы предотвратить гипотетические конфликты в будущем.
Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairComponent.cs (1)
15-30
: Проверка состояния Enabled
Переменная «Enabled» определяет активность стула. Убедитесь, что все события (в том числе питание и крепление к полу) корректно синхронизируют это поле, чтобы во время сбоя быть уверенными, что стул не нанесёт урон неожиданно.
Content.Client/TapeRecorder/Ui/TapeRecorderWindow.xaml.cs (2)
28-62
: Синхронизация выбора режима
Радиокнопки (_options) корректно настраиваются. Проверьте, что серверная часть всегда уведомляет клиентский UI о принудительной смене режима, чтобы избежать расхождений в состоянии при быстром переключении.
77-105
: Актуализация данных при UpdateState
Проверяется принадлежность компонента TapeRecorderComponent хозяину. Убедитесь, что вызов TryGetComponent для разных ситуаций (например, когда объект уничтожался) корректно обрабатывает этот кейс.
Content.Server/TapeRecorder/TapeRecorderSystem.cs (1)
19-32
: Подписка на локальные события
Код подписывается на ListenEvent и PrintTapeRecorderMessage. Это корректно, но убедитесь, что при уничтожении объекта или ротации системы отписка происходит во избежание потенциальных утечек.
Content.Server/_CorvaxNext/ExecutionChair/ExecutionChairSystem.cs (2)
87-90
: Проверка на отсутствие сущностей.
Перед тем как накладывать электрошок, целесообразно добавить проверку, существует ли «StrapComponent» и есть ли забакленные сущности. Если пока нет оставшихся сущностей, можно заранее выйти из метода для снижения накладных расходов.
118-126
: Уточнение флагов изоляции.
Параметр ignoreInsulation: true гарантирует, что персонаж получит урон, даже если остальная часть экипировки даёт защиту от электричества. Убедитесь, что это соответствует замыслу игрового дизайна.
Content.Shared/TapeRecorder/SharedTapeRecorderSystem.cs (1)
72-83
: Обработка отсутствия кассеты.
При отсутствии кассеты система автоматически переводит состояние рекордера в «Stopped». Это корректно, но стоит ещё убедиться, что любые фоновые ресурсы (например, воспроизведение звука) останавливаются незамедлительно.
Resources/Locale/ru-RU/_corvaxnext/reagents/biological.ftl (1)
1-2
: Перевод выглядит корректно.
Добавленные строки локализации точно передают суть реагента на русском языке.
Content.Shared/TapeRecorder/Components/ActiveTapeRecorderComponent.cs (1)
5-9
: Компонент реализован корректно!
Компонент правильно аннотирован и имеет четкую документацию. Использование NetworkedComponent обеспечивает корректную синхронизацию состояния между клиентом и сервером.
Content.Client/TapeRecorder/TapeRecorderSystem.cs (1)
12-23
: Корректная реализация синхронизации времени
Реализация метода Update корректно обрабатывает временные интервалы и синхронизацию с сервером. Использование Timing.CurTime вместо frameTime - правильное решение для точного отслеживания позиции записи.
Content.Client/_CorvaxNext/Medical/SmartFridge/SmartFridgeSystem.cs (1)
10-23
: Правильная организация кода
Код хорошо структурирован:
- Корректная инициализация базового класса
- Правильная подписка на события
- Эффективная проверка состояния UI
Resources/Textures/Objects/Devices/tape_recorder.rsi/meta.json (1)
23-30
: Проверить интервалы анимации
Все анимированные состояния (recording, playing, rewinding) используют одинаковые интервалы по 0.1 секунды. Рекомендуется проверить:
- Достаточно ли плавная анимация при таких интервалах
- Нужны ли разные интервалы для разных состояний
Also applies to: 34-41, 45-52
✅ Verification successful
Let me check the animation delays in similar devices to verify if 0.1s is appropriate.
Let me check the actual animation frames to understand the visual context better.
Интервалы анимации выглядят приемлемыми
Анализ показывает, что:
- Интервал 0.1с является стандартным для подобных анимированных устройств (как видно из других примеров: swapper, hand_teleporter, gps)
- Все три состояния (запись, воспроизведение, перемотка) используют 4-кадровую анимацию с одинаковыми интервалами, что логично для отображения работающего механического устройства
- Более быстрая анимация может выглядеть слишком резкой, а более медленная - недостаточно отзывчивой
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check for other RSI files with similar animations for comparison
# Search for other RSI meta files with animation delays
fd -e json -e meta.json | xargs grep -l "delays"
Length of output: 58289
Script:
#!/bin/bash
# Search for animation delays in similar devices/machines
rg -U "delays.*\[\s*\[\s*[\d\.]+" Resources/Textures/Objects/Devices/
Length of output: 10566
Script:
#!/bin/bash
# Get the states and their frames from the tape recorder meta.json
cat Resources/Textures/Objects/Devices/tape_recorder.rsi/meta.json
Length of output: 1005
Resources/Prototypes/_CorvaxNext/Entities/Structures/Machines/execution_chair.yml (1)
26-27
: Проверьте потребление энергии
Нагрузка в 1500 единиц может быть слишком высокой для данного устройства. Рекомендуется сравнить с аналогичными устройствами в игре.
✅ Verification successful
Нагрузка в 1500 единиц соответствует другим устройствам
Анализ потребления энергии показывает, что нагрузка в 1500 единиц находится в нормальном диапазоне для машин подобного класса:
- Криокапсула (cryo_pod) потребляет 3000
- Двигатели шаттла (thrusters) - 1500
- Базовые машины (base_structuremachines) - 1000
- Стазис-кровать (stasisbed) - 1000
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for other ApcPowerReceiver configurations
rg "powerLoad:" Resources/Prototypes/
Length of output: 5214
Content.Shared/TapeRecorder/Events/TapeRecorderEvents.cs (1)
27-27
: Рассмотрите возможность проверки ItemSlot на стороне клиента
TODO комментарий указывает на возможность оптимизации путем проверки ItemSlot на стороне клиента вместо передачи этой информации через состояние.
✅ Verification successful
Проверка ItemSlot на стороне клиента возможна и рекомендуется
Анализ кода показывает, что проверка ItemSlot на стороне клиента действительно возможна и предпочтительна. В текущей реализации состояние кассеты (HasCasette
) передается через состояние UI, что создает избыточный сетевой трафик. Вместо этого клиент может напрямую проверять наличие кассеты через систему ItemSlots.
Рекомендуемые изменения:
- Удалить
HasCasette
изTapeRecorderState
- Использовать
_slots.GetItemOrNull()
на стороне клиента для проверки наличия кассеты - Обновлять UI только при изменении содержимого слота
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск примеров проверки ItemSlot на стороне клиента
ast-grep --pattern 'class $_ {
$$$
ItemSlot $_ {
$$$
}
$$$
}'
Length of output: 75
Script:
#!/bin/bash
# Поиск использования ItemSlot в коде
rg -l "ItemSlot"
# Поиск конкретных примеров использования ItemSlot
rg "ItemSlot" -A 5
# Поиск файлов, связанных с TapeRecorder
fd "TapeRecorder"
Length of output: 69591
Script:
#!/bin/bash
# Поиск файлов, связанных с TapeRecorder и ItemSlot
rg -l "TapeRecorder.*ItemSlot|ItemSlot.*TapeRecorder"
# Поиск использования ItemSlot в TapeRecorder
rg "ItemSlot" -A 5 -B 5 Content.Shared/TapeRecorder/
# Поиск всех файлов, связанных с TapeRecorder
fd -t f "TapeRecorder" -x cat {}
Length of output: 38164
Resources/Prototypes/Entities/Objects/Devices/tape_recorder.yml (1)
15-16
: Проверьте размер предмета
Размер Small
может быть слишком большим для диктофона. Рекомендуется рассмотреть использование размера Tiny
для более реалистичного представления.
✅ Verification successful
Based on the search results, I can see that both Small
and Tiny
sizes are commonly used across various handheld devices and items in the codebase. Looking specifically at recording devices and similar electronic handheld items:
- Tape recorder cassette uses
Tiny
size - Forensic scanner uses
Small
size - PDA uses
Small
size - Network configurator uses
Small
size - Wristwatch uses
Small
size
Since the tape recorder is a handheld electronic device similar in nature to these other devices, the current Small
size appears to be consistent with the codebase conventions for such items.
Размер диктофона соответствует стандартам кодовой базы
Размер Small
является подходящим для диктофона, так как соответствует размерам других портативных электронных устройств в игре, таких как КПК, сканеры и конфигураторы. Хотя кассеты для диктофона имеют размер Tiny
, сам диктофон правильно классифицирован как Small
.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check other similar handheld devices for size consistency
rg "size: (Small|Tiny)" -A 2 -g "*.yml"
Length of output: 68534
Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml (2)
40-44
: Проверка энергопотребления
Значение powerLoad: 100
кажется произвольным. Необходимо сравнить с другими подобными устройствами.
✅ Verification successful
Значение энергопотребления соответствует аналогичным устройствам
Анализ показывает, что значение powerLoad: 100 для смарт-холодильника является обоснованным:
- Аналогичное энергопотребление (100) имеет музыкальный автомат (jukebox) и оборудование для аномалий
- Схожие по назначению торговые автоматы потребляют 200
- Другие простые устройства имеют близкие значения: исследовательское оборудование (200), измельчитель реагентов (300), микроволновка (400)
- Более сложные устройства потребляют значительно больше: криокапсула (3000), анализатор артефактов (12000)
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск других устройств с компонентом ApcPowerReceiver для сравнения
rg "ApcPowerReceiver" -A 2 "Resources/Prototypes/Entities/Structures/Machines"
Length of output: 9459
8-17
: Проверка списка разрешенных предметов
Текущий список тегов в storageWhitelist
может быть неполным для медицинского холодильника.
✅ Verification successful
Let me generate a final response based on the search results. The search revealed extensive usage of medical-related items and equipment across the codebase, which helps verify the appropriate tags for the medical smart fridge.
Список тегов для хранения в медицинском холодильнике корректен
Текущая конфигурация storageWhitelist
включает все необходимые теги для хранения медицинских предметов:
PillCanister
- для контейнеров с таблеткамиSyringe
- для шприцевBottle
- для медицинских бутылокChemDispensable
- для химических препаратовMeat
иCooked
- для хранения органических материалов
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск других тегов, которые могут быть релевантны для медицинского холодильника
rg -l "tags:" | xargs rg "Medical|Med|Health|Pill|Syringe" -C2
Length of output: 76135
Content.Shared/TapeRecorder/Components/TapeRecorderComponent.cs (1)
33-34
: Проверка временной логики
Использование TimeSpan.Zero
как значения по умолчанию может привести к неожиданному поведению при сериализации.
✅ Verification successful
TimeOffsetSerializer широко используется в кодовой базе
Использование TimeSpan.Zero
как значения по умолчанию для CooldownEndTime
является безопасным и соответствует общепринятой практике в кодовой базе. Анализ показывает, что:
- TimeOffsetSerializer используется для сериализации временных значений во многих компонентах
- TimeSpan.Zero часто используется как значение по умолчанию для временных полей
- Подобная комбинация встречается в других компонентах, например:
- VendingMachineComponent.NextEmpEject
- SingularityGeneratorComponent.NextFailsafe
- ResearchServerComponent.NextUpdateTime
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск других использований TimeOffsetSerializer для сравнения реализации
ast-grep --pattern 'TimeOffsetSerializer'
Length of output: 41
Script:
#!/bin/bash
# Поиск файла с реализацией TimeOffsetSerializer
fd TimeOffsetSerializer
# Поиск использования TimeSpan.Zero в сочетании с сериализацией
rg "TimeSpan.*Zero.*serializ" -i
# Поиск других полей с TimeSpan и сериализацией
ast-grep --pattern '[DataField$_] public TimeSpan $_'
Length of output: 116
Script:
#!/bin/bash
# Поиск файла сериализатора с учетом возможных расширений
fd -e cs -e cs.disabled "TimeOffset"
# Поиск всех упоминаний TimeOffsetSerializer в коде
rg "TimeOffsetSerializer" -A 2 -B 2
# Поиск всех DataField с TimeSpan
rg "\[DataField.*\].*TimeSpan" -A 1
Length of output: 67015
Resources/Prototypes/Recipes/Lathes/misc.yml (1)
216-232
: Рецепты выглядят сбалансированными!
Материалы и время создания хорошо подобраны относительно других рецептов в категории инструментов.
🧰 Tools
🪛 yamllint (1.35.1)
[error] 232-232: no new line character at the end of file
(new-line-at-end-of-file)
Resources/Textures/Objects/Storage/boxes.rsi/meta.json (1)
227-229
: Состояние добавлено корректно!
Новое состояние "recorder" правильно интегрировано в существующий массив состояний.
Resources/Prototypes/Entities/Markers/Spawners/Random/posters.yml (1)
96-103
: Вероятности спавна выглядят сбалансированными!
Снижение основного шанса до 0.99 и добавление редких флагов с шансом 0.01 создает интересное разнообразие для игроков.
Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)
Line range hint 1-22
: Проверьте баланс снаряжения в шкафчике начальника службы безопасности.
В LockerWardenFilledHardsuit
содержится большое количество мощного снаряжения. Рекомендуется пересмотреть баланс для предотвращения злоупотреблений.
✅ Verification successful
Based on the search results, I can see that the WeaponDisabler
and ClothingOuterHardsuitWarden
are standard equipment items that appear across multiple maps and loadouts. The warden's hardsuit is a specialized protective gear, and the disabler is a standard security weapon used by various security roles.
Let me verify the balance by checking other security lockers to compare their equipment:
Based on the search results and previous findings, I can now generate a final response:
Баланс снаряжения в шкафчике смотрителя соответствует его роли и стандартам безопасности.
Анализ показывает, что:
- Станнер (WeaponDisabler) является стандартным оружием для всех сотрудников службы безопасности
- Скафандр смотрителя (ClothingOuterHardsuitWarden) - специализированное защитное снаряжение, соответствующее его должности
- Остальное содержимое шкафчика аналогично стандартному снаряжению других офицеров безопасности, но с дополнительными предметами, соответствующими уровню доступа смотрителя
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск других шкафчиков с подобным снаряжением
rg "ClothingOuterHardsuitWarden|WeaponDisabler" -A 5
Length of output: 61201
Script:
#!/bin/bash
# Search for other security-related lockers and their contents
rg "parent: Locker.*Security|parent: LockerSecurity" -A 10
Length of output: 3860
Resources/migration.yml (1)
667-668
: Корректное переименование флагов
Переименование флагов соответствует целям PR и правильно отражает их новые идентификаторы.
Resources/Prototypes/Entities/Structures/Machines/lathe.yml (1)
205-207
: Добавлены рецепты для диктофона
Корректно добавлены рецепты для создания кассет и диктофона в автолате, что соответствует целям PR.
Resources/Audio/Items/Taperecorder/attributions.yml (1)
1-17
: Корректные атрибуции для аудиофайлов
Все аудиофайлы имеют правильно оформленные атрибуции с указанием:
- Лицензий
- Информации об авторских правах
- Источников
🧰 Tools
🪛 yamllint (1.35.1)
[error] 17-17: no new line character at the end of file
(new-line-at-end-of-file)
@@ -22,6 +22,7 @@ | |||
- SemiAuto | |||
soundGunshot: | |||
path: /Audio/Weapons/Guns/Gunshots/kinetic_accel.ogg | |||
fireOnDropChance: 1 # Corvax-Next-FireOnDrop |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо пересмотреть значение fireOnDropChance
Значение 1 (100% шанс) кажется слишком высоким для случайного выстрела при падении оружия. Для сравнения, у других видов оружия этот показатель значительно ниже:
- Револьверы: 0.6 (60%)
- Снайперские винтовки: 0.9 (90%)
Рекомендуется уменьшить значение для баланса.
- fireOnDropChance: 1 # Corvax-Next-FireOnDrop
+ fireOnDropChance: 0.6 # 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.
fireOnDropChance: 1 # Corvax-Next-FireOnDrop | |
fireOnDropChance: 0.6 # Corvax-Next-FireOnDrop |
@@ -22,6 +22,7 @@ | |||
- FullAuto | |||
soundGunshot: | |||
path: /Audio/Weapons/Guns/Gunshots/batrifle.ogg | |||
fireOnDropChance: 0.5 # Corvax-Next-FireOnDrop |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Рекомендуется пересмотреть вероятность случайного выстрела.
Значение 0.5 (50%) для случайного выстрела при падении кажется довольно высоким для винтовок. Это может привести к частым непреднамеренным выстрелам и негативно повлиять на игровой баланс.
- fireOnDropChance: 0.5 # 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.
fireOnDropChance: 0.5 # Corvax-Next-FireOnDrop | |
fireOnDropChance: 0.3 # 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 |
There was a problem hiding this comment.
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%) для дробовиков кажется несогласованным с иерархией оружия, учитывая что у винтовок 50%. Предлагается установить промежуточное значение.
- fireOnDropChance: 0.3 # 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.
fireOnDropChance: 0.3 # Corvax-Next-FireOnDrop | |
fireOnDropChance: 0.4 # Corvax-Next-FireOnDrop |
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())); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Требуются улучшения обработки выстрела при падении
Текущая реализация имеет несколько потенциальных проблем:
- Отсутствует проверка на null для Transform
- Сложное вычисление координат в одной строке снижает читаемость
- Нет валидации значения FireOnDropChance
Предлагаемые исправления:
private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args)
{
+ if (!TryComp<TransformComponent>(uid, out var transform))
+ return;
+
+ if (component.FireOnDropChance is < 0 or > 1)
+ return;
+
if (_random.Prob(component.FireOnDropChance))
- _gun.AttemptShoot(uid, uid, component, Transform(uid).Coordinates.Offset(Transform(uid).LocalRotation.ToVec()));
+ {
+ var rotation = transform.LocalRotation;
+ var offset = rotation.ToVec();
+ var coordinates = transform.Coordinates.Offset(offset);
+ _gun.AttemptShoot(uid, uid, component, coordinates);
+ }
}
📝 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.
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())); | |
} | |
private void HandleLand(EntityUid uid, GunComponent component, ref ThrowDoHitEvent args) | |
{ | |
if (!TryComp<TransformComponent>(uid, out var transform)) | |
return; | |
if (component.FireOnDropChance is < 0 or > 1) | |
return; | |
if (_random.Prob(component.FireOnDropChance)) | |
{ | |
var rotation = transform.LocalRotation; | |
var offset = rotation.ToVec(); | |
var coordinates = transform.Coordinates.Offset(offset); | |
_gun.AttemptShoot(uid, uid, component, coordinates); | |
} | |
} |
private void SetEnabled(TapeRecorderMode mode, bool condition) | ||
{ | ||
_options.SetItemDisabled((int) mode, !(_hasCasette && condition)); | ||
} | ||
|
||
protected override void FrameUpdate(FrameEventArgs args) | ||
{ | ||
base.FrameUpdate(args); | ||
|
||
if (!_entMan.HasComponent<ActiveTapeRecorderComponent>(_owner)) | ||
return; | ||
|
||
if (!_entMan.TryGetComponent<TapeRecorderComponent>(_owner, out var comp)) | ||
return; | ||
|
||
if (_mode != comp.Mode) | ||
{ | ||
_mode = comp.Mode; | ||
_options.SelectByValue(_mode); | ||
} | ||
|
||
var speed = _mode == TapeRecorderMode.Rewinding | ||
? -comp.RewindSpeed | ||
: 1f; | ||
PlaybackSlider.Value += args.DeltaSeconds * speed; | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Моделирование проигрывания в режиме Rewinding
При перемотке установка «PlaybackSlider.Value += args.DeltaSeconds * speed» со знаком «-» корректна. Убедитесь, что граничные условия (Value не уходит в отрицательные значения) тоже учтены при длительных перемотках.
-PlaybackSlider.Value += args.DeltaSeconds * speed;
+var newValue = PlaybackSlider.Value + args.DeltaSeconds * speed;
+PlaybackSlider.Value = MathF.Max(0f, newValue);
📝 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.
private void SetEnabled(TapeRecorderMode mode, bool condition) | |
{ | |
_options.SetItemDisabled((int) mode, !(_hasCasette && condition)); | |
} | |
protected override void FrameUpdate(FrameEventArgs args) | |
{ | |
base.FrameUpdate(args); | |
if (!_entMan.HasComponent<ActiveTapeRecorderComponent>(_owner)) | |
return; | |
if (!_entMan.TryGetComponent<TapeRecorderComponent>(_owner, out var comp)) | |
return; | |
if (_mode != comp.Mode) | |
{ | |
_mode = comp.Mode; | |
_options.SelectByValue(_mode); | |
} | |
var speed = _mode == TapeRecorderMode.Rewinding | |
? -comp.RewindSpeed | |
: 1f; | |
PlaybackSlider.Value += args.DeltaSeconds * speed; | |
} | |
private void SetEnabled(TapeRecorderMode mode, bool condition) | |
{ | |
_options.SetItemDisabled((int) mode, !(_hasCasette && condition)); | |
} | |
protected override void FrameUpdate(FrameEventArgs args) | |
{ | |
base.FrameUpdate(args); | |
if (!_entMan.HasComponent<ActiveTapeRecorderComponent>(_owner)) | |
return; | |
if (!_entMan.TryGetComponent<TapeRecorderComponent>(_owner, out var comp)) | |
return; | |
if (_mode != comp.Mode) | |
{ | |
_mode = comp.Mode; | |
_options.SelectByValue(_mode); | |
} | |
var speed = _mode == TapeRecorderMode.Rewinding | |
? -comp.RewindSpeed | |
: 1f; | |
var newValue = PlaybackSlider.Value + args.DeltaSeconds * speed; | |
PlaybackSlider.Value = MathF.Max(0f, newValue); | |
} |
ent-FlagHCA = флаг Ассоциации Человеческого содружества | ||
.desc = Официальный флаг политической партии «Человеческое Содружество», который гордо развевается над душой каждого человека. Если у вас есть этот флаг, то вы, скорее всего, принадлежите к этой ассоциации. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Исправьте регистр в названии организации
В описании "Человеческое Содружество" используется неправильный регистр. В русском языке только первое слово в названии организации пишется с заглавной буквы, если это не аббревиатура.
ent-FlagHCA = флаг Ассоциации Человеческого содружества
- .desc = Официальный флаг политической партии «Человеческое Содружество», который гордо развевается над душой каждого человека. Если у вас есть этот флаг, то вы, скорее всего, принадлежите к этой ассоциации.
+ .desc = Официальный флаг политической партии «Человеческое содружество», который гордо развевается над душой каждого человека. Если у вас есть этот флаг, то вы, скорее всего, принадлежите к этой ассоциации.
📝 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.
ent-FlagHCA = флаг Ассоциации Человеческого содружества | |
.desc = Официальный флаг политической партии «Человеческое Содружество», который гордо развевается над душой каждого человека. Если у вас есть этот флаг, то вы, скорее всего, принадлежите к этой ассоциации. | |
ent-FlagHCA = флаг Ассоциации Человеческого содружества | |
.desc = Официальный флаг политической партии «Человеческое содружество», который гордо развевается над душой каждого человека. Если у вас есть этот флаг, то вы, скорее всего, принадлежите к этой ассоциации. |
[Dependency] private readonly IPrototypeManager _prototypeManager = default!; | ||
[Dependency] private readonly IEntityManager _entityManager = default!; | ||
|
||
private readonly Dictionary<EntProtoId, EntityUid> _dummies = []; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Необходимо освобождение ресурсов для _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.
public void Populate(List<SmartFridgeInventoryItem> inventory) | ||
{ | ||
if (inventory.Count == 0) | ||
{ | ||
SearchBar.Visible = false; | ||
VendingContents.Visible = false; | ||
OutOfStockLabel.Visible = true; | ||
return; | ||
} | ||
|
||
SearchBar.Visible = true; | ||
VendingContents.Visible = true; | ||
OutOfStockLabel.Visible = false; | ||
|
||
var listData = new List<VendorItemsListData>(); | ||
|
||
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)); | ||
} | ||
|
||
VendingContents.PopulateList(listData); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Улучшение обработки ошибок в методе Populate
Метод Populate
не проверяет входные данные на null и не логирует ошибки при отсутствии прототипов.
Рекомендуется добавить проверки:
public void Populate(List<SmartFridgeInventoryItem> inventory)
{
+ if (inventory == null)
+ throw new ArgumentNullException(nameof(inventory));
+
if (inventory.Count == 0)
{
SearchBar.Visible = false;
VendingContents.Visible = false;
OutOfStockLabel.Visible = true;
return;
}
// ... rest of the method
Committable suggestion skipped: line range outside the PR's diff.
# Corvax-Next-SmartFridge-Start | ||
# - type: EntityStorage | ||
# isCollidableWhenOpen: true | ||
# closeSound: | ||
# path: /Audio/Machines/windoor_open.ogg | ||
# params: | ||
# volume: -3 | ||
# openSound: | ||
# path: /Audio/Machines/windoor_open.ogg | ||
# params: | ||
# volume: -3 | ||
# - type: ContainerContainer | ||
# containers: | ||
# entity_storage: !type:Container | ||
# - type: UseDelay | ||
# delay: 1 | ||
# - type: AntiRottingContainer | ||
# - type: ResistLocker | ||
# Corvax-Next-SmartFridge-End |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codebase verification
Based on the search results, I can generate the final response since I have enough information to verify the impact of removing these components.
Удаление компонентов может нарушить функциональность холодильника
Анализ кодовой базы показывает, что удаление этих компонентов может привести к проблемам:
EntityStorage
иContainerContainer
являются базовыми компонентами для хранения предметов, их удаление нарушит основную функциональность холодильникаAntiRottingContainer
предотвращает порчу продуктов внутри холодильника (используется вSharedRottingSystem
)ResistLocker
позволяет существам выбраться из холодильника если они оказались заперты внутриUseDelay
предотвращает спам-использование холодильника
🔗 Analysis chain
Проверка влияния удаления компонентов
Удаление компонентов EntityStorage
и связанных с ним может повлиять на существующую функциональность.
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Поиск зависимостей на удаленные компоненты
rg "EntityStorage|ContainerContainer|UseDelay|AntiRottingContainer|ResistLocker" --type cs
Length of output: 58867
[DataField] | ||
public SoundSpecifier PrintSound = new SoundPathSpecifier("/Audio/Machines/diagnoser_printing.ogg") | ||
{ | ||
Params = AudioParams.Default.WithVolume(-2f).WithMaxDistance(3f) | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Дублирование аудио параметров
Параметры звука (громкость и дистанция) дублируются для каждого звукового эффекта.
Рекомендуется вынести общие параметры в константу:
+ private static readonly AudioParams DefaultAudioParams = AudioParams.Default.WithVolume(-2f).WithMaxDistance(3f);
- Params = AudioParams.Default.WithVolume(-2f).WithMaxDistance(3f)
+ Params = DefaultAudioParams
Also applies to: 60-64, 69-73, 78-82
насрал |
Описание PR
многочисленные порты с Corvax-Next, авторы и источники в коммитах
Медиа
Тип PR
Изменения
🆑 trest100
Summary by CodeRabbit
Новые функции
Исправления ошибок
Документация
Обновления