Skip to content

add SetLobbyMusic command#19

Open
ESphagnum wants to merge 6 commits intoss14-art:masterfrom
ESphagnum:set-lobby-music
Open

add SetLobbyMusic command#19
ESphagnum wants to merge 6 commits intoss14-art:masterfrom
ESphagnum:set-lobby-music

Conversation

@ESphagnum
Copy link
Contributor

@ESphagnum ESphagnum commented Mar 22, 2026

Краткое описание

setlobbymusic

Почему мы должны добавить это?

Для ивентёров и сезонных событий

Медиа (Видео/Скриншоты)

Проверочный пункт

  • [y] Перед публикацией/запросом на проверку PR, я убедился что изменения работают.
  • [n] Я добавил скриншоты/видео изменений, если только этот PR не изменит внутриигровую механику.
  • [y] Я подтверждаю, что мои изменения лицензированы в соответствии с лицензией Open Space Лицензия и предоставляю разрешение на их использование в этом репозитории в соответствии с его условиями.

Changelog

Summary by CodeRabbit

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

    • Административная команда для установки музыки в лобби с проверками, сообщениями и ограничением одного использования за раунд.
    • Добавлена коллекция звуков EventMusicForLobby (шесть треков) для лобби.
    • Лобби-музыка теперь реагирует на изменения конфигурации в реальном времени и прекращается вне состояния лобби.
    • Переименование консольной команды карты: forcemap → setgamemap.
  • Документация / Локализация

    • Добавлены строки локализации (en-US и ru-RU) для новой команды.
    • Добавлен файл атрибуций для новых аудиофайлов.

@ESphagnum
Copy link
Contributor Author

  • Для теста был добавлен плейлист из 6 треков. Он был одобрен ГРом. К нему следует attributions.yml с копирайтами для треков. По идее проблем с лицензией быть не должно.

Чтобы включить этот плейлист надо прописать: "setlobbymusic EventMusicForLobby"

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 22, 2026

📝 Walkthrough

Walkthrough

Добавлена серверная консольная команда для смены коллекции музыки лобби с ограничением «раз за раунд» и валидацией; клиентская аудиосистема подписывается на CVar изменения коллекции и прекращает лобби‑музыку при выходе из состояния лобби; добавлены локализации, прототип коллекции и файл атрибуций аудио.

Changes

Cohort / File(s) Summary
Клиентская аудиосистема
Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs
Добавлена подписка на CCVars.LobbyMusicCollection и обработчик LobbyMusicCollectionChanged() — при отсутствии LobbyState вызывается EndLobbyMusic().
Серверная команда администратора
Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs
Добавлен SetLobbyMusicCommand (setlobbymusic) с валидацией наличия SoundCollectionPrototype, проверкой на совпадение с текущим значением и ограничением использования один раз за раунд (сброс по RoundRestartCleanupEvent).
Локализация
Resources/Locale/en-US/_OpenSpace/commands/set-lobby-music-command.ftl, Resources/Locale/ru-RU/_OpenSpace/commands/set-lobby-music-command.ftl
Добавлены ключи описания, помощи и сообщений об ошибках/успехе для команды setlobbymusic.
Атрибуции аудио и прототипы коллекций
Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/attributions.yml, Resources/Prototypes/SoundCollections/lobby.yml
Добавлен файл атрибуций для нескольких .ogg и новая soundCollection EventMusicForLobby, ссылающаяся на эти треки.
Переименование команды
Content.Server/GameTicking/Commands/ForceMapCommand.cs
Консольный идентификатор команды изменён с forcemap на setgamemap (поведение без изменений).

Sequence Diagram(s)

