# 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.