Доброго времени суток.
Так как ни одного нормального русского тутора по добавлению своего GUI прямо в игру, хочу показать как сделать что-то простенькое, что-то вроде этого.

Моддить мы будем на чистом minecraft, без forge или ModLoader. В нашем случае во всех случаях (Чистый Minecraft, с Forge или ModLoader) все получится почти одинаково.
Я не буду долго и нудно рассказывать как начать моддить: все это есть, наверное, у нас на форуме, ну а в крайнем случае вы сможете найти туториалы в интернете, но все же.

Нам понадобятся:
MCP (выбираем нужную нам версию)
Клиент и сервер Minecraft (я даю ссылку на 1.5.1, там мы и моддим)
Так же нам понадобится JDK.
И желательно NetBeans, или Eclipse (мой выбор упал на второе).
Создадим, допустим, папку MCP, и закинем туда все файлы нашего mcp. Зайдем в эту папку, и в папку jars закинем minecraft_server.jar и папки bin и resource нашей версии minecraft.
Жмем decompile.bat, ждем. Далее (как на эклипсе) открываем эклипс, Указываем папку eclipse в папке нашего MCP, запускаем.

КАК Я ЗАРАБОТАЛ 170.000 РУБЛЕЙ НА СОЗДАНИИ ПЛАГИНОВ МАЙНКРАФТ


Если у вас получилось что-то вроде этого (левый столбец), то вы все сделали правильно. Продолжаем.

Открываем папку Client, после src. Находим пакет net.minecraft.src, открываем файл GuiIngame.java. Давайте воспользуемся поиском по нему (Ctrl + F). Вобьем в него if (this.mc.gameSettings.showDebugInfo) , нажмем поиск (Find). Увидим код.

Разберем основное.

if (this.mc.gameSettings.showDebugInfo)
this.mc.mcProfiler.startSection(«debug»);
GL11.glPushMatrix();
var8.drawStringWithShadow(«Minecraft 1.5.1 (» + this.mc.debug + «)», 2, 2, 16777215);
var8.drawStringWithShadow(this.mc.debugInfoRenders(), 2, 12, 16777215);
var8.drawStringWithShadow(this.mc.getEntityDebug(), 2, 22, 16777215);
var8.drawStringWithShadow(this.mc.debugInfoEntities(), 2, 32, 16777215);
var8.drawStringWithShadow(this.mc.getWorldProviderName(), 2, 42, 16777215);
long var36 = Runtime.getRuntime().maxMemory();
long var40 = Runtime.getRuntime().totalMemory();
long var43 = Runtime.getRuntime().freeMemory();
long var44 = var40 — var43;
String var46 = «Used memory: » + var44 * 100L / var36 + «% (» + var44 / 1024L / 1024L + «MB) of » + var36 / 1024L / 1024L + «MB»;
this.drawString(var8, var46, var6 — var8.getStringWidth(var46) — 2, 2, 14737632);
var46 = «Allocated memory: » + var40 * 100L / var36 + «% (» + var40 / 1024L / 1024L + «MB)»;
this.drawString(var8, var46, var6 — var8.getStringWidth(var46) — 2, 12, 14737632);
var47 = MathHelper.floor_double(this.mc.thePlayer.posX);
var22 = MathHelper.floor_double(this.mc.thePlayer.posY);
var23 = MathHelper.floor_double(this.mc.thePlayer.posZ);
this.drawString(var8, String.format(«x: %.5f (%d) // c: %d (%d)», new Object[] ), 2, 64, 14737632);

♨️ Основы Java | РАЗРАБОТКА ПЛАГИНОВ ДЛЯ МАЙНКРАФТ С НУЛЯ #1 | Полный курс Spigot


this.drawString(var8, String.format(«y: %.3f (feet pos, %.3f eyes pos)», new Object[] ), 2, 72, 14737632);
this.drawString(var8, String.format(«z: %.5f (%d) // c: %d (%d)», new Object[] ), 2, 80, 14737632);
var24 = MathHelper.floor_double((double)(this.mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D)
this.drawString(var8, «f: » + var24 + » (» + Direction.directions[var24] + «) / » + MathHelper.wrapAngleTo180_float(this.mc.thePlayer.rotationYaw), 2, 88, 14737632);

var8.drawStringWithShadow(«Minecraft 1.5.1 (» + this.mc.debug + «)», 2, 2, 16777215);
//Добавляем надпись Minecraft 1.5.1 (65 fps, 99 chunk updates) — как пример

Так как же создать то, что было вначале туториала? А очень просто. Изменяем нашу конструкцию на такую, чтобы в итоге получилось так.

if (this.mc.gameSettings.showDebugInfo)
this.mc.mcProfiler.startSection(«debug»);
GL11.glPushMatrix();
var8.drawStringWithShadow(«Minecraft 1.5.1 (» + this.mc.debug + «)», 2, 2, 16777215);
var8.drawStringWithShadow(this.mc.debugInfoRenders(), 2, 12, 16777215);
var8.drawStringWithShadow(this.mc.getEntityDebug(), 2, 22, 16777215);
var8.drawStringWithShadow(this.mc.debugInfoEntities(), 2, 32, 16777215);
var8.drawStringWithShadow(this.mc.getWorldProviderName(), 2, 42, 16777215);
long var36 = Runtime.getRuntime().maxMemory();
long var40 = Runtime.getRuntime().totalMemory();
long var43 = Runtime.getRuntime().freeMemory();
long var44 = var40 — var43;
String var46 = «Used memory: » + var44 * 100L / var36 + «% (» + var44 / 1024L / 1024L + «MB) of » + var36 / 1024L / 1024L + «MB»;
this.drawString(var8, var46, var6 — var8.getStringWidth(var46) — 2, 2, 14737632);
var46 = «Allocated memory: » + var40 * 100L / var36 + «% (» + var40 / 1024L / 1024L + «MB)»;
this.drawString(var8, var46, var6 — var8.getStringWidth(var46) — 2, 12, 14737632);
var47 = MathHelper.floor_double(this.mc.thePlayer.posX);
var22 = MathHelper.floor_double(this.mc.thePlayer.posY);
var23 = MathHelper.floor_double(this.mc.thePlayer.posZ);
this.drawString(var8, String.format(«x: %.5f (%d) // c: %d (%d)», new Object[] ), 2, 64, 14737632);
this.drawString(var8, String.format(«y: %.3f (feet pos, %.3f eyes pos)», new Object[] ), 2, 72, 14737632);
this.drawString(var8, String.format(«z: %.5f (%d) // c: %d (%d)», new Object[] ), 2, 80, 14737632);
var24 = MathHelper.floor_double((double)(this.mc.thePlayer.rotationYaw * 4.0F / 360.0F) + 0.5D)
this.drawString(var8, «f: » + var24 + » (» + Direction.directions[var24] + «) / » + MathHelper.wrapAngleTo180_float(this.mc.thePlayer.rotationYaw), 2, 88, 14737632);

Теперь изменим нашу последнюю конструкцию так.

>
else
drawString(var8, (new StringBuilder()).append(«X: «).append((int)mc.thePlayer.posX).toString(), 6, 51, 0xe0e0e0);
drawString(var8, (new StringBuilder()).append(«Y: «).append((int)mc.thePlayer.posY).toString(), 6, 61, 0xe0e0e0);
drawString(var8, (new StringBuilder()).append(«Z: «).append((int)mc.thePlayer.posZ).toString(), 6, 71, 0xe0e0e0);
>

Почему так? На мой взгляд такой вывод координат удобнее, чем тот, который был указан выше в нашем первоначальном коде.
Давайте разберем часть кода.

drawString(var8, (new StringBuilder()).append(«Y: «).append((int)mc.thePlayer.posY).toString(), 6, 61, 0xe0e0e0);
//var8 — наш fontrenderer
//.append(«Y: «).append((int)mc.thePlayer.posY) — выводим наши координаты в текст на экран
//6, 61 — координаты, начиная от левого верхнего угла. 6 — слева, 61 — сверху.
//0xe0e0e0 — цвет. Как сделать свой — читать в конце тутора.


Теперь у нас получилось это.

Читайте также:  Что делать если Майнкрафт долго грузится

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

drawString(var8, (new StringBuilder()).append(«Shadow Tutorial»).toString(), 6, 2, 0xefd334);
Теперь давайте попробуем вывести на экран свой ник. Добавим это в наш код, а так же разберем.

drawString(var8, mc.thePlayer.username, 6, 19, 0xe0e0e0);
//Часть уже разобрана
//mc.thePlayer.username
//mc — так зареган наш minecraft.java вначале файла
//username — что выводим из thePlayer. Там можно вывести многое. К примеру, ссылку на скин

Теперь пришло время картинки. Добавляем это в наш код, а так же разбираем.

GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
this.mc.renderEngine.bindTexture(«/gui/topgui.png»);
this.drawTexturedModalRect(this.width=0 / 2, this.height=-70 / 2, 0, 0, 100, 200);
GL11.glDisable(GL11.GL_BLEND);
//С помощью GL11 мы добавляем полупрозрачность. Если убрать его — полупрозрачные картинки работать не будут!
//topgui.png — имя нашей картинки в . bin/minecraft.jar/gui.
//this.width=0 / 2, this.height=-70 / 2 — смещение (отрицательное число тоже можно)
//100, 200 — какая часть картинки видна (ширина, высота) (ВСЕ КАРТИНКИ ДОЛЖНЫ БЫТЬ 256х256, НЕ смотря на эту строчку)

Чтобы показать, что можно использовать координаты в минус, я взял картинку больше, чем нужно, и сместил ее вверх. Получилось то, что нужно. Сама картинка.

И так, у нас получилось то, что мы и хотели.
Теперь: как сделать цвет?
Скажем так. Html color: ff0000 , 0000ff , ffffff
Цвета в наш код: 0xff0000 , 0x0000ff , 0xffffff (не удивляйтесь, что оно может измениться)

Спасибо за просмотр. Будут вопросы — задавайте.
P.S. Простите за то, что вместо code использовал quote. Дело в том, что если использовать code, то страница порвется так, что будет совершенно неудобно закрывать контейнеры, да и вообще потеряетесь
P.S.S. Картинка вначале темы немного неверна. Там вместо fps выводится fps + chunks update (или как там). Изменить можно в minecraft.java.

Источник: forum.minecraft-galaxy.ru

Fabric Wiki

Если вы хотите начать разработку модов с использованием Fabric, возможно, некоторые статьи могут вас заинтересовать.

Подготовка

Эти страницы помогут вам настроить среду разработки и полуавтоматические выпуски.

Основы

Эти страницы являются обязательными для чтения при разработке модов. Если вы новичёк, то рекомендуется прочитать следующее.

Терминология
Инструменты для разработки

Продвинутым

Предметы

Блоки

Эти страницы помогут вам создать блоки, хранить предметы и данные в блоках, а также создавать модели и состояния блоков.

Генерация данных

Эти страницы помогут вам с Fabric Data Generation API, который генерирует файлы JSON с помощью генераторов данных.

Генерация мира

Команды

Эти страницы помогут вам с библиотекой Brigadier от Mojang, которая позволяет создавать команды со сложными аргументами и действиями.

События (Ивенты)

Сущности

Жидкости

Миксины

Эти страницы помогут вам в использовании библиотеки Mixin от SpongePowered, которая является очень сложной темой. Мы рекомендуем вам внимательно прочитать эти страницы.

Разное

Некоторые из этих страниц в настоящее время находятся в стадии написания, некоторые могут быть недоступны.

Yarn

Помощь в разработке Fabric

Процедура изменения Fabric — или как сделать так, чтобы предложенное Вами изменение внесли (или наоборот!)

FabLabs — тестовая площадка для макетирования новых возможностей Fabric без создания pull-запроса

Ищете старые туториалы? Вероятно, они были заархивированы. Вы можете просмотреть архивные страницы здесь.

ru:tutorial:setup

Table of Contents

Настройка среды разработки модов

Обязательно нужно

Java Development Kit (JDK) для Java 17 (рекомендуется) или новее. Чтобы установить его, зайдите на https://adoptium.net/releases.html.

Если вы профессионал, вы можете получить JDK здесь, который необходимо извлечь и настроить системные переменные вручную.

Любая Java IDE, например Intellij IDEA или Eclipse. Вы также можете использовать любые другие редакторы кода, такие как Visual Studio Code.

Если вы не знакомы ни с одним из них, мы рекомендуем использовать Intellij IDEA, поскольку это то, что большинство людей выбирают для моддинга.

Плагин MinecraftDev IntelliJ IDEA

Если вы используете IntelliJ IDEA, вы можете использовать плагин MinecraftDev. Этот плагин добавляет поддержку автоматического создания проектов Fabric, а также некоторых функций, связанных с mixin, таких как проверки, генерация accessors/shadow полей и копирование целевых ссылок Mixin (дескрипторов JVM). Плагин можно найти в репозитории плагинов IntelliJ, таким образом, вы можете установить его с помощью внутреннего браузера плагинов IntelliJ, перейдя в File → Settings → Plugins, затем перейдите на вкладку Marketplace и выполните поиск по слову Minecraft.

Ручное управление

Скопируйте начальные файлы fabric-example-mod (или версию для Kotlin, если вы хотите использовать Kotlin), за исключением файлов LICENSE и README.md , так как они нужны только для самого шаблона и не обязательны для Вашего мода.

Отредактируйте gradle.properties :
Установите полям archives_base_name и maven_group ваши предпочтительные значения.

Не забудьте обновить версию Minecraft, маппингов, Loom и Loader, — все это может быть запрошено через https://fabricmc.net/develop/ — чтобы соответствовать версиям, на которые вы настроены.

Читайте также:  Как пользоваться цистерной края в Майнкрафт

Добавьте в build.gradle иные зависимости, которые Вы планируете использовать.

Импортируйте файл build.gradle в вашу среду разработки. Вы можете обратиться к следующему разделу для получения информации о конкретных IDE.

Счастливой разработки!

Если вы не можете использовать плагин MinecraftDev или fabric-example-mod, вы также можете использовать GeneratorFabricMod от ExtraCrafTX, удобный инструмент для автоматического создания новых модов Fabric из шаблона. Выполните следующие действия:

Скачайте последнюю версию GeneratorFabricMod здесь и извлеките его.

Создайте новый каталог, затем запустите там командную строку и введите path/to/GeneratorFabricMod/bin/GeneratorFabricMod .

После того как он получит свои зависимости, следуйте инструкциям и введите необходимую информацию.
Теперь все готово, просто откройте папку проекта в вашей IDE.

IntelliJ IDEA

Если вы используете IntelliJ IDEA от JetBrains, пожалуйста, выполните следующие действия:

В главном меню IDEA, выберите ‘Import Project’ (или File → Open… если у вас уже есть открытый проект).

Выберите файл build.gradle проекта, чтобы импортировать его.

После того как Gradle закончит настройку, закройте проект (File → Close Project) и снова откройте, чтобы исправить неверное отображение конфигураций запуска.

(Если конфигурации запуска по-прежнему не отображаются, попробуйте повторно импортировать проект Gradle с вкладки Gradle в IDEA.)

Необязательно, но рекомендуется: По умолчанию IntelliJ делегирует Gradle для создания проекта. Это не требуется для Fabric и, помимо прочих проблем, приводит к увеличению времени сборки и странностям, связанным с горячей заменой. Чтобы сделать это, используйте встроенный компилятор:

Откройте диалоговое окно ‘Gradle Settings’ на вкладке Gradle.
Измените поля ‘Build and run using’ и ‘Run tests using’ на ‘IntelliJ IDEA’.

Перейдите в File → Project Structure → Project и установите ‘Project compiler output’ на $PROJECT_DIR$/out .

К сожалению, в настоящее время невозможно установить значение IDE по умолчанию для параметров ‘Build and run using’ и ‘Run tests using’, поэтому эти шаги должны повторяться для каждого нового проекта.

ПРИМЕЧАНИЕ: Не запускайте задачу gradle ./gradlew idea , так как это портит gradle и нарушает среду разработки.

Eclipse

Если вы используете Eclipse и хотите, чтобы IDE запускала конфигурации, вы можете запустить gradlew eclipse . Затем проект можно импортировать как обычный (не gradle) проект Eclipse в вашу рабочую область, используя меню ‘File’ — ‘Import…’, затем ‘General’ → ‘Existing Projects into Workspace’.

Visual Studio Code

Если вы используете VSCode, следуйте этим инструкциям

Генерация Minecraft исходников

Чтение исходного кода Minecraft является неотъемлемой частью моддинга. К сожалению, мы не можем опубликовать исходный код Minecraft, потому что это нарушает лицензионное соглашение Minecraft. Вам нужно самостоятельно сгенерировать исходный код Minecraft.

Чтобы сгенерировать исходный код Minecraft. запустите задачу gradle genSources . Если ваша IDE не имеет интеграции с gradle, выполните следующую команду в терминале: gradlew genSources (или ./gradlew genSources в Linux/macOS). Это может занять некоторое время, в зависимости от мощности вашего компьютера. Возможно, вам потребуется обновить gradle после выполнения задачи.

Смотрите Чтение исходного кода Minecraft о том, как прочитать исходный код.

Приступаем к работе

Совет

Хотя Fabric API не является строго необходимым для разработки модов, его основная цель обеспечить кросс-совместимость, где этого не делает игровой движок, и поэтому он настоятельно рекомендуется! Даже некоторые учебники в вики неявно требуют Fabric API .

Иногда при разработке fabric-loom (нашего плагина Gradle build) могут возникать проблемы, требующие сброса файлов кэша. Это можно сделать, запустив gradlew cleanloom . Запуск gradlew —stop также может помочь с несколькими редкими проблемами.

Не стесняйтесь задавать вопросы! Мы здесь, чтобы помочь вам и работать с вами, чтобы сделать ваш мод мечты реальностью.

Диагностика

Отсутствующие звуки

Иногда при импорте проекта Gradle в IDE ресурсы могут загружаться неправильно. В этом случае запустите задачу downloadAssets вручную — либо с помощью встроенного меню IDE, либо просто запустив gradlew downloadAssets .

ru/tutorial/setup.txt · Last modified: 2022/02/25 21:10 by furnygo

Page Tools

Except where otherwise noted, content on this wiki is licensed under the following license: CC Attribution-Noncommercial-Share Alike 4.0 International

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

Разработка плагинов Bukkit. «Заставляем» клиент перейти по ссылке

Разработка плагинов Bukkit. «Заставляем» клиент перейти по ссылке

2012-04-23 в 9:49, admin , рубрики: bukkit, java, minecraft, plugin, метки: bukkit, java, minecraft, plugin

Позавчера, когда нечего было делать, пришла в голову мысль о том, как можно интересно организовывать ивенты на серверах minecraft. Веселые «крысиные» бега это очень интересно и даже местами забавно, но больше интересно это для админов, наблюдать с высоты как копошатся внизу игроки и кидать им хлеб и мясо. Во время подобных ивентов ЧСВ организаторов поднимается до over 9000. Я, лично, подобные мероприятия недолюбливаю (странно, да?).

Читайте также:  Майнкрафт превью что это

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

Задание не архисложное, но за минуту я до него не дошел. Была безумная идея менять что либо в обмене данными сервер-клиент. Но потом, пришла в голову более простая, но, как мне кажется, более красивая идея.

Самый простой способ обмена информацией между клиентом и сервером — это чат. Так что нет смысла изобретать велосипед, если все у же есть. Просто отсылаем игроку сообщение вида: LINK: example.com, в клиенте это обрабатывается и в случае если строка не подходит отправляет ее в чат, если же пришла ссылка, то открывается страничка. Работает все в связке мод-плагин.

Скриншот

Первое за что я взялся — это клиент, тут мне казалось организовать процесс более сложным. Я ошибался, так как найти место, где обрабатывается чат, было минутным делом. К делу:

Нужно декомпилировать клиент при помощи MCP и в файле net.minecraft.src.ChatLine производить все изменения. Первое, что я добавил — функцию для перехода по ссылке:

private void openLink(String link) < try < Process p = Runtime.getRuntime().exec(«rundll32 url.dll,FileProtocolHandler » + link);//вызов rundll32 >catch (IOException e) < e.printStackTrace(); >>

Я думаю, что вопросов тут возникнуть не должно. И чуть не забыл, код предназначен для Windows, что бы обеспечить универсальность нужно использовать класс Desctop, но этот способ требует подключения дополнительных библиотек.

import java.net.URI; import java.net.URISyntaxException; import java.awt.Desktop;
private void openLink(String link) < Desktop desktop; if (Desktop.isDesktopSupported()) < desktop = Desktop.getDesktop(); if (desktop.isSupported(Desktop.Action.BROWSE)) < URI uri; try < uri = new URI(link); desktop.browse(uri); >catch (IOException ioe) < ioe.printStackTrace(); >catch (URISyntaxException use) < use.printStackTrace(); >>

С переходом разобрались, теперь нужно отфильтровать из потока чата нужную нам ссылку. Плагин будет отсылать код типа LINK: dmwatson.ru:

Фильтрующую процедуру я описал так:

public String ParseLink(String Str2parse) < if(Str2parse.startsWith(«LINK: «))//если строка начинается с LINE:, то < openLink((String) Str2parse.subSequence(«LINK: «.length(), Str2parse.length()));//открывает ссылку в броузере return «Opening page » + (String) Str2parse.subSequence(«LINK: «.length(), Str2parse.length());//и показывает об этом сообщение >return Str2parse;//иначе просто возвращаем строку как есть. > Далее просто цепляем ParseLink в ChatLine: public ChatLine(String par1Str)

Всё. С клиентом закончено.

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

Но на всякий случай серверную часть я тоже опишу. Суть плагина:

Пишем на табличке в первой строке [LINK], далее на трех строках ссылку (знаков там мало, но bit.ly никто не отменял). Так что приступаем. Плагин будет очень простым, так как сложности мне не нужны. Так что к делу.

Первым делом я создаю файл Main.java. Он у меня один на все плагины, меняются вызовы и прочее, но часть стандартных функций всегда со мной.

Плагин будет называться LinkSender, через пару дней, когда я его доделаю, отправлю на dev.bukkit.org, пока же опишу его тут.

Итак, любой плагин начинается с plugin.yml:

name: LinkSender main: ncc.ls.Main author: Dale Martin Watson website: http://nextcraft.ru version: 0.0.1 description: Send link to client. commands: lsend: description: Send link to all. usage: «/lsend http://nextcraft.ru» permissions: ls.*: description: Allows you to use all the functions. default: op ls.send: description: Allows you to send link to all users. default: op ls.create: description: Allows you to create sign. default: op

Далее, как я указал во второй строке plugin.yml, создаю класс Main в пакете ncc.ls.

Он наследуется от JavaPlugin и содержит две стандартные функции onEnable и onDisable, а также две функции для отправки сообщений в консоль и чат от имени плагина, и одна для отправки ссылки.

В onEnable регистрируется три обработчика для трех событий:

Отправка в чат администратором команды /lsend example.com;
Установка таблички;
Правый клик по табличке;
Для проверки введенных URL’ов также нужна функция. ncc.ls.Validator:

package ncc.ls; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Validator < public static boolean validURL(String URL) < Pattern pattern = Pattern.compile(«(https?://([a-zA-Z0-9]+.)+[a-zA-Z0-9]((/[a-zA-Z0-9%-]*)*|?(([a-zA-Z0-9%-]* = [a-zA-Z0-9%-]); Matcher matcher = pattern.matcher(URL); return matcher.matches(); > >

Далее просто ставим табличку, вписываем URL и пользуемся. Естественно, что использовать можно для чего угодно, от ивентов, до голосований в топах. Удачи.

P.S. Статья писалась не для профессиональных java-программистов, так как я сам еще новичок и код может смотреться некрасиво, возможно нерационально, с радостью приму все замечания и пожелания.

Источник: www.pvsm.ru