Что такое ядро сервера в майнкрафт?
@KingMcpe, у Minecraft есть API, используя этот API создаю сервер/клиент, ядро это типа основа для сервер/клиент.
Есть чистый сервер — но на нём не кто не создаёт серверы, за исключении если кто-то хочет первым попробовать новую версию Minecraft.
Есть сервера которые типа написанные с нуля используя API Minecraft известный как Bukkit и т.п.
Есть сервера которые берутся чистые, модифицируются с помощью Forge, а так-же есть ядра на которые добавляются API от Bukkit‘а или само ядро Bukkit. Или-же на оборот, используются Bukkit ядра пытаясь модифицировать с помощью Forge.
И различия этих ядер в их реализации и/или исполнении. У кого-то полно эвентов (события, взаимодействие и т.п.), у кого-то по минимуму, а так-же можно с помощью ASM увеличивают потенциал ядра.
Что такое ядро сервера
При создании сервера, первое на что стоит обратить внимание — выбор ядра. В этой статье, мы в сжатом формате рассмотрим наиболее популярные ядра для вашего сервера Minecraft и проведем сравнение по нескольким пунктам: поддержка, популярность, уязвимость, настройка, стабильность и оптимизация. А также выберем какие ядра стоит использовать для создания сервера.
Что такое ядро сервера?
Ядро сервера — это API-файл сервера Minecraft, который предназначен для запуска сервера и обменом данных с клиентом. Простым языком, ядро сервера это файл, позволяющий запустить многопользовательский сервер.
CraftBukkit
Одним из самых первых ядер для игровых серверов является CraftBukkit, на данный момент поддержка ядра не прекратилась, но использование среди создателей серверов приближается к нулю. Основная разработка ядра перешла в управление Mojang, поэтому выпуском новых версий и обновлений занимается компания создавшая Minecraft.
Стабильность, оптимизация и возможность настройки у ядра оставляет желать лучшего, потому что по сути оно представляет из себя ванильное ядро поддерживающее плагины
Spigot
Spigot — это форк ядра Bukkit, то есть по сути его улучшенная версия. Он регулярно поддерживается и обновляется разработчиками и пользуется большой популярностью среди создателей серверов. Однако возможность настройки ядра всё ещё оставляет желать лучшего, а стабильность и оптимизация ядра хромает.
PaperMC
PaperMC — это форк ядра Spigot, на данный момент является одним из самых популярных ядер для серверов. Обладает широкой возможностью настройки и высокой стабильностью. Является довольно оптимизированным ядром и при создании своего сервера стоит обратить внимание именно на него
Заключение
Обратите внимание, что мы сделали лишь краткий обзор самых популярных ядер под все версии Minecraft, и некоторые пункты могут быть субъективными. Если вы хотите создать сервер и не заморачиваться — используйте ядро PaperMC, если же вы хотите более оптимизированные и гибкие ядра обратите внимание на его форки под конкретные версии
Что такое ядро сервера?
Здравствуйте уважаемые пользователи нашего форума , наша тема сегодня по вопросу "Что такое ядро сервера"
Начнём с того , что Ядро сервера — Это главный jar файл, который Вы предварительно скачали.
Используется ядро сервера для того чтобы ваш сервер майнкрафт полноценно работал , имел свою версию(Например чтобы сервер был на версии 1.8.9)
Всего существует 5 ядер (самые популярные):
Spout (ещё не до конца разработан)
Теперь расскажу про каждый из них
Vanilla — официальное серверное ядро, выпущенное командой Mojang. Оно всегда выходит самым первым. Скачать его можно на официальном сайте Minecraft.
Плюсы:
Выходит почти сразу после выхода версии Minecraft.
Имеет консоль и GUI.
Можно легко поставить Forge, следовательно и моды.
Не требует специального лаунчера.
Выделяет очень много оперативной памяти на каждого игрока. Примерно 50 МБ на игрока
Нет возможности ставить плагины. Есть только моды, которые заменяют плагины, что не очень удобно.
CraftBukkit — серверное ядро, основанное на Vanilla. Основное преимущество этого ядра в том, что оно занимает меньше памяти и имеет возможность установки плагинов.
Более оптимизированное ядро, чем Vanilla. Выделяет примерно 5-15 МБ на каждого игрока.
Есть возможность поставить плагины.
Не требует специального лаунчера.
Имеет только консоль, но сторонние разработчики написали BukkitGUI.
Нет возможности поставить Forge. Для установки модов, их сначала нужно портировать.
Spigot — оптимизированный CraftBukkit. Так же Spigot абсолютно совместим с CraftBukkit.
Более оптимизированное ядро, чем Bukkit. Выделяет меньше памяти.
Ядро полностью совметимое с CraftBukkit, следовательно плагины от CraftBukkit подойдут на Spigot.
Оптимизированы события роста, подсчет чанков.
Автоматическое собирание шаров опыта и предметов в стаки.
Выключено случайное обновление света.
Возможность создать свое сообщение, при отказе в вайтлисте.
Возможность конфигурировать записываемые события в лог.
Свое сообщение при выключении сервера.
Как и CraftBukkit, не требует специального лаунчера.
Имеет только консоль, но можно скачать BukkitGUI.
Нет возможности поставить Forge. Для установки модов, их сначала нужно портировать.
MCPC+ — Модифицированный Spigot, в котором встроена поддержка модов и плагинов.
Не нужно портировать моды.
Есть возможность устанавливать моды и плагины одновременно.
Ядро полностью совметимое с CraftBukkit, следовательно плагины от CraftBukkit подойдут на MCPC+.
Имеет только консоль, но можно скачать BukkitGUI.
Для игры на сервере требуется уже собранный клиент.
Spout — написанный с нуля сервер. У него есть уникальные возможности. Одна из его особенностей в том, что плагины могут подгружаться сразу и с клиента и с сервера. В данный момент Spout находится в стадии разработки. Так же плагины Spout имеют GUI
Плюсы:
GUI для плагинов.
Не выделяет большое количество памяти.
Не поддерживает плагины CraftBukkit.
Не поддерживает моды Forge.
Для игры требуется специальный лаунчер.
Если вам нужен сервер самой последней версии или сервер, на котором не будет много игроков и если вам не нужны плагины, то лучше выбрать Vanilla.
Если вам нужны только моды, то так же подходит Vanilla.
Если вам нужен быстрый сервер, на котором должны стоять плагины, а моды не нужны, то лучше выбрать Spigot.
Если вам нужен сервер, на которым должны быть и моды, и плагины, то подойдет MCPC+.
Если вам нужен сервер уникальными возможностями, то можно выбрать Spout.
А так-же все данные ядра появятся на нашем форуме в течении недели!
by : despect
Создание своего серверного ядра на Go для Minecraft Java. Часть #1 — Основное о идее и малое начало
Тема, которая будет писаться в многих частях будет в основном представлять этапы написания своего серверного ядра для мультиплеера популярной игры Minecraft.
Об игре Minecraft
Игра на данный момент имеет большую популярность среди многих людей, наверное зайдя на тот же ютуб вы можете встретить множество видео или стримов по этой игре, в неё играют люди разных возрастов. В ней вы можете играть как в одиночном режиме, так и мультиплеере. Мы будем разбирать конкретно мультиплеер так-как именно он позволяет играть людям вместе, где есть некоторые проблемы, но так-же и добавлять разнообразие в игру.
О серверах игры
В самой игре нет централизированной системы серверов, что позволяет создавать сервера где угодно, но чаще под них арендуют услуги хостинга. Сервера можно найти очень легко, например введя в поисковик гугл «Мониторинг майнкрафт серверов», а так-же вы можете и создать свой. В основе большенства серверов лежат ядра, которые в свою очередь основаны от одного ядра — Vanilla. Вот малый список ядер, которые часто использут: Paper, Purpur, Spigot, Sponge, Glowstone.
Программная часть серверов
Все ядра, которые были перечислены выше имеют одну и ту же проблемную зависимость — они написаны почти полностью на Java. Сам по себе этот язык классный, много классных особенностей, но в случае огромных проектов часто бывают проблемы например с потреблением ОЗУ, а уже процессор часто бывает второстепенный. Обычный сервер, без дополнений (плагины), при тех же 20-40 игроках может спокойно использовать и 1 или даже 2 гигабайта ОЗУ, а что же говорить о том, что при долгой работе без перезагрузок потребление может занимать и более 6ГБ ОЗУ. Поэтому находятся люди, которые пытаются создавать собственные ядра например на Rust ведётся разработка одного из таких ядер. Я же планирую по частям описывать создание своего ядра, но уже на Go.
Почему же Go?
Я не раз пробовал разные языки для всего подряд (да, даже PHP для серваков. ), но мне показался самым классным Go. В основном нравиться его простота, удобство и экосистема, ведь есть много классных библиотек. Так-же бы я выделил его производительность, ведь она тут очень замечательная.
Зачем?
Да просто :D. А если говорить по правде, то я просто давно хотел сделать, что-то интересное не только для меня, но и другим. А может даже и поможет это кому-то. Ну и конечно возможно это будет очень удобно использовать где-то у себя.
Перед началом
В данном посте я планирую сделать лишь основы, поэтому в следующей части будет больше интересного).
Сначала я бы хотел уточнить, что буду использовать Go последней версии (на момент поста 1.17.5), а так-же редактор GoLand от JetBrains и буду надеяться на вашу поддержу 🙂
Пока на самом начале сервер будет поддерживаться только на 1.12.2, потому-что моё супер вычислительное устройство очень плохо работает в связке GoLand + Minecraft 1.16.5 и выше.
Начало
Называться ядро пока-что будет именно ULE, поэтому будет инициализироваться проект в GoLand, создаём main.go в качестве запускатора.
Инициализация проекта
В качестве упрощения в создании будем использовать одну библиотеку для протокола игры. Она очень мощная, но из неё мне понадобиться только функционал для парсинга сообщений и чтении/записи пакетов, а так-же небольшой обработке игроков. Поэтому установим её таким образом:
go.mod после добавления go-mc
После чего данная библиотека будет автоматически добавлена в go.mod и мы сможем её использовать в нашем коде обращаясь по «github.com/Tnze/go-mc/».
Теперь для удобства я создам директорию server и в нём файл server.go со следующим содержимым:
Как мы видим для работы мы используем net из go-mc для подключений, а так-же принимаем их с помощью нашей функции acceptConnection, которая объявлена в server/accepter.go и её код уже такой:
Здесь вы можете уже заметить, что в списке инпутов есть свой пакет, в папке server/protocol/serverbound, а там находиться уже файл handsnake.go для «рукопожатий», но перед этим стоит разобрать код функции для принятия подключений, в ней мы пока используем при чтении только nextState, так-как в первой части будет готов только пинг и поэтому в обработке типа подключения из HandSnake мы используем только 1, который означает, что это пинг.
Далее по очереди у нас очень важный компонент в работе ядра — чтение HandSnake, который как описывал был расположен в server/protocol/serverbound/handsnake.go и всё что находиться в директории связанной с протоколом конечно будет всё, что с ним связано и делиться всё на ServerBound (для сервера) и ClientBound (для клиента), поэтому при таком разделении у нас будет именно чтение HandSnake со следующим содержимым:
Ну и написанными комментариями я думаю расписал всё довольно подробно и если вы хотите почитать сами про структуру пакета и почему всё так читаем, то можете ознакомиться на официальном источнике.
После чтения HandSnake пакета мы так-же решаем что делать с ним и поэтому в accepter.go при обработке состояния при 1 — принимаем в виде пинга в функции acceptPing, но принятие пинга уже кому-то может составить проблему из-за большого кода, ведь тут вся функция пинга обходиться нам в server/accepter_ping.go не в 20 строчек:
Обошлось нам всё в 83 строчки. Наверное это ещё очень мало так-как под некоторое была выделена папка config в которой вскоре будет располагаться вся конфигурация, но пока поговорим о нашем любимом пинге. Принятый пинг-подключение мы читать будем не более 3-х раз так-как обычному клиенту этого хватить должно в большинстве случаев, но это и частично нас обезопасит от ping-аттак.. частично. ну ладно, если не получилось отправить пакет, то перестаём его обрабатывать, поэтому каждый раз прочитывая пакет мы так-же узнаём его тип, так-как:
0x00 — получение описания
0x01 — пинг игрока
И вот тут самое интересное, при пинге игрока нам надо просто возвращать отправленный игроком пакет, а вот уже при описании нам приходиться генерировать JSON из нашей структуры, но сама генерация идёт в функции listResp, но для неё у нас есть структура данных listRespPlayer, которая говорит частично за себя ведь она описывать игрока для ответа, другая структура в самой функции генерации ответа уже гораздо больше, которая соответствует минимальному стандарту ответа. Мы так-же устанавливаем в структуру значения по дефолту
И мы тут можем заметить, что идёт обращение к какому-то config, а это просто в корне проекта config/basic.go:
И в нём установлены некоторые дефолтные значения по типу версии протокола (для 1.12.2 версия протокола — 340), а так-же MOTD или же то что вы видите в виде текста под названием сервера.
Для генерации JSON из структуры используем json.Marshal, который может вывести ошибку и так-как он не должен выводить ошибку, то мы заканчиваем работу программы с ошибкой.
Вот и конец первой части истории о самописном серверном ядре для Minecraft Java. Весь исходный код доступен на GitHub. И я буду очень сильно надеяться на вашу поддержку.
В итоге первой части мы получили:
Результат пинга
При этом ядро пока использует 2.1МБ ОЗУ, но стоит учесть, что на Linux он будет использовать гораздо меньше так-как размер потребления указан на Windows 11.
Спасибо за прочтение статьи и скоро выйдет новая часть, посвящённая написанию своего ядра! 🙂