Предупреждение:
Minestom не является серверным ядром, поэтому данная новость подразумевает то, что вы скорее всего хоть немного разбираетесь в Java программировании и владеете инструментами, которые необходимы для этого процесса.
Minestom - новая, уникальная технология для создания своих Minecraft серверов с максимальной кастомизацией. Начать стоит с того, что Minestom является не ядром, а библиотекой для разработки Java приложений, поэтому фактически это абсолютно иной подход к созданию своего сервера. В данной статье я попробую максимально подробно объяснить и рассказать об данной библиотеке и её возможностях.
1.В чём загвоздка?
Как вы уже поняли,
Minestom не является серверным ядром.
Minestom - библиотека для создания своих
Minecraft Java серверов, в которых вы можете кастомизировать буквально
всё. При создании сервера, базирующегося на этой библиотеке, вам придётся имплементировать даже собственную механику входа игрока на сервер. Это даёт вам невероятные возможности для максимально тонкой настройки игровой логики и создания собственных, уникальных режимов. Самое необычное это то, что на вашем сервере по стандарту не будет ничего, поскольку вы должны запрограммировать даже самую базовую логику сервера сами. Например, по стандарту если вы создадите мир по инструкции и пропишете базовый ивент входа игрока на сервер то в мире даже не будет освещения, поскольку это нужно
запрограммировать вручную.
2.Создание базового сервера при помощи Minestom
Давайте попробуем создать свой сервер на основе этой библиотеки. Для этого нам понадобится Minecraft последней версии (На данный момент
1.21), IDE (среда разработки) и небольшие познания в Java и английском языке. Узнать об том как настроить IDE для разработки можно в моей
статье об создании своего первого плагина.
Этап 1
В первом этапе мы создадим проект и подготовимся к разработке нашего сервера.
Разработчики
Minestom рекомендуют использовать
Gradle в качестве инструмента для управления проектом и сборки приложения, поэтому мы так же будем его использовать.
Для начала нам требуется зайти в нашу IDE (в моём случае Intelij Idea CE) и создать новый
Java проект на основе
Gradle, так же рекомендую заполнить остальные поля (GroupID, ArtifactID и т.д.):
Внимание:
На скриншоте выше выбрана JDK17, но минимальная поддерживаемая версия Java библиотекой Minestom - 21. Перед нажатием кнопки Create я сменил версию SDK на JDK21.
После нажатия кнопки
Create создаётся пустой
Gradle Java проект. Перед началом разработки нам нужно подготовить сам проект. Для этого нам нужно открыть файл
build.gradle:
В данном файле мы будем управлять зависимостями, библиотеками, сборкой и т.д. Нам необходимо изменить этот файл следующим образом:
1.Добавляем плагин
Shadowjar для сборки .jar файла, дописав следующую строчку в секцию
plugins:
id 'com.gradleup.shadow' version "8.3.0"
2.Сменим строку
version на удобную нам, в моём случае это будет 1.0 вместо 1.0-SNAPSHOT:
version = '1.0'
3.Добавим библиотеку
Minestom в зависимости, дописав строчку в секцию
dependencies:
implementation 'net.minestom:minestom-snapshots:a521c4e7cd'
На момент написания статьи последняя доступная версия библиотеки
Minestom -
a521c4e7cd, она указывается в самом конце названия зависимости. Узнать какая версия библиотеки последняя на данный момент можно на
Maven Central.
4.Устанавливаем минимальную версию
Java на 21, добавив следующую секцию после секции
dependencies:
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(21))
}
}
5.Прописываем логику сборки
.jar файла, добавив следующую секцию в самый конец:
tasks {
jar {
manifest {
attributes["Main-Class"] = "me.xarta.MinestomTest.Main" //Здесь указываем путь к вашему главному классу
}
}
build {
dependsOn(shadowJar)
}
shadowJar {
mergeServiceFiles()
archiveClassifier.set("")
}
}
Рекомендую свериться со скриншотом ниже, ваша конфигурация
Gradle должна выглядеть подобным образом:
6.Применяем все изменения, перезагрузив
Gradle (нажимаем на кнопку перезагрузки):
Этап 2
Во втором этапе мы напишем базовый сервер с плоским миром и имплементированым входом игрока на сервер.
Для начала нам нужно создать структуру нашего будущего приложения, в моём случае главный класс будет называться
Main и будет находиться по пути
GroupID.ArtifactID.MainClass (me.xarta.MinestomTest.Main):
Теперь мы можем приступить к написанию кода нашего сервера, для начала мы создадим главный метод и в нём инициализируем наш сервер:
MinecraftServer minecraftServer = MinecraftServer.init();
Важное уточнение Ещё раз напомню, что
Minestom - библиотека, поэтому мы пишем не плагин или модификацию, а свой
собственный сервер с
собственной логикой.
После инициализации сервера мы инициализируем две утилиты: InstanceManager и InstanceContainer.
InstanceManager instanceManager = MinecraftServer.getInstanceManager();
InstanceContainer instanceContainer = instanceManager.createInstanceContainer();
Объяснение В
Minestom механика игровых миров реализована путём так называемых инстанций. Если по простому, то
InstanceManager - утилита, отвечающая за управление мирами вашего сервера.
InstanceContainer - мир.
После инициализации утилиты для управления мирами и самого мира мы пропишем нашему миру
логику:
instanceContainer.setGenerator(unit -> {
unit.modifier().fillHeight(0, 40, Block.GRASS_BLOCK);
});
Объяснение Чуть выше мы прописали нашему миру
генерацию, а именно заполнение мира
блоками травы с мин. высотой
0 и макс. высотой
40.
Далее нам нужно прописать логику входа игрока на сервер, инициализировав утилиту
GlobalEventHandler и добавив с её помощью
Listener:
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
globalEventHandler.addListener(AsyncPlayerConfigurationEvent.class, event -> {
final Player player = event.getPlayer();
event.setSpawningInstance(instanceContainer);
player.setRespawnPoint(new Pos(0, 42, 0));
});
Объяснение Библиотека Minestom требует от разработчика полной собственной имплементации абсолютно всех элементов игры, поэтому если вы не пропишете логику входа игрока на сервер, то на сервер просто нельзя будет зайти. Выше мы добавили Listener (так называемый прослушиватель события), который ловит момент входа игрока на сервер и выполняет действия, прописанные в лямбде. В ней мы получаем игрока, устанавливаем ему мир в котором он должен заспавниться и координаты на которых он должен заспавниться.
В самом конце нам нужно запустить сервер:
minecraftServer.start("0.0.0.0", 25565);
Объяснение В строке выше мы даём нашему приложению команду запуска нашего сервера на локальном
IP с портом
25565.
После этого программирование базового
Minecraft сервера на базе библиотеки
Minestom завершено, в последнем этапе мы создадим
.jar файл и протестируем наш сервер.
Этап 3
В третьем этапе мы соберём .jar файл и протестируем его
Для сборки нашего .jar файла мы будем использовать утилиту
Gradle, для этого исполним команду
gradle shadowJar и, если мы сделали всё правильно, то по пути
build/libs будет находиться наш
.jar файл (ArtifactID-version.jar):
После этого мы переносим наш
.jar файл в отдельную папку и создаём скрипт запуска:
@echo off
Title Minestom
"C:\Program Files\java\директория с jdk21\bin\java.exe" -jar ArtifactID-version.jar
pause
При запуске мы ничего не увидим в консоли, поскольку по стандарту в нашем приложении
не прописан вывод в консоль, мы увидим лишь ошибку об отсутствии провайдера
SLF4J (утилиты для вывода информации в консоль):
В самой игре войти на наш сервер можно по адресу
localhost:
Если вы всё сделали правильно, то при входе на сервер вы увидите следующую картину:
На сервере не будет освещения, голода, урона, смерти, сообщений, команд, конфигов, выпадения блоков при ломании и т.д. Опять же таки, смысл
Minestom заключается в том, что вы сами имплементируете всё так, как вам надо. Все механики и логику вы должны продумывать вручную, что даёт вам невероятные возможности для кастомизации.
В заключение можно сказать следующее: Minestom это инновационный метод создания своих Minecraft серверов. Эта библиотека определённо может предложить программистам новые возможности по кастомизации своего сервера, т.к. вы сами прописываете логику и т.д. Лично я считаю, что у этого решения есть весьма немало плюсов, однако и недостатки в виде отсутствия модульности и прочих мелочей присутствуют. Благодарю за прочтение данной новости и надеюсь, что вы узнали что-то новое для себя!