103 lines
5.6 KiB
Markdown
103 lines
5.6 KiB
Markdown
# Delta
|
||
|
||
Экспериментальное серверное ядро на базе [Paper](https://github.com/PaperMC/Paper) для 1.21.8.
|
||
|
||
Сделано под узкие задачи: PvP-сервер с большим количеством кастомных способностей,
|
||
тяжёлыми визуальными эффектами (Display-сущности, частицы, звуки) и ограниченным
|
||
железом. Основная цель — выжать больше производительности с 4 vCPU / 8 ГБ RAM, не
|
||
ломая совместимость плагинов.
|
||
|
||
> **Не для публичного использования.** Ядро собирается под конкретный сервер и не
|
||
> имеет ни стабильности, ни гарантий безопасности. Не публикуйте его и не
|
||
> стройте на нём публичные проекты.
|
||
|
||
---
|
||
|
||
## Совместимость — это приоритет
|
||
|
||
Delta — **не форк с поломанным API**. Плагины видят ровно то же, что и на Paper:
|
||
|
||
| Что | Значение | Почему |
|
||
|---|---|---|
|
||
| Группа артефакта | `io.papermc.paper` | `Versioning` читает `pom.properties` по пути группы — смена ломает `Bukkit.getBukkitVersion()` |
|
||
| Версия | `1.21.8-R0.1-SNAPSHOT` | плагины парсят эту строку под API-фичи |
|
||
| `Brand-Id` | `papermc:paper` | по нему работает `ServerBuildInfo#isBrandCompatible` |
|
||
| Пакеты | `io.papermc.paper.*`, `net.minecraft.*`, Bukkit API | не трогаем вообще |
|
||
| Порядок тиков | стоковый | многопоток не трогает семантику |
|
||
|
||
Отличие только в отображении: `Brand-Name = Delta`, поэтому в F3 видно
|
||
`server: Delta`. Это **единственное** пользовательское отличие.
|
||
|
||
## Что добавлено
|
||
|
||
### `/delta` — инспекция и тюнинг
|
||
```
|
||
/delta status текущие значения конфигурации
|
||
/delta displayrange <блоки|0> дальность трекинга Display, 0 = стоковая
|
||
/delta reload перечитать конфиг
|
||
```
|
||
Периметр `delta.admin`.
|
||
|
||
### Бюджет Display-сущностей
|
||
В `ChunkMap.TrackedEntity#updatePlayer` добавлен кламп дальности трекинга для
|
||
`Display`. Display-сущности не имеют физики и коллизий, поэтому их отсечение по
|
||
дальности безопасно: клиент просто их не видит, серверное состояние остаётся
|
||
корректным. Это снимает основную нагрузку от способностей, спавнящих
|
||
десятки `BlockDisplay` с `viewRange=64`.
|
||
|
||
Отключено по умолчанию — включается в `paper-global.yml`:
|
||
```yaml
|
||
delta:
|
||
display-tracking-range-enabled: false
|
||
display-tracking-range: 64
|
||
particle-budget-per-player-per-tick: 0
|
||
sound-budget-per-player-per-second: 0
|
||
extended-particle-distance-enabled: false
|
||
extended-particle-distance: 128.0
|
||
decoupled-sound-range-enabled: false
|
||
```
|
||
|
||
### Баннер при старте
|
||
При запуске печатается блок с версией, коммитом, веткой, списком включённых
|
||
Delta-фич и предупреждением о статусе ядра.
|
||
|
||
## Конфигурация сервера
|
||
|
||
Готовые тюнинг-конфиги под 4 vCPU лежат в [`zernmc-config/`](zernmc-config/) —
|
||
трекинг сущностей, активация, хопперы, чанковая система, редстоун. Это
|
||
партиальные файлы: Paper мержит их с дефолтами.
|
||
|
||
## Сборка
|
||
|
||
Требуется JDK 21. Две фазы, **обязательно отдельными вызовами** — при объединении
|
||
падает с ошибкой неявной зависимости `applyResourcePatches -> processResources`:
|
||
|
||
```bash
|
||
./gradlew applyPatches
|
||
./gradlew createMojmapPaperclipJar
|
||
```
|
||
|
||
Артефакты: `paper-server/build/libs/paper-paperclip-*.jar`
|
||
|
||
## CI
|
||
|
||
Gitea Actions, воркфлоу `.gitea/workflows/build.yml`. Раннер живёт на отдельной
|
||
машине с 4 vCPU — на слабом хосте сборка невозможна.
|
||
|
||
Джобы выполняются в образе `delta-builder:jdk21` (JDK 21 + node + git identity).
|
||
Node обязателен для `actions/checkout`, git identity — для `applyFeaturePatches`,
|
||
который делает commit.
|
||
|
||
## Планируется
|
||
|
||
- Раздельные громкость и дальность звука (сейчас это один и тот же параметр —
|
||
чтобы было слышно за 150 блоков, приходится делать volume=10, и в упор всё
|
||
клиппит)
|
||
- `force`/`alwaysShow` в публичном API частиц (сейчас недоступны плагинам)
|
||
- Вынос симуляции «безопасных» чанков в worker-треды Moonrise — с чек-листом,
|
||
исключающим BlockEntity и плагинные блоки, чтобы не сломать совместимость
|
||
|
||
## Лицензия
|
||
|
||
Код ядра наследует лицензию Paper ([GPLv3](LICENSE.md)). Все изменения в
|
||
`me.sashegdev.delta` — тоже GPLv3. |