Перейти к содержимому
eu_tomat

Путь от нуля до разработчика OpenComputers

Рекомендуемые сообщения

Эта тема посвящена описанию моего будущего опыта разработки мода OpenComputers.

Моя цель:

Усовершенствовать механизм управления нагрузкой, создаваемой пользовательскими Lua-скриптами, сделав мод OpenComputers ещё более дружественным к серверу. Программа максимум: протолкнуть своё предложение по изменению репозитория OpenComputers.

Что я имею:

  • Неплохо понимаю и нахожу алгоритмы.

  • Пробовал кодить на куче языков, хотя опыт и небольшой.

  • Улавливаю смысл кода на распространённых языках программирования без детального изучения их синтаксиса.

  • В целом я освоил Lua.

  • Пролистал книгу «Java за 21 минуту».

  • Почитал документацию git.

  • Несколько раз читал исходники OpenComputers и даже смог найти ответы на интересующие меня вопросы.

  • Есть желание получить новый опыт.

Чего я не имею на данный момент:

  • Я ещё не привык к синтаксису Java.

  • Синтаксис Scala я вообще не изучал, и понимаю не все конструкции кода.

  • Я никогда не использовал корутины в Lua.

  • Я не знаю полностью всего процесса сборки OpenComputers из исходников.

  • Как отлаживать моды – я вообще не знаю.

  • Я ничего не знаю о протоколах общения с разработчиками.

  • Я с трудом (и с гуглопереводчиком) пишу по-английски.

В чём смысл этой темы?

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

 

Поэтому я предлагаю альтернативу. У меня есть довольно объёмная задача, но значительная часть необходимых для её решения навыков у меня отсутствует. Зато есть желание научиться чему-то новому. Дедлайн назначать я не буду, т. к. слабо представляю, сколько времени у меня займёт та или иная задача, и пока не знаю, как мне удастся совмещать их решение с другими занятиями, не имеющими отношения к данной теме.

Алгоритм обсуждения предлагаю такой:

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

 

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

  • Нравится 1
  • Одобряю 2
  • В шоке 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

О, наполеоновский план. Одобряю :D

 

1 час назад, eu_tomat сказал:

Я ничего не знаю о протоколах общения с разработчиками.

Мы все люди. Так что основной протокол - вежливость и взаимоуважение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, eu_tomat сказал:

Эта тема посвящена описанию моего будущего опыта разработки мода OpenComputers.

Дело это муторное, пулл реквесты могут годами не проходить...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сначало люди разрабатывали программы для OpenComputers.

Теперь они делают сам OpenComputers.

 

Эволюция человечества.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Задача:

Исполнить какой-нибудь простой код, написанный на Java.

Мой путь к решению:

В первом попавшемся поисковике я набираю фразу «java helloworld» и почти сразу нахожу какой-то код:

class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

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

 

В тех же статьях про хелоуворлды обычно говорится, как этот код скомпилировать и запустить. Если в найденной статье об этом не сказано, поможет поисковой запрос «java compilation command». Также ничто не мешает совершать поисковые запросы и на русском или любом другом языке, например «запустить первую программу на java». Как правило, базовые знания доступны на множестве разных языков.

 

При запуске javac я получил ошибку об отсутствии такого приложения, а также информацию о том, в каких пакетах его можно найти. Не мучаясь выбором, произвожу установку пакета по умолчанию:

# apt install default-jdk

Теперь javac успешно запускается, и я перехожу к компиляции кода:

$ javac HelloWorld.java

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

$ java HelloWorld
Hello World!

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

Результат:

Я смог скомпилировать и запустить на выполнение свой первый код, написанный на Java. Дверь в разработку на Java открыта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
25 минут назад, eu_tomat сказал:

Задача:

Исполнить какой-нибудь простой код, написанный на Java.

Мой путь к решению:

В первом попавшемся поисковике я набираю фразу «java helloworld» и почти сразу нахожу какой-то код:


class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

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

 

В тех же статьях про хелоуворлды обычно говорится, как этот код скомпилировать и запустить. Если в найденной статье об этом не сказано, поможет поисковой запрос «java compilation command». Также ничто не мешает совершать поисковые запросы и на русском или любом другом языке, например «запустить первую программу на java». Как правило, базовые знания доступны на множестве разных языков.

 

