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

Upstream sync #1066

Merged
merged 36 commits into from
Feb 21, 2025
Merged

Upstream sync #1066

merged 36 commits into from
Feb 21, 2025

Conversation

Rxup
Copy link
Owner

@Rxup Rxup commented Feb 21, 2025

🆑

  • fix: Upstream

Summary by CodeRabbit

  • Новые возможности

    • Введены альтернативные атаки для холодного оружия (легкая, тяжелая, обезоруживание) и улучшен бой.
    • Добавлены новые оружия, такие как Мьёльнир и Singularity Hammer, а также механика притягивания/отталкивания объектов.
    • Появились новые баровые вывески «Maltroach» и «Whiskey Echoes» и расширены возможности прокрафта.
  • Исправления и улучшения

    • Оптимизировано управление предметами: улучшен подбор и сброс возле игрока.
    • Обновлены сообщения подключения и исправлены описания состояния голода для большей точности.

Absotively and others added 30 commits February 19, 2025 11:44
…rves (#35297)

Character picker button height equality for dwarves
* Added optional param to PickupOrDrop to allow the item to be moved next to the owner of the hand component

* cleanup placement code
Fix ExaminableHunger spelling mistake
* adds two new barsigns

* webedit to fix a typo

* the typo was in two locations

* reformatted meta.json and added attribution links
* space lizard

* attributions

* attribution fix
* Update shotgun.yml

* Update shotgun.yml

* Update shotgun.yml
Co-authored-by: Winkarst <[email protected]>
Co-authored-by: slarticodefast <[email protected]>
* Fix storage stars

* Fix some more storage bugs

- Fix positions not saving.
- Fix the 1-tick delay between parent and child storage UIs opening / closing.
- Fix BackButton being visible sometimes when it shouldn't be.

* milon is a furry
* Made all corpses disposable. Argocytes, Mimics, Butterflies, Bees, Space Kangaroos, Laser Raptors and Watchers their corpses can now be butchered.

* Accidentally removed a line break. restored it.

* Removed a dash that did not belong there.

* Changed mimic giving a "Changeling Sting Can" when butchered instead of normal meat.
* Remove storage hotbar GUI bandaid

With BUI deferred opens it also happened to fix this issue which is nice.

* Update Content.Client/Storage/StorageBoundUserInterface.cs
* Make cvar to require that the client has a modern hwid

* Ignore guests and don't disable cvar on dev

* Rename and add docs
Copy link
Contributor

coderabbitai bot commented Feb 21, 2025

Walkthrough

В этом наборе изменений затронуты различные аспекты проекта. Произошли обновления алгоритмов вычисления координат с использованием новых систем (MapSystem, SharedTransformSystem), изменения в логике пользовательского интерфейса, переработка механизмов альтернативной атаки и обработки отбрасывания в боевой системе, а также усиление проверки соединения через современный HWID. Кроме того, добавлены новые компоненты (например, для репульсии/притяжения и задержек при ударах), обновлён прототип ресурсов и локализации, а также обновлён идентификатор коммита подмодуля.

Changes

Файл(ы) Описание изменений
Content.Client/Gameplay/…, Content.Client/Weapons/Misc/TetherGunSystem.cs, Content.Server/Explosion/…, Content.Shared/Coordinates/Helpers/SnapgridHelper.cs, Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs, Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs Пересчитаны и унифицированы алгоритмы преобразования координат: замена методов MapToGrid/FromMap на вызовы методов через SharedTransformSystem и MapSystem; добавлен новый параметр (dropNear) для корректного позиционирования объектов.
Content.Client/Lobby/UI/CharacterPickerButton.xaml, Content.Client/Storage/StorageBoundUserInterface.cs, Content.Client/UserInterface/Systems/Storage/StorageUIController.cs, Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs Обновлён интерфейс: добавлен атрибут SetSize, удалены методы переоткрытия и обработки изменения экрана, изменена логика получения координат сессий.
Content.Client/Weapons/Melee/MeleeWeaponSystem.cs, Content.Shared/Weapons/Melee/Components/AltFireMeleeComponent.cs, Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs, Content.Shared/Weapons/Melee/UseDelayOnMeleeHitSystem.cs, Content.Shared/Throwing/ThrowingSystem.cs, Content.Shared/Timing/UseDelaySystem.cs, Content.Shared/Wieldable/SharedWieldableSystem.cs Рефакторинг боевой системы: переработана логика альтернативной атаки (легкая, тяжелая, разоружение) с добавлением специализированных методов; внедрён параметр unanchor для отбрасывания; изменены алгоритмы сброса задержек при использовании.
Content.Server/Connection/ConnectionManager.cs, Content.Shared/CCVar/CCVars.Admin.cs Добавлена проверка наличия modernHwid у подключающихся клиентов; введена новая причина отказа (NoHwid) и соответствующая переменная конфигурации для требования современного HWID.
Content.Shared/RepulseAttract/RepulseAttractComponent.cs, Content.Shared/RepulseAttract/RepulseAttractSystem.cs, Content.Shared/Weapons/Melee/Components/UseDelayOnMeleeHitComponent.cs, Content.Shared/Wieldable/Components/WieldableComponent.cs Новые компоненты для репульсивно-притягательного эффекта, управления задержками при ударах и контроля состояния при использовании; добавлено новое булево свойство UseDelayOnWield.
Resources/Changelog/Changelog.yml, Resources/Locale/…, Resources/Prototypes/…, Resources/Textures/… Обновление прототипов, локализаций и настроек ресурсов: добавлены новые предметы, бар-сайны, звуковые эффекты, изменены параметры объектов, NPS, элементы миграции и метаданные текстур.
RobustToolbox Обновление идентификатора коммита подмодуля с 8f75560ec… до 7104a4f4….

Sequence Diagram(s)

sequenceDiagram
    participant P as Игрок
    participant I as Обработчик ввода
    participant M as MeleeWeaponSystem
    participant A as AltFireMeleeComponent

    P->>I: Нажатие кнопки альтернативной атаки
    I->>M: Отправка события альтернативного огня
    M->>A: Проверка компонента AltFireMeleeComponent
    alt Если атака светлая
        M->>M: Выполнение ClientLightAttack
    else Если атака тяжелая
        M->>M: Выполнение ClientHeavyAttack
    else Если требуется разоружение
        M->>M: Выполнение ClientDisarm
    end
    M-->>P: Завершение атаки
Loading
sequenceDiagram
    participant CL as Клиент
    participant CM as ConnectionManager
    participant CFG as Конфигурация

    CL->>CM: Попытка подключения
    CM->>CFG: Проверка наличия modernHwid
    alt modernHwid отсутствует и требуется
        CM-->>CL: Отклонение подключения (NoHwid, сообщение hwid-required)
    else
        CM-->>CL: Подключение разрешено
    end
Loading

Poem

Я кролик-кодер, с ушами настороже,
Прыгаю сквозь строки, где изменения – зов.
Альтатаки, координаты — всё собрано,
HWID и UI теперь в системе обновлено.
Пусть баги прочь, а код сверкает,
С морковкой в лапке радость сияет!
В этих строках мой весёлый привет!

✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

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 size/M 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 labels Feb 21, 2025
Copy link
Contributor

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

Resources/Textures/Objects/Fun/toys.rsi

State Old New Status
spacelizard-inhand-left Added
spacelizard-inhand-right Added

Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi

State Old New Status
icon Added
inhand-left Added
inhand-right Added
wielded-inhand-left Added
wielded-inhand-right Added

Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi

State Old New Status
icon Added
inhand-left Added
inhand-right Added
wielded-inhand-left Added
wielded-inhand-right Added

Resources/Textures/Structures/Wallmounts/barsign.rsi

State Old New Status
maltroach Added
whiskeyechoes Added

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🔭 Outside diff range comments (3)
Content.Server/Backmen/EnergyDome/EnergyDomeSystem.cs (1)

271-271: 🛠️ Refactor suggestion

Несоответствие в использовании UseDelayComponent

В методе TurnOff всё ещё используется старый подход с созданием нового экземпляра Entity. Рекомендуется обновить для соответствия изменению в методе AttemptToggle.

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

-                _useDelay.TryResetDelay(new Entity<UseDelayComponent>(generator, useDelay));
+                _useDelay.TryResetDelay((generator, useDelay));
Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (1)

554-556: 🛠️ Refactor suggestion

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

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

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

Resources/Prototypes/Entities/Structures/Wallmounts/Signs/bar_sign.yml (1)

277-294: 🛠️ Refactor suggestion

Исправьте несоответствие в именовании!

В сущности BarSignMaltroach имя определено как "The Maltroach", в то время как в других файлах используется просто "Maltroach". Необходимо привести к единому стилю.

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

-  name: The Maltroach
+  name: Maltroach
🧹 Nitpick comments (27)
Resources/Locale/en-US/connection-messages.ftl (1)

64-64: Рекомендуется добавить дополнительную информацию в сообщение.

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

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

-hwid-required = Your client has refused to send a hardware id. Please contact the administration team for further assistance.
+hwid-required = Your client has refused to send a hardware id. Please contact the administration team at {$contact} for further assistance.

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

Content.Server/Backmen/EnergyDome/EnergyDomeSystem.cs (2)

163-166: Требуется доработка TODO комментария

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

Хотите, чтобы я помог создать issue для отслеживания этой проблемы?


154-159: Дублирование логики проверки заряда

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

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

+    private void HandleBatteryDrain(EntityUid generatorUid, EnergyDomeGeneratorComponent generatorComp, float energyLeak)
+    {
+        if (TryComp<BatteryComponent>(generatorUid, out var battery))
+        {
+            _battery.UseCharge(generatorUid, energyLeak);
+            if (battery.CurrentCharge == 0)
+                TurnOff((generatorUid, generatorComp), true);
+        }
+    }
Content.Server/Connection/ConnectionManager.cs (1)

230-234: Предложение по улучшению читаемости кода и сообщения об ошибке

Текущая реализация корректна, но можно улучшить читаемость и информативность.

Предлагаю следующие изменения:

-            if (modernHwid.Length == 0 && e.AuthType == LoginType.LoggedIn && _cfg.GetCVar(CCVars.RequireModernHardwareId))
+            var isModernHwidEmpty = modernHwid.Length == 0;
+            var isLoggedInUser = e.AuthType == LoginType.LoggedIn;
+            var requireModernHwid = _cfg.GetCVar(CCVars.RequireModernHardwareId);
+            
+            if (isModernHwidEmpty && isLoggedInUser && requireModernHwid)
             {
-                return (ConnectionDenyReason.NoHwid, Loc.GetString("hwid-required"), null);
+                return (ConnectionDenyReason.NoHwid, 
+                    Loc.GetString("hwid-required") + " " + 
+                    Loc.GetString("hwid-required-details"), null);
             }
Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (3)

187-191: Проверьте логику обработки ошибок

Блок обработки ошибок использует условие !errorOnMissing для раннего выхода, что может привести к неожиданному поведению при отладке. Рекомендуется переработать логику для большей ясности.

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

-            entity = null;
-            if (!errorOnMissing)
-                return false;
-            Log.Error($"{ToPrettyString(container)} does not have a solution with ID: {name}");
-            return false;
+            entity = null;
+            if (errorOnMissing)
+                Log.Error($"{ToPrettyString(container)} does not have a solution with ID: {name}");
+            return false;

196-200: Дублирование кода в обработке ошибок

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

Предлагаю создать вспомогательный метод:

+    private bool HandleSolutionError(Entity<SolutionContainerManagerComponent?> container, string? name, bool errorOnMissing)
+    {
+        if (errorOnMissing)
+            Log.Error($"{ToPrettyString(container)} does not have a solution with ID: {name}");
+        return false;
+    }

И использовать его в обоих местах:

-            entity = null;
-            if (!errorOnMissing)
-                return false;
-            Log.Error($"{ToPrettyString(container)} does not have a solution with ID: {name}");
-            return false;
+            entity = null;
+            return HandleSolutionError(container, name, errorOnMissing);

1174-1175: Исправьте форматирование

Отсутствует пробел после запятой в вызове метода.

-            dissolvedSol.RemoveReagent(reagent,amtChange);
+            dissolvedSol.RemoveReagent(reagent, amtChange);
Resources/Textures/Structures/Wallmounts/barsign.rsi/meta.json (1)

517-548: Оптимизируйте анимацию!

Анимация для "whiskeyechoes" использует 80 кадров с одинаковой задержкой 0.1 секунды. Это можно оптимизировать для улучшения производительности.

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

  1. Уменьшите количество кадров анимации
  2. Используйте более длительные интервалы между кадрами

Пример оптимизации:

-          0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
-          0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,
-          // ... (80 entries)
+          0.2, 0.2, 0.2, 0.2, 0.2,
+          0.2, 0.2, 0.2, 0.2, 0.2
Content.Shared/RepulseAttract/RepulseAttractComponent.cs (4)

7-11: Структура компонента соответствует лучшим практикам!

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

Предлагаю расширить XML-документацию, добавив примеры использования и более детальное описание механики отталкивания/притяжения.


13-18: Добавьте валидацию значения скорости

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

Предлагаю добавить:

+    [ViewVariables(VVAccess.ReadWrite)]
+    [DataField, AutoNetworkedField]
+    public float Speed
+    {
+        get => _speed;
+        set => _speed = Math.Clamp(value, -20f, 20f);
+    }
+    private float _speed = 5.0f;

20-24: Добавьте валидацию значения радиуса действия

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

Предлагаю добавить:

+    [ViewVariables(VVAccess.ReadWrite)]
+    [DataField, AutoNetworkedField]
+    public float Range
+    {
+        get => _range;
+        set => _range = Math.Max(0f, value);
+    }
+    private float _range = 5.0f;

26-30: Расширьте документацию для белого списка

Текущая документация не объясняет, как именно настраивать белый список и какие типы сущностей рекомендуется включать/исключать.

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

Content.Shared/RepulseAttract/RepulseAttractSystem.cs (3)

14-21: Добавьте документацию для системы и зависимостей.

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

  • Класса RepulseAttractSystem
  • Каждой зависимости с описанием её роли в системе

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

+/// <summary>
+/// Система, управляющая механикой отталкивания и притяжения сущностей.
+/// </summary>
 public sealed class RepulseAttractSystem : EntitySystem
 {
+    /// <summary>
+    /// Система для поиска сущностей в пространстве.
+    /// </summary>
     [Dependency] private readonly EntityLookupSystem _lookup = default!;

22-31: Уточните порядок выполнения обработчиков событий.

Текущая подписка на событие использует параметры before и after, но причины такого порядка не очевидны.

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

+    // Обработчик должен выполняться после SharedWieldableSystem для учета состояния оружия,
+    // но до UseDelayOnMeleeHitSystem для корректной обработки задержек
     SubscribeLocalEvent<RepulseAttractComponent, MeleeHitEvent>(OnMeleeAttempt, 
         before: [typeof(UseDelayOnMeleeHitSystem)], 
         after: [typeof(SharedWieldableSystem)]);

32-38: Добавьте дополнительные проверки в обработчик события.

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

  • Валидности пользователя (args.User)
  • Состояния компонента RepulseAttract

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

 private void OnMeleeAttempt(Entity<RepulseAttractComponent> ent, ref MeleeHitEvent args)
 {
+    if (!EntityManager.IsAlive(args.User))
+        return;
+
     if (_delay.IsDelayed(ent.Owner))
         return;
 
     TryRepulseAttract(ent, args.User);
 }
Content.Shared/Weapons/Melee/Components/AltFireMeleeComponent.cs (1)

16-22: Рекомендуется добавить документацию к значениям перечисления.

Хотя базовая документация присутствует в виде комментариев, рекомендуется оформить её в формате XML-документации для улучшения читаемости и поддержки IDE.

 [Flags]
 public enum AltFireAttackType : byte
 {
-    Light = 0, // Standard single-target attack.
-    Heavy = 1 << 0, // Wide swing.
-    Disarm = 1 << 1
+    /// <summary>
+    /// Standard single-target attack.
+    /// </summary>
+    Light = 0,
+    
+    /// <summary>
+    /// Wide swing attack.
+    /// </summary>
+    Heavy = 1 << 0,
+    
+    /// <summary>
+    /// Attack that attempts to disarm the target.
+    /// </summary>
+    Disarm = 1 << 1
 }
Content.Shared/Weapons/Melee/UseDelayOnMeleeHitSystem.cs (2)

11-11: Рекомендуется использовать readonly для зависимости.

Зависимость _delay помечена как default!, но не помечена как readonly, что может привести к случайной модификации.

-    [Dependency] private readonly UseDelaySystem _delay = default!;
+    [Dependency] private readonly UseDelaySystem _delay = default!;

34-37: Рекомендуется добавить логирование при отсутствии компонента.

В случае отсутствия UseDelayComponent система молча возвращается. Добавление логирования поможет при отладке.

     if (!TryComp<UseDelayComponent>(uid, out var useDelay))
+    {
+        Logger.Debug($"No UseDelayComponent found on entity {uid}");
         return;
+    }
Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs (1)

51-51: Обновите документацию события AttemptMeleeThrowOnHitEvent.

Документация события не отражает новые параметры Target и User.

 /// <summary>
-/// Raised a weapon entity with <see cref="MeleeThrowOnHitComponent"/> to see if a throw is allowed.
+/// Raised when a weapon entity with <see cref="MeleeThrowOnHitComponent"/> attempts to throw a target.
+/// <param name="Target">The entity being targeted for throwing.</param>
+/// <param name="User">The entity initiating the throw, if any.</param>
+/// <param name="Cancelled">Whether the throw attempt was cancelled.</param>
+/// <param name="Handled">Whether the event has been handled.</param>
 /// </summary>
Content.Client/Weapons/Melee/MeleeWeaponSystem.cs (1)

226-234: Выделена логика обезоруживания в отдельный метод.

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

Content.Client/Gameplay/GameplayStateBase.cs (1)

222-227: Улучшена логика вычисления координат.

Использование MapSystem и SharedTransformSystem делает обработку координат более надежной, но стоит добавить обработку ошибок для случаев, когда системы недоступны.

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

-var transformSystem = _entitySystemManager.GetEntitySystem<SharedTransformSystem>();
-var mapSystem = _entitySystemManager.GetEntitySystem<MapSystem>();
+if (!_entitySystemManager.TryGetEntitySystem(out SharedTransformSystem? transformSystem) ||
+    !_entitySystemManager.TryGetEntitySystem(out MapSystem? mapSystem))
+{
+    return;
+}
Resources/Prototypes/Entities/Objects/Fun/skub.yml (1)

30-36: Новый компонент MeleeWeapon для Skub
Добавлен компонент MeleeWeapon с конфигурацией урона (Blunt: 0) и свойством hidden: true. Если нулевой урон — осознанный выбор для этой сущности, то всё верно. Рекомендуется перепроверить, что такое поведение не приведёт к непредвиденным эффектам в игровом процессе.

Resources/Prototypes/Entities/Objects/Weapons/Melee/hammers.yml (2)

27-69: Новая сущность Mjollnir
Сущность Mjollnir внедрена с набором компонентов для магического оружия (Wieldable, MeleeRequiresWield, LandAtCursor, Sprite, UseDelay, UseDelayOnMeleeHit, MeleeThrowOnHit, MeleeWeapon, IncreaseDamageOnWield, DamageOtherOnHit, Item). Проверьте, что путь к аудио файлу (/Audio/Effects/tesla_consume.ogg) и параметры (например, задержка использования, урон) соответствуют концепции оружия.


70-110: Новая сущность Singularity Hammer
Сущность Singularity Hammer добавлена с механикой отталкивания и притяжения (компонент RepulseAttract с параметром speed: -15 и range: 5). Рекомендуется перепроверить, что значение скорости соответствует игровым ожиданиям и не вызывает непредвиденного поведения.

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

46-49: Добавление компонента Butcherable в Lavaland
В базовой сущности (watcher) добавлен новый компонент Butcherable, который при забое генерирует предмет DiamondOre1 в количестве 1. Убедитесь, что данное изменение соответствует общей логике получения ресурсов и балансу игры.

Resources/migration.yml (1)

788-838: Обновление миграционного маппинга для оружейной системы и боеприпасов.
Добавлены новые записи, такие как MagazineBoxCaselessRifle10x24: null, для синхронизации с изменениями в модификациях оружия. Также видны закомментированные строки (например, #WeaponSubMachineGunVector: null и #MagazineBoxAntiMaterielBig: null). Просмотрите, соответствует ли такое поведение (удаление или временное отключение этих маппингов) требованиям общей миграционной стратегии.

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

3193-3242: Новая сущность «Syndicat (Explosive Kitten)»
Добавлена сущность Syndicat с компонентами:

  • GhostRole с высокими вероятностями и необходимыми параметрами,
  • AutoImplant (предусмотрен MicroBombImplant),
  • ExplosionResistance с уменьшенным коэффициентом урона от взрывов.
    Эти изменения требуют тщательного тестирования, чтобы убедиться в том, что взрывной эффект не нарушает игровой баланс.
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between b71a30f and 4299ed3.

⛔ Files ignored due to path filters (14)
  • Resources/Textures/Objects/Fun/toys.rsi/spacelizard-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Objects/Fun/toys.rsi/spacelizard-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/wielded-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/wielded-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/icon.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/wielded-inhand-left.png is excluded by !**/*.png
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/wielded-inhand-right.png is excluded by !**/*.png
  • Resources/Textures/Structures/Wallmounts/barsign.rsi/maltroach.png is excluded by !**/*.png
  • Resources/Textures/Structures/Wallmounts/barsign.rsi/whiskeyechoes.png is excluded by !**/*.png
📒 Files selected for processing (68)
  • Content.Client/Gameplay/GameplayStateBase.cs (1 hunks)
  • Content.Client/Lobby/UI/CharacterPickerButton.xaml (1 hunks)
  • Content.Client/Storage/StorageBoundUserInterface.cs (0 hunks)
  • Content.Client/UserInterface/Systems/Storage/StorageUIController.cs (0 hunks)
  • Content.Client/Weapons/Melee/MeleeWeaponSystem.cs (4 hunks)
  • Content.Client/Weapons/Misc/TetherGunSystem.cs (2 hunks)
  • Content.Server.Database/Model.cs (1 hunks)
  • Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs (1 hunks)
  • Content.Server/Backmen/EnergyDome/EnergyDomeSystem.cs (1 hunks)
  • Content.Server/Connection/ConnectionManager.cs (1 hunks)
  • Content.Server/Explosion/EntitySystems/ExplosionSystem.cs (3 hunks)
  • Content.Shared/Anomaly/SharedAnomalyCoreSystem.cs (1 hunks)
  • Content.Shared/Anomaly/SharedAnomalySystem.cs (2 hunks)
  • Content.Shared/CCVar/CCVars.Admin.cs (1 hunks)
  • Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (1 hunks)
  • Content.Shared/Coordinates/Helpers/SnapgridHelper.cs (1 hunks)
  • Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs (3 hunks)
  • Content.Shared/Nutrition/Components/ExaminableHungerComponent.cs (1 hunks)
  • Content.Shared/Nutrition/EntitySystems/ExaminableHungerSystem.cs (2 hunks)
  • Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs (1 hunks)
  • Content.Shared/RepulseAttract/RepulseAttractComponent.cs (1 hunks)
  • Content.Shared/RepulseAttract/RepulseAttractSystem.cs (1 hunks)
  • Content.Shared/Storage/EntitySystems/MagnetPickupSystem.cs (1 hunks)
  • Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs (2 hunks)
  • Content.Shared/Throwing/ThrowingSystem.cs (7 hunks)
  • Content.Shared/Timing/UseDelaySystem.cs (2 hunks)
  • Content.Shared/Weapons/Melee/Components/AltFireMeleeComponent.cs (1 hunks)
  • Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs (1 hunks)
  • Content.Shared/Weapons/Melee/Components/UseDelayOnMeleeHitComponent.cs (1 hunks)
  • Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs (2 hunks)
  • Content.Shared/Weapons/Melee/UseDelayOnMeleeHitSystem.cs (1 hunks)
  • Content.Shared/Wieldable/Components/WieldableComponent.cs (1 hunks)
  • Content.Shared/Wieldable/SharedWieldableSystem.cs (2 hunks)
  • Resources/Changelog/Changelog.yml (1 hunks)
  • Resources/Locale/en-US/barsign/barsign-component.ftl (1 hunks)
  • Resources/Locale/en-US/connection-messages.ftl (1 hunks)
  • Resources/Locale/en-US/nutrition/components/examinable-hunger-component.ftl (1 hunks)
  • Resources/Locale/en-US/nutrition/components/examineable-hunger-component.ftl (0 hunks)
  • Resources/Locale/en-US/store/spellbook-catalog.ftl (1 hunks)
  • Resources/Prototypes/Catalog/spellbook_catalog.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml (6 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml (12 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/mimic.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/NPCs/space.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Species/arachnid.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Species/base.yml (2 hunks)
  • Resources/Prototypes/Entities/Mobs/Species/moth.yml (1 hunks)
  • Resources/Prototypes/Entities/Mobs/Species/vox.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml (2 hunks)
  • Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml (3 hunks)
  • Resources/Prototypes/Entities/Objects/Fun/skub.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Fun/toys.yml (18 hunks)
  • Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml (0 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml (9 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Melee/hammers.yml (1 hunks)
  • Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml (0 hunks)
  • Resources/Prototypes/Entities/Structures/Machines/lathe.yml (1 hunks)
  • Resources/Prototypes/Entities/Structures/Wallmounts/Signs/bar_sign.yml (1 hunks)
  • Resources/Prototypes/Magic/touch_spells.yml (0 hunks)
  • Resources/Prototypes/bar_signs.yml (1 hunks)
  • Resources/Textures/Objects/Fun/toys.rsi/meta.json (2 hunks)
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/meta.json (1 hunks)
  • Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/meta.json (1 hunks)
  • Resources/Textures/Structures/Wallmounts/barsign.rsi/meta.json (2 hunks)
  • Resources/migration.yml (1 hunks)
  • RobustToolbox (1 hunks)
💤 Files with no reviewable changes (6)
  • Resources/Locale/en-US/nutrition/components/examineable-hunger-component.ftl
  • Content.Client/Storage/StorageBoundUserInterface.cs
  • Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml
  • Content.Client/UserInterface/Systems/Storage/StorageUIController.cs
  • Resources/Prototypes/Magic/touch_spells.yml
  • Resources/Prototypes/Entities/Objects/Weapons/Melee/sledgehammer.yml
✅ Files skipped from review due to trivial changes (5)
  • Resources/Prototypes/Entities/Mobs/Species/base.yml
  • Resources/Textures/Objects/Weapons/Melee/mjollnir.rsi/meta.json
  • Content.Shared/Nutrition/EntitySystems/ExaminableHungerSystem.cs
  • RobustToolbox
  • Content.Shared/Nutrition/Components/ExaminableHungerComponent.cs
⏰ Context from checks skipped due to timeout of 300000ms (3)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: YAML Linter
  • GitHub Check: Test Packaging
🔇 Additional comments (136)
Content.Server.Database/Model.cs (1)

991-992: Добавлено новое значение для отклонения подключений без современного HWID.

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

Resources/Locale/en-US/connection-messages.ftl (1)

64-64: Добавлено новое сообщение для проверки аппаратного идентификатора.

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

Content.Server/Backmen/EnergyDome/EnergyDomeSystem.cs (1)

177-177: Улучшение в обработке UseDelayComponent

Изменение в использовании кортежа вместо создания нового экземпляра Entity является более эффективным подходом. Это соответствует современным практикам C# и уменьшает накладные расходы.

Content.Shared/CCVar/CCVars.Admin.cs (1)

186-191: Корректное добавление новой конфигурационной переменной!

Переменная RequireModernHardwareId хорошо документирована и следует существующему паттерну конфигурационных переменных в файле.

Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs (1)

148-148: Улучшение обработки ошибок в методе TryGetSolution

Передача параметра errorOnMissing в вызов метода улучшает контроль над логированием ошибок при отсутствии раствора.

Resources/Locale/en-US/barsign/barsign-component.ftl (1)

99-105: Локализация соответствует стандартам!

Новые записи для баров "Maltroach" и "Whiskey Echoes" корректно добавлены и следуют установленному формату локализации.

Resources/Prototypes/bar_signs.yml (1)

185-199: Прототипы корректно определены!

Новые прототипы вывесок баров добавлены с правильной структурой и ссылками на соответствующие ресурсы.

Content.Shared/RepulseAttract/RepulseAttractComponent.cs (2)

1-5: Импорты корректны!

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


32-38: Отличная реализация маски коллизий!

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

Content.Shared/Hands/EntitySystems/SharedHandsSystem.Pickup.cs (2)

118-118: Улучшение точности расчета координат!

Использование TransformSystem.ToCoordinates вместо EntityCoordinates.FromMap обеспечивает более точное преобразование координат при анимации подбора предметов.


200-224: Улучшение механики размещения предметов!

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

Content.Shared/Radio/EntitySystems/EncryptionKeySystem.cs (1)

58-58: Улучшение UX при извлечении ключей шифрования!

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

Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml (2)

229-229: Проверьте влияние уменьшения объема на игровой баланс!

Значительное уменьшение maxVol с 40 до 10 может повлиять на эффективность пищи и игровой баланс. Убедитесь, что это изменение соответствует дизайну игры.


286-286: Проверьте согласованность изменений объема!

Уменьшение maxVol с 50 до 10 соответствует общей тенденции уменьшения объемов. Убедитесь, что все связанные пищевые предметы обновлены согласованно.

Resources/Prototypes/Entities/Mobs/Species/arachnid.yml (2)

104-104: Добавление слоя outerClothing

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


129-139: Удаление Dummy-сущности для Arachnid

Блок, относящийся к временной (Dummy) сущности для Arachnid, удалён. Убедитесь, что это изменение не приводит к нарушению зависимостей, если где-то в проекте ожидается наличие данной сущности.

Resources/Prototypes/Entities/Mobs/Species/moth.yml (2)

102-102: Добавление слоя outerClothing

Новая строка с маппингом "outerClothing" добавлена в список слоёв спрайта. Проверьте, что данный слой правильно интегрирован в визуальный порядок и соответствует стандартам оформления для представления сущности Moth.


135-149: Удаление Dummy-сущности для Moth

Удалён блок, относящийся к Dummy-сущности для Moth. Убедитесь, что удаление этого блока не влияет на зависимые системы или загрузку ресурсов, особенно если где-то в коде ориентируются на наличие данной сущности.

Resources/Prototypes/Entities/Mobs/Species/vox.yml (2)

85-85: Добавление слоя outerClothing

В слое спрайта Vox добавлен новый маппинг "outerClothing". Проверьте, что изменение порядка слоёв отвечает требованиям визуальной эстетики и не вызывает конфликтов с ранее установленными приоритетами отображения.


156-203: Удаление Dummy-сущности для Vox

Удалён блок Dummy-сущности для Vox, который ранее использовался для тестирования или заполнения. Убедитесь, что это удаление не затрагивает функциональность загрузки или отображения Vox, если в системе ожидается наличие подобной сущности.

Content.Shared/Wieldable/Components/WieldableComponent.cs (2)

31-31: Улучшение документации!

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


36-40:

✅ Verification successful

Хорошее добавление контроля задержки!

Новое свойство UseDelayOnWield позволяет гибко управлять поведением задержки после действий удержания/снятия удержания предмета. Реализация соответствует паттернам компонента и хорошо документирована.

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


🏁 Script executed:

#!/bin/bash
# Поиск использования WieldableComponent для проверки обработки UseDelayOnWield

# Поиск систем, работающих с WieldableComponent
rg -l "WieldableComponent" | grep "System"

# Поиск использования UseDelayOnWield
rg "UseDelayOnWield"

Length of output: 622


Отличное улучшение: контроль задержки интегрирован корректно.

Новое свойство UseDelayOnWield реализовано согласно установленным паттернам и документировано. По результатам проверки видно, что система SharedWieldableSystem.cs корректно обрабатывает его, используя условные проверки с учетом наличия компонента UseDelayComponent. Просьба убедиться, что все остальные системы, использующие WieldableComponent, также правильно интерпретируют значение этого свойства.

Resources/Textures/Objects/Fun/toys.rsi/meta.json (2)

4-4: Обновление данных об авторских правах
Строка обновлена с добавлением подробного списка источников и авторов. Убедитесь, что все ссылки и имена правильны и отражают актуальные данные из upstream.


204-211: Добавление новых состояний для spacelizard
Добавлены два новых состояния: "spacelizard-inhand-right" и "spacelizard-inhand-left" с параметром "directions": 4. Проверьте, что новые состояния правильно интегрированы в систему (например, используются в MeleeWeaponSystem и UseDelayOnMeleeHitSystem) и корректно отображаются в игре.

Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/shotgun.yml (9)

4-4: Изменение родительского класса для BaseShellShotgun.
Значение атрибута parent изменено на BaseCartridge, что упрощает иерархию наследования для данного объекта.


42-44: Обновление наследования для ShellShotgunSlug.
Атрибут parent теперь задан как [ BaseShellShotgun, BaseSecurityContraband], что обеспечивает расширение функциональности через дополнительную классификацию.


55-58: Модификация наследования для ShellShotgunFlare.
Теперь данная сущность наследует только от BaseShellShotgun, исключая BaseSecurityContraband. Проверьте, что такое изменение соответствует требованиям модели безопасности.


74-77: Изменение схемы наследования для ShellShotgun.
Атрибут parent обновлён на [ BaseShellShotgun, BaseSecurityContraband ], что добавляет дополнительный уровень наследования и, соответственно, функциональности.


86-89: Корректировка наследования для ShellShotgunIncendiary.
Изменение атрибута parent на [ BaseShellShotgun, BaseSecurityContraband ] гарантирует, что объект правильно наследует как базовые, так и дополнительные свойства, связанные с безопасностью.


100-103: Обновление родительского класса для ShellShotgunPractice.
Атрибут parent изменён на [ BaseShellShotgun, BaseSecurityContraband ], что позволяет наследовать дополнительные характеристики и обеспечивает согласованность с остальными объектами.


114-117: Изменение наследования для ShellTranquilizer.
Атрибут parent обновлён на [ BaseShellShotgun, BaseSecurityContraband ], что соответствует общей стратегии наследования в обновлённой системе.


142-146: Модификация наследования для ShellShotgunImprovised.
Теперь у данной сущности значение parent установлено как [ BaseShellShotgun, BaseSecurityContraband ], что улучшает согласованность наследования в системе.


165-168: Обновление родительского класса для ShellShotgunUranium.
Атрибут parent изменён на [ BaseShellShotgun, BaseSecurityContraband ], что повышает интеграцию с базовыми и дополнительными характеристиками безопасности.

Content.Client/Lobby/UI/CharacterPickerButton.xaml (1)

8-12:

✅ Verification successful

Проверьте корректность размеров спрайта.

Добавление атрибута SetSize="64 64" вместе с существующим Scale="2 2" приведёт к тому, что спрайт будет отображаться размером 128x128 пикселей. Убедитесь, что:

  1. Такой размер соответствует дизайну интерфейса
  2. Не возникнет проблем с отображением в контейнере при различных разрешениях экрана

🏁 Script executed:

#!/bin/bash
# Поиск других SpriteView с похожими настройками размера для сравнения
rg -U 'SpriteView.*Scale.*SetSize' --type xaml

Length of output: 77


Пожалуйста, повторно проверьте использование атрибутов Scale и SetSize в файлах XAML.

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


🏁 Script executed:

[run_scripts]
#!/bin/bash
# Поиск использования SpriteView с атрибутом Scale и SetSize в файлах *.xaml
rg 'SpriteView.*Scale.*SetSize' -g "*.xaml"

Length of output: 663


Проверьте итоговый размер спрайта.

Добавление атрибута SetSize="64 64" вместе с Scale="2 2" приводит к тому, что спрайт будет отображаться с размерами 128x128 пикселей. Обратите внимание, что аналогичная комбинация уже используется в файлах:

  • Content.Client/Atmos/Monitor/UI/AirAlarmWindow.xaml
  • Content.Client/Power/APC/UI/ApcMenu.xaml
  • Content.Client/UserInterface/Systems/Character/Windows/CharacterWindow.xaml

Если итоговый размер соответствует дизайнерскому решению и вёрстке, можно считать изменения корректными.

Content.Shared/RepulseAttract/RepulseAttractSystem.cs (1)

1-12: Зависимости корректны!

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

Content.Shared/Anomaly/SharedAnomalyCoreSystem.cs (1)

39-41:

✅ Verification successful

Проверьте корректность изменения параметра!

Изменение args.Hit на args.Target является частью рефакторинга системы ближнего боя. Логика проверки компонентов осталась прежней, но теперь применяется к целевому объекту.

Пожалуйста, убедитесь, что:

  1. Все вызовы правильно передают целевой объект в args.Target
  2. Поведение системы не изменилось неожиданным образом

🏁 Script executed:

#!/bin/bash
# Поиск других мест использования AttemptMeleeThrowOnHitEvent
rg "AttemptMeleeThrowOnHitEvent" -A 5

Length of output: 2424


Изменение параметра подтверждено

Из выполненного анализа видно, что замена args.Hit на args.Target соответствует контракту события AttemptMeleeThrowOnHitEvent – конструктор события принимает первым аргументом объект-цель. Все обращения к событию в кодовой базе (например, в файлах Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs и Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs) используют параметр target, что подтверждает корректность изменения.

Пожалуйста, ещё раз проверьте, что:

  • Все вызовы события корректно передают объект-цель через args.Target.
  • Изменение не повлияло на ожидаемое поведение системы ближнего боя.
Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs (6)

2-4: Все добавленные пространства имён выглядят корректно.
Эти директивы using необходимы для новых систем и структур (Stunnable, Throwing, Timing, System.Numerics). Никаких конфликтов не обнаружено.

Also applies to: 10-10


21-23: Проверка внедрений зависимостей.
Объявленные системы UseDelaySystem, SharedStunSystem и ThrowingSystem корректно используются в данном файле, проблем не выявлено.


28-28: Подписка на новое событие ThrowDoHitEvent.
Подключение к событию выглядит правильным, оно необходимо для обработки броска при попадании. Убедитесь, что никакие другие зависимости не забыты.


31-50: Проверка логики OnMeleeHit.
Метод корректно учитывает задержку использования и отсутствие целей в списке HitEntities. Также происходит вычисление направления удара на основе позиции пользователя и цели.

Рекомендуется удостовериться, что args.User не может быть null, чтобы избежать потенциальных ошибок при вызове _transform.GetWorldPosition(args.User).


52-61: Обработка события ThrowDoHitEvent.
Метод корректно проверяет, активна ли функциональность при броске, а также наличие компонента Physics у выброшенного оружия. Логика выглядит последовательно.


63-81: Разделение логики ThrowOnHitHelper.
События AttemptMeleeThrowOnHitEvent и MeleeThrowOnHitStartEvent даёт возможность другим системам отменять или модифицировать бросок. Проверка нулевого вектора направления и применение оглушения выглядят оправданно.

Content.Shared/Weapons/Melee/Components/UseDelayOnMeleeHitComponent.cs (1)

1-12: Новый компонент для задержки использования.
Компонент UseDelayOnMeleeHitComponent объявлен корректно. Он регистрируется и сеттится как сетевая сущность, что даёт возможность синхронизировать его состояние по сети. Дополнительных замечаний нет.

Resources/Locale/en-US/nutrition/components/examinable-hunger-component.ftl (1)

1-5: Проверка новых строк локализации для состояний голода.
Формат и структура сообщений выглядят корректно, используются функции для согласования глаголов и заглавных букв. Никаких проблем не обнаружено.

Content.Shared/Coordinates/Helpers/SnapgridHelper.cs (1)

18-22: Изменения улучшают согласованность с системой трансформаций.

Переход на использование xformSys.ToMapCoordinates и xformSys.ToCoordinates делает код более последовательным и соответствует архитектурным принципам системы.

Resources/Locale/en-US/store/spellbook-catalog.ftl (2)

58-59:

✅ Verification successful

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

Описание Singularity Hammer указывает на эффект притяжения окружающих объектов. Убедитесь, что эта механика реализована в соответствующих системах.


🏁 Script executed:

#!/bin/bash
# Поиск реализации механики притяжения для Singularity Hammer
rg -A 5 "Singularity.*pull|attract"

Length of output: 22294


Проверьте соответствие описания механике притяжения.
Выяснено, что эффект притяжения реализован:

  • Компонент SingularityAttractorComponent (файл Content.Server/Singularity/Components/SingularityAttractorComponent.cs)
  • Система SingularityAttractorSystem (файл Content.Server/Singularity/EntitySystems/SingularityAttractorSystem.cs)

Пожалуйста, убедитесь, что описание в файле Resources/Locale/en-US/store/spellbook-catalog.ftl (строки 58–59) точно отражает этот игровой механизм.


55-56:

❓ Verification inconclusive

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

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


🏁 Script executed:

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

rg -A 5 "Mjollnir.*throw|knockback"

Length of output: 1083


Проверьте реализацию механики отбрасывания для Mjollnir

Описание указывает на возможность отбрасывания противников при ударе или броске, однако автоматизированный поиск реализации метода throw или других функций, связанных с knockback, для Mjollnir не дал результатов. Единственные найденные совпадения относятся к другому оружию (например, baseball bat), что может говорить об отсутствии соответствующей реализации для Mjollnir.

  • Проверьте, существует ли в коде реализация метода (или логики) отбрасывания для оружия Mjollnir.
  • Если механика реализована в другом месте, убедитесь, что описание соответствует действительности.
  • Если реализация отсутствует, необходимо либо убрать упоминание механики из описания, либо добавить поддержку соответствующего функционала.
Content.Shared/Storage/EntitySystems/MagnetPickupSystem.cs (1)

84-84: Улучшение производительности при вычислении координат.

Замена EntityCoordinates.FromMap на _transform.ToCoordinates является правильным решением, так как это более эффективный способ преобразования координат.

Content.Client/Weapons/Misc/TetherGunSystem.cs (2)

19-19: Добавлена новая зависимость MapSystem.

Добавление MapSystem как зависимости является правильным решением для работы с координатами карты.


77-82: Улучшение логики преобразования координат.

Замена старой логики на использование TransformSystem.ToCoordinates с MapSystem делает код более последовательным и поддерживаемым.

Content.Shared/Timing/UseDelaySystem.cs (2)

91-95: Улучшение обработки отсутствующего компонента.

Изменение сигнатуры метода для поддержки nullable компонента и добавление проверки через Resolve делает код более надёжным.


150-150: Обновление вызова IsDelayed.

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

Content.Client/Weapons/Melee/MeleeWeaponSystem.cs (2)

111-133: Улучшена логика альтернативной атаки для оружия.

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


236-253: Улучшена обработка легкой атаки.

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

Content.Shared/Throwing/ThrowingSystem.cs (1)

145-146: Добавлена возможность открепления объектов при броске.

Новый параметр unanchor позволяет автоматически откреплять объекты перед броском, что улучшает игровой процесс.

Content.Shared/Wieldable/SharedWieldableSystem.cs (2)

195-196: Улучшен контроль задержки использования при удержании.

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


241-245: Добавлена проверка задержки при попытке удержания.

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

Content.Shared/Anomaly/SharedAnomalySystem.cs (4)

7-7: Добавлена новая зависимость для системы бросков

Добавлен импорт Content.Shared.Throwing для поддержки новой механики приземления.


44-45: Улучшена обработка событий броска аномалии

Заменена подписка на MeleeThrowOnHitEndEvent на более подходящий LandEvent, что лучше отражает логику приземления объекта.


50-54: Улучшена читаемость и логика проверки оружия

  • Параметр переименован с args.Used на args.Weapon для большей ясности
  • Добавлен поясняющий комментарий о статическом состоянии аномалий

58-62: Добавлен новый обработчик приземления

Реализован метод OnLand для обработки приземления аномалии, который возвращает объект в статическое состояние.

Content.Server/Explosion/EntitySystems/ExplosionSystem.cs (2)

42-42: Добавлена зависимость MapSystem

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


361-362: Улучшен метод преобразования координат

Использование TransformSystem.ToCoordinates вместо EntityCoordinates.FromMap для более последовательной работы с координатами.

Content.Server/Administration/Systems/AdminVerbSystem.Smites.cs (1)

139-139: Обновлён метод установки координат в шахматном измерении

Использован TransformSystem.ToCoordinates для согласованности с общей системой координат.

Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs (2)

535-538: Обновлён метод преобразования координат в системе хранения

Использование TransformSystem.ToCoordinates для более последовательной работы с координатами в системе хранения.


587-590: Улучшена обработка координат при подборе предметов

Обновлён метод преобразования мировых координат в локальные с использованием TransformSystem.

Resources/Prototypes/Entities/Objects/Fun/skub.yml (3)

18-20: Новый компонент EmitSoundOnLand
Новый компонент EmitSoundOnLand добавлен корректно и использует коллекцию звуков Skub. Убедитесь, что этот компонент работает аналогично другим звуковым компонентам в проекте.


24-26: Новый компонент EmitSoundOnActivate
Компонент EmitSoundOnActivate добавлен с правильно заданной коллекцией звуков Skub. Проверьте его интеграцию с другими системами звукового воспроизведения.


27-29: Новый компонент EmitSoundOnCollide
Добавлен компонент EmitSoundOnCollide с указанием коллекции звуков Skub. Необходимо убедиться, что логика вызова и проигрывания звука соответствует требованиям геймдизайна.

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

43-46: Новый компонент Butcherable для mimic
В сущность mimic добавлен компонент Butcherable, который при забое генерирует предмет с идентификатором DrinkChangelingStingCan в количестве 1. Проверьте, что это изменение соответствует игровой логике и балансировке при добыче ресурсов.

Resources/Prototypes/Entities/Objects/Weapons/Melee/hammers.yml (1)

1-26: Новый объект Sledgehammer
Сущность sledgehammer добавлена корректно: все компоненты (Sprite, MeleeWeapon, Wieldable, IncreaseDamageOnWield, Item) настроены согласно требованиям. Убедитесь, что коллекция звуков MetalThud доступна в проекте.

Resources/Textures/Objects/Weapons/Melee/singularityhammer.rsi/meta.json (1)

1-245: Новый файл метаданных для Singularity Hammer
Файл meta.json успешно добавлен для описания метаданных оружия Singularity Hammer. Все ключевые параметры (версия, лицензия, размеры, состояния анимации и задержки) выглядят корректно. Рекомендуется перепроверить, что значения задержек (0.05) соответствуют требованиям анимаций в проекте.

Resources/Prototypes/Entities/Objects/Fun/bike_horn.yml (12)

17-18: Проверка компонента UseDelay
Добавлен компонент UseDelay с задержкой 0.5. Убедитесь, что выбранное значение соответствует требуемой логике использования в игре.


24-28: Добавление компонента EmitSoundOnLand (BikeHorn)
Новый блок EmitSoundOnLand настроен с использованием звуковой коллекции BikeHorn и вариацией 0.125. Проверьте, что это соответствует общему дизайну звуковых эффектов для данного предмета.


34-38: Добавление компонента EmitSoundOnActivate (BikeHorn)
Добавлен компонент EmitSoundOnActivate, который генерирует звук активации с вариацией 0.125. Рекомендуется перепроверить соответствие звуковой коллекции спецификации.


39-43: Добавление компонента EmitSoundOnCollide (BikeHorn)
Добавлен компонент EmitSoundOnCollide для обработки звука при столкновении, вариант звука установлен в 0.125. Убедитесь, что его работа не конфликтует с другими эффектами при столкновении.


93-94: Обновление параметра в EmitSoundOnUse (CluwneHorn)
Изменено значение параметра variation до 0.125 для компонента EmitSoundOnUse. Проверьте, что такое значение гармонирует со звуковой палитрой для CluwneHorn.


95-98: Добавление компонента EmitSoundOnActivate (CluwneHorn)
В блоке добавлен новый компонент EmitSoundOnActivate с вариацией 0.125 для CluwneHorn. Настройка выглядит консистентной с остальными звуковыми эффектами.


99-103: Добавление компонента EmitSoundOnCollide (CluwneHorn)
Новая реализация компонента EmitSoundOnCollide для CluwneHorn с параметром variation: 0.125 добавлена корректно.


104-108: Добавление компонента EmitSoundOnLand (CluwneHorn)
Компонент EmitSoundOnLand для CluwneHorn введён с аналогичными настройками: звуковая коллекция CluwneHorn и вариация 0.125.


166-170: Добавление компонента EmitSoundOnLand (BananiumHorn)
Для BananiumHorn добавлен блок EmitSoundOnLand с вариацией 0.246, что соответствует тематике данного предмета.


176-180: Добавление компонента EmitSoundOnActivate (BananiumHorn)
Новый компонент EmitSoundOnActivate для BananiumHorn интегрирован с параметром variation: 0.246. Проверьте корректность использования звуковой коллекции.


181-185: Добавление компонента EmitSoundOnCollide (BananiumHorn)
Добавлен компонент EmitSoundOnCollide с настройками коллекции BananiumHorn и variation: 0.246.


186-195: Настройка компонента MeleeWeapon (BananiumHorn)
Изменена конфигурация компонента MeleeWeapon: установлен wideAnimationRotation, добавлен блок soundHit с коллекцией BananiumHorn и значением variation: 0.246, а также указано, что компонент скрыт (hidden: true). Проверьте, что баланс урона и визуальное отображение соответствуют требованиям.

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

40-44: Добавление компонента Butcherable (MobLaserRaptor)
На строках 40–44 добавлен компонент Butcherable, который при разделке моба MobLaserRaptor выдаёт предмет FoodMeatChicken в количестве 2. Проверьте, что данное изменение согласовано с игровым балансом и механикой добычи.

Resources/Prototypes/Catalog/spellbook_catalog.yml (2)

200-212: Новая запись для SpellbookHammerMjollnir
Добавлена новая запись для SpellbookHammerMjollnir с указанными полями: имя, описание, привязка к сущности Mjollnir, стоимость 2 WizCoin и условие лимита запаса 1. Убедитесь, что идентификатор и все атрибуты соответствуют определениям сущностей.


213-225: Новая запись для SpellbookHammerSingularity
Добавлена запись для SpellbookHammerSingularity с привязкой к сущности SingularityHammer. Параметры (стоимость, категория, условие лимита) аналогичны предыдущей записи — проверьте корректность описания и соответствие игровым механикам.

Resources/Prototypes/Entities/Mobs/NPCs/argocyte.yml (12)

86-90: Добавление компонента Butcherable (MobArgocyteSlurva)
Для сущности MobArgocyteSlurva добавлен компонент Butcherable, который спавнит FoodMeatXeno в количестве 1. Нововведение соответствует общей тенденции по расширению механики добычи ресурсов.


120-124: Добавление компонента Butcherable (MobArgocyteBarrier)
Новый компонент Butcherable для MobArgocyteBarrier обеспечивает выдачу FoodMeatXeno (1 шт.). Проверьте балансировку этого изменения.


160-164: Добавление компонента Butcherable (MobArgocyteSkitter)
Для MobArgocyteSkitter добавлен компонент Butcherable, генерирующий FoodMeatXeno в количестве 1. Изменение выглядит логичным и согласованным с механикой мобов.


200-204: Добавление компонента Butcherable (MobArgocyteSwiper)
Новый компонент Butcherable для MobArgocyteSwiper обеспечивает спавн FoodMeatXeno (2 шт.). Проверьте, что такое количество соответствует задуманному игровому процессу.


226-230: Добавление компонента Butcherable (MobArgocyteMolder)
Для MobArgocyteMolder введён компонент Butcherable, выдающий FoodMeatXeno в количестве 2. Изменение выглядит корректно с точки зрения консистентности механик.


253-257: Добавление компонента Butcherable (MobArgocytePouncer)
Добавлен компонент Butcherable для MobArgocytePouncer, который спавнит FoodMeatXeno (2 шт.). Проверьте, что данная настройка соответствует балансу мобов.


282-286: Добавление компонента Butcherable (MobArgocyteGlider)
Новый компонент Butcherable для MobArgocyteGlider настроен на выдачу FoodMeatXeno — 2 единицы. Все настройки выглядят последовательными.


314-318: Добавление компонента Butcherable (MobArgocyteHarvester)
Для MobArgocyteHarvester добавлен компонент Butcherable, который создает FoodMeatXeno в количестве 2. Изменение интегрируется в общую механику добычи ресурсов.


345-349: Добавление компонента Butcherable (MobArgocyteCrawler)
В сущности MobArgocyteCrawler введен компонент Butcherable, выдающий FoodMeatXeno (2 шт.). Проверьте, что это не влияет негативно на баланс игры.


378-382: Добавление компонента Butcherable (MobArgocyteEnforcer)
Для MobArgocyteEnforcer добавлен компонент Butcherable, генерирующий FoodMeatXeno в количестве 3. Нововведение выглядит оправданным для этой категории мобов.


408-413: Добавление компонента Butcherable с типом разделки Spike (MobArgocyteFounder)
В сущности MobArgocyteFounder введён компонент Butcherable с дополнительным атрибутом butcheringType: Spike, который спавнит FoodMeatXeno (5 шт.). Проверьте, что тип разделки правильно обрабатывается в других системах.


454-459: Добавление компонента Butcherable с типом Spike (MobArgocyteLeviathing)
Для MobArgocyteLeviathing добавлен компонент Butcherable с типом Spike и выдачей FoodMeatXeno (10 шт.). Убедитесь, что данное количество соответствует сложности и размерам этого моба.

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

179-182: Обновление настроек для space kangaroo
Для сущности space kangaroo добавлен компонент Butcherable, который выдаёт FoodMeat в количестве 1. Кроме того, изменены языковые настройки:
currentLanguage обновлено с TauCetiBasic до Kangaroo;
– списки speaks и understands теперь содержат только Kangaroo.
Убедитесь, что эти изменения корректно отражают локализацию и функционал для данной сущности.

Also applies to: 184-189

Resources/Prototypes/Entities/Structures/Machines/lathe.yml (1)

195-212: Добавлена динамическая опция ScienceExplosives в dynamicPacks.
Новая запись "ScienceExplosives" корректно добавлена в список динамических паков между существующими научными наборами. Убедитесь, что этот идентификатор согласуется с остальными элементами системы и не приводит к конфликтам при обработке рецептов протолата.

Resources/Prototypes/Entities/Objects/Fun/toys.yml (10)

202-205: Добавлен компонент EmitSoundOnCollide для PlushieHampter.
Новый компонент EmitSoundOnCollide с указанием звукового файла /Audio/Items/Toys/mousesqueek.ogg добавлен в состав PlushieHampter для воспроизведения звука при столкновениях. Проверьте, соответствует ли выбранный звук общей стилистике звуковых эффектов для игрушек.


291-294: Добавлен EmitSoundOnCollide для PlushieArachind.
Новый компонент EmitSoundOnCollide, использующий файл /Audio/Voice/Arachnid/arachnid_laugh.ogg, добавлен для PlushieArachind. Убедитесь, что звук вызова смеха адекватен для данного типа игрушки и не конфликтует с другими эффектами.


326-329: Добавлен EmitSoundOnCollide для PlushieLizard.
В PlushieLizard теперь присутствует компонент EmitSoundOnCollide с путём /Audio/Items/Toys/weh.ogg. Проверьте, что этот звуковой эффект гармонично сочетается с уже используемыми в данном типе игрушек эффектами и правильно воспроизводится при столкновениях.


529-532: Добавлен EmitSoundOnCollide для PlushieDiona.
Новый компонент для столкновений, использующий файловый путь /Audio/Items/Toys/toy_rustle.ogg (убедитесь, что выбранный звук соответствует логике оформления), добавлен для PlushieDiona. Проверьте, что этот эффект не вызывает диссонанса с другими звуками данного объекта.


824-836: Обновление звуковых эффектов для ToyMouse.
Для ToyMouse добавлен компонент EmitSoundOnCollide с указанным путём /Audio/Items/Toys/mousesqueek.ogg. Это обновление согласует звуковые эффекты столкновения с ранее определёнными эффектами использования, активации и призыва звука.


869-882: Обновление звуковых эффектов для ToyRubberDuck.
Новые компоненты для событий «на приземление», «при активации» и «при столкновении» используют файл /Audio/Items/Toys/quack.ogg, что должно усилить характерный звук резиновой утки. Убедитесь, что звуковой файл передаёт нужное настроение и технически корректен.


910-913: Добавлен EmitSoundOnCollide для PlushieVox.
Новый компонент EmitSoundOnCollide с использованием /Audio/Voice/Vox/shriek1.ogg интегрирован в PlushieVox для воспроизведения звука при столкновениях. Проверьте корректность уровня громкости и согласованность с другими звуковыми эффектами данного объекта.


1025-1027: Добавлен EmitSoundOnCollide для PlushieMoth.
Новый компонент, отвечающий за звук столкновения, теперь использует файл /Audio/Voice/Moth/moth_chitter.ogg для PlushieMoth. Проверьте, что этот эффект настроен с правильными параметрами (громкость, длительность) и гармонирует с остальными звуковыми эффектами.


1581-1595: Обновление звуковых эффектов для ClownRecorder.
В блоке ClownRecorder добавлены или обновлены компоненты EmitSoundOnLand и EmitSoundOnCollide (а также соответствующие эффекты при триггере) с использованием коллекции ClownRecorder. Проверьте, что эти изменения обеспечивают ожидаемую комичную акустику и не конфликтуют со звуковой системой устройства.


1107-1121: Обновление звуковых эффектов для ToyIan.
Компоненты EmitSoundOnUse, EmitSoundOnLand, EmitSoundOnActivate и EmitSoundOnCollide для ToyIan теперь используют файл /Audio/Items/Toys/ian.ogg. Убедитесь, что эти звуковые эффекты последовательны между собой и соответствуют стилистике данного игрушечного объекта.

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

118-137: Новые компоненты для сущности «bee»
В этом блоке для сущности пчёлы добавлены:

  • Компонент Extractable с параметром grindableSolutionName: food для обработки сущности в пищевые ресурсы.
  • Компонент SolutionContainerManager с описанием реагента: для ключа food указан реагент GroundBee с Quantity: 1.
  • Модифицирован компонент Butcherable: теперь при разделке пчёлы не должен спауниться никакой предмет (поле id установлено в null).
  • В Bloodstream добавлено новое свойство bloodReagent со значением InsectBlood.

Убедитесь, что обработка значения null в Butcherable соответствует ожидаемой логике, а новое поле в Bloodstream корректно интегрируется с существующими механиками.


259-259: Исправление именования компонента голода для «chicken»
В этой строке название компонента изменено с ошибочного варианта на корректное — теперь используется ExaminableHunger. Это поможет обеспечить единообразие именования по всему коду.


1078-1078: Единообразие именования компонента голода для «goat»
Здесь также применяется обновлённое название ExaminableHunger для сущности козы. Проверьте, что во всех связанных механизмах используется именно этот параметр и отсутствуют ссылки на старое именование.


826-847: Новые компоненты для сущности «butterfly»
В блоке для бабочки добавлены следующие изменения:

  • Компонент Extractable с установленным grindableSolutionName: food.
  • Компонент SolutionContainerManager для ключа food, где в реагентах указан UncookedAnimalProteins с Quantity: 1.
  • Компонент Butcherable с параметром spawned заданным как id: null (т.е. при разделке ничего не спаунится).
  • Дополнительно добавлены компоненты Item (с размером Tiny), Tag (с тегом Trash), а также обновлён Bloodstream с указанием bloodReagent: InsectBlood и соответствующим объемом.
    Эти изменения усиливают возможность обработки и использования сущности в механиках получения ресурсов.

3764-3778: Добавление ReplacementAccent для «MobDionaNymphAccent»
Для сущностей, связанных с Diona Nymph Accent, добавлен компонент ReplacementAccent с параметром accent: nymph. Это позволит корректно применять особенности речи и акцента для данной группы нипов.


2668-2672: Новый компонент Butcherable для сущности «Clown Spider»
Для сущности «clown spider» введён компонент Butcherable, который при разделке спаунит материал MaterialBananium1 в количестве 1. Проверьте, что добыча этого материала соответствует балансу игры и не приводит к неожиданным эффектам.


2942-3050: Новая сущность «Corrupted Corgi»
Для сущности Corrupted Corgi добавлены изменения, включающие:

  • Отсутствие интерактивного успеха (successChance: 0), что позволяет использовать её как пасхалку;
  • Уникальные параметры повреждений, температурные пороги и особенности повреждения метафизической природой.
    Убедитесь, что эти параметры протестированы и не нарушают баланс игровых питомцев.

3243-3277: Обновлённая сущность «Space Cat»
Изменения включают улучшения для защиты от экстремальных температур и интеграцию дополнительных систем (например, компонент Respirator для работы в космическом вакууме). Проверьте, что все эти системы корректно работают вместе и не создают конфликтов с базовыми настройками питомцев.


3071-3097: Новая сущность «Corgi Puppy»
Добавлена новая сущность Corgi Puppy, наследующая параметры от базовой сущности corgi. Проверьте, что характеристики питомца и взаимодействия (например, аудиоэффекты, визуальные эффекты) соответствуют ожиданиям для маленького питомца.


3300-3332: Новая сущность «Kitten»
Сущность Kitten представлена с уменьшёнными параметрами урона и скоростью, что типично для маленьких питомцев. Убедитесь, что стоимость и баланс питомца отвечают игровым требованиям.


3333-3388: Новая сущность «Sloth»
Добавлена сущность Sloth с очень низкой скоростью передвижения, соответствующими параметрами физики и анимации, а также с высокой вероятностью успешного взаимодействия (petting-success). Проверьте, что такие характеристики не приводят к непредвиденным нарушениям в игровом процессе.


3389-3442: Новая сущность «Ferret»
Обновлённые параметры для сущности Ferret, включая аудиоэффекты, скорость анимации и прочие базовые характеристики, выглядят корректно. Рекомендуется дополнительно протестировать визуальное и звуковое представление этой сущности.


3443-3593: Новая сущность «Hamster»
Сущность Hamster оснащена разнообразными компонентами:

  • Интерфейс взаимодействия (GhostRole, Speech и т.п.),
  • Физическими параметрами (Fixtures, Inventory, MobState, Deathgasp),
  • Системой голода с компонентом Hunger и новым набором реагентов в SolutionContainerManager.

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


3594-3672: Новая сущность «Pig»
Сущность Pig добавлена с подробными параметрами:

  • Функции репродукции (Reproductive, ReproductivePartner),
  • Компонентом Butcherable с добычей Bacon (FoodMeatBacon),
  • Дополнительными настройками интерактивного взаимодействия.

Проверьте, что все показатели (например, successChance, анимации, звуковые эффекты) соответствуют балансу и логике игры.


3673-3762: Новая сущность «Diona Nymph»
Для сущности Diona Nymph внесены следующие изменения:

  • Добавлены компоненты, отвечающие за язык (LanguageSpeaker, LanguageKnowledge) и визуальное представление (Sprite, DamageStateVisuals);
  • Определён новый источник «крови» с использованием компонента Bloodstream (значение Sap);
  • Компоненты Butcherable, Inventory и специальные параметры (MobThresholds) также обновлены;
  • Введена новая механика реформирования через компонент Reform с соответствующим действием (DionaReformAction).

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


3780-3840: Новая сущность «Reindeer Buck»
Добавлена сущность Reindeer Buck с:

  • Подробными настройками физики (Fixtures, Density),
  • Обновлёнными визуальными состояниями (DamageStateVisuals),
  • Компонентом Butcherable и специфичными параметрами для взаимодействия (MeleeWeapon, NPCRetaliation).

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


3841-3872: Новая сущность «Reindeer Doe»
Эта сущность является вариантом Reindeer Buck с изменёнными характеристиками оружия (MeleeWeapon) и визуальными состояниями. Проверьте, что различия между Buck и Doe корректно отражены в балансе и эстетике игры.

Resources/Changelog/Changelog.yml (8)

3837-3844: Проверка возврата рецептов взрывчатых технологий
Изменение возвращает рецепты (триггеры, полезные нагрузки, сигнализатор) в протолат после их недокументированного удаления. Убедитесь, что данное исправление соответствует намерениям команды и задокументировано в технических спецификациях.


3845-3851: Скрытие спрайтов при надевании верхней одежды
Новая запись гарантирует, что при использовании верхней одежды, спрайты PDA и ремней будут скрываться, что повышает визуальную чистоту интерфейса. Это улучшение выглядит логичным и соответствует требованиям по эстетике.


3852-3859: Корректировка удаления ключей шифрования с интеркома
Теперь при удалении ключей из интеркома избыточные ключи сбрасываются у пользователя (падают у ног), что должно улучшить удобство использования. Проверьте, что подобное поведение согласуется с ожиданиями игроков и тестами пользовательского опыта.


3860-3866: Добавление новых бар-сайнов
Новые записи для бар-сайнов «Maltroach» и «Whiskey Echoes» аккуратно интегрированы и отражают вклад сообщества (основано на работах MoffNyan и cerebralerror). Убедитесь, что форматирование и стилистика соответствуют остальным записям в журнале изменений.


3868-3873: Изменение статуса ограничения для Flare Shells
Запись сообщает, что флайршеллы больше не классифицируются как запрещённый предмет. Это корректировка фикса, которая должна улучшить игровой баланс – проверьте, что данное изменение протестировано и не оказывает негативного влияния на игровой процесс.


3874-3880: Добавление аудиоэффектов для игрушек и bike horns
Изменение гарантирует, что все игрушки и сигнальные рожки теперь воспроизводят соответствующие звуки, что улучшает аудио-обратную связь и качество взаимодействия с объектами в игре.


3881-3892: Расширение возможностей обработки трупов и взаимодействия с мелкой живностью
Изменения позволяют расчленять трупы различных мобов (Argocytes, Mimics, Butterflies, Bees, Space Kangaroos, Laser Raptors, Watchers), а также перетаскивать бабочки в мусорные мешки и измельчать их вместе с пчёлами в реактивном градуснике. Рекомендуется тщательно протестировать влияние этих изменений на баланс игры и взаимодействие с другими системами.


3893-3899: Исправление дублирования окон хранения
Исправление устраняет проблему с дублированием окон хранения при переподключении, что значительно улучшает удобство работы с UI. Проведите дополнительные проверки, чтобы убедиться в отсутствии побочных эффектов.

Comment on lines +46 to +77
public bool TryRepulseAttract(MapCoordinates position, EntityUid? user, float speed, float range, EntityWhitelist? whitelist = null, CollisionGroup layer = CollisionGroup.SingularityLayer)
{
_entSet.Clear();
var epicenter = position.Position;
_lookup.GetEntitiesInRange(position.MapId, epicenter, range, _entSet, flags: LookupFlags.Dynamic | LookupFlags.Sundries);

foreach (var target in _entSet)
{
if (!_physicsQuery.TryGetComponent(target, out var physics)
|| (physics.CollisionLayer & (int)layer) != 0x0) // exclude layers like ghosts
continue;

if (_whitelist.IsWhitelistFail(whitelist, target))
continue;

var targetPos = _xForm.GetWorldPosition(target);

// vector from epicenter to target entity
var direction = targetPos - epicenter;

if (direction == Vector2.Zero)
continue;

// attract: throw all items directly to to the epicenter
// repulse: throw them up to the maximum range
var throwDirection = speed < 0 ? -direction : direction.Normalized() * (range - direction.Length());

_throw.TryThrow(target, throwDirection, Math.Abs(speed), user, recoil: false, compensateFriction: true);
}

return true;
}
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. Производительность:

    • HashSet _entSet создается для каждого вызова, что может вызвать проблемы с GC
    • Возможно избыточное получение компонентов в цикле
  2. Безопасность:

    • Отсутствует проверка на null для MapId
    • Нет защиты от экстремальных значений speed и range

Предлагаемые улучшения:

 public bool TryRepulseAttract(MapCoordinates position, EntityUid? user, float speed, float range, EntityWhitelist? whitelist = null, CollisionGroup layer = CollisionGroup.SingularityLayer)
 {
+    if (!position.MapId.IsValid())
+        return false;
+
+    if (range <= 0 || float.IsNaN(range) || float.IsInfinity(range))
+        return false;
+
+    if (float.IsNaN(speed) || float.IsInfinity(speed))
+        return false;
+
     _entSet.Clear();
     var epicenter = position.Position;
     _lookup.GetEntitiesInRange(position.MapId, epicenter, range, _entSet, flags: LookupFlags.Dynamic | LookupFlags.Sundries);

Рекомендации по архитектуре:

  1. Рассмотрите возможность использования объектного пула для HashSet<EntityUid>
  2. Добавьте конфигурационные параметры для ограничения максимальных значений speed и range
📝 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 bool TryRepulseAttract(MapCoordinates position, EntityUid? user, float speed, float range, EntityWhitelist? whitelist = null, CollisionGroup layer = CollisionGroup.SingularityLayer)
{
_entSet.Clear();
var epicenter = position.Position;
_lookup.GetEntitiesInRange(position.MapId, epicenter, range, _entSet, flags: LookupFlags.Dynamic | LookupFlags.Sundries);
foreach (var target in _entSet)
{
if (!_physicsQuery.TryGetComponent(target, out var physics)
|| (physics.CollisionLayer & (int)layer) != 0x0) // exclude layers like ghosts
continue;
if (_whitelist.IsWhitelistFail(whitelist, target))
continue;
var targetPos = _xForm.GetWorldPosition(target);
// vector from epicenter to target entity
var direction = targetPos - epicenter;
if (direction == Vector2.Zero)
continue;
// attract: throw all items directly to to the epicenter
// repulse: throw them up to the maximum range
var throwDirection = speed < 0 ? -direction : direction.Normalized() * (range - direction.Length());
_throw.TryThrow(target, throwDirection, Math.Abs(speed), user, recoil: false, compensateFriction: true);
}
return true;
}
public bool TryRepulseAttract(MapCoordinates position, EntityUid? user, float speed, float range, EntityWhitelist? whitelist = null, CollisionGroup layer = CollisionGroup.SingularityLayer)
{
if (!position.MapId.IsValid())
return false;
if (range <= 0 || float.IsNaN(range) || float.IsInfinity(range))
return false;
if (float.IsNaN(speed) || float.IsInfinity(speed))
return false;
_entSet.Clear();
var epicenter = position.Position;
_lookup.GetEntitiesInRange(position.MapId, epicenter, range, _entSet, flags: LookupFlags.Dynamic | LookupFlags.Sundries);
foreach (var target in _entSet)
{
if (!_physicsQuery.TryGetComponent(target, out var physics)
|| (physics.CollisionLayer & (int)layer) != 0x0) // exclude layers like ghosts
continue;
if (_whitelist.IsWhitelistFail(whitelist, target))
continue;
var targetPos = _xForm.GetWorldPosition(target);
// vector from epicenter to target entity
var direction = targetPos - epicenter;
if (direction == Vector2.Zero)
continue;
// attract: throw all items directly to to the epicenter
// repulse: throw them up to the maximum range
var throwDirection = speed < 0 ? -direction : direction.Normalized() * (range - direction.Length());
_throw.TryThrow(target, throwDirection, Math.Abs(speed), user, recoil: false, compensateFriction: true);
}
return true;
}

Comment on lines +11 to +12
[DataField, AutoNetworkedField]
public AltFireAttackType AttackType = AltFireAttackType.Light;
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Рассмотрите добавление валидации для AttackType.

Поле AttackType может принимать любую комбинацию флагов, что может привести к неожиданному поведению.


🏁 Script executed:

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

rg "AltFireAttackType" -A 5

Length of output: 2203


Проверка валидации поля AttackType

  • В файле Content.Shared/Weapons/Melee/Components/AltFireMeleeComponent.cs поле AttackType инициализировано значением AltFireAttackType.Light.
  • Благодаря атрибуту [Flags] перечисление AltFireAttackType позволяет комбинировать флаги, однако обработка в Content.Client/Weapons/Melee/MeleeWeaponSystem.cs выполняется через конструкцию switch-case, ожидающую одиночное значение (Light, Heavy или Disarm).
  • При наличии комбинации флагов поведение может оказаться неожиданным. Рекомендуется добавить валидацию, которая гарантирует, что значение AttackType соответствует одному из допустимых вариантов или же реализовать корректную обработку комбинаций.

Comment on lines +19 to 20
[DataField, AutoNetworkedField]
public float Speed = 10f;
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Рекомендуется добавить валидацию значения Speed.

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


🏁 Script executed:

#!/bin/bash
# Поиск использования Speed для проверки наличия валидации

rg "Speed\s*=" -A 5

Length of output: 56313


Обрати внимание на валидацию значения поля Speed в компоненте MeleeThrowOnHitComponent.

В текущей реализации (строки 19–20 файла Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs) поле инициализируется значением 10f без какой-либо проверки. При этом поиск по коду не выявил наличия логики, гарантирующей, что значение Speed не может быть отрицательным или слишком высоким.

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

  • Добавить проверку при установке значения Speed (например, в сеттере или во время инициализации компонента). Это позволит гарантировать, что значение всегда находится в допустимом диапазоне, например, от 0 до максимально допустимого порога.
  • Рассмотреть возможность логирования или обработки некорректных значений для упрощения отладки.

@Rxup Rxup merged commit 6b6643e into master Feb 21, 2025
18 checks passed
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: Untriaged size/M
Projects
None yet
Development

Successfully merging this pull request may close these issues.