0373806e2and0817a5706were pushed but never built, so the server jar was broken on main. Six compile errors, all in code that had never run: - ClientboundSoundPacket takes Holder<SoundEvent> in 1.21, not SoundEvent. - CraftWorld has no getServer(); the vanilla handle does. - Server has no paperConfigurations()/registryAccess() - Configurations is reachable through the console, and saveGlobalSection lives on Configurations (GlobalConfiguration is a ConfigurationPart, i.e. the data, not the writer). - ServerPlayer.server is private. DeltaSound pumped delayed packets through BukkitScheduler, which requires a live Plugin, and Delta as a core has none. It now uses GlobalRegionScheduler with a null plugin, which exists precisely for core tasks. Delays are counted in game ticks via Bukkit#getCurrentTick rather than System.nanoTime, so they no longer stretch under lag. The pump cancels itself once the queue drains. New DeltaDisplay holds the predictive-teleport policy (lead range, default, application) and /delta displaylead tunes it. Honest about its scope: Display#setTeleportDuration is already stock Bukkit, so Delta adds no new API to plugins and breaks no compatibility - it centralises the policy and reports it. The position shift itself is done by the plugin, per visual, along that visual's own trajectory. DeltaBuild now registers the existing features in the startup banner instead of printing "no custom features registered". The banner is emitted from a static initialiser before paper-global.yml is parsed, so the strings describe the mechanism and point at /delta status for live values rather than printing defaults as if they were the running configuration.
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.