[1.15.2] Добавляем свой блок

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

Список уроков

Будет полезно до:

Немного о блоках

Всё, что окружает нас в игровом мире – блоки (ну, есть еще сущности и мобы, но сам мир состоит в основном из блоков). Даже там, где блоков вроде как нет – они есть. Всякие пещеры и шахты тоже заполнены особым блоком — воздухом.

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

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

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

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

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

Короче, блоков много, и они могут иметь множество параметров и особенностей.

Для начала создадим обычный блок. Потом пару блоков с разными моделями и фишками. Создадим и свои модели для блоков, обязательно. Стекло, источник света, блок с анимацией. Без вариантов будут и блоки с интерфейсом, растения и мебель.

Ну что, погнали?

JAVA-часть

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

Регистрируем блоки аналогично предметам. Для этого создаём отдельную папку block, а в ней ModBlocks.java.

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 – правильный (или эффективный) инструмент для добычи.

Теперь нужно дополнить конструктор мода, чтобы блоки тоже регистрировало:

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 такую строку:

"block.tutorial_mod_gs.stone_stick_block": "Блок из каменных палок"

Модель так же не должна вызвать сложностей. В папке моделей для блоков создадим stone_stick_block.json:

{
  "parent": "block/cube_all",
  "textures": {
    "all": "tutorial_mod_gs:block/stone_stick_block"
  }
}

Родителем тут указана модель куба с одинаковыми сторонами, а потому и текстура всего одна all.

И вот модель в папке. Учтите, что имя файла модели должно в точности совпадать с именем, которое мы укажем в файле blockstates для этого блока. Вообще система такая. Есть файл blockstates, который должен быть в формате ТОЧНОЕ_ИМЯ_БЛОКА.json, там мы указываем одну или несколько возможных моделей (имена не принципиальны, но есть общие правила), а уже в моделях указываем текстуры. Таким образом разные блоки могут использовать одинаковые модели или текстуры. Очень удобно!

Текстура. Для блоков текстуры добавляем в соответствующую папку block.

(хоть и похоже на чёрную черноту, но там есть узор как у золота)

Путь должен совпадать

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

И в завершение – самый важный blockstates файл. В одноименной папке создаём файл stone_stick_block.json.

Так как у нас не ступени и не что-либо интерактивное, то состояние всего одно:

{
    "variants": {
        "": { "model": "tutorial_mod_gs:block/stone_stick_block" }
    }
}

Если всё сделано верно, то можно запускать и тестировать. Блока пока не будет ни в одном списке, зато можно создать его при помощи команды.

Знаете такую?

Предмет для блока

В классификации предметов был отдельный вид: предметы-блоки. Именно эти ребята представляют в нашем инвентаре…собственно блоки. Пришла пора и нам сделать свой. К обычной палке добавим такой предмет.

    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)));

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

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

{
  "parent": "tutorial_mod_gs:block/stone_stick_block"
}

В этот раз родительской темой стаёт модель блока stone_stick_block, а это значит, что предмет тоже уже готов и можно запускать!

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

На этом всё, исходный код смотрите тут: Ссылка на исходники.

3 thoughts on “[1.15.2] Добавляем свой блок

Добавить комментарий