NMS, также известный как N et. M inecraft. S erver — это пакет, содержащий основной код сервера Minecraft. Классы в этом пакете были сделаны Mojang (не Bukkit) и поэтому в основном запутываются и не предназначены для использования или изменения. Однако взаимодействие с кодом сервера Minecraft на этом уровне позволяет вам модифицировать почти все его аспекты.

Это важно, поскольку существуют многочисленные модификации, которые Bukkit не поддерживает.

замечания

API Bukkit — это слой обертки или абстракции для NMS, который позволяет разработчикам плагина взаимодействовать с сервером, не беспокоясь об изменениях, внесенных во внутреннюю кодовую базу.

Использование кода NMS не рекомендуется, поскольку он часто прерывается между изменениями версии Minecraft и не может поддерживаться Bukkit или Spigot, поскольку они не создают, не владеют или не поддерживают его.

Доступ к текущей версии Minecraft

Одной из наиболее важных частей работы с кодом NMS является поддержка версий Mulitple Minecraft. Существует множество способов сделать это, но простым решением является использование этого кода для хранения версии в виде открытого статического поля:

Minecraft Plugin Development 1: What Is Bukkit, CraftBukkit, Spigot and NMS and how plugins work


public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().substring(23);

Этот фрагмент кода работает с использованием класса CraftServer:

И взяв подстроку имени пакета, начиная с индекса 23, который всегда будет после «org.bukkit.craftbukkit». (длиной 23 символа). Результат в последней строке VERSION:

Существует ряд причин, почему так важно иметь доступ к текущей версии Minecraft. В основном из-за того, что любой доступ к классу на сервере с другой версией Minecraft, чем то, что кодировал плагин, вызовет ошибку.

Вот пример, который демонстрирует, как решить эту проблему, используя поле NMS_VERSION для извлечения экземпляра CraftPlayer (который является классом NMS) в любой версии Minecraft.

Получаемый объект можно затем манипулировать с помощью отражения для выполнения задач на основе NMS, не беспокоясь о попытке доступа к неправильной версии класса.

Однако даже этот метод не является надежным, поскольку имена полей NMS и методов легко меняются, поэтому единственное, что вы гарантируете этим, заключается в том, что ваш код не будет определенно ломаться каждый раз при обновлении Minecraft.

Получение пинга игрока

Одна очень простая вещь, которую вы можете захотеть сделать с NMS, которую Bukkit не поддерживает, — это получить пинг игрока. Это можно сделать следующим образом:

Если вы используете метод getCraftPlayer (Player), который возвращает экземпляр соответствующего экземпляра CraftPlayer Player как объекта. Вы можете получить доступ к данным, не импортируя классы, зависящие от версии, с помощью отражения следующим образом:

Источник: learntutorials.net

Use NMS in Paper Plugin | UPDATE

Что такое NMS и как с ним бороться?

- - - - -

Прошлой статьей мы начали небольшой цикл на тему написания плагинов для серверов Bukkit. Статья получилась из разряда «Вообще». Сегодня обратимся к конкретике и рассмотрим основы структуры майнкрафтовского сервера.

Читайте также:  Скомпрометированная учетная запись Майнкрафт

— Астронавты, которая тут цапа?!
— Там. ржавая гайка, родной.
— У вас все тут ржавое!
— А эта самая ржавая!
к/ф «Кин-дза-дза»

А вот тут как бы сам по себе, из ниоткуда, возник резонный вопрос: «А для чего мы все это делаем, и что это за Баккит такой?». Попробуем потихоньку разобраться во всех этих майновских хитросплетениях, поскольку без хотя бы минимального понимания механизма работы сервера писать для него плагины будет сущим мучением (испытано на себе, не повторять в домашних условиях!).

Итак, майновский сервер представляет собой jar-файл с набором откомпилированных до уровня байт-кода java-классов. Если интересно, можно открыть его каким-нибудь архиватором типа WinRAR или 7-zip (сейчас меня закидают яйцами пингвинов) и посмотреть как это все разложено по каталогам.

