# Серверная сборка m2612

Документация по скриптам управления модпаком: от добавления модов до локального тестового сервера и выкладки на NixOS.

## Пути

| Что | Путь |
| :-- | :-- |
| Репозиторий модпака | этот каталог |
| Локальный тестовый сервер | `/home/dimti/Seafile/minecraft/installers/m2612` |
| Развёртывание на NixOS | `server-scripts/recreate-m2612.sh` (репозиторий nixos) |

## Конфигурация `.env`

Локальные настройки, не попадают в git. Шаблон — `.env.example`.

```env
LOCAL_WORLD="Новый мир"
```

Используется скриптом `sync-datapacks-to-world.sh`: в какой мир клиента копировать датапаки из `datapacks/`. Значение с пробелами — в кавычках.

## Шаблон сервера `server-template/`

Минимальный набор файлов для первичного развёртывания локального сервера (хранится в git):

- `eula.txt` — принятие EULA
- `server.properties` — базовые настройки (без секретов)
- `start.sh` — запуск Fabric-сервера (имя jar подставляется скриптом)

Разворачивается командой `init-local-server.sh` в `TARGET_DIR`.

---

## Скрипты `bash/`

### `sync-with-shelve.sh`

Синхронизирует папку `mods/` с реестром pakku (`pakku sync`).

Перед sync временно убирает в `.pakku/shelf` кастомные моды (advanced-xray, mobility), которых нет в CurseForge/Modrinth, и возвращает их обратно после. Без этого pakku пытается их удалить.

Запускать после добавления или удаления модов в FreesmLauncher.

### `fetch-with-restore-shelve.sh`

Скачивает моды из реестра pakku в `mods/` (`pakku fetch --shelve`). Желательно после `sync-with-shelve.sh` — для консистентности локальной папки с lock-файлом.

### `export-serverpack.sh`

Собирает серверный архив и разворачивает его локально:

1. `pakku export` → `build/serverpack/*.zip`
2. Очищает `mods/` и `config/` в локальном сервере
3. Распаковывает архив в `/home/dimti/Seafile/minecraft/installers/m2612`
4. Синхронизирует `datapacks/` → `world/datapacks/` на локальном сервере

Пользовательские конфиги из `config/` попадают в serverpack — pakku экспортирует их вместе со сборкой.

### `init-local-server.sh`

Первичная инициализация локального тестового сервера (один раз или после смены версии MC/loader):

1. Копирует шаблоны из `server-template/` (`server.properties` не перезаписывает, если уже есть)
2. Генерирует `start.sh` с актуальным именем Fabric jar
3. Скачивает Fabric Server Launcher (версии берутся из `pakku-lock.json`)

### `start-local-server.sh`

Запускает локальный сервер: `cd` в `TARGET_DIR` и `bash start.sh`.

MC 26.1.2 требует Java 25 (`java-runtime-epsilon` в FreesmLauncher). Для нормальной консоли с историей команд — мод better-fabric-console.

### `sync-datapacks-to-world.sh`

Зеркальная синхронизация датапаков в клиентский мир:

```
datapacks/  →  saves/$LOCAL_WORLD/datapacks/
```

```bash
bash bash/sync-datapacks-to-world.sh           # один раз
bash bash/sync-datapacks-to-world.sh --watch   # следить за изменениями (inotifywait)
```

Режим `--watch` удобен при разработке рецептов: правишь файлы в `datapacks/`, они сразу попадают в мир.

---

## Типовой workflow

### Обновление модпака на сервере

1. Добавить/убрать мод в FreesmLauncher (`*.disabled` игнорируются и git-ом, и pakku)
2. `bash/sync-with-shelve.sh`
3. `bash/fetch-with-restore-shelve.sh` (желательно)
4. `bash/export-serverpack.sh` — собрать и развернуть локально для проверки
5. `bash/start-local-server.sh` — протестировать
6. Закоммитить, запушить, раздать клиентам
7. На NixOS: `server-scripts/recreate-m2612.sh`

Или одной VS Code-задачей **Build All** (шаги 2–4), затем **Start server**.

### Первый запуск локального сервера

1. Скопировать `.env.example` → `.env`, при необходимости поправить `LOCAL_WORLD`
2. `bash/init-local-server.sh` — шаблон + Fabric jar
3. `bash/export-serverpack.sh` — mods и config
4. `bash/start-local-server.sh`

### Разработка датапаков

1. Запустить VS Code-задачу **Watch sync datapacks to local world** (или `--watch` в терминале)
2. Редактировать файлы в `datapacks/`
3. Перезагрузить датапаки в игре: `/reload`

---

## VS Code tasks (`.vscode/tasks.json`)

| Задача | Скрипт |
| :-- | :-- |
| **Build All** | sync → fetch → export (последовательно) |
| Sync local mods to pakku registry | `sync-with-shelve.sh` |
| Fetch mods and download from pakku registry | `fetch-with-restore-shelve.sh` |
| Export serverpack | `export-serverpack.sh` |
| Start server | `start-local-server.sh` |
| Sync datapacks to local world | `sync-datapacks-to-world.sh` |
| Watch sync datapacks to local world | `sync-datapacks-to-world.sh --watch` (фон) |
| Run serverpack on Anta | `recreate-m2612.sh` на NixOS |

**Build All** — default build task (`Ctrl+Shift+B`).

---

## Заметки

- Клиентские моды, нужные на сервере (lambdynamiclights, xaeros-world-map), настроены в `pakku.json` как `side: BOTH`. Добавлять через `pakku cfg prj -s BOTH <slug>` — один раз.
- Датапаки на NixOS-сервер пока синхронизируются вручную (см. TODO в `ReadMe.md`).
