Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно. Необходимо обновить браузер или попробовать использовать другой.
Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
Стартап[Туториал] Удобная работа с NMS на Paper/Purpur/Folia 1.17+ (paperweight)
Конечно не будет - просто зависимость ведь - но тут в целом пойдут те же инструкции, что при использовании specialsource.
Странный ход конём получается, но таким образом переносимость проектов с места на место несколько легче должна быть. Что с paperweight, что с buildtools, нам всегда необходимо проделать пару дополнительных шагов перед началом работы.
Проблема в том, что плагины без обфускации просто-напросто не запустятся на стандартных ядрах. Поэтому смысла практически не вижу - разве что отладка проекта на ремапнутом ядре, но без возможности использования на проде.
А по поводу переносимости совсем не понял. Ничего не мешает склонировать проект с paperweight - он заработает сразу из коробки, хотя и времени на процесс сборки, очевидно, уйдёт больше.
Создать новый проект и подключить paperweight, конечно, сложнее, чем просто подключить зависимость.
Но рабочая альтернатива тут только одна - использовать NMS без маппингов.
Короче говоря, я прям совсем не вижу смысла в ремапнутом NMS, если он не мапится обратно в обфу
Проблема в том, что плагины без обфускации просто-напросто не запустятся на стандартных ядрах. Поэтому смысла практически не вижу - разве что отладка проекта на ремапнутом ядре, но без возможности использования на проде.
А по поводу переносимости совсем не понял. Ничего не мешает склонировать проект с paperweight - он заработает сразу из коробки, хотя и времени на процесс сборки, очевидно, уйдёт больше.
Создать новый проект и подключить paperweight, конечно, сложнее, чем просто подключить зависимость.
Про то и говорю - с сетапом обычной зависимости+плагина ты просто потратишь куда меньше времени, чем если бы заводил эту махину со сборки ядра. Как бонус - не придется пояснять другим, как собирать плагин, посылать читать документацию.
Обновил пост:
- Добавил спойлер для пользователей мавен со всеми предложенными ссылками и примерами
- Добавил ссылку на тестовый плагин на Groovy DSL
- Добавил информацию о настройке paperweight на Groovy DSL
- Обновил версии зависимостей
Пока лениво разбираться в теме глубже, но в одном из последних PR наткнулся на упоминание проекта ignite. Он позволяет создавать миксины на сервер.
Кто не в курсе - миксины это по своей сути патчи, которые применяются перед запуском сервера, только в форме jar'ника. Миксины являются одним из основных средств моддинга на Fabric (нынче кажется и в Forge имеются, но там Lex - главный разработчик Кузнецы - долго плевался на них).
В общем, если вам нужны мелкие правки ядра, возможно вам будет проще сделать мод на ignite, нежели собирать свой форк и пытаться поспевать за обновлениям Бумаги. К тому же, этими модами можно делиться, не рекомпилируя сервер вновь и вновь.
Пока лениво разбираться в теме глубже, но в одном из последних PR наткнулся на упоминание проекта ignite. Он позволяет создавать миксины на сервер.
Кто не в курсе - миксины это по своей сути патчи, которые применяются перед запуском сервера, только в форме jar'ника. Миксины являются одним из основных средств моддинга на Fabric (нынче кажется и в Forge имеются, но там Lex - главный разработчик Кузнецы - долго плевался на них).
В общем, если вам нужны мелкие правки ядра, возможно вам будет проще сделать мод на ignite, нежели собирать свой форк и пытаться поспевать за обновлениям Бумаги. К тому же, этими модами можно делиться, не рекомпилируя сервер вновь и вновь.
Сразу хочу показать вам пример кода на NMS с использованием технологии paperweight: Посмотреть вложение 60939
Как вы можете увидеть, больше нет никаких однобуквенных названий. Весь код читабельный и выглядит так, будто это и вовсе не NMS. Тем не менее, это он - обратите внимание на импорты.
Заинтересовало? Тогда продолжаем...
Предисловие:
Использование NMS - это крайняя мера, к которой стоит прибегать только в крайнем случае. Если у какой-то функции есть апи - лучше использовать это апи.
Если же нужной вам функции в апи нет - стоит предложить её разработчикам Spigot или Paper на гитхабе данных проектов.
Итак, с версии 1.14 Mojang начали публиковать официальные маппинги, включающие в себя всё кроме локальных переменных методов.
На версии 1.17 мы наконец-то дождались внедрения этих маппингов в Spigot и Paper 1.17.
Настало время использовать их в полную силу!
Использовать будем следующие технологии:
- Среда разработки Intellij IDEA
- Система сборки Gradle (с использованием Groovy DSL или Kotlin DSL)
- Ядро Paper 1.17 или новее
- paperweight - система сборки ядра Paper и плагинов с использованием маппингов Mojang
При необходимости вы можете самостоятельно добавить зависимость в локальный мавен- репозиторий, для этого используется BuilTools с флагом "--remapped".
Внимание!
Технология работы с маппингами Mojang является достаточно новой для Paper. Я не гарантирую оперативное обновление туториала. Пожалуйста, убедитесь, что используете актуальные версии плагинов, библиотек и прочих зависимостей. Также при необходимости ознакомьтесь с официальной документацией и сообщите в этой теме об изменениях.
Приступаем.
1) Для начала необходимо перевести ваш проект на систему сборки Gradle, а все конфигурации сборщика на Groovy DSL (build.gradle) или Kotlin DSL (build.gradle.kts). По поводу перехода с Maven довольно много информации в интернете.
Если вы не знакомы с понятием "система сборки" - вам придётся изучить эту тему самостоятельно.
2) Далее нужно убедиться, что в нашем проекте используется JDK 17 или новее.
Если у вас возникнут с этим вопросы или сложности - привожу полный список мест, в которых может понадобиться указать целевые версии Java. Данный список поможет вам решить ошибки вида "java: error: release version 17 not supported".
3) Следующим пунктом необходимо проверить, что в нашем проекте используется Gradle 7-й версии или новее. На данный момент последняя версия Gradle - это 7.6. Следить за релизами можно тут.
Версия 7+ требуется для раз для поддержки Java 17 и новее.
Версия Gradle указывается в файле /gradle/wrapper/gradle-wrapper.properties в строке distributionUrl.
Кстати, папку wrapper'а не рекомендуется добавлять в .gitignore проекта, а загружать в гит вместе со всеми исходниками.
После выполнения 3-го пункта рекомендую вам убедиться, что ваш плагин корректно собирается и запускается на сервере с использованием Java 17+.
4) Последний этап подготовки. Необходимо удалить из проекта все зависимости от всех компонентов ядра: nms/craftbukkit/bukkit/spigot/paper - абсолютно всё. Не имеет значения, подключена ли зависимость из maven-репозитория или локальным jar-файлом. Это нужно для того, чтобы в дальнейшем избежать различных разногласий при работе с классами ядра и не ловить в рантайме NoClassDefFoundError, NoSuchMethodError и прочие.
Пора переходить непосредственно к подключению paperweight. Предлагаю обратить внимание на примеры:
Помимо этого, по желанию вы можете использовать плагин run-paper от jpenilla, позволяющий для тестирования своего плагина запускать сервер на базе Paper при помощи задач runServer и runMojangMappedServer:
PHP:
id('xyz.jpenilla.run-paper') version '2.0.0'
PHP:
id("xyz.jpenilla.run-paper") version "2.0.0"
В рамках текущей статьи это необязательный шаг.
Помимо этого, рекомендую почитать про плагины java и java-library. Я не уверен в их обязательности в данной ситуации.
После всех манипуляций блок plugins будет выглядеть примерно так:
PHP:
plugins {
id('java-library')
id('io.papermc.paperweight.userdev') version '1.3.11'
id('xyz.jpenilla.run-paper') version '2.0.0'
}
PHP:
plugins {
java
`java-library`
id("io.papermc.paperweight.userdev") version "1.3.11"
id("xyz.jpenilla.run-paper") version "2.0.0"
}
Обращаю внимание, что блок plugins должен находиться в верхней части файла, выше всех остальных параметров сборки.
7) Наконец-то мы можем добавить в наш проект зависимость для подключения ядра вместе с заветным NMS с маппингами:
После этого не забываем обновить зависимости проекта.
Готово! На данном этапе вы уже можете писать плагин с использованием NMS с маппингами от Mojang.
Но есть несколько подводных камней, о которых вам стоит знать:
1) Плагин, собранный под одну версию ядра, не обязан работать на другой. Дело в том, что в самом ядре, которое используется на серверах, по-прежнему находится обфусцированный NMS. Фактически при сборке вашего плагина paperweight применяет к коду маппинги, чтобы привести код в обфусцированный вид. Т.е. обфускация отсутствует исключительно на этапе разработки. Это сделано с целью избежать юридических проблем с Microsoft.
Таким образом, если вы хотите добавить в свой плагин поддержку разных версий ядра - вам придётся создавать несколько модулей с разными версиями зависимостей paperweightDevelopmentBundle (для Groovy DSL) или paperDevBundle (для KotlinDSL). Но сам я не проверял, работает ли такая структура.
2) При использовании нескольких модулей в проекте вы, вероятно, столкнётесь с тем, что Gradle просто не позволит подключить paperweight в этих самых модулях. Насколько мне известно, это связано с недоработкой Gradle: https://github.com/gradle/gradle/issues/14697
Решение данной проблемы элементарное - достаточно удалить указание версии из дочерних модулей:
PHP:
id('io.papermc.paperweight.userdev')
PHP:
id("io.papermc.paperweight.userdev")
После чего перенести указание версии плагина в родительский скрипт сборки следующим образом:
PHP:
id('io.papermc.paperweight.userdev') version '1.3.11' apply false
PHP:
id("io.papermc.paperweight.userdev") version "1.3.11" apply false
Напоминаю, что блок plugins должен находиться в верхней части файла.
3) При обновлении на новые версии paperweight вы можете столкнуться с ошибкой
"The paperweight development bundle you are attempting to use is of data version '1', but the currently running version of paperweight only supports data version '2':".
Данная проблема связана то ли с багом в Gradle, то ли в paperweight. Так или иначе, мне удаётся решить данную проблему банальным удалением директории %userprofile%/.gradle/caches/7.3/md-rule
На этом всё. Материал подготовлен Dymeth.
Есть вопросы или дополнения?
Тема открыта, не стесняйтесь
Просто при попытке билдинга вылезает ошибка
Build file 'C:\Users\makar\IdeaProjects\TESTNMS\build.gradle' line: 3
Plugin [id: 'io.papermc.paperweight.userdev', version: '1.3.11'] was not found in any of the following sources:
* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
Если потребуется могу скинуть полную ошибку, потому что там очень большое кол-во текста
Обновил первый пост:
- указал актуальные версии плагинов и зависимостей
- удалил необходимость указывать репозиторий плагина paperweight
- удалил рекомендацию использовать Kotlin DSL вместо Groovy DSL
- добавил упоминание Purpur и Folia
Помимо этого, актуализировал paperweight-test-plugin-groovy:
- Обновлены версии gradle-плагинов и dev-bundle зависимостей (до 1.20)
- Обновлён Gradle до 8+ (gradle-wrapper 8.1.1)
- Добавлен плагин foojay-resolver-convention, который занимается решением зависимостей JDK (для Gradle 8+)
- Удалено указание репозитория paperweight в pluginManagement, т.к. релизы перенесены в Gradle plugin portal (начиная с paperweight v1.5.1)
- Удален плагин net.minecrell.plugin-yml.bukki, добавлен классический plugin.yml, а нужные параметры устанавливаются средствами самого сборщика
- Несколько других небольших изменений
После обновления на новые версии рекомендую очистить все кэши и убедиться, что все зависимости подгружаются корректно:
gradle clean cleanCache cleanAllRunTaskCaches cleanCustomServiceCaches cleanPaperclipCache cleanAllPaperweightUserdevCaches
Информацию по Миксинам пока не стал добавлять в первый пост - корректней будет написать отдельную тему. В любом случае, спасибо ребятам за информацию.
Просто при попытке билдинга вылезает ошибка
Build file 'C:\Users\makar\IdeaProjects\TESTNMS\build.gradle' line: 3
Plugin [id: 'io.papermc.paperweight.userdev', version: '1.3.11'] was not found in any of the following sources:
* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
Если потребуется могу скинуть полную ошибку, потому что там очень большое кол-во текста
Ну, потому что нужно использовать актуальные версии зависимостей. Я не просто так дал ссылки на релизы paperweight.
Обновил сейчас статью, с последними версиями всё должно быть норм. Также обрати внимание на репы с примерами простейших плагинов
Ну, потому что нужно использовать актуальные версии зависимостей. Я не просто так дал ссылки на релизы paperweight.
Обновил сейчас статью, с последними версиями всё должно быть норм. Также обрати внимание на репы с примерами простейших плагинов
а то что пейпер в открытый доступ выложил исходники майнкрафт сервера с понятными названиями классов и методов это ничего не нарушает? странные законы в этих ваших штатах
Так они вроде и не делали этого? Собстна, вся эта наркомания с PaperWeight и нужна, чтобы избежать выпуска исходников на показ. Тоже самое касается и PaperClip, только там вопрос выпуска бинарников.
а то что пейпер в открытый доступ выложил исходники майнкрафт сервера с понятными названиями классов и методов это ничего не нарушает? странные законы в этих ваших штатах
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!