Основной набор файлов лежит в подкаталоге /net/minecraft/server/v1_X_RY/, где X — мажорная (основная) версия сервера, а Y — минорный (вторичный) номер билда. Например, для майнкрафта версии 1.8.8 этот подкаталог имеет название «v1_8_R3». В подкаталоге находится более 1.5 тысяч файлов с расширением .class (java байт-код), обеспечивающих работу вашего сервера. Минорная версия (билд) меняется не очень часто, например, билд R3 тянется аж (если мне склероз не изменяет) с версии 1.8.4. Мажорный номер, как вы понимаете, меняется еще реже, в соответствии с изменением версии игры (например, переход с версии 1.7.10 на 1.8).

Указанный путь /net/minecraft/server имеет вполне реальный смысл: именно так называется основной java-пакет (package) сервера — net.minecraft.server, обычно в разговоре его называют NMS. Отсюда, когда спрашивают «не изменился ли NMS?», имеют в виду, не сменился ли номер билда v1_X_RY или, не дай бохх, мажорная версия сервера.

В основном от этого зависит — будут ли работать плагины, собранные под предыдущую версию, на текущей сборке сервера. Как правило, в 99% случаев, если не было изменений NMS, плагины не требуют адаптации и прекрасно продолжают работать. В случае изменения версии NMS жди проблем: некоторые плагины активно используют низкоуровневый доступ к классам и методам NMS, и, соответственно, начинают сыпаться исключениями, поскольку не могут найти нужный путь (читай, пакет) и загрузить нужный класс. В итоге приходится либо ждать, когда у разработчиков дойдут руки адаптировать свое творение под новую версию, либо искать исходники плагина и делать за них их работу, либо заниматься некромантией: декомпилировать плагин и далее проводить его адаптацию, надеясь что декомпиляция не нарушила его целостность.

Основная проблема, из-за которой начинают глючить плагины при смене версии NMS даже не столько в изменившемся названии пакета (путь к каталогу). Больше всего проблем доставляет так называемая обфускация, которую активно применяют моджанги в попытке скрыть от хитровывернутых любопытствующих исходный код сервера. Смысл процесса обфускации (obfuscation — затемнение) — переименование перед компиляцией (или после нее) имен методов и полей классов в бессмысленные названия. Попробуйте, например, догадаться, что делает метод:

Читайте также:  Можно ли увеличить инвентарь в Майнкрафте

private int e(ItemStack itemstack)
.
>

И таких a(), b(), c(), d() и e() в коде майна — три из четырех. Догадаться об их назначении можно лишь после вдумчивого изучения содержимого. А если учесть, что переименовываются не только названия методов, но и названия членов (переменных) класса, задача и вовсе становится нетривиальной. Причем в одном классе запросто может встретиться в дополнение к вышеприведенному метод:

public int e(Item item, int i, int j, NBTTagCompound nbttagcompound)
.
>

Как видно, имена у них одинаковые, а выполняют они совершенно разные функции в зависимости от входного набора аргументов [и возвращаемого значения]. Яву это нисколько не смущает, а вот человеку крышу сносит конкретно.

Однако самая большая проблема даже не в этом, а в том, что при смене NMS методы и члены класса свободно могут поменять названия, причем непредсказуемым образом. Слава КПСС, происходит это не очень часто, а если и происходит, в 99% случаев ведет за собой смену набора аргументов, что приводит к появлению в среде разработки (см., Eclipse) ошибок компиляции. После появления и нахождения такой ошибки приходится поднимать исходный код новой версии NMS, искать куда убежал метод, который в прошлой версии назывался, например, int e(ItemStack itemstack), и после обнаружения его под именем int c(ItemStack itemstack) менять ссылку на него в коде плагина. В оставшемся 1% случаев метод меняет название, а на его месте оказывается другой метод, имеющий теперь такое же название и такой же набор аргументов, но выполняющий совершенно другие задачи. В этом случае об ошибке вы узнаете, скорее всего, по крикам «одмин чо за фигня ни паиграть жи!».