При запуске javac я получил ошибку об отсутствии такого приложения, а также информацию о том, в каких пакетах его можно найти. Не мучаясь выбором, произвожу установку пакета по умолчанию:


# apt install default-jdk

Теперь javac успешно запускается, и я перехожу к компиляции кода:


$ javac HelloWorld.java

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


$ java HelloWorld
Hello World!

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

Результат:

Я смог скомпилировать и запустить на выполнение свой первый код, написанный на Java. Дверь в разработку на Java открыта.

Лучше IDE поставь. Например Intellij Idea - фаворит среди разработчиков на жаве, скале, котлине и андроид, под андроид называется по другому, но движок тот же.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@eu_tomat респект, что начинаешь с самых основ.

Но чисто с практической точки - удобства написания кода - проще скачать IDE.

 

Самая простая и удобная для работы скорее всего будет IntelliJ IDEA, которую Нео упомянул.

Можно взять коммьюнити версию здесь: https://www.jetbrains.com/idea/download/#section=linux

 

Минусы:

* будет жрать 2 гига оперативы

* надо будет ознакомиться с базами интерфейса

 

Плюсы:

* запуск и компиляция кода одной кнопочкой (ощутимо полезно по мере усложнения программы, когда она выйдет за пределы одного файла)

* анализ кода (IDE будет подсказывать ошибки, даст автодополнение, возможность перемещаться по коду к месту определения нужных тебе предметов, удобно переименовывать переменные, методы и прочее, и так далее)

* более сложные инструменты, которые тебе будут нужны для работы с модом OpenComputers - например, система сборки Gradle, достаточно безболезненно и беспроблемно интегрированы в IDE, и тоже вызываются одной кнопочкой

* в случае IntelliJ IDEA в комплекте будет идти очень удобный Git клиент (неоценимая штука для более сложных манипуляций с гитом чем git commit -am & git push)

* дебаггер (точки останова, возможность посмотреть значение переменных в момент выполнения, стек вызовов, выполнять код пошагово и т.п.)

* Scala в комплекте (при первом запуске, или позднее, надо убедиться что плагин Scala установлен, либо установить). Поскольку мод OpenComputers на 90% состоит из Scala - очень полезно. Тоже интегрировано бесшовно, тоже даёт анализ кода и прочие плюшки. Очень полезно для изучения языка, который слегка сложнее чем plain Java.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
21 час назад, ArtHacker сказал:

Сначало люди разрабатывали программы для OpenComputers.

Теперь они делают сам OpenComputers.

 

Эволюция человечества.

Похоже на отсылку к моему же посту:

В 07.09.2019 в 14:42, eu_tomat сказал:

Таковы этапы эволюции:

  • Кирилл хочет, чтобы кто-то написал игру для него;
  • Артур хочет сам написать OpenComputers Studio для других;
  • Игорь уже написал MineCode IDE.

Да, хорошее напоминание, во что может выродиться эта тема, если я потеряю мотивацию продолжать этот путь.

 

Я не смогу съесть этого мамонта за один раз целиком, поэтому продолжу придерживаться простой тактики: я выбираю микрозадачу, выполняю её и фиксирую результат. Задачу выбираю не слишком крупную, чтобы во-первых, не терять мотивацию во время её решения, а во-вторых, чтобы детали решения успели сохраниться в памяти к моменту отчёта о проделанной работе. Также задача должна быть и не слишком мелкой, чтобы во-первых, я мог прочувствовать удовлетворение достигнутым результатом, а во-вторых, чтобы не плодить крошечные отчёты по малейшему поводу.

 

IntelliJ IDEA я установлю обязательно. Мне эту IDE первым рекомендовал @Fingercomp в приватной беседе. А теперь @NEO и @Totoro.

@Totoro вообще отлично всё расписал.

 

Но мне казалось, что сначала следовало убедиться в том, что я в принципе могу компилировать и запускать программы на Java, и лишь затем думать об удобствах. Что мне даст IDE на текущем этапе, я пока не знаю. И мне кажется, что начав с изучения IDE, я рискую не почувствовать никаких преимуществ от проделанной работы и потерять мотивацию.

 

Сейчас я вижу две ближайшие задачи, для решения которых IDE не требуется:

  • Найти готовые исходники какого-то простого мода на Java, без всяких там Scala и Lua, собрать его по инструкции и запустить.
  • Вникнуть в азы Scala и также скомпилировать какой-нибудь хелоуворлд и поиграться в нём с конструкциями языка.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Totoro сказал:

