Англоязычный гайд по маппингу: https://docs.spacestation14.io/en/content/mapping
Англоязычный гайд по сборке проекта: https://docs.spacestation14.io/en/getting-started/dev-setup
---
Маппинг происходит на сервере, поэтому для маппинга необходимо поднять свой локальный сервер. Для этого будет необходимо сначала скачать актуальную версию кода проекта из репозитория используя Git, а затем собрать её.
## Сборка и поднятие локального сервера
### Для сборки потребуется скачать и установить:
* Git - https://git-scm.com
* Python 3.7 или новее - https://www.python.org - качать именно с оф. сайта а не с Windows Store иначе могут возникнуть проблемы со скриптом
* .NET 7 SDK x64 - https://dotnet.microsoft.com/en-us/download
### Клонирование кода
После установки всего вышеперечисленного теперь нужно скачать код проекта через Git.
1. Для этого сначала нужно получить ссылку на репозиторий, оканчивающуюся на `.git` . Для этого нужно зайти на страницу репозитория на GitHub и нажать справа сверху на кнопку "Code". Скопируйте ссылку из выпавшего окна (вам нужна ссылка по HTTPS).
**Для билда SS220 вы можете просто скопировать вот эту ссылку:** https://github.com/SerbiaStrong-220/space-station-14.git
2. После этого вам нужно открыть командную строку вашей системы (в Windows 10 - Win+R и введите cmd) и перейти в папку, куда вы будете клонировать. В cmd и PowerShell (Windows) для этого используется команда cd, например `cd C:\Users\VasyaPupkin\Desktop`. Вы можете копировать путь прямо из проводника.
Если папка находится на диске, отличном от C то сначала переключитесь на этот диск введя `<буква диска>:` Например `E:`

Учитывайте то, что в процессе клонирования Git сам создаст подпапку для кода проекта.
Убедитесь что у вас достаточно места! Билд после сборки может весить больше 4ГБ.
4. Теперь введите git clone <ссылка из шага 1>. Для билда SS220 команда будет выглядеть так: `git clone https://github.com/SerbiaStrong-220/space-station-14.git`
5. Дождитесь конца клонирования. Проверьте результат, по указанному вами пути будет подпапка "space-station-14" с кодом проекта.
### Сборка
1. Откройте командную строку и перейдите через cd в папку проекта (space-station-14). Введите `py -3 .\RUN_THIS.py`. Дождитесь окончания.
2. Введите `dotnet build --configuration Release`. Дождитесь окончания. В консоли жёлтым цветом может показаться очень много предупреждений, игнорируйте их. Ошибки будут показаны красным цветом. После окончания сборки у вас должно быть 0 ошибкок как на скриншоте:

Теперь у вас есть **релиз-сборка**. Она отличается от дебаг-сборки тем, что имеет автосохранение карт во время маппинга и реже крашится. Именно её рекомендуется использовать для маппинга.
Если вам вдруг потребуется **дебаг-сборка**, то введите просто `dotnet build` (без `--configuration Release`). Её для маппинга использовать не рекомендуется.
### Запуск
Сервер запускается с помощью runserver.bat в папке билда, клиент с помощью runclient.bat
Сервер можно настраивать в файле конфигурации `server_config.toml` в папке `bin\Content.Server`, однако для маппинга или тестирования это не требуется.
### Обновление
Расписано для тех, кто не использует Git для коммита своих обновлений в основной репозиторий или делает это через других людей.
1. Сохраните нужные вам файлы (вашу карту и прототип) в отдельной папке. Выключите сервер и клиент. Все лишние файлы в папке игры будут потом удалены, как и изменения в существующих файлах. Исключением будет конфигурация сервера и файлы в data.
2. Откройте консоль и сделайте cd в главную папку билда. Введите `git clean -fd`
Это удалит все лишние файлы (файлы которые не существовали изначально или которых нет в .gitignore).
3. Введите `git reset --hard` Это откатит изменения в тех файлах, которые не были удалены в предыдущем шаге
4. Это было сделано чтобы не было конфликтов с загружаемым обновлением. Теперь введите `git pull`
5. Если обновление загрузилось успешно, переходите к сборке (`dotnet build` или `dotnet build --configuration Release`)
## Маппинг
### Запуск mapping-режима
Запустите сервер и клиент, зайдите на сервер.
На клавишу `~` вы можете открыть консоль игры. Для начала маппинга вам нужно ввести в консоль `mapping <ID карты> <Файл карты>`.
* **ID карты** это номер слота карты на сервере. Он существует т.к. в раунде может быть загружено сразу несколько карт. Для ID карты Вы можете использовать абсолютно любое число от 0 до 255, но первые 12 обычно заняты. Для того чтобы увидеть какие ID заняты и какие карты загружены, введите в консоль `lsmap`. Список появится в ней же.
* **Файл карты** обычно лежит либо в `Resources/Maps`, который в консоли указывается как `/Maps`, либо в `bin/Content.Server/data`, который указывается как просто `/`. Файл карты имеет расширение `.yml`. Карты, которые вы сохраняете, лежат обычно в `bin/Content.Server/data`. Карты, которые используются для игры, лежат обычно в `Resources/Maps`.
Пример команды для загрузки карты Box: `mapping 220 /Maps/box.yml`
### Сохранение карты
Карта сохраняется с помощью команды `savemap <ID карты> <имя файла>.yml`
Карта будет сохранена в папку `bin/Content.Server/data`. Если в пути вы указали подпапку, то она будет создана там. Вы не можете сохранять карту в `Resources/Maps`, при попытке сохранения будет создана подпапка в `data`.
Убедитесь что вы сохраняете ту карту что нужно! Сохраняемая карта должна быть **не** инициализирована, иначе потом она не загрузится ни в раунде, ни в mapping. Mapping изначально загружает карту не инициализированной, но если у вас возникают сомнения то проверьте инициализацию сохраняемой карты с помощью `lsmap` - она будет показана в самом левом столбце после id. Значение `init: True` означает что карта инициализирована и сохранять её **нельзя**.
### Тестирование карты
Перед тестированием не забудьте сохранить изменения!
Протестировать карту можно с помощью `mapinit <ID карты>`. Это снимет карту с паузы и **инициализирует** её - камеры подключатся к роутерам, спавнеры заспавнят предметы и т.п. При этом функционал карты может быть ограничен по сравнению с обычным раундом. **Сохранять инициализированную карту нельзя - она не будет загружаться.**
Чтобы продолжить маппинг, вы можете загрузить ту же карту (вы же сохранили изменения перед тестированием?) через mapping но с другим ID.
Однако, во избежание лишней нагрузки на процессор я рекомендую делать полный рестарт раунда (restartroundnow). Это уберёт все карты что вы загрузили через mapping или loadmap.
### Тестирование карты в раунде
Для тестирования карты в раунде вам потребуется создать новый прототип станции.
1. Сначала переместите карту из data в папку `Resources/Maps` - там лежат файлы карт.
2. Прототипы станций хранятся в другой папке - в `/Resources/Prototypes/Maps/`. Зайдите туда и скопируйте любой из лежащих там .yml файлов. Оставьте его в этой же папке и дайте ему название латиницей без пробелов.
3. Откройте его в любом текстовом редакторе (блокнот подойдёт, но для редактирования прототипов Notepad++ будет удобнее).
4. Найдите строку начинающуюся на `id:` (она ближе к началу файла) и впишите туда любой не занятый ID вместо существующего. Пишется латиницей без пробелов. Удобнее всего если он схож с названием карты. Этот ID будет использоваться для загрузки карты через `forcemap`.
5. Найдите строку `mapPath:`, она тоже близко к началу файла. Укажите в ней путь к файлу карты. Обратите внимание на то что путь начинается с `/Maps`. Так же проверьте не используете ли вы символ \\ в пути (он там может быть если вы скопировали его из проводника). Если они там есть, замените их на `/`
6. Сохраните файл. Перезапустите сервер и введите в консоли forcemap <ID который указан в вашем прототипе>. При вводе ID должен появлятся в подсказках автозаполнения. После этого введите restartroundnow. Если загрузить карту не вышло, то скорее всего вы допустили синтаксическую ошибку в прототпе карты.
Теперь вы можете тестировать вашу карту в полноценном раунде. Если вы обновили свою карту, то достаточно перекинуть её из data в Resources/Maps заменив старую версию. Убедитесь что имя файла осталось то же что и раньше. После этого будет достаточно еще раз прописать forcemap и перезапустить раунд.
Так же некоторые профессии могут отсутствовать даже если вы добавили спавнер. Это происходит из-за того, что доступные профессии и количество сотрудников перечислены в прототипе карты, ниже строки `availableJobs:`. Редактируйте осторожно, ошибки синтаксиса приведут к тому что прототип карты не будет загружен и вы просто не найдёте своей карты. При изменениях в прототипе перезапустить раунд недостаточно, нужно перезапускать весь сервер.
### Инструментарий
* Когда вы в первый раз за раунд используете mapping, у вас из-за бага не загружается панель быстрых действий. Исправьте это с помощью `loadmapacts`
Это добавит быстрый выбор объектов для спавна на вашей левой панели действий. У вас заполнятся сразу несколько панелей, которые вы можете переключать с помощью Shift+<цифра>. Что самое главное, у вас появится инструмент для быстрого удаления объектов на кнопку 0. Вы можете выключить инструмент удаления так же, как вы выключаете инструмент спавна - на ПКМ. При использовании будьте аккуратны - вы можете удалить себя!
* На P (английскую) вы активируете спавн того же объекта что и под курсором. Так же работает с плиткой, но к сожалению не работает с декалями.
* Вы можете вращать объект перед тем как его заспавнить, просто нажимайте на СКМ (колёсико).
* Если вы удалили клетки станции, или наоборот построили их там где был космос - перед сохранением пропишите `fixgridatmos <ID грида>`. Если вы этого не сделаете, то у вас будет вакуум на созданной части станции. Вы можете узнать грид на котором сейчас находитесь нажав F3.
* Вы можете прописать zoom <дробь с запятой (не точкой!)> для отдаления карты. Стандартное значение - 1. Отдалять дальше чем на 1,5 не практично так как дальность рендера ограничена.
* Чтобы покрасить трубы введите команду `colornetwork <ID объекта трубы> Pipe <Цвет в hex в форме RGB, можно с решеткой>` Это покрасит все соединенные с ней трубы, что так же позволит проверить не соединили ли вы вейст с дистрой. Стандартный цвет дистры - 0335FC (синий), вейста - FF1212 (красный).
* В меню песочницы (английская B) вы можете включать/отключать отсвещение, FOV, отображение спавнов и труб под полом.
* Варп-поинты всё так же работают, если вы случайно удалили себя - делайте админ-гост, `loadmapacts` и варпайтесь обратно на карту.
* Не забывайте, у вас есть VariableViewer позволяющий редактировать компоненты объектов.
### Важно знать
* Если вы подберёте гостом предмет, то на полу останется его копия которую нельзя удалить. Эта копия на самом деле не существует на сервере и не сохраняется в файле карты. Это баг от разработчиков официального билда, с которым пока нельзя ничего сделать. (17.07.2023)
* Anchored (прикрученные) объекты (не важно Anchorable или просто через поле anchored в TransformComponent) могут находиться только в середине клетки. Если вы переместите предмет через телепорт или отредактировав TransformComponent, то он станет открученным (динамическим). У них пропадёт питание, а в случае с WallmountComponent (настенный предмет) у них появится коллизия со стеной. Это не относится к полностью статическим объектам, которые не могут быть откручены.
* Если объект который вы собираетесь удалять привязан к кнопке или выключателю, то сначала отвяжите его с помощью конфигуратора сетей. Иначе связь сохранится в файле карты как invalid. Обычно от этого карта не перестаёт работать но может показывать лишние ошибки/предупреждения.
* Тем кто занимается репозиторием очень сложно решать конфликты между изменениями в картах из-за формата. Конфликты происходят когда два человека предлагают изменения одних и тех же строк, что может с большой вероятностью произойти из-за обновления формата или хаотичного смещения uid декалей (баг, не пофикшенный разрабами). Перед тем как делать большие ремапы или ремапы затрагивающие декали, поинтересуйтесь не работает ли кто-то с картой.
В данный момент следующими картами заняты:
* Delta - VladIsLove ( discord - vladislove._. )
* Box - TheArturZh ( discord - thearturzh )
### Прочее:
Для удобства работы через командную строку рекомендую поставить Windows Terminal из Microsoft Store если он у вас еще не стоит. Выглядит более современно и можно открывать сразу в папке через контекстное меню. Это то чем я пользуюсь для разработки
https://apps.microsoft.com/store/detail/windows-terminal/9N0DX20HK701