Как небольшой костыль можно использовать т.н. Minecraft Coder Pack (MCP), который производит деобфускацию исходников майна. В этом случае вы получите (в 90% случаев) более-менее внятные имена свойств и методов классов. Однако здесь вас ждут еще две проблемы: после компиляции вашего плагина вам необходимо будет произвести его обфускацию, дабы он смог работать с оригинальным jar-Файлом майна.

А вторая проблема: разработчики MCP не очень торопятся, новая версия выходит с большой задержкой после обновления NMS. Отсюда столь частые задержки выхода обновленных версий многих известных плагинов, разработчики которых привыкли полагаться на добрых кудесников, придумавших MCP. Бяда, в общем.

Еще пару слов по структуре: такое огромное количество файлов в каталоге MNS (вообще-то там есть еще подкаталог v1_X_RY, но обычно его опускают) объясняется тем, что каждый класс, даже самый мелкий, находится в отдельном файле. Независимо от того, имеет он размер в несколько строк или в несколько тысяч строк. Причем вполне возможно, что на этапе написания кода классы были сгруппированы в файлах по нескольку штук, ява вполне это допускает в пределах одного пакета. Однако на этапе компиляции они в любом случае разбиваются по принципу 1 класс -> 1 файл.

Читайте также:  Как получить литий Майнкрафт

Что интересно, код майнкрафтовского сервера и клиента на уровне классов хоть и схож во многом, но все же разный, если код сервера побросали в один пакет, то код клиента аккуратно разложен по подпакетам и гораздо лучше структурирован. В любом случае, если вы собираетесь писать плагины для сервера, изучать вам придется именно код серверной части, хотя знание клиентской части, конечно, существенно облегчит процесс. В общем и целом, код серверной части с точки зрения соответствия принципам объектно-ориентированного программирования написан на слабую троечку. Причем заявляю я это не потому что «я бы гораздо лучше написал!», просто появление надстройки Bukkit, речь о которой пойдет в следующей части, лучшее доказательство данного тезиса.

Вот, пожалуй, самый минимум того, что необходимо знать об основах т.н. «ванильного» майнкрафтовского вервера, чтобы не пучить глаза, услышав «посмотри в NMS».

  • Поблагодарили: aleksey_t и Frank

Источник: minecrafting.ru

Что такое nms minecraft

Nikdoge’s Minecraft Server (NMS, Майнкрафт сервер Никдоге) — игровой сервер Minecraft для друзей Nikdoge и друзей друзей 🙂

Сервер основан Nikdoge в 2011 году изначально для своей группы по программированию, преподаватель которой порекомендовал Minecraft в качестве одной из интересных площадок для построения базовых логических схем.

Схема Метро NMS

Как играть

Игровой клиент

Для игры на нашем сервере необходимо установить свежую Java, и клиент Minecraft, соответствующий версии и сборке нашего сервера. Инструкцию по установке можно найти на странице Игровой клиент.

Правила

Соблюдайте правила и ведите себя адекватно, чтобы на сервере было комфортно всем игрокам.

Модификации

Моды используются для того, чтобы сделать игровой процесс комфортнее и интереснее. Например, у нас есть мод, который не позволит другому человеку играть на сервере под Вашим никнеймом, но сначала придётся зарегистрироваться простой командой.

  • QuickHomes
  • Команда «/sethome» — установить домашний портал
  • Команда «/home» — телепортироваться к домашнему порталу
  • ComputerCraft (wiki)

Метро

На сервере существует развитая транспортная система, соединяющая все основные локации.

История

Наш сервер работает с 2011 года.

Выдержка из истории, относительно игрового мира:

  • 2011.03.10 — 2012.11.10 существовала карта №1
  • 2012.11.10 — 2013.10.20 существовала карта №2
  • 2013.10.20 — 2016.12.05 существовала карта №3
  • 2016.12.05 карта №2 была восстановлена и объединена с картой №3

Таким образом в итоге получается, что на сервере был только один вайп 2012.11.10 .

Сообщество

  • Сервер Discord для голосового общения
  • Группа ВКонтакте
  • Группа Facebook (пока не особо активна)

Источник: wiki.nikdoge.ru