Привет всем! С предметами немного разобрались, так что пора переходить к более фундаментальным вещам кубического мира. И понятное дело, что речь пойдёт о блоках!
Будет полезно до:
Немного о блоках
Всё, что окружает нас в игровом мире – блоки (ну, есть еще сущности и мобы, но сам мир состоит в основном из блоков). Даже там, где блоков вроде как нет – они есть. Всякие пещеры и шахты тоже заполнены особым блоком — воздухом.
В гайде по предметам я довольно много времени уделил классификации (хоть и довольно свободной). С блоками можно сделать так же, но обилие параметров у блоков сделает такую схему достаточно путанной, а потому я просто назову лишь некоторые важные отличительные способности блоков.
Для начала есть блоки прозрачные и не. К примеру, стекло и камень. В зависимости от этого параметра блок может не давать тень, пропускать свет и т.д.
Есть полные блоки и не. От этого значения зависит отрисовка соседних блоков, что влияет на оптимизацию. Для примера, нам не нужно рисовать невидимые поверхности вокруг блока песка, ведь он не прозрачный и занимает полный блок, в то время как ступени так сделать не дадут.
Так же блоки могут быть источниками света. Максимальные значения яркости ограничены, так что создать второе солнце не выйдет, но какой-либо свой факел или фонарь – никаких проблем.
Есть так же редстоун блоки, проходимые, с гравитацией, жидкие, растения, порталы, те что имеют возможность взаимодействия без видимого интерфейса и те, что имеют UI. И это не всё!
Короче, блоков много, и они могут иметь множество параметров и особенностей.
Для начала создадим обычный блок. Потом пару блоков с разными моделями и фишками. Создадим и свои модели для блоков, обязательно. Стекло, источник света, блок с анимацией. Без вариантов будут и блоки с интерфейсом, растения и мебель.
Ну что, погнали?
JAVA-часть
Для этого урока я решил взять исходный код первого гайда. Там мы создали новую палку, а теперь я хочу сделать из них блок.
Регистрируем блоки аналогично предметам. Для этого создаём отдельную папку block, а в ней ModBlocks.java.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package mod.astler.tutorial_mod_gs.block; import mod.astler.tutorial_mod_gs.TutorialGSMod; import mod.astler.tutorial_mod_gs.item.ModItemGroups; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.Item; import net.minecraftforge.common.ToolType; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; public class ModBlocks { public static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>(ForgeRegistries.BLOCKS, TutorialGSMod.MODID); public static final RegistryObject<Block> STONE_STICK_BLOCK = BLOCKS.register("stone_stick_block", () -> new Block(Block.Properties.create(Material.ROCK).hardnessAndResistance(3.0F, 3.0F).harvestTool(ToolType.PICKAXE))); } |
DeferredRegister мы уже встречали, но в этот раз создаём его для блоков. И добавляем сам STONE_STICK_BLOCK. Как предмет Item, был объектом класса Item, так и блок — класса Block.
Блоки так же имеют свойства. Материал – определяет множество параметров блока. Вообще идея материалов отличная, но с реализацией что-то не то и они не всегда работают так, как должна бы. Именно потому нам нужно будет самостоятельно указывать некоторые вещи, которые уже прописаны в материале. Так же, насколько я знаю, свои материалы создавать проблематично в связи сокрытием некоторых ключевых переменных. Об этом напишу подробнее в другой раз. hardnessAndResistance – прочность и взрывоустойчивость. harvestTool – правильный (или эффективный) инструмент для добычи.
Теперь нужно дополнить конструктор мода, чтобы блоки тоже регистрировало:
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 |
package mod.astler.tutorial_mod_gs; import mod.astler.tutorial_mod_gs.block.ModBlocks; import mod.astler.tutorial_mod_gs.item.ModItems; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @Mod(TutorialGSMod.MODID) @Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD) public class TutorialGSMod { public static final Logger LOGGER = LogManager.getLogger(); public static final String MODID = "tutorial_mod_gs"; public TutorialGSMod() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); ModBlocks.BLOCKS.register(bus); ModItems.ITEMS.register(bus); } } |
Класс. Теперь ресурсы!
Ресурсы для блока
Как и для предметов, нам нужно добавить текстуру и модель блоку. Кроме этого, еще нужно создать blockstates файл, в котором будут прописаны возможные состояния блока (и соответствующие состояниям модели). Хорошим примером будут ступени. Поворот модели, как и их угловые версии – всё там.
Открываем папку ресурсов! Сразу создадим папку blockstates, она нам будет нужна. В итоге должно быть что-то такое:
Если у вас каких-то нет, то это странно. Видимо вы что-то важное пропустили. Так же в папки models и textures нам нужно добавить по папке block.
И теперь внимательно. Для полноценного блока нужно: локализация (папка lang), модель, текстура и файл состояний.
Начнём в таком же порядке.
Перевод, модель, текстура и состояния блока
С локализацией всё просто. Для русского добавляем в файл ru_ru.json такую строку:
1 |
"block.tutorial_mod_gs.stone_stick_block": "Блок из каменных палок" |
Модель так же не должна вызвать сложностей. В папке моделей для блоков создадим stone_stick_block.json:
1 2 3 4 5 6 |
{ "parent": "block/cube_all", "textures": { "all": "tutorial_mod_gs:block/stone_stick_block" } } |
Родителем тут указана модель куба с одинаковыми сторонами, а потому и текстура всего одна all.
И вот модель в папке. Учтите, что имя файла модели должно в точности совпадать с именем, которое мы укажем в файле blockstates для этого блока. Вообще система такая. Есть файл blockstates, который должен быть в формате ТОЧНОЕ_ИМЯ_БЛОКА.json, там мы указываем одну или несколько возможных моделей (имена не принципиальны, но есть общие правила), а уже в моделях указываем текстуры. Таким образом разные блоки могут использовать одинаковые модели или текстуры. Очень удобно!
Текстура. Для блоков текстуры добавляем в соответствующую папку block.
(хоть и похоже на чёрную черноту, но там есть узор как у золота)
Повторяю, что имя текстуры должно в точности совпадать с именем текстуры в модели. Не обязательно дублировать одну и ту же текстуру под разными именами, ведь при создании модели можно выбрать текстуру любого другого блока.
И в завершение – самый важный blockstates файл. В одноименной папке создаём файл stone_stick_block.json.
Так как у нас не ступени и не что-либо интерактивное, то состояние всего одно:
1 2 3 4 5 |
{ "variants": { "": { "model": "tutorial_mod_gs:block/stone_stick_block" } } } |
Если всё сделано верно, то можно запускать и тестировать. Блока пока не будет ни в одном списке, зато можно создать его при помощи команды.
Предмет для блока
В классификации предметов был отдельный вид: предметы-блоки. Именно эти ребята представляют в нашем инвентаре…собственно блоки. Пришла пора и нам сделать свой. К обычной палке добавим такой предмет.
1 |
public static final RegistryObject<Item> STONE_STICK_BLOCK = ITEMS.register("stone_stick_block", () -> new BlockItem(ModBlocks.STONE_STICK_BLOCK.get(), new Item.Properties().group(ModItemGroups.MOD_ITEMS_ITEM_GROUP))); |
При создании предмета для блока мы передаём в виде параметра сам блок. Так же тут уже можно указать предмету и вкладку творческого.
Но теперь блок с текстурой и моделью, а предмет без. Потому-то нужно добавить модель и для него. Текстуру добавлять не нужно, и вот почему:
1 2 3 |
{ "parent": "tutorial_mod_gs:block/stone_stick_block" } |
В этот раз родительской темой стаёт модель блока stone_stick_block, а это значит, что предмет тоже уже готов и можно запускать!
На этом всё, исходный код смотрите тут: Ссылка на исходники.
Пингбэк: [1.15.2] Добавляем свою плиту, ступени и стену – GeekStand
Пингбэк: Создание модов для Minecraft 1.15 – GeekStand
Пингбэк: [1.15.2] Дроп при добыче блоков – GeekStand