Предмет есть, но в игру, кототрая состоит из блоков хочется добавить и блок (Block). Эти мы сегодня и займемся. Ещё раз повторю логику игры: блоки мы видим в мире, предметы в инвентаре. А мобы, стрелы, летящий глаз и падающий песок – это виды сущностей, которые позволяют создать более продвинутое взаимодействие. Это если очень простым языком.
Из сказанного выше нужно запомнить, что при добыче блока из него выпадают сущности (плавающие маленькие блоки). Именно поэтому их можно убить вместе с мобами при помощи команды (или уроном кактуса 🤣). А если вы держите в руках блок, то это предмет. Даже если выглядит он как блок.
Так что такая система: в руках предмет, поставили – блок, сломали, но не подобрали – сущность.
Добавляем Block
Аналогично классу с предметами создаём ModBlocks.java в папке blocks. Прописываем DeferredRegister аналогично предметам, но с заменой Item на Block и ForgeRegistries.ITEMS на ForgeRegistries.BLOCKS.
Ниже объявим статическую переменную FORTIFIED_STONE, типа RegistryObject<Block>. Это будет своего рода более крепкий камень, чем тот, что у нас есть.
Сам блок создаётся немного иначе, чем предмет:
1 |
new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.STONE).strength(1.5F, 6.0F) |
Этот я взял у камня, он подходит для нашего укрепленного камня. Хотя прочность можно будет и увеличить. В функцию strength мы передаём два значения. Первое влияет на скорость добычи, а второе на устойчивость к взрывам.
Также в of мы передаём материал и цвет блока. Первый отвечает за некоторые свойства блока, а второй – за его цвет на карте.
О свойствах блоков, как и о материалах я сделаю отдельную запись, так как их довольно много и используя определенные можно получить интересные эффекты. К примеру, будет ли блок заменён поршнем, или будет подвинут.
Так вот, значит тут мы закончили. В результате получили что-то такое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
package dev.astler.gsmod.blocks; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.material.MaterialColor; import net.minecraftforge.fmllegacy.RegistryObject; import net.minecraftforge.registries.DeferredRegister; import net.minecraftforge.registries.ForgeRegistries; import static dev.astler.gsmod.GSMod.MODID; public class ModBlocks { public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); public static final RegistryObject<Block> FORTIFIED_STONE = BLOCKS.register("fortified_stone", () -> new Block(BlockBehaviour.Properties.of(Material.STONE, MaterialColor.STONE).strength(2F, 8.0F))); } |
Обязательно добавляем регистрацию BLOCKS в конструкторе класса, иначе блок просто не будет зарегистрирован. Тут всё один к одному как было у предметов.
1 2 3 4 5 |
public GSMod() { IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus(); ITEMS.register(bus); BLOCKS.register(bus); } |
И если честно, то блок уже в игре. Он не имеет модели, текстуры, предмета, который бы его олицетворял в инвентаре. Но при помощи setblock его уже можно получить.
Добавляем предмет для блока
Тут всё очень просто. Переходим в ModItems и добавляем новую переменную с именем как у блока: FORTIFIED_STONE. Для предметов, которые отображают блоки есть отдельный класс BlockItem. В конструкторе обычного Item мы передавали свойства предмета и всё. А тут нужно сначала передать блок, который и будет размещать этот предмет, а уже вторым всё те же параметры.
1 |
public static final RegistryObject<Item> FORTIFIED_STONE = ITEMS.register("fortified_stone", () -> new BlockItem(ModBlocks.FORTIFIED_STONE.get(), new Item.Properties().tab(ModCreativeTabs.GS_MOD_TAB))); |
Я сразу докинул нашу вкладку для блока. Если пропустили, то обязательно прочитайте.
Теперь надо задать блоку текстуру, модель и blockstate. Локализацию блоков смотрите тут.
Список всех уроков: Создание модов для Minecraft 1.15-1.17 [Forge/Fabric]
Исходный код проекта на Github