Files
DeltaZern/README.md
T
2026-09-30 09:16:06 +00:00

5.6 KiB
Raw Blame History

Delta

Экспериментальное серверное ядро на базе 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:

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/ — трекинг сущностей, активация, хопперы, чанковая система, редстоун. Это партиальные файлы: Paper мержит их с дефолтами.

Сборка

Требуется JDK 21. Две фазы, обязательно отдельными вызовами — при объединении падает с ошибкой неявной зависимости applyResourcePatches -> processResources:

./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). Все изменения в me.sashegdev.delta — тоже GPLv3.