Наш первый блок
А вот и очередная статья из нашего цикла! cегодня мы создадим наш первый блок. С вами RedGuy, и мы начинаем!
Важно!
Перед началом работы вам необходимо изучить основы синтаксиса языка Java! Для их изучения мы рекомендуем использовать Codecademy или METANIT.
Данная статья содержит материал, который подразумевает, что вы прочитали предыдущие. Если вы этого не сделали, то стоит сделать это сейчас.
Создание блока
Сегодня мы создадим блок металла, который при клике по нему будет воспроизводить звук.
Для начала нам нужно создать интерфейс, в котором будут регистрироваться все наши блоки.
Создайте интерфейс
StoryBlocksв пакетеru.storyteam.mylittlestory.init.У интерфейса укажите аннотацию
@SimplyRegister. Получается такой файл:package ru.storyteam.mylittlestory.init; import org.zeith.hammerlib.annotations.SimplyRegister; @SimplyRegister public interface StoryBlocks { }Теперь нам нужно создать пакет, внутри которого будут храниться все наши блоки. Создайте пакет
blocksвнутри пакетаru.storyteam.mylittlestory.content.Создайте класс
MetalBlockв пакетеru.storyteam.mylittlestory.content.blocks. Получается такой файл:package ru.storyteam.mylittlestory.content.blocks; public class MetalBlock { }Теперь нам нужно реализовать блок, для этого мы укажем, что наш класс наследуется от
Blockи реализуем конструктор.package ru.storyteam.mylittlestory.content.blocks; import net.minecraft.world.level.block.Block; public class MetalBlock extends Block { public MetalBlock(Properties p_49795_) { super(p_49795_); } }Теперь нам нужно зарегистрировать наш блок. Для этого мы возвращаемся в
StoryBlocksи создаём статическое полеMETAL_BLOCKтипаMetalBlock. В качестве аргумента мы указываем, что характеристики блока копируются от железного блока.package ru.storyteam.mylittlestory.init; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockBehaviour; import org.zeith.hammerlib.annotations.RegistryName; import org.zeith.hammerlib.annotations.SimplyRegister; import ru.storyteam.mylittlestory.content.blocks.MetalBlock; @SimplyRegister public interface StoryBlocks { @RegistryName("metal_block") MetalBlock METAL_BLOCK = new MetalBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BLOCK)); }
И уже в этот момент наш блок появится в игре, но он не имеет текстуры, модели, названия и логики, поэтому давайте это исправим!

Текстурируем блок
Идём в папку с ресурсами и создаём папку
blockвнутри папкиtextures.В папку
blockпомещаем текстуру нашего блока. В моём случае этоmetal_block.png.Теперь нам нужно указать модель, согласно которой будет отрисовываться наш блок. Для этого создаём папку
blockвнутри папкиmodels.В папке
blockсоздаём файлmetal_block.jsonи помещаем туда следующий код:{ "parent": "minecraft:block/cube_all", "textures": { "all": "mylittlestory:block/metal_block" } }В этом файле мы указываем что наша модель наследуется от
minecraft:block/cube_allи что текстура нашего блока находится вmylittlestory:block/metal_block.minecraft:block/cube- Простая модель, представляющая собой кубический блок.minecraft:block/cube_all- Модель, текстура в которой применяется ко всем сторонам блока.minecraft:block/cube_column_mirrored- Колонна отраженная по горизонтали.minecraft:block/cube_directional- Модель, ориентированная в определенном направлении, обычно используется для блоков, которые имеют различные текстуры на разных сторонах.minecraft:block/cube_mirrored- Блок с отраженной текстурой.minecraft:block/cube_mirrored_all- Как cube_mirrored, но с текстурой, примененной ко всем сторонам.minecraft:block/cube_north_west_mirrored- Блок с отраженной текстурой на северо-западной стороне.minecraft:block/cube_north_west_mirrored_all- Как cube_north_west_mirrored, но с текстурой, примененной ко всем шесть сторонам.minecraft:block/cube_top- Блок с отдельной текстурой для верхней стороны.minecraft:block/cube_bottom_top- Блок с текстурой, с отдельными текстурами применимыми ко дну и верху.minecraft:block/cube_column- Кубический столб с общей текстурой для сторон и общей стороной для верха и низа.minecraft:block/cube_column_horizontal- Горизонтальный кубический столб.И последнее, что нам нужно сделать – указать модели, которые используются для разных состояний блока. Для этого создаём папку
blockstatesвнутри папкиmylittlestoryв ресурсах.В папке
blockstatesсоздаём файлmetal_block.jsonи помещаем туда следующий код:{ "variants": { "": { "model": "mylittlestory:block/metal_block" } } }В этом файле мы указываем что для любого состояния блока используется модель
storytelling:block/metal_block.
Прекрасно, наш блок теперь имеет текстуру в мире, но в инвентаре он всё ещё без текстуры, давайте это исправим.

Текстурируем предмет
Идём в папку с ресурсами и копируем
файл metal_block.jsonиз папкиmodels/blockв папкуmodels/item.

Прописываем название для блока
Идём в папку
langв ресурсах и в файлеru_ru.langпрописываем название для нашего блока в виде блока и предмета.item.mylittlestory.metal_block=Металлический блок block.mylittlestory.metal_block=Металлический блок
Чудесно, теперь наш блок имеет название, но он всё ещё не имеет логики, давайте это исправим.

Добавляем логику
Возвращаемся в класс
MetalBlockи переопределяем методuse. Для этого нажимаем Ctrl + o и вводимuse, после чего нажимаем Enter.
В наш класс добавляется код:
@Override public InteractionResult use(BlockState p_60503_, Level p_60504_, BlockPos p_60505_, Player p_60506_, InteractionHand p_60507_, BlockHitResult p_60508_) { return super.use(p_60503_, p_60504_, p_60505_, p_60506_, p_60507_, p_60508_); }Теперь мы реализуем логику проигрывания звука при клике на блок.
Для этого мы используем метод
playSoundкоторый находится внутри классаLevel. Для его использования нам нужно передать в него следующие аргументы:null- игрок, который проигрывает звук, в нашем случае этоnull, потому что звук проигрывается от имени мира. Вам стоит запомнить, что этот игрок не слышит звук.pos- позиция блока, относительно которого будет проигрываться звук.SoundEvents.METAL_HIT- звук который будет проигрываться.SoundSource.BLOCKS- источник звука, в нашем случае это блоки.1.0F- громкость звука, в нашем случае это 100%.1.0F- высота звука, в нашем случае это 100%.
package ru.storyteam.mylittlestory.content.blocks; import net.minecraft.core.BlockPos; import net.minecraft.sounds.SoundEvents; import net.minecraft.sounds.SoundSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; public class MetalBlock extends Block { public MetalBlock(Properties p_49795_) { super(p_49795_); } @Override public InteractionResult use(BlockState p_60503_, Level level, BlockPos pos, Player p_60506_, InteractionHand p_60507_, BlockHitResult p_60508_) { level.playSound(null, pos, SoundEvents.METAL_HIT, SoundSource.BLOCKS, 1.0F, 1.0F); return InteractionResult.SUCCESS; } }
Заходим в игру и проверяем наш блок. При клике на него должен проигрываться звук. Прекрасно, наш блок готов!
На сегодня это всё, а пока вы ждёте следующую статью, не бойтесь экспериментировать, вы можете попробовать другие методы или модели, главное не бояться ошибаться.
Пишите в комментариях на Boosty ваше мнение и что вы хотите видеть дальше!
Оставайтесь с нами!