sequenceDiagram
    participant Admin as Администратор
    participant Console as Консоль
    participant Command as SetLobbyMusicCommand
    participant CVar as CCVars
    participant Client as Клиент
    participant Audio as AudioSystem

    Admin->>Console: setlobbymusic <collection>
    Console->>Command: Execute(argStr, args)
    Command->>Command: Проверка: уже использовано в раунде?
    alt Уже использовано
        Command-->>Console: Вывести "уже использовано"
    else Не использовано
        Command->>Command: Валидировать аргументы и найти прототип
        alt Прототип не найден / неверный аргумент
            Command-->>Console: Ошибка "коллекция не найдена" / "неверные аргументы"
        else Прототип найден
            Command->>CVar: Установить CCVars.LobbyMusicCollection
            CVar->>Client: Уведомление об изменении CVar
            Client->>Audio: LobbyMusicCollectionChanged()
            Audio->>Audio: Если не в LobbyState -> EndLobbyMusic() иначе (планируется) обновить музыку
            Command-->>Console: Сообщение об успехе
        end
    end
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐰 Я — кролик, новый трек принёс,
В лобби музыка взмолилась всерьёз.
Раз в раунд — смена, проверка и свет,
Локали, атрибуции — тихий букет.
Хоп! — и звучит обновлённый ответ.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Заголовок полностью соответствует основному изменению в PR: добавлена новая команда SetLobbyMusic для управления музыкой лобби.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

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

🧹 Nitpick comments (1)
Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs (1)

24-24: Статическое поле _alreadyUsed может быть заменено на экземплярное.

EntitySystem в этом движке — синглтон, поэтому static работает, но семантически правильнее использовать обычное поле экземпляра (private bool _alreadyUsed;). Это также упростит тестирование и соответствует паттерну других команд.

Предлагаемое изменение
-    private static bool _alreadyUsed;
+    private bool _alreadyUsed;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs` at line
24, Поле _alreadyUsed объявлено static; нужно заменить его на экземплярное поле
в классе SetLobbyMusic (private bool _alreadyUsed;) и обновить все места,
которые к нему обращаются, чтобы использовать экземпляр команды вместо
статического доступа; проверьте методы/свойства в классе SetLobbyMusic и любые
вызовы типа SetLobbyMusic._alreadyUsed и измените их на this._alreadyUsed или
просто _alreadyUsed, удалите/обновите статические зависимости, и убедитесь, что
семантика сброса/инициализации сохраняется при создании нового экземпляра
(например, при необходимости инициализируйте в конструкторе или методе и
очистите при завершении).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs`:
- Around line 129-141: The if in LobbyMusicCollectionChanged is missing braces
so only EndLobbyMusic() is conditional while return always runs; wrap the two
statements (EndLobbyMusic() and return;) in braces so the return executes only
when _state.CurrentState is not LobbyState, and ensure the subsequent commented
block (the StartLobbyMusic() code) remains reachable when the condition is
false.

In `@Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/attributions.yml`:
- Around line 1-34: В attributions.yml для каждой записи (например запись с
files: ["1.-Credits-Song-for-My-Death.ogg"], "2.-Space-Cruise-_Title_.ogg" и
т.д.) замените значение поля license на корректный SPDX-идентификатор (например
CC-BY-NC-SA-4.0 или CC-BY-NC-SA-3.0) вместо "CC BY-NC-SA"; примените правку ко
всем секциям (включая записи для "3.-Deus-Ex_-UNATCO.ogg", "4.-Beacon-Beach.ogg"
и т.д.) и дополнительно проверьте совместимость лицензий с политикой репозитория
(если NC запрещён, пометить или исключить трек).

In `@Resources/Prototypes/SoundCollections/lobby.yml`:
- Around line 20-28: В коллекции soundCollection с id EventMusicForLobby в
lobby.yml файлы не соответствуют записям в attributions.yml: атрибуции ссылаются
на 6.-Resurrections.ogg и 7.-Neon-Requiem.ogg, тогда как в files указан
6.-Neon-Requiem.ogg и отсутствует файл №7; исправьте это либо добавив в files
недостающий файл 6.-Resurrections.ogg (и при необходимости 7.-Neon-Requiem.ogg)
в список under id EventMusicForLobby, либо отредактируйте attributions.yml,
чтобы имена и номера треков точно совпадали с фактическими файлами в files.

