eu_tomat
-
Публикации
2 666 -
Зарегистрирован
-
Посещение
-
Победитель дней
331
Сообщения, опубликованные пользователем eu_tomat
-
-
В Ubuntu, Debaian и других подобных системах для запуска лаунчеров Майнкрафта требуется установить JavaFX:
# apt install openjfx
Больше ничего не требуется. JRE подтянется через зависимости.
-
1
-
-
Первые шаги в освоении моддинга
Задача:
Найти исходник простейшего мода для 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, сконцентрировав все необходимые для разработки инструменты в одном месте.
-
2
-
1
-
-
Первые шаги в 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.
Ближайшие направления для работы:
-
Узнать, как добавить в мод одиночный предмет, даже без крафта, без текстуры и особых свойств.
-
Найти готовые исходники простого мода и скомпилировать их.
Первое направление даст мне больший опыт, а второе поможет быстрее двигаться между промежуточными целями. Скорее всего, я выберу скорость. А в нюансах разберусь потом.
-
2
-
1
-
-
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. Такая последовательность должна помочь мне стабилизировать мотивацию. Или я неправильно понимаю процесс разработки?
-
1
-
Задача:
Исполнить какой-нибудь простой код, написанный на 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 открыта.
-
4
-
1
-
-
8 минут назад, hohserg сказал:Если один проектор позволяет отобразить 18 символов, то нужно 1/18 проекторов для одного символа. Конечно, поделить проектор нельзя, но такое представление удобно, чтобы подсчитать, столько проекторов дадут разрешение эквивалентное монитору. На мониторе т3 8000 символов(160*50), без учета символов двойной ширины нужно 445 проекторов
Да, удобно. Считать можно и так, если к результатам расчётов добавлять слово "приблизительно".
Для отображения поля символов размером 160x50 требуется приблизительно 445 проекторов, а точнее — 459.
-
1
-
1
-
-
Эта тема посвящена описанию моего будущего опыта разработки мода OpenComputers.
Моя цель:
Усовершенствовать механизм управления нагрузкой, создаваемой пользовательскими Lua-скриптами, сделав мод OpenComputers ещё более дружественным к серверу. Программа максимум: протолкнуть своё предложение по изменению репозитория OpenComputers.
Что я имею:
-
Неплохо понимаю и нахожу алгоритмы.
-
Пробовал кодить на куче языков, хотя опыт и небольшой.
-
Улавливаю смысл кода на распространённых языках программирования без детального изучения их синтаксиса.
-
В целом я освоил Lua.
-
Пролистал книгу «Java за 21 минуту».
-
Почитал документацию git.
-
Несколько раз читал исходники OpenComputers и даже смог найти ответы на интересующие меня вопросы.
-
Есть желание получить новый опыт.
Чего я не имею на данный момент:
-
Я ещё не привык к синтаксису Java.
-
Синтаксис Scala я вообще не изучал, и понимаю не все конструкции кода.
-
Я никогда не использовал корутины в Lua.
-
Я не знаю полностью всего процесса сборки OpenComputers из исходников.
-
Как отлаживать моды – я вообще не знаю.
-
Я ничего не знаю о протоколах общения с разработчиками.
-
Я с трудом (и с гуглопереводчиком) пишу по-английски.
В чём смысл этой темы?
@NEO в чате предложил мне описать опыт решения одной задачки. Не само решение, а именно опыт решения, развитие мысли. Но задача к тому моменту была уже решена, и описание моего пути к решению потеряло былую живость, и вряд ли теперь будет интересно читателям.
Поэтому я предлагаю альтернативу. У меня есть довольно объёмная задача, но значительная часть необходимых для её решения навыков у меня отсутствует. Зато есть желание научиться чему-то новому. Дедлайн назначать я не буду, т. к. слабо представляю, сколько времени у меня займёт та или иная задача, и пока не знаю, как мне удастся совмещать их решение с другими занятиями, не имеющими отношения к данной теме.
Алгоритм обсуждения предлагаю такой:
Я поднимаю очередную микрозадачу, пытаюсь её решить, выкладываю решение независимо от его качества, выслушиваю мнение экспертов, корректирую решение, и мы переходим на следующую итерацию обсуждения. Если эксперты в целом удовлетворены решением, я перехожу к следующей микрозадаче, постепенно приближаясь к цели.
Надеюсь, что эта тема поможет влиться в ряды разработчиков OpenComputers не только мне, но и другим желающим, которые, как и я сейчас, не знают с чего начать.
-
1
-
2
-
1
-
-
27 минут назад, hohserg сказал:Сколько минимум проекторов нужно, чтобы разрешения хватало для вывода одного любого символа, что можно вывести на обычный монитор?
Вернее будет говорить не о количестве проекторов на один символ, а о количестве символов, отображаемых одним проектором.
Размер обычного символа на мониторе OC составляет 8x16, а проектор обеспечивает разрешение до 48x48. Получается, что один проектор может вывести поле символов размером 6x3. А для символов двойной ширины (встречаются и такие) поле будет иметь размер 3x3.
-
51 минуту назад, Doob сказал:Дропнуть предмет и кильнуть процесс игры это совсем простой откат...
Я же имел ввиду совсем другой тип отката...
Если не трудно, поясни, как различные типы отката могут повлиять на программную навигацию. Тебе удавалось сделать так, чтобы робот или компьютер заметил "дежавю" в результате отката чанка?
-
Итак: теперь мне почти всё понятно в этой теме.
В 07.05.2020 в 11:51, Doob сказал:Есть 100% способ дюпать чанк на любой сборке модов или ванили, но я этот способ не дам, у вас документов нету. Способ гениально прост, до него может допереть кто угодно.
Да, способ оказался и в самом деле простым. Не знаю, как на сервере, но в одиночной игре возможен дюп чего угодно независимо от сборки модов. Но правила форума не позволяют обсуждать способы дюпа, да это и не потребуется, т.к. сам способ не относится к обсуждаемой теме.
Вот что я обнаружил: дюп возможен благодаря тому, что при некоторых манипуляциях данные об инвентаре игрока сохраняются, а данные о последних изменениях в чанке теряются. Ничего удивительного, если свежеустановленный робот может исчезнуть, а свежеснятый – продублироваться.
А теперь самое главное: при откатах чанков мои тестовые компьютеры фиксировали точно такие же артефакты времени, что и при обычной выгрузке-загрузке чанков с помощью управляемого чанклодера. При этом на провокацию откатов чанков мне приходится тратить своё время, а чанклодер переключается в полностью автоматическом режиме. Откат чанка я успешно выполнил три раза из примерно десятка попыток, а чанклодер уже загрузил и выгрузил чанк несколько сотен раз. И за все эти попытки мои скрипты ни разу не зафиксировали каких-либо предпосылок для сбоя программной навигации. Я оставлю скрипты работать на ночь, и если вдруг получу какие-то неожиданные результаты, то обязательно дам вам знать.
А пока вывод такой: откаты чанка вряд ли могут помешать программной навигации роботов в одиночной игре. На сервере, скорее всего, тоже, но это надо проверять.
-
До запуска сервера я приостанавливаю эксперименты по поиску артефактов течения времени при выгрузке и загрузке чанков. В сингле у меня никаких сбоев в программной навигации не возникает, не смотря на периодическую выгрузку и загрузку чанков. На сервере в штатном режиме я, скорее всего, также не обнаружу проблем. Для возникновения проблемы нужна нештатная выгрузка чанка, и я пока не знаю, как её воспроизвести. Пока что я наблюдаю лишь незначительные артефакты времени, а точнее – микролаги.
Остановлюсь на ранее озвученной мысли:
23 часа назад, eu_tomat сказал:И, наверное, лучшее, что я могу придумать: построить домик где-нибудь не очень далеко от спавна, и не очень близко к нему, чтобы пробегающие мимо игроки загружали мои чанки и выгружали. А в домике поставить детектор, регистрирующий возникающие артефакты времени. А ещё могу поставить такой же детектор где-нибудь на своём варпе в шахтёрском мире. И наиболее тщательно проверять логи этого детектора после потерь связи с сервером, если такие потери случатся.
@Alex, планируются ли на TechCraft размещать приваты в шахтёрских мирах? Я не настаиваю на этом и даже не прошу, а просто уточняю, чтобы знать, к чему готовиться. С приватами можно будет использовать более дорогие компоненты и упростить кодинг. Но и отсутствие приватов тоже не создаст особых трудностей.
-
18 минут назад, NEO сказал:Что вообще такое откат чанка? Дуб вроде бы говорил про дюп робота.
Ты меня так скоро запутаешь, и я перестану понимать, кто из них Дуб, а что – дюп.
Дуб говорил про дюп чанка:
В 07.05.2020 в 11:51, Doob сказал:Есть 100% способ дюпать чанк на любой сборке модов или ванили, но я этот способ не дам, у вас документов нету. Способ гениально прост, до него может допереть кто угодно.
Я же говорил про дюп роботов, а также исчезновение роботов, которые могут произойти при откате чанка.
Механизм представляется мне таким: чанк по какой-то причине не сохранился, и при очередной попытке загрузить чанк восстанавливается его предыдущее состояние до изменений в чанке. Это я называю откатом. А произойдёт ли там дюп, это уже дело десятое. Например, ты сломал в чанке робота, но при следующей загрузке чанка робот остался стоять на месте, и теперь у тебя два робота, у которых компоненты имеют одинаковые адреса. Это можно назвать дюпом. А может и не быть никакого дюпа, если ты поставил робота, но при следующей загрузке чанка робот пропал.
И в связи с этим я задался вопросом: может ли возникнуть ситуация, когда ничего ни дюпалось, ничего не пропадало, но робот успел сменить свою позицию, запомнить её, но из-за отката чанка эта позиция перестала соответствовать действительности? Вычисления же OC происходят в отдельном потоке. И состояния компов хранятся отдельно от чанков. Вот, в чём трагизм, Нео – Матрица скрывает от нас правду. А я в этой теме хочу научиться обнаруживать сбои в Матрице, чтобы быть готовым к неожиданностям.
Но продолжим исследование:
48 минут назад, Doob сказал:Если хочется поковырять всякие артефакты памяти, предлагаю скопировать комп командой в другой чанк и посмотреть, что из этого выйдет. Как он будет себя вести, если чанки с копиями компа поочередно выгружать/загружать.
А как это сделать? Какой-такой командой?
53 минуты назад, Doob сказал:Тут на форуме кто-то приводил пример кода, при котором комп падал из-за того, что его состояние имело отрицательное время.
Да, я помню эту тему. Жаль, её автор не проявил настойчивости в поисках причин проблемы. Я тоже не понимаю, как такое возможно даже с учётом отката чанка. Зато могу представить, как может при откате чанка сбиться программная навигация.
-
2 часа назад, Doob сказал:Не знаю, где читал про механику нулевых чанков, нашел только это https://minecraft.gamepedia.com/Spawn_chunk
Тут написано, что и как тикает https://minecraft.gamepedia.com/Chunk#start_ticket
Вдохновившись иллюстрацией, я отодвинул тестовую установку более чем на 50 чанков от точки спавна – с большим запасом, как мне казалось. Но это всё равно не помогло. Включенный чанклодер всё равно случайным образом загружает чанки за пределами области 3x3 чанка с собою в центре – будто то чанклодер робота, или же мировой якорь RailCraft.
Грузить чанк с управляемым чанклодером оказалось лучше всего самим игроком. На данный момент это самая прозрачная схема. Можно было бы и с промежуточными роботами нагородить схему, но тогда было бы непонятно, какой из роботов первым загрузил целевой чанк – последний в цепочке, или какие-то из предыдущих. В общем, как измерять задержку, непонятно.
С другой стороны, а нужно ли нам знать задержку при загруке чанка, учитывая, что время его выгрузки нами всё равно неуправляемо?
В 07.05.2020 в 20:26, NEO сказал:"рандомное" время выгрузки зависит от скорости той самой выгрузки, в майне работает балансировщик выгрузки.
Я около 10 раз включил чанклодер и выключил его следующим же тиком. При этом целевой чанк мог проработать от 11 до 45 секунд. На каком тике произошла выгрузка, и что в чанке успело произойти, а что не успело, точно неизвестно, связь с выгруженным чанком пропала. По косвенным признакам мы, конечно, можем моделировать более-менее точные предположения. Но какое количество тиков будет пропущено при следующей загрузке чанка, какие действия будут пропущены, можно сказать только после экспериментов.
Например, я опытным путём установил, что при каждой выгрузке-загрузке чанка MFSU недополучает энергию за один тик. Является ли причиной потери энергии откат чанка – совсем не факт. Скорее всего, это вообще не так. И смогу ли я воспроизвести откат чанка, как это делает @Doob, пока не знаю.
Вот ещё интересный момент вспомнился. Во время моих перемещений по варпам на сервере у меня не только пропадали свежеустановленные роботы. Ещё и клиент часто отлетал от сервера из-за каких-то ошибок. А это случалось заметно чаще пропажи роботов. И причиной откатов могли оказаться как раз те самые ошибки, а не банальные выгрузки-загрузки чанков. И это может означать, что отката чанка я этими манипуляциями не добьюсь, и никаких сбоев в программной навигации не обнаружу.
И, наверное, лучшее, что я могу придумать: построить домик где-нибудь не очень далеко от спавна, и не очень близко к нему, чтобы пробегающие мимо игроки загружали мои чанки и выгружали. А в домике поставить детектор, регистрирующий возникающие артефакты времени. А ещё могу поставить такой же детектор где-нибудь на своём варпе в шахтёрском мире. И наиболее тщательно проверять логи этого детектора после потерь связи с сервером, если такие потери случатся.
А в сингле мне остаётся, пожалуй, провести ещё один эксперимент, но на его успех нет никакой надежды. Предчувствую, снова получится, что программная навигация абсолютно надёжна при аккуратной реализации.
@Doob Ты что-то говорил про гарантированный способ добиться отката чанка. Что при этом у тебя происходит с программной навигацией? Состояние памяти компьютеров тоже синхронно откатывается?
-
Проблема блуждающей загрузки чанков, похоже, не в OC. Мировой якорь из RailCraft ведёт себя точно также. Чанклодер периодически подгружает чанк, не смежный ему. Можно предположить, что границы чанков неверные, но я разместил целевой компьютер и чанклодер на расстоянии 47 блоков, если считать расстояние между их центрами. Их чанки никак не могут быть смежными. Похоже, такова механика самого Майнкрафта. Подскажите, знатоки Майнкрафта, верно ли моё предположение?
Идея грузить некоторые чанки игроком выглядит не такой плохой после этого эксперимента. При манипуляциях игроком я не заметил артефактов течения времени, которые бы указывали на неожиданную выгрузку или загрузку чанка. Артефакты есть, но это обычные микролаги, которые не замечаются большинством игроков.
Ещё у меня возник вопрос к знатокам Майкрафта. Я разместил свою экспериментальную установку на расстоянии 9 чанков от точки спавна. Также я знаю, что какое-то количество чанков в районе спавна остаётся всегда загруженным. Вопросы: Каков размер этой всегда загруженной области? Чем он задаётся, от чего зависит? Должны ли чанки, находящиеся рядом со спавном быть всегда загруженными или всегда выгруженными, или же там тоже возможны случайные загрузки и выгрузки даже при стоящем на месте игроке?
С другой стороны, близость спавна вроде бы не должна влиять на этот эффект, т.к. при выключенных чанклодерах проблема блуждающей загрузки чанков у меня ни разу не проявилась. Или всё-таки может влиять?
-
1 час назад, ProgramCrafter сказал:В 07.05.2020 в 20:13, eu_tomat сказал:А как ты чанклодер сможешь включать с точностью до тика? Пока чанклодер выключен, чанк не загрузен. Пока чанк не загружен, робот не примет сигнал на включение чанклодера.
У меня есть такая идея: игроком надо прогружать чанк, в котором находится робот с чанклоадером, но не соседний, где будет находиться тестовый робот. Тогда сигнал гарантированно будет доходить.
Да, хорошая идея, и я уже воплотил её в немного ином виде.
В момент написания того поста я считал, что чанклодер OC загружает область 1x1 чанк. Вроде бы так и было раньше. Не знаю, когда это изменилось. Но один из проведённых мной экспериментов показал, что чанклодер OC загружает область 3x3, чему я позже нашёл подтверждение и в коде OC. Поэтому озвученная мной проблема потеряла свою актуальность, и вместо игрока я стал использовать ещё одного неуправляемого робота с чанклодером, который постоянно держит загруженным чанк с управляемым роботом. А от загрузки чанков игроком я в своих экспериментах решил пока отказаться, чтобы не усложнять интерпретацию результатов, и без того неожиданных.
Мой эксперимент выглядел так. На границе чанка установлен компьютер с целевым скриптом. В 16 блоках от него в другом чанке стоит робот с управляемым чанклодером, а 16 блоках от него (и в 32 блоках от целевого) стоит неуправляемый робот с постоянно включенным чанклодером, который служит для постоянной загрузи чанка с управляемым роботом. Это практически предложенная тобой схема, в которой вместо игрока задействован ещё один робот. Игроку остаётся лишь отбежать подальше и с планшета подавать сигналы управляемому роботу на включение и выключение чанклодера.
Именно в ходе того эксперимента мной и был обнаружен эффект блуждающей загрузки чанка, который по моему разумению вообще не должен был входить в зону загрузки неуправляемого чанклодера. Я сначала думал, что виноват управляемый робот, который по каким-то причинам не хочет отключать чанклодер. В конечном итоге я вообще удалил его с карты, тогда и оказалось, что управляемый робот вообще не при чём. К эксперименту с двумя чакнлодерами я планирую вернуться позже с немного другой расстановкой роботов по чанкам. Но сначала хочу ещё немного поиграть с блуждающей загрузкой чанков.
-
1
-
-
4 минуты назад, hohserg сказал:За счет того, что он грузит область 3*3. Он все время грузит текущий чанк и любой в который может перейти
Речь шла о чанках за пределами области 3x3 с роботом в центре. И, как оказалось далее, роботу вообще не обязательно двигаться. Находящийся рядом чанк случайным образом загржается и выгружается. При этом игрок находится далеко и не двигается.
-
2
-
-
Ещё один эксперимент с неожиданными результатами.
Вплотную к границе чанка стоит компьютер с целевым скриптом. Скрипт детектирует странности течения времени в чанке и записывает их в файл. Также в файл периодически пишется текущее время, чтобы понимать, работает ли целевой скрипт в данный момент. Обновлённые данные файла отображаются в реальном времени средствами операционной системы хоста.
На расстоянии 32 блока от целевого компа находится робот с включенным чанклодером. Между роботом и целевым компьютером есть свободный чанк. Границы чанков проверялись нажатием клавиши F9.
При удалении игрока на достаточную дистанцию целевой скрипт должен полностью остановить свою работу. Но скрипт работу продолжает. Можно было бы предположить, чтобы я неправильно определил границы чанков. Теоретически, два блока на расстоянии друг от друга в 32 блока могут находиться в соседних чанках. В этом случае целевой чанк должен всегда оставаться загруженным. Но нет же, скрипт время от времени свою работу прерывает. Размер паузы похож на случайный от единиц до десятков секунд.
Если откатить робота с чанклодером ещё на шаг назад, то целевой скрипт гарантированно прекращает свою работу. В этой позиции вопросов не возникает.
Но что было до этого? Что это за чанк Шрёдингера, который то выгружается, то снова загружается с какой-то случайной задержкой?
-
33 минуты назад, NEO сказал:Наверно, если робот переместится в другой чанк - то он выгрузится и чанклоадер не успеет его загрузить, очевидно что автор предусмотрел такой ход и загружает чанк по мере приближения к нему, если я правильно понял.
Я тоже сделал подобное предположение, но для меня не очевидна логика, которой руководствовался автор. А ещё я не смог найти участок кода, который бы приводил к подобным результатам. Не подскажешь, как его найти? За счёт чего чанклодер загружает область 3x3 чанка, я вижу. А за счёт какого кода он загружает чанки заранее, до того как робот пересёк границу чанка?
-
До основного эксперимента я не дошёл. Зато я попытался проверить, на каком расстоянии будет действовать чанклодер из OC. Результаты меня удивили, объяснения им не вижу. Прошу помощи в интерпретации.
Сразу выяснилось, что чанклодер OC загружает область 3x3 чанка. Это подтверждается и кодом OC.
Но дальше начались странности. Я проверил, как далеко следует отвести робота с чанклодером, чтобы он перестал загружать целевой чанк. Робот был установлен рядом с границей чанка, поэтому ему было достаточно сделать один шаг назад, чтобы перестать подгружать чанк, находящийся перед ним. Но не тут-то было. Для полной гарантии потребовалось 16 шагов. То есть, робот перешёл не просто границу чанка, а подошёл к следующей границе. И пока я не могу объяснить такое поведение чанклодера.
Затем я решил проверить момент включения тестового робота в целевом чанке при приближении к чанку робота с чанклодером. Оказалось, что робота можно приблизить всего на 8 шагов, чтобы целевой чанк загрузился. При этом робот даже не дошёл до границы чанка, а целевой чанк уже загрузился. Так можно было несколько раз двигать роботом туда и обратно на 8 шагов и каждый раз целевой чанк загружался и выгружался. Но так длилось не долго. Позже этого количества шагов оказалось недостаточно. Но оказалось достаточно 12 шагов. И после одного выбегания на 12 шагов снова оказалось возможным выбегать всего на 8 шагов. И целевой чанк загружался на короткое время. Правда, в какой-то момент оказалось, что недостаточно и 12 шагов. В общем, игрался я так, и в конечном итоге роботу с чанклодером пришлось проделать весь путь в 16 шагов, чтобы загрузить целевой чанк.
С чем связано такое поведение чанклодера? По идее-то роботу с чанклодером достаточно было просто преодолеть границу чанков, чтобы целевой чанк встал в очередь на выгрузку или загрузку. Или, например, всегда бы требовалось 16 шагов назад для выгрузки и 16 шагов вперёд для загрузки чанка, это я бы тоже смог как-то понять. Но разному количеству шагов робота, необходимых для загрузки чанка, я не вижу объяснения.
-
7 часов назад, Xytabich сказал:А вообще где-то есть описание подобных фишек?
Я не встречал полного описания. Для проверки наличия драйверов для того или иного мода я просто устанавливал адаптер рядом с интересующими меня блоками. В плане коллективного знания возможности этого мода почти не изучены. Например, я узнал о возможности получать информацию о жёрдочках IC2 с помощью OpenPeripheral ещё в 20015-ом. Подозреваю, что об этом я узнал не один я, но Гугл по фразе "ic2 tecrop" до сих пор не выводит ничего похожего на запрашиваемую информацию.
-
1 минуту назад, whiskas сказал:Через цыкл или через getAllStacks?
Через цикл без всяких getAllStacks, как в коде @Xytabich.
-
1 минуту назад, whiskas сказал:Скорость овпенперипхерала больше чем 1 в тик?. Просто в адаптера тож есть метот getAllStacks() и все произойдет моментально!
С OpenPeripheral даже полный перебор 108 слотов аламазного сундука если не моментален, то очень быстр, на весь цикл уходит менее тика. Точнее я не замерял.
-
1 минуту назад, NEO сказал:Нужны условия где нет других модов или плагинов.
Проблема в том, что я не знаю, какие моды и плагины имеют значение. Может, они наоборот нужны для провокации отката чанка. Хотя, @Doob говорит, что значения это вообще не имеет.
-
8 минут назад, NEO сказал:Никак ты не узнаешь без жавы.
Опять 25. Может, и надо мне тоже погрузиться в жаву. Как там, трудно вникать? Думаю, за день я установлю какую-то среду, настрою, и под конец дня смогу даже что-то заговнокодить консольное. Синтаксис Java мне в целом понятен, а нюансы я могу и позже освоить. С этим я разберусь. Но там для программирования в Майнкрафте там нужна ещё куча всего, и вот тут для меня начнётся вообще тёмный лес. Можешь набросать какой-то гайдик, с чего начать и чем продолжать? Или ссылки какие-нибудь. Я не сомневаюсь, что в потрохах Майнкрафта тоже всё жутко интересно, но я пока не знаю с чего начинать, и сколько времени на это придётся потратить.
2 минуты назад, NEO сказал:имхо, но решать проблему который нет, бессмысленно, нужно её хотя-бы зафиксировать. Кто-то там сказал, какая-то бабка на ухо прошептала, камон парни, с каких пор такое работает?
Ты про какую проблему? То, что роботы на сервере пропадают? Да, подтверждаю. То, что роботы дюпаются, тоже есть свидетели. Примерная ситуация известна. И её надо научиться воспроизводить. Вон, @Doob говорит, что умеет. Далее надо зафиксировать рассинхронизацию программной навиагации с положением робота в чанке. Я тоже попробую поработать над этим. Как смогу, конечно.

Не запускается лаунчер, kubuntu 18.04
в Задать вопрос
Опубликовано:
Простое решение для дистрибутивов, основанных на Debain: