RubyCore — создавайте моды для Minecraft на Ruby
Многие игроки и разработчики привыкли, что моды для Minecraft пишутся исключительно на Java. Но что, если вы знаете Ruby и хотите применить свои навыки в любимой игре? Дополнение RubyCore открывает эту возможность. Это элегантный мост между миром Java и гибким, выразительным языком Ruby. Вместо того чтобы изучать десятки Java-классов, вы можете описывать логику блоков, предметов и событий на привычном Ruby-синтаксисе. RubyCore — это не просто прослойка, а полноценный инструмент, который заботится о загрузке скриптов и интеграции с Forge API.
Проект представляет собой обновлённый и поддерживаемый форк идеи, которая изначально принадлежала btripoloni. Основная цель — дать разработчикам простой способ творить, не углубляясь в дебри Java-кода. Благодаря JRuby, который интерпретирует Ruby-код внутри Java-машины, вы получаете доступ ко всем игровым API. Хотите создать блок с уникальными свойствами? Пожалуйста. Нужен предмет, который взаимодействует с игроком? Легко. RubyCore берёт на себя рутинные процессы, позволяя вам сосредоточиться на геймдизайне.
Для кого создан RubyCore и какие версии поддерживаются
Инструмент будет полезен как новичкам, которые хотят попробовать себя в моддинге, так и опытным кодерам, желающим ускорить прототипирование. Текущая версия RubyCore для Minecraft 1.16.5 требует Java 15. Однако, учитывая лёгкость прослойки, дополнение может работать и на других версиях, просто они пока не протестированы разработчиками. Основной упор сделан на Forge, так как DeferredRegister значительно упрощает регистрацию блоков и предметов.
Если вы используете лаунчер foxygame.net, то установка RubyCore для Minecraft становится ещё проще: в каталоге дополнений лаунчера можно быстро найти нужную версию и добавить её в сборку в один клик, не беспокоясь о ручном копировании файлов.
Требования и особенности запуска
Для работы вам понадобится JRuby версии 9.2.17, который уже предустановлен в репозитории и поставляется вместе с библиотекой rubyzip. Java 15 обязательна для версии игры 1.16.5. Стоит учитывать несколько нюансов, которые могут повлиять на ваш код:
- JRuby не поддерживает аннотации на Ruby-функциях, поэтому аннотацию мода придётся оставить на Java-стороне.
- Аннотации @SubscribeEvent не работают на 100% из Ruby. Решение — определить функцию process_event(event) в вашем скрипте, и RubyCore сам передаст события Forge в неё.
- Избегайте вызовов system/exec/backticks. Запуск суб-Ruby процессов внутри JRuby может негативно сказаться на производительности.
Все внутренние и внешние моды (найденные в папке mod или скопированные из внешних jar) помещаются в папку cache внутри rubycore. Это необходимо, чтобы Ruby мог загрузить файлы через функцию load.
Способы создания модов с RubyCore
Разработчики предусмотрели несколько сценариев для написания кода. Выберите тот, который удобнее именно вам.
Стандартный Forge-проект
Создайте обычный Forge-проект в Intellij, настройте mods.toml и аннотацию в главном классе. Затем создайте файл с именем mod_yourmodname.rb в папке src/main/resources. Когда вы поместите этот внешний мод в папку mods вместе с RubyCore, он просканирует наличие файлов mod_*.rb, скопирует их в кэш и загрузит.
Скрипты в папке rubycore
Вы можете создавать скрипты прямо в директории rubycore/scripts. Они будут загружены напрямую из неё. Это самый быстрый способ проверить небольшую идею, не собирая полноценный jar-файл.
Клонирование репозитория
Склонируйте репозиторий, измените mod ID в файле RubyCoreApi.java и в mods.toml. Добавьте свой Ruby-код в src/main/resources/mod. Обратите внимание: такой подход отключает загрузку внешних модов. После этого запустите gradle build для получения jar-файла.
Для тех, кто хочет быстро начать, отличным подспорьем станут примеры в src/resources/examples. Они показывают базовые конструкции, например, создание блока в Ruby выглядит так: @rubyblock = Block.new(AbstractBlock::Properties.create(Material::ROCK).hardnessandresistance(3, 10).harvestlevel(2)). JRuby автоматически конвертирует имена объектов и функций в Ruby-формат, что делает код чистым и понятным.
Возможности и ограничения
RubyCore даёт доступ ко всем Java, Minecraft и Forge API, поэтому вы можете создавать практически всё, что пожелаете. В проекте есть классы-помощники, которые оборачивают Forge API, чтобы упростить разработку. Касательно поддержки Fabric или Spigot — разработчик работает над портированием загрузчика, но пока обёртки написаны только для Forge. Вы можете внести свой вклад и помочь с реализацией других платформ.
Использование гемов технически возможно. Вы можете загрузить их через строку RubyCore::Gems::process_gems([{rubygem: "rubyzip", as: "zip"}]) в начале файла, где находятся require. Однако помните, что это вызывает суб-Ruby процесс, что не идеально для рантайма, хотя происходит только один раз при старте. Если вы используете лаунчер foxygame.net, автообновление RubyCore и проверка совместимости версий происходят автоматически, что экономит время на настройку окружения.
Часто задаваемые вопросы
Многие спрашивают, можно ли использовать Java в своих модах. Да, вы можете вызывать любые Java-классы и функции из Ruby, просто учитывайте особенности синтаксиса JRuby. Что касается зависимостей — добавляйте их в build.gradle и используйте java_import в коде. Почему Ruby? Этот язык создавался для удобства разработчика, и его выразительность позволяет писать лаконичный код. Кстати, GitHub и GitLab построены на Ruby on Rails, что доказывает его надёжность в масштабных проектах.
Если вы нашли способ вызывать функцию загрузки Ruby напрямую из jar без распаковки в кэш, разработчик готов обсудить вознаграждение. Это одна из текущих целей проекта. Вы также можете внести свой вклад через merge request на GitLab.
В итоге, RubyCore — это отличный выбор для тех, кто хочет расширить свои горизонты в моддинге Minecraft, используя Ruby. Начните с простых скриптов, постепенно переходя к полноценным модам. Как установить RubyCore? Просто поместите jar-файл в папку mods, как и любой другой мод. Скачать RubyCore можно с официального репозитория, где также доступны все исходники и документация. Удачи в творчестве!