---

Nitpick comments:
In `@Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs`:
- Line 24: Поле _alreadyUsed объявлено static; нужно заменить его на
экземплярное поле в классе SetLobbyMusic (private bool _alreadyUsed;) и обновить
все места, которые к нему обращаются, чтобы использовать экземпляр команды
вместо статического доступа; проверьте методы/свойства в классе SetLobbyMusic и
любые вызовы типа SetLobbyMusic._alreadyUsed и измените их на this._alreadyUsed
или просто _alreadyUsed, удалите/обновите статические зависимости, и убедитесь,
что семантика сброса/инициализации сохраняется при создании нового экземпляра
(например, при необходимости инициализируйте в конструкторе или методе и
очистите при завершении).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 3f53a790-bd5d-4fad-97c0-862f46b77eb0

📥 Commits

Reviewing files that changed from the base of the PR and between 576d808 and 93928aa.

⛔ Files ignored due to path filters (6)
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/1.-Credits-Song-for-My-Death.ogg is excluded by !**/*.ogg
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/2.-Space-Cruise-_Title_.ogg is excluded by !**/*.ogg
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/3.-Deus-Ex_-UNATCO.ogg is excluded by !**/*.ogg
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/4.-Beacon-Beach.ogg is excluded by !**/*.ogg
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/5.-All-Seeying-Eyes.ogg is excluded by !**/*.ogg
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/6.-Neon-Requiem.ogg is excluded by !**/*.ogg
📒 Files selected for processing (6)
  • Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs
  • Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs
  • Resources/Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/attributions.yml
  • Resources/Locale/en-US/_OpenSpace/commands/set-lobby-music-command.ftl
  • Resources/Locale/ru-RU/_OpenSpace/commands/set-lobby-music-command.ftl
  • Resources/Prototypes/SoundCollections/lobby.yml

Comment on lines +20 to +28
- type: soundCollection
id: EventMusicForLobby
files:
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/1.-Credits-Song-for-My-Death.ogg
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/2.-Space-Cruise-_Title_.ogg
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/3.-Deus-Ex_-UNATCO.ogg
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/4.-Beacon-Beach.ogg
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/5.-All-Seeying-Eyes.ogg
- /Audio/_OpenSpace/TEMP_FOR_EVENTS/ESphagnum/Lobby/6.-Neon-Requiem.ogg
Copy link
Contributor

@coderabbitai coderabbitai bot Mar 22, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Несоответствие между файлами коллекции и атрибуций.

В attributions.yml указаны файлы 6.-Resurrections.ogg и 7.-Neon-Requiem.ogg, но в этой коллекции файл №6 — это 6.-Neon-Requiem.ogg, а файл №7 отсутствует вовсе.

Необходимо синхронизировать:

  • Либо добавить недостающий файл 6.-Resurrections.ogg в коллекцию
  • Либо исправить атрибуции, чтобы они соответствовали фактическим файлам
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Resources/Prototypes/SoundCollections/lobby.yml` around lines 20 - 28, В
коллекции soundCollection с id EventMusicForLobby в lobby.yml файлы не
соответствуют записям в attributions.yml: атрибуции ссылаются на
6.-Resurrections.ogg и 7.-Neon-Requiem.ogg, тогда как в files указан
6.-Neon-Requiem.ogg и отсутствует файл №7; исправьте это либо добавив в files
недостающий файл 6.-Resurrections.ogg (и при необходимости 7.-Neon-Requiem.ogg)
в список under id EventMusicForLobby, либо отредактируйте attributions.yml,
чтобы имена и номера треков точно совпадали с фактическими файлами в files.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Ошибки нет

Copy link
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
fd "attributions.yml" --exec cat {}

Length of output: 138806


@ESphagnum, вы правы — мой предыдущий комментарий был ошибочным. Проверив реальное содержимое attributions.yml, я вижу, что все 6 файлов в нём точно соответствуют файлам в коллекции EventMusicForLobby:

lobby.yml attributions.yml
1.-Credits-Song-for-My-Death.ogg
2.-Space-Cruise-_Title_.ogg
3.-Deus-Ex_-UNATCO.ogg
4.-Beacon-Beach.ogg
5.-All-Seeying-Eyes.ogg
6.-Neon-Requiem.ogg

Несоответствия нет. Приношу извинения за ложноположительный комментарий.

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

♻️ Duplicate comments (1)
Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs (1)

130-140: ⚠️ Potential issue | 🟠 Major

Смена коллекции в лобби сейчас фактически не применяется.

На Line 136-139 логика перезапуска закомментирована, поэтому при LobbyState метод становится no-op. С учетом Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs (Line 64-68), где команда делает только _cfg.SetCVar(...), изменение коллекции не приводит к немедленному обновлению лобби-музыки на клиенте.

Предлагаемое исправление
 private void LobbyMusicCollectionChanged()
 {
-    if (_state.CurrentState is not LobbyState) {
+    if (_state.CurrentState is not LobbyState)
+    {
         EndLobbyMusic();
         return;
     }
-    // if (_configManager.GetCVar(CCVars.LobbyMusicEnabled))
-    // {
-    //     StartLobbyMusic();
-    // }
+
+    if (_configManager.GetCVar(CCVars.LobbyMusicEnabled))
+    {
+        EndLobbyMusic();
+        StartLobbyMusic();
+    }
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs` around lines 130 -
140, Смена коллекции сейчас игнорируется потому что внутри
LobbyMusicCollectionChanged() закомментирован вызов перезапуска; нужно
восстановить логику: в методе LobbyMusicCollectionChanged() проверить флаг
_configManager.GetCVar(CCVars.LobbyMusicEnabled) и при true вызвать
StartLobbyMusic(), иначе вызвать EndLobbyMusic(); оставьте предварительную
проверку состояния (_state.CurrentState is not LobbyState) как есть, чтобы
перезапуск происходил только в LobbyState — используйте существующие методы
StartLobbyMusic и EndLobbyMusic для применения изменения сразу после SetCVar.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Server/GameTicking/Commands/ForceMapCommand.cs`:
- Line 20: Проблема: свойство Command в классе ForceMapCommand было
переименовано на "setgamemap", что ломает существующие вызовы и тесты; исправьте
это, вернув обратно идентификатор "forcemap" в ForceMapCommand.Command либо
синхронно обновите все зависимые места — тесты (класс ForceMapTest в
интеграционных тестах) и строку помощи (ресурс commands/force-map-command.ftl) —
чтобы использовать новое имя "setgamemap"; для минимального безразрывного
исправления просто изменить public override string Command => "forcemap" в
ForceMapCommand, либо если выбираете миграцию, обновите ForceMapTest и
соответствующий FTL help-файл в том же PR.

---

Duplicate comments:
In `@Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs`:
- Around line 130-140: Смена коллекции сейчас игнорируется потому что внутри
LobbyMusicCollectionChanged() закомментирован вызов перезапуска; нужно
восстановить логику: в методе LobbyMusicCollectionChanged() проверить флаг
_configManager.GetCVar(CCVars.LobbyMusicEnabled) и при true вызвать
StartLobbyMusic(), иначе вызвать EndLobbyMusic(); оставьте предварительную
проверку состояния (_state.CurrentState is not LobbyState) как есть, чтобы
перезапуск происходил только в LobbyState — используйте существующие методы
StartLobbyMusic и EndLobbyMusic для применения изменения сразу после SetCVar.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: cb7e9b3d-a5b1-420a-9650-85cd3834fa4f

📥 Commits

Reviewing files that changed from the base of the PR and between 478ce68 and 5eca655.

📒 Files selected for processing (2)
  • Content.Client/Audio/ContentAudioSystem.LobbyMusic.cs
  • Content.Server/GameTicking/Commands/ForceMapCommand.cs

[Dependency] private readonly IPrototypeManager _prototypeManager = default!;

public override string Command => "forcemap";
public override string Command => "setgamemap"; // OpenSpace-Edit
Copy link
Contributor

@coderabbitai coderabbitai bot Mar 23, 2026

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Переименование команды сделано неатомарно и ломает существующие вызовы.

На Line 20 идентификатор сменён на setgamemap, но связанные потребители не обновлены: интеграционный тест Content.IntegrationTests/Tests/Commands/ForceMapTest.cs (Line 62/67/72/77) и help-текст Resources/Locale/en-US/commands/force-map-command.ftl (Line 2) всё ещё используют forcemap. Это создаёт регрессию CLI и падение тестов. Либо верните forcemap, либо в этом же PR синхронно обновите тесты/локаль и явно оформите миграцию.

Вариант минимального исправления (без breaking change)
-        public override string Command => "setgamemap"; // OpenSpace-Edit
+        public override string Command => "forcemap";
📝 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 override string Command => "setgamemap"; // OpenSpace-Edit
public override string Command => "forcemap";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/GameTicking/Commands/ForceMapCommand.cs` at line 20, Проблема:
свойство Command в классе ForceMapCommand было переименовано на "setgamemap",
что ломает существующие вызовы и тесты; исправьте это, вернув обратно
идентификатор "forcemap" в ForceMapCommand.Command либо синхронно обновите все
зависимые места — тесты (класс ForceMapTest в интеграционных тестах) и строку
помощи (ресурс commands/force-map-command.ftl) — чтобы использовать новое имя
"setgamemap"; для минимального безразрывного исправления просто изменить public
override string Command => "forcemap" в ForceMapCommand, либо если выбираете
миграцию, обновите ForceMapTest и соответствующий FTL help-файл в том же PR.

