> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ss14.art/llms.txt
> Use this file to discover all available pages before exploring further.

# Инструменты отладки

## Быстрые клавиши

`~ (Тильда)` — переключить отладочную консоль, из которой выполняются многие команды. Используйте `list` для просмотра списка команд. Используйте `help someCommand` для получения информации о команде. Команда `list` также может принимать фильтр, например: `list show`.
`F3` — переключить отладочный оверлей. Содержит много полезной информации о сети, рендеринге и других состояниях игры. Наведите мышь на сущности и области, чтобы увидеть такие вещи, как ID сущности, ID сетки, координаты и другое.
`F5` — переключить окно спавна сущностей
`F6` — переключить окно спавна тайлов
`B` — переключить окно песочницы
`Shift + F4` — переключить UI

## View Variables

**View Variables** или VV — это инструмент для просмотра и изменения переменных объектов. Вы можете VV объект с помощью команды `vv` или через контекстное меню правой кнопки мыши.
Вы также можете использовать команды `vvread`, `vvwrite` и `vvinvoke` для использования VV напрямую из консоли.

Параметры, которые принимают команды `vv`:

`vv /path/to/an/object` откроет VV для введённого пути. Проверьте автодополнение команд для всех возможностей.
`vv <IoC Interface>`, например `vv IPlayerManager`, откроет VV для клиентского IoC.
`vv S<IoC Interface>`, например `vv SIPlayerManager`, откроет VV для серверного IoC.
`vv CE<Entity System>`, например `vv CEPhysicsSystem`, откроет VV для клиентской entity system.
`vv SE<Entity System>`, например `vv CSPhysicsSystem`, откроет VV для серверной entity system.
`vv <EntityUid>` откроет VV для сущности. И клиент, и сервер одновременно.
`vv guihover` откроет VV для текущего GUI-контрола под мышью.

## Окно разработчика

`devwindow` открывает дополнительное окно, содержащее растущее количество полезных инструментов отладки и разработки:

* Вторичная отладочная консоль
* Дерево UI

## Запуск тестов

### Server GC

Я рекомендую включить [**server GC**](https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/workstation-server-gc) для запуска тестов SS14, *особенно* интеграционных тестов (это сокращает время интеграционных тестов *вдвое*).

Для включения в различных редакторах:

#### Rider

Unit Testing -> Test Runner и добавьте переменную окружения `COMPlus_gcServer=1`

<img src="https://mintcdn.com/meowmew/TvZPuS8U3lxB2Npc/images/debug-gcserver.png?fit=max&auto=format&n=TvZPuS8U3lxB2Npc&q=85&s=d1ba8ed8527997b3bafebfca7f21ad3f" alt="" width="1552" height="1063" data-path="images/debug-gcserver.png" />

#### `dotnet test`

Передайте `-e COMPlus_gcServer=1` команде `dotnet test`

#### Visual Studio

Кто-нибудь, кто использует VS, пожалуйста, заполните это

## Скриптинг

Скриптинг позволяет запускать C# Interactive REPL внутри игры! Вы можете запускать скрипты как на сервере, так и на клиенте. Обратите внимание, что скриптинг отключён для релизных сборок клиента из-за соображений размера и безопасности, и вам, очевидно, нужны права уровня host, чтобы делать это на сервере.

Для открытия скриптинга есть две команды: `csi` и `scsi`. Первая — на клиенте, вторая — на сервере. Также есть `watch`, который показывает вывод списка команд каждый кадр (как окно watch в отладчике).

См. [эту ссылку](https://github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough) для введения (я полагаю).

Глобальные переменные по умолчанию, которые вы можете использовать, определены в `IScriptGlobals` как на клиенте, так и на сервере. Полезные: `vv` на клиенте, `res<T>()` для быстрого разрешения IoC и т.д.

## Тестирование лобби

По умолчанию сервер запускается в режиме «без лобби». Это означает, что лобби отключено, и вы отправляетесь сразу в игру при подключении к серверу. Это удобно для тестирования, конечно, но если вы хотите *тестировать* лобби, вы можете представить, почему это раздражает.

Чтобы включить лобби, нужно установить переменную конфигурации `game.lobbyenabled` в true. Есть несколько способов сделать это:

1. Отредактируйте конфигурационный файл сервера в папке bin сервера и добавьте `lobbyenabled=true` в секцию `[game]`.
2. Передайте `--cvar game.lobbyenabled=true` в команду, которую вы используете для запуска игры.
3. Измените переменную во время игры, выполнив `cvar game.lobbyenabled true` в консоли сервера. Вам придётся возродить персонажа, чтобы попасть в лобби, если вы подключились до этого.

Если вы используете Rider, я рекомендую создать отдельную конфигурацию запуска (см. ниже) с `--cvar game.lobbyenabled=true`.

Для быстрой проверки лобби с более лёгкой настройкой `golobby` завершит раунд, включит лобби и отправит вас в предыгровое лобби. Вы можете пропустить таймер следующего раунда с помощью `forcepreset sandbox` (или любого другого режима игры).

## Продвинутое использование консоли

* `sudo` позволяет выполнять команды *как консоль сервера* с вашего клиента. Большинство админ-команд (например, `ban`) автоматически отправляются на сервер, если у вас есть разрешение на их использование, но некоторые команды управления сервером, такие как `cvar`, могут быть выполнены только из консоли сервера *обычно*. Вот где вы используете `sudo`. Конечно, для этого требуется `+HOST`.
* `exec <file>` позволяет выполнять файлы скриптов в директории пользовательских данных (`%appdata%/space station 14/data` для клиента или аналогично для других ОС, папка `data` рядом с исполняемым файлом для сервера). Вы можете создать скрипт `lobby`, который автоматически перезапускает раунд в лобби, а затем запустить его `exec lobby`:

```
sudo cvar game.lobbyenabled 1
restartroundnow
```

## Разные полезные консольные команды

Это несколько полезных консольных команд и их описание. Это ни в коем случае не полный список. Чтобы увидеть все консольные команды, используйте `list`.

* `guidump` — выгружает полный дамп дерева GUI в текстовый файл в `%APPDATA%/Space Station 14/guidump.txt` (Windows), `~/Library/Application Support/Space Station 14/guidump.txt` (macOS) или `~/.local/share/Space Station 14/guidump.txt` (Linux).
* `showrays` — переключает отладочную отрисовку физических лучей. Принимает параметр времени жизни лучей.
* `showbb` — визуализирует ограничивающие рамки и сетки. Сетки отображаются синими объёмами, их границы — красными линиями. Ограничивающие рамки отображаются красными линиями.
* `physics shapes` — показывает точные коллизионные оболочки объектов. Очень полезно, если вы пытаетесь настроить структуру с необычной формой.
* `dumpentities` — выгружает список сущностей с UID и prototypes.
* `debugai` — используется для подсказок над головами мобов (в настоящее время охватывает как мышление, так и поиск пути для конкретного моба).
* `pathfinder` — охватывает общий поиск пути, который в настоящее время представляет собой граф, маршруты, узлы (особенно полезно для JPS).
* `togglelight` — переключает рендеринг света. Полезно для маппинга.
* `net_graph` — включить с помощью `net_graph 1`, выключить с помощью `net_graph 0`. Показывает график использования сети.
* `tp` — телепортирует игрока в любое место. Использование: `tp <x> <y> [<MapId>]`.
* `aghost` — переключает режим призрака администратора для быстрого исследования карты.
* `restartroundnow` — если вы не работаете над экраном после игры, обычно это то, что нужно для завершения раунда. Перезапускает раунд без минутного ожидания.
* `restartround` — перезапускает раунд как обычно, отправляя игроков обратно в предраундовое лобби.
* `restart` — полностью перезапускает сервер.
* `launchauth` — загружает токены аутентификации из настроек лаунчера при запуске с клиента. Вы можете запустить это перед подключением к серверу, чтобы легко включить и протестировать аутентификацию из dev-сборок.
* `deadmin` — если вы работаете над чем-то, что ведёт себя по-разному для админов и не-админов, например чат, убедитесь, что вы вручную деадминитесь, чтобы проверить, что всё работает и для обычных игроков.

## Используйте конфигурации запуска

Если вы используете Rider, используйте **run configurations** для быстрого переключения между сценариями тестирования. Это необходимо, если вам нужно чередовать различные сценарии, такие как разные бэкенды баз данных, но проявите креативность. Например, вот какие конфигурации запуска у меня есть на момент написания:

<img src="https://mintcdn.com/meowmew/TvZPuS8U3lxB2Npc/images/debug-run-configs.png?fit=max&auto=format&n=TvZPuS8U3lxB2Npc&q=85&s=493d1af265c08cda78d27fcf523e3572" alt="many-run-configurations.png" width="264" height="566" data-path="images/debug-run-configs.png" />

Вы можете использовать `--cvar` или `+command` для изменения конфигурации сервера и автоматического выполнения команд для настройки тестовых сред. Поищите другие идеи на этой странице, если хотите.

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

По умолчанию Rider отключает оптимизации для *всех* сборок при запуске через отладчик. Это означает, что даже BCL-код (`System`) будет работать намного медленнее. Это может сделать работу в отладчике довольно болезненной.

Вы можете отключить это, сняв флажок в Settings -> Build, Execution & Deployment -> Debugger:

<img src="https://mintcdn.com/meowmew/TvZPuS8U3lxB2Npc/images/debug-rider-opts.png?fit=max&auto=format&n=TvZPuS8U3lxB2Npc&q=85&s=a4c57f3724ac13abedd331c0a3554031" alt="rider_debugger_opts.png" width="312" height="63" data-path="images/debug-rider-opts.png" />

## Внешние инструменты

* [renderdoc](https://renderdoc.org/) — идеально подходит для отладки движка рендеринга и шейдеров.
