Привет! Руда — незаменимый аттрибут песочниц. Должна же быть у нас адекватная мотивация лезть в подземные дебри? В майнкрафте это у нас уголь, железо, золото, алмаз, изумруд, лазурит, редстоун, кварц (а сейчас еще и незерит). И чаще всего именно руды играют ключевую роль в игре.
Понятное дело, что и моды без новых руд далеко не так прекрасны (ладно, это не обязательно, но вспомнить крупные моды без новых руд я не смог). В любом случае самое время и нам создать свою руду!
Привычное дело
В который раз нужно создать новый блок и новый предмет (+ предмет для блока). Блок и будет новой рудой, а предмет будет результатом переплавки этой руды.
Не забываем добавить все необходимые ресурсы (для блока: blockstate, модель, текстуру. Для предмета: модель и текстуру). Не забывайте так же о локализации.
Всё готово?
Хорошо, будем считать, что у вас уже есть некий Block, который назван как-то _ore. К примеру sun_ore. Есть предмет «руды», так же есть предмет «блока». Вот, как это всё выглядит у меня.
Итак. Теперь немного теории и план. В игре есть два типа руды. Первый тип дропает при добыче блок, который нужно плавить в печи, а второй тип дропает какие-то предметы. Примером будет всё то же золото и лазурит. Сегодня мы рассмотрим оба случая.
Дроп самого себя для обычного блока я уже показывал в статье о дропе и рецептах. И этот же рецепт дропа мы будем использовать для первого типа руды. Далее добавим рецепт плавки в печи (а так же для новой плавильной печи) и будем таковы.
Дроп предметов так же вынесен в отдельный файл. Просто он будет немного сложнее. Стоит отметить, что для второго типа руды так же нужен рецепт плавки в печи, т.к. есть шёлковое касание, которое позволит получить сам блок (этого можно избежать, но не будем перечить игровой логике).
Дроп блока руды и получение руды при помощи печи
Если вы проходили упомянутый урок о дропе, то папка для файлов дропа с блоков у вас уже должна быть. Если же нет, то нужно её создать. Полный путь из папки resources будет приблизительно таким: data\tutorial_mod_gs\loot_tables\blocks\вашфайл.json.
Сюда добавляем json файл с именем вашего блока (конечно же лучше это делать через IDE, чтобы не получились нерабочие sun_ore.json.txt) и пишем туда следующий текст.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:item", "name": "tutorial_mod_gs:sun_ore" } ], "conditions": [ { "condition": "minecraft:survives_explosion" } ] } ] } |
Кратко основное: type, pools — тип (дроп с блока) и пул дропа, не трогаем. rolls — количество, но будет странно, если из одного блока выпадет 50. entries — что именно упадёт, conditions — условие дропа. Тут условие буквально гласит «выжил при взрыве». Есть и другие, к примеру для растений это возраст растения, в зависимости от которого дополнительный дроп может выпасть, а может и не выпадать.
Блок теперь выпадает, пора добавить рецепт. Для этого в папке recipes (всё в той же data: data\tutorial_mod_gs\recipes) добавляем сразу два json файла. Назвать их можно как угодно, но во избежание путаницы советую сохранять имена блоков для одиночных, а так же указывать тип прямо в имени для множественных рецептов. В данном случае у нас рецепт не один. Руду можно переплавить или в печи, или в плавильной печи, а значит рецепта два. Поэтому создаю два файлика:
1 |
<strong>sun_element.json <br>sun_element_from_blasting.json</strong> |
Их содержимое будет иметь пару отличий, но суть одна. Так что сначала код, а потом обсуждение.
1 |
<strong>sun_element.json </strong> |
1 2 3 4 5 6 7 8 9 |
{ "type": "minecraft:smelting", "ingredient": { "item": "tutorial_mod_gs:sun_ore" }, "result": "tutorial_mod_gs:sun_element", "experience": 1.0, "cookingtime": 200 } |
1 |
<strong>sun_element_from_blasting.json</strong> |
1 2 3 4 5 6 7 8 9 |
{ "type": "minecraft:blasting", "ingredient": { "item": "tutorial_mod_gs:sun_ore" }, "result": "tutorial_mod_gs:sun_element", "experience": 1.0, "cookingtime": 100 } |
Так вот. Как известно, плавильная печь плавит всё в два раза быстрее. Как можно увидеть в рецептах, обычная плавка занимает 10 секунд (200 тиков, видимо), а для плавильной печи (blasting) всего 5, т.е. в два раза меньше (параметр cookingtime).
Из остального вроде всё очевидно. Тип указывает тип рецепта, т.е. для верстака, печи, костра и т.д. Ингридиент и результат так же то и значат. Experience — получаемый опыт.
Запускаем и тестируем.
Окей. Всё работает. Скоро напишем генерацию и запилим свои инструменты, а пока переходим ко второй части.
Дроп руды сразу из блока
Тот же блок, та же руда (хотя логичнее было бы сделать какую-то пыль по типу редстоуна). Меняем содержимое одного только файла:
1 |
<strong>data\tutorial_mod_gs\loot_tables\blocks\sun_ore.json</strong> |
И вместо старого дропа блока вставляем вот тукаю конструкцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
{ "type": "minecraft:block", "pools": [ { "rolls": 1, "entries": [ { "type": "minecraft:alternatives", "children": [ { "type": "minecraft:item", "conditions": [ { "condition": "minecraft:match_tool", "predicate": { "enchantments": [ { "enchantment": "minecraft:silk_touch", "levels": { "min": 1 } } ] } } ], "name": "tutorial_mod_gs:sun_ore" }, { "type": "minecraft:item", "functions": [ { "function": "minecraft:apply_bonus", "enchantment": "minecraft:fortune", "formula": "minecraft:ore_drops" }, { "function": "minecraft:explosion_decay" } ], "name": "tutorial_mod_gs:sun_element" } ] } ] } ] } |
Рецепт полностью и бессовестно стянул с алмазов. Но согласитесь, этот пример куда интереснее предыдущего! Теперь entries имеет тип альтернативы и предлагает целых два варинта дропа, которые зависят от условий. Если есть подходящий инструмент с шёлковым касанием — выпадает блок. Если же ничего такого нет, то выбрасываем алмаз. Но и тут не так просто, ведь вписаны функции расчёта количества алмазов при зачаровании на удачу.
Как видите, для шёлкового касания работает очень простой алгоритм сравнения. Подобным образом и мы можем создать своё, ну, к примеру, теневое касание. В результате при помощи предмета с ним мы сможем получить какой-либо новый дроп. Звучит перспективно!
Запускаем!
На этом сегодня всё. Ничего особо нового, просто систематизация пройденного перед новым. До скорого! Спасибо за время 😀