1a2f3bbde7
Build Delta / Build paperclip jar (push) Successful in 7m57s
Мир пустоты как кастомное измерение датапаком и пересчёт координат между мирами с разным масштабом. Механизм масштаба — тот же, что у Незера: поле coordinate_scale в типе измерения, а пересчёт при переходе равен делению масштаба источника на масштаб назначения. Для пустоты нужно ровно 2.0, то есть один блок пустоты на два блока оверворлда. Проверено на сервере: coord scale overworld=1.0 void=2.0. Биом сделан своим (delta_void:void), а не переопределением ванильного minecraft:the_void. Переопределение трогало бы данные Mojang и конфликтовало с любыми другими датапаками. Отличия от ванильного — только цвета: sky_color и fog_color в ноль, плюс выключенный туман и вода. Что потребовалось по дороге, все три ошибки поймал сервер, а не я: 1. У типа измерения в 1.21.8 обязательное поле logical_height. Без него сервер отказывается стартовать: "No key logical_height". 2. Файл измерения не принимает дискриминатор "type": "minecraft:dimension". Кодек LevelStem читает поле type как ССЫЛКУ на тип измерения, и мой дискриминатор уходил в неё как имя типа. Правильно — "type" со значением delta_void:void. 3. getAllLevels() живёт на MinecraftServer, а не на DedicatedServer, который отдаёт CraftServer#getHandle(). И dimensionType() в Paper уже разворачивает Holder, так что .value() там не нужен и ломает компиляцию. Отдельно: World#getCoordinateScale() в Paper УЖЕ есть, причём реализован ровно так, как я собрался писать. Для чтения масштаба ядро менять не нужно. А вот пересчёта координат в API нет ни в Paper, ни в Bukkit: Player#teleport его не делает, потому что телепорт не портал. Добавлен default-метод World#convertLocation с той же формулой, что и ванильная, и без изменения Y. Хорошая новость про отказ сервера: на битый датапак он не стартует, а падает в safeMode. Тихая загрузка сломанной генерации была бы хуже. Диагностика частиц всё ещё в CraftWorld, снимается после проверки прицела.