Но чисто с практической точки - удобства написания кода - проще скачать IDE.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 часов назад, eu_tomat сказал:

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

IDE даёт возможность проще и быстрее получить результат, и соответственно "награду" за усилия.

Плюс даёт возможность изучать не флаги компилятора, а собственно язык.

 

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

А главное, что это потом не пригодится, потому что 100% работы с Java (и Scala) идёт через IDE.

 

Но это конечно дело вкуса.

 

6 часов назад, eu_tomat сказал:

Найти готовые исходники какого-то простого мода на Java, без всяких там Scala и Lua, собрать его по инструкции и запустить.

Моды на майнкрафт - не самый простой проект с архитектурной точки зрения.

Это уже не чистая Java, а Java с зависимостями.

Практически во всех нормальных модах работа с зависимостями идёт через утилиту под названием Gradle.

 

Вообще она неплохо интегрирована в IDE (для создания мода никаких детальных знаний не требуется), но в духе начинания с основ, рекомендую пролистать документацию.

https://docs.gradle.org/current/userguide/userguide.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да, кстати, под 1.7.10 форж протух и надо писать свой билд скрипт или искать, так же надо версию апать, это если что про gradle.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, NEO сказал:

под 1.7.10 форж протух и надо писать свой билд скрипт или искать

Достаточно в ./gradle/wrapper/gradle-wrapper.properties поменять версию на gradle-2.6 и все заработает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Первые шаги в Gradle

   

Задача:

Найти исходник простейшего мода для Minecraft 1.7.10, скомпилировать его, проверить в работе, внести какие-нибудь правки в код и так же проверить в работе.

Мой путь к решению:

Поисковая фраза «minecraft mod 1.7.10 template» приводит меня к репозиторию https://github.com/RoBrit/Mod-Template

 

Удача! В описании есть подробная инструкция. Автор кривовато сверстал внутренние ссылки в оглавлении документа, но чтению это не помешает.

 

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

 

Первые три пункта инструкции, связанные с установкой JDK, я уже выполнил, решая предыдущую задачу. Далее следует установка gradle и проверка его работоспособности:

# apt install gradle
$ gradle
...
Welcome to Gradle 2.10.
...

Чтобы мои действия не превратились в полное шаманство, я почитал, что такое Gradle (https://ru.wikipedia.org/wiki/Gradle). Как я понял, это некий аналог классического make, но значительно более функциональный. Похоже, именно Gradle будет управлять сборкой мода. Самой полезной на данный момент мне показалась команда gradle tasks, упростившая моё первое знакомство с Gradle.

 

Далее инструкция предлагает установить Git, скачав его. Я пойду чуть иным путём, установив его из репозитория Linux:

# apt install git

Git – это система контроля версий. Скоро пригодится нам для клонирования репозитория, но самое интересное начнётся при решении последующих задач.

 

Следуя инструкции, я создаю каталог для своих экспериментов, и, находясь в нём, клонирую репозиторий и сразу перехожу во вновь созданный каталог с локальным репозиторием:

$ git clone https://github.com/TheRoBrit/Mod-Template.git
$ cd Mod-Template

Инструкция предлагает взглянуть на получившуюся структуру каталогов клонированного репозитория, и я воспользовался командой tree. Результат оказался идентичным приведённому в инструкции.

 

А теперь самое интересное. Если я верно понял документацию, следующая команда подготавливает минимальное окружение для сборки мода. Не совсем ясно, что такое «CI Servers». Вероятно, это сервера, выполняющие сборку проектов автоматически.

$ gradle setupCiWorkspace
...
BUILD SUCCESSFUL

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

$ gradle build
...
BUILD SUCCESSFUL

Придерживаясь инструкции, я нахожу собранный файл в каталоге ./build/libs/

$ ls ./build/libs
ModTemplate-1.8-1.5.07.29a-deobf.jar
ModTemplate-1.8-1.5.07.29a.jar
ModTemplate-1.8-1.5.07.29a-source.jar

Копирую файл только что собранного мода в папку с модами Майнкрафта:

$ cp ./build/libs/ModTemplate-1.8-1.5.07.29a.jar ~/.minecraft/mods/AAA.jar

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

 

Запускаю Minecraft, нажимаю кнопочку Mods, листаю список модов, но не нахожу ничего похожего на ModTemplate или AAA. Проверяю загрузку старого сохранения – работает. Но следов нового мода я не вижу.

 

Проверяю, оставил ли этот мод какие-либо следы в логах Майнкрафта:

$ grep --include=*.log -lire ModTemplate ~/.minecraft
... пусто
$ grep --include=*.log -lir AAA ~/.minecraft
... есть какие-то логи

Теперь проверяю более подробно в наиболее интересном для меня логе:

$ grep -A10 -B10 AAA ~/.minecraft/logs/fml-client-latest.log

Так как смысла многих сообщений в логе я не понимаю, сравниваю найденные сообщения с аналогичными сообщениями для других модов.

Самом интересным мне показалось такое сообщение:

FML has found a non-mod file AAA.jar in your mods directory. It will now be injected into your classpath. This could severe stability issues, it should be removed if possible.

Майнкрафт не считает этот файл модом. С другой стороны, в логе присутствует аналогичное сообщение и для CodeChickenLib-1.7.10-1.1.3.138-universal.jar, что не помешало ему оказаться в списке модов.

 

Что могло пойти не так? Скорее всего, этот шаблон мода не содержит даже минимального контента. А значит, этот контент требуется создать. А может быть, причина в чём-то ещё. На всякий случай я подведу промежуточный итог и возьму паузу.

Промежуточный результат:

Я смог найти шаблон мода и скомпилировать его. Майнкрафт не воспринял его как мод, но я смог получить первый опыт работы с Gradle.

Ближайшие направления для работы:

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

  2. Найти готовые исходники простого мода и скомпилировать их.

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

Изменено пользователем eu_tomat
форматирование

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, hohserg сказал:

Достаточно в ./gradle/wrapper/gradle-wrapper.properties поменять версию на gradle-2.6 и все заработает

У нас не так всё просто... там еще поддержку http отключили в репозиториях.

Мы еще используем другой плагин для форджа - для возможности использовать более свежую версию gradle, так как старые версии не работают с новой idea.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У тебя есть forge mdk 1.7.10 с forgegradle 3?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@eu_tomat самый простой способ получить пустой темплейт мода - это последовать инструкциям,

которые даются в документации к Minecraft Forge.

https://mcforge.readthedocs.io/en/1.14.x/gettingstarted/


Так у тебя будет гарантировано рабочий и современный код.

(Темплейт который ты взял на github - дико древний.)

 

Вообще дока Forge очень неплохое место для старта. Там тебя как раз познакомят с базами создания модов под Minecraft.

Создание и развёртка проекта через Gradle (для разных IDE тоже есть инструкции), блоки, предметы, tile entity и так далее. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Первые шаги в освоении моддинга

Задача:

Найти исходник простейшего мода для Minecraft 1.7.10, скомпилировать его, проверить в работе, внести какие-нибудь правки в код и так же проверить в работе.

Мой путь к решению:

Формулировка задачи полностью скопирована из предыдущей. Но теперь я пойду немного иным путём. Буду искать не шаблон, а готовый мод. Желательно, чтобы его код был простым для изучения. Для поиска буду использовать фразу «1.7.10 simple mod site:github.com». Насколько найденные моды окажутся простыми, я не знаю. Буду читать код и пытаться разобраться.

 

Первой меня заинтересовала ссылка на мод https://github.com/BlayzerQ/MacrosMod. Не знаю, что это такое, вроде бы код для клавиатурных макросов. Инструкции по установке нет, но теперь я использую опыт решения предыдущей задачи. Запускаю уже привычные команды, лишь подставляя в них лишь требуемые сейчас ссылки, имена каталогов и файлов:

$ git clone https://github.com/BlayzerQ/MacrosMod.git
$ cd MacrosMod
$ gradle setupCiWorkspace
$ gradle build
$ ls ./build/libs
  MacroMod-1.0.jar
$ cp ./build/libs/MacroMod-1.0.jar ~/.minecraft/mods/AAA2.jar

Майнкрафт успешно запустился, показал в списке модов MacroMod 1.0, и загрузил сохранение игры. Теперь настало время почитать код этого мода. Насколько я понял, мод позволяет создавать клавиатурные макросы для быстрого набора в чате. Скудненько. Скучненько. Нужно что-то поинтереснее, с какими-нибудь крафтами, например.

 

Пробежав по другим ссылкам, почитав описания и полистав коды, я решил исследовать мод на игровые деньги: https://github.com/Ionaru/Currency. Снова запускаю привычные команды:

$ git clone https://github.com/Ionaru/Currency.git
$ cd Currency
$ gradle setupCiWorkspace
$ gradle build
$ ls ./build/libs
  currency-1.7.10 - 1.2.jar
$ cp './build/libs/currency-1.7.10 - 1.2.jar' ~/.minecraft/mods/AAA3.jar

Майнкрафт видит мод, в креативном режиме появилась вкладка валют. Похоже, это те самые деньги, что были у нас на EvilCraft! Количество строк кода небольшое. Можно использовать как учебное пособие. Настало время попробовать внести в код мода свои правки.

 

Как насчёт смены названий? Например, изменить Penny на Penny1, а DoublePenny на DoublePenny2? Это оказалось легко. Я просто открыл файл Currency.java и заменил в нём соответствующие строки. Правда, потом пришлось соответственно переименовать и файлы с текстурами. Это я выяснил уже после первого пробного запуска откомпилированного мода. Для проверки результа изменений в коде я последовательно выполняю две команды для компиляции и копирования файла мода в папку Майнкрафта:

$ gradle build
$ cp './build/libs/currency-1.7.10 - 1.2.jar' ~/.minecraft/mods/AAA3.jar

 

Что дальше? Попробовать изменить крафт? Легко! Теперь из монеты в два пенни можно скрафтить три монеты в один пенни. Для этого я просто чуть изменил строку, регистрирующую крафт:

GameRegistry.addShapelessRecipe(new ItemStack(Penny, 3), DoublePennyStack);

 

Теперь я попробую усложнить задачу. Добавлю крафт яблока из монеты в один пенни. Но как это сделать? В каком классе искать это яблоко? Поиск по фразе «GameRegistry.addShapelessRecipe apple» приводит меня к простому решению:

GameRegistry.addShapelessRecipe(new ItemStack(Items.apple, 2), Penny );

Компилятор ругнулся на неизвестный ему класс Items, и я добавлю его по аналогии с уже использующимся классом Item:

import net.minecraft.item.Item;
import net.minecraft.init.Items;

Это сработало.

 

Но это тоже было слишком просто. Для наработки практики требуется что-то посложнее. Что ещё можно попробовать? А пусть монеты в один пенни будут служить топливом в обычной печке! Фраза «minecraft modding furnace fuel» привела меня к наброскам решения, но я не сразу понял, как их правильно применить.

 

Пришлось вникать в неизвестные мне нюансы Java и Forge. Очень загадочным мне показался символ «@», и поисковики тоже не сразу поняли, какую я от них требую информацию. В конечном итоге я пришёл к фразе «java at sign». Так я узнал про аннтоации в Java.

 

Вот код, позволяющий сжигать монету в печи:

public class FuelHandler implements IFuelHandler {

  @Override
  public int getBurnTime(ItemStack fuel) {
    if(fuel.getItem() == Currency.Penny)
      //return 24*60*60*20;
      //return 0xFFFF;
      return 0x7FFF;
    return 0;
  }
}

Эксперименты с новым топливом привели меня к неожиданному открытию. Как видно по коду, сначала я пытался задать время горения монеты равным реальным суткам. Но после первого же выхода из игры и повторного входа я узнал, что остаток времени горения уже подожжённого в печи топлива резко уменьшился. Я предположил, что проблема связана с низкой разрядностью хранимого числа. Указав время горения равным 0xFFFF, и скомпилировав мод, я загрузил печь топливом, сделал сохранение игры, вышел и загрузил сохранение. Время горения в печи стало отрицательным.

 

Теперь я, кажется, понял. Время горения топлива можно задать очень большим, в пределах числового типа int. И топливо, скорее всего, будет гореть всё положенное ему время, если не произойдёт перезагрузка сервера. То ли во время сохранения, то ли при загрузке сохранения остаток времени горения уже подожжённого топлива будет обрезан до типа short с максимальным значением 0x7FFF. Можно ли этим управлять, я пока не знаю. Скорее всего, нет. Полагаю, это очередная особенность Майнкрафта, с которой придётся как-то жить, и учитывать её при создании модов.

Результат:

Я смог внести изменения в уже готовый мод и успешно использовать их в игре. Я углубил своё знание Java и чуть-чуть познакомился с устройством Forge и Minecraft. Также я узнал о неочевидной механике горения топлива в печах, о которой невозможно узнать просто играя. Теперь я чувствую свою готовность писать простейшие моды или переходить к изучению устройства более сложных. Разумеется, пользуясь помощью Интернета.

 

Во время решения этой задачи я временами ощущал нехватку возможностей простых текстовых редакторов. Похоже, приходит время установить IDE, сконцентрировав все необходимые для разработки инструменты в одном месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Первый опыт компиляции и правок OpenComputers

Задача:

Собрать мод OpenComputers, проверить его работоспособность в игре, внести небольшие правки в мод и также проверить их работоспособность в игре.

Мой путь к решению:

Первая страница поисковой выдачи по фразе «opencomputers build mod» не показала ничего интересного для меня. Зато фраза «opencomputers build from source» быстро привела меня на страницу https://ocdoc.cil.li/tutorial:debug_1.7.10

 

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

  1. Чем отличается вызов gradlew от gradle?

  2. Чем отличается setupDecompWorkspace от setupCIWorkspace?

На первый вопрос я ответил неправильно. Из найденной информации я понял, что обёртка gradlew используется для того, чтобы не морочить себе голову отдельной установкой Gradle и всё необходимое устанавливать через скрипт. Но у меня же уже установлен Gradle! Поэтому проще использовать именно его.

 

Ещё не понимая, в чём грабли, я в хаотическом порядке побежал по коммитам, дойдя чуть ли не до начала репозитория. Но gradle упорно выдавал ошибку даже при запуске без параметров:

$ gradle
...
A problem occurred evaluating root project 'OpenComputers'.
> Failed to apply plugin [id 'forge']
   > Could not create task of type 'ReobfTask'.

Поиск по фразе «gradle Could not create task of type ReobfTask» не дал ничего вразумительного кроме того, что может быть неправильной версия не то Gradle, не то Forge, не то Minecraft, не то JDK. Так я ходил по граблям около двух часов, пытаясь что-то изменить в конфигах Gradle и переходя от коммита к коммиту. Почувствовав усталость, я решил, что зашёл в тупик, и чтобы выйти из него, мне следует взять перерыв, и отдохнув, найти новую точку для приложения усилий. Так я и сделал.

 

Отдохнув, я ещё раз почитал об отличии gradlew от gradle, вспомнил, что встреченная мной ошибка может быть вызвана неправильной версией Gradle, и сразу осознал упущенный мной нюанс: gradlew – не просто обёртка, и позволяет не просто обойтись без установки gradle, а без установки требуемой версии gradle. Проверяю предположение:

$ gradle -version
Gradle 2.10
$ ./gradlew -version
Gradle 5.6.4

Так и есть!

 

Вывод: Для ускорения продвижения в изучении в первый раз следует максимально чётко следовать инструкциям. А уже имея эталонный рабочий вариант, можно смело экспериментировать. Зная, в чём именно я совершил отклонение, можно быстрее находить и причину неудачи тоже.

 

Я быстро отработал ту часть инструкции, которая не касалась использования IDE, нашёл файл свежесобранного мода, переместил его в каталог с остальными модами и запустил игру:

$ git clone https://github.com/MightyPirates/OpenComputers.git
$ cd OpenComputers
$ ./gradlew setupDecompWorkspace
$ ./gradlew build
$ find . -name OpenComputers*.jar
./libs/OpenComputers-LuaJ.jar
./libs/OpenComputers-JNLua.jar
./build/libs/OpenComputers-MC1.7.10-1.7.5+f73dd9e-dev.jar
./build/libs/OpenComputers-MC1.7.10-1.7.5+f73dd9e-javadoc.jar
./build/libs/OpenComputers-MC1.7.10-1.7.5+f73dd9e-api.jar
./build/libs/OpenComputers-MC1.7.10-1.7.5+f73dd9e-sources.jar
$ mv build/libs/OpenComputers-MC1.7.10-1.7.5+???????-universal.jar ~/.minecraft/mods/OpenComputers-MC1.7.10-1.7.5+test-universal.jar

Работает!

 

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

 

Для чистоты эксперимента удаляю папку с модом и пользовательскую папку Gradle:

$ rm -rf OpenComputers
$ rm -r  ~/.gradle

И получаю собранный мод минимумом команд:

$ git clone https://github.com/MightyPirates/OpenComputers.git
$ cd OpenComputers
$ ./gradlew build

Остаётся лишь перенести мод в каталог с другими модами:

$ mv build/libs/OpenComputers-MC1.7.10-1.7.5+???????-universal.jar ~/.minecraft/mods/OpenComputers-MC1.7.10-1.7.5+test-universal.jar

С компиляцией и сборкой я разобрался. Теперь пора что-нибудь изменить в моде. Чтобы не выдумывать задачу, я вспоминаю исходную цель.

 

В OpenComputers мне не нравится механика управления нагрузкой от пользовательских скриптов. Что я об этом знаю? Во время длительных вычислений я могу получить ошибку «too long without yielding». Попробую найти эту строку в исходниках:

$ grep -ir 'too long without yielding'
src/main/resources/assets/opencomputers/lua/machine.lua:local tooLongWithoutYielding = setmetatable({},  { __tostring = function() return "too long without yielding" end})

Удача! Это файл на Lua, и мне сейчас, возможно, не потребуется вникать в Scala. Открываю этот файл первым подвернувшимся под руку редактором:

$ nano src/main/resources/assets/opencomputers/lua/machine.lua

Ищу, как используется переменная tooLongWithoutYielding. Ошибка с таким исключением генерируется лишь в одном месте, в функции checkDeadline() по результатам проверки computer.realTime() > deadline.

Ищу, где и как используется переменная deadline. Стараясь не вникать в детали кода, я нахожу участок, который с наибольшей вероятностью задаёт время, в течение которого пользовательский скрипт может работать без уступки времени: deadline = computer.realTime() + system.timeout(). Лучших вариантов я не вижу, поэтому правлю эту строку.

 

Проверяю выполненные изменения:

$ git diff
--- a/src/main/resources/assets/opencomputers/lua/machine.lua
+++ b/src/main/resources/assets/opencomputers/lua/machine.lua
@@ -1486,7 +1486,7 @@ local function main()
...
-    deadline = computer.realTime() + system.timeout()
+    deadline = computer.realTime() + 10 --system.timeout()

По уже отработанной схеме компилирую мод, переношу его в папку с модами и запускаю игру.

Для проверки внесённых в мод изменений я запускаю тестовый скрипт:

# lua
lua > clock=os.clock t_=clock() pcall(function() while true do end end) t=clock() print(t-t_)
5.000662049

Вроде бы ничего не изменилось. Но я перезагружаю тестовый компик и снова запускаю скрипт. Получаю результат:

9.999750501

Сработало! Подобного поведения можно добиться и банальной правкой конфига, но моя цель заключалась в достижении того же эффекта правкой исходников мода.

Результат:

Я смог скомпилировать мод OpenComputers, осознал пользу обёртки gradlew, нашёл минимальный набор команд для компиляции, а также внёс работоспособное изменение в мод.

Ближайшие планы:

Во время решения этой задачи я снова уклонился от использования IDE. Но сейчас я начал серьёзно колебаться, выбирая между двумя направлениями: приступить к поиску оптимального алгоритма управления нагрузкой, или же всё таки освоить работу с IDE хотя бы на базовом уровне.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

GradleWrapper предназначен для того, чтобы сделать воркспейсы более переносимыми. Не факт, что твоя глобальная версия Gradle правильно все сделает по билд-скрипту. С другой стороны враппер позволяет всем разработчикам проекта иметь идентичный воркспейс, если заработало(или не заработало) у одного, то аналогично будет у всех.

 

  

22 часа назад, eu_tomat сказал:

приступить к поиску оптимального алгоритма управления нагрузкой, или же всё таки освоить работу с IDE хотя бы на базовом уровне

Т.к. скорее всего такой алгоритм будет зависеть от аспектов игры(типо, тпс, отгрузка чанков), то скорее всего понадобится вносить изменения в код самого мома, смотреть исходники игры. Поэтому будет хорошей идей попробовать работать в идее(:lol:), она довольно хорошо заточена под скалу

Изменено пользователем hohserg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...