Copy link
Member

Choose a reason for hiding this comment

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

@ESphagnum сделай как кролик просит, обнови в тестах и локале

Copy link
Contributor

Choose a reason for hiding this comment

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

Seems like the humans are having a chat. I'll hop back into my burrow for now. If you need me again, just tag @coderabbitai in a new comment, and I'll come hopping out!

Copy link
Member

@ReWAFFlution ReWAFFlution left a comment

Choose a reason for hiding this comment

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

Ещё пройдись по советам кролика. В целом это то что я нашёл. Это всё не критично, но не желательно. Код должен быть чистым, иначе могут быть конфликты, а нам это не нужно совсем.

Вот кстати линтер починить надо бы
5
Error: /home/runner/work/open-space/open-space/Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs(21,19): error CS0108: 'SetLobbyMusicCommand.Description' hides inherited member 'EntitySystem.Description(EntityUid, MetaDataComponent?)'. Use the new keyword if hiding was intended. [/home/runner/work/open-space/open-space/Content.Server/Content.Server.csproj]
Error: /home/runner/work/open-space/open-space/Content.Server/_OpenSpace/Administration/Commands/SetLobbyMusic.cs(53,30): error CS0246: The type or namespace name 'SoundCollectionPrototype' could not be found (are you missing a using directive or an assembly reference?) [/home/runner/work/open-space/open-space/Content.Server/Content.Server.csproj]

using Robust.Shared.Utility;


namespace Content.Client.Audio;
Copy link
Member

Choose a reason for hiding this comment

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

Удали отступ!!!!!!!!

Comment on lines +136 to +139
// if (_configManager.GetCVar(CCVars.LobbyMusicEnabled))
// {
// StartLobbyMusic();
// }
Copy link
Member

Choose a reason for hiding this comment

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

Если в комменте, то зачем оставлять? Или ты в будущем хочешь переработать метод?

[Dependency] private readonly IPrototypeManager _prototypeManager = default!;

public override string Command => "forcemap";
public override string Command => "setgamemap"; // OpenSpace-Edit
Copy link
Member

Choose a reason for hiding this comment

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

Лучше откати. В будущем возможны конфликты если оффы будут куда-то впихивать forcemap, в те же тесты например.

@ReWAFFlution ReWAFFlution self-assigned this Mar 26, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants