Создаём мод с StoryTeam Help

Наш первый блок

А вот и очередная статья из нашего цикла! cегодня мы создадим наш первый блок. С вами RedGuy, и мы начинаем!

Важно!

Перед началом работы вам необходимо изучить основы синтаксиса языка Java! Для их изучения мы рекомендуем использовать Codecademy или METANIT.

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

Создание блока

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

Для начала нам нужно создать интерфейс, в котором будут регистрироваться все наши блоки.

  1. Создайте интерфейс StoryBlocks в пакете ru.storyteam.mylittlestory.init.

  2. У интерфейса укажите аннотацию @SimplyRegister. Получается такой файл:

    package ru.storyteam.mylittlestory.init; import org.zeith.hammerlib.annotations.SimplyRegister; @SimplyRegister public interface StoryBlocks { }
  3. Теперь нам нужно создать пакет, внутри которого будут храниться все наши блоки. Создайте пакет blocks внутри пакета ru.storyteam.mylittlestory.content.

  4. Создайте класс MetalBlock в пакете ru.storyteam.mylittlestory.content.blocks. Получается такой файл:

    package ru.storyteam.mylittlestory.content.blocks; public class MetalBlock { }
  5. Теперь нам нужно реализовать блок, для этого мы укажем, что наш класс наследуется от 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_); } }
  6. Теперь нам нужно зарегистрировать наш блок. Для этого мы возвращаемся в 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)); }

И уже в этот момент наш блок появится в игре, но он не имеет текстуры, модели, названия и логики, поэтому давайте это исправим!

very-bad-block

Текстурируем блок

  1. Идём в папку с ресурсами и создаём папку block внутри папки textures.

  2. В папку block помещаем текстуру нашего блока. В моём случае это metal_block.png.

  3. Теперь нам нужно указать модель, согласно которой будет отрисовываться наш блок. Для этого создаём папку block внутри папки models.

  4. В папке 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 - Горизонтальный кубический столб.

  5. И последнее, что нам нужно сделать – указать модели, которые используются для разных состояний блока. Для этого создаём папку blockstates внутри папки mylittlestory в ресурсах.

  6. В папке blockstates создаём файл metal_block.json и помещаем туда следующий код:

    { "variants": { "": { "model": "mylittlestory:block/metal_block" } } }

    В этом файле мы указываем что для любого состояния блока используется модель storytelling:block/metal_block.

Прекрасно, наш блок теперь имеет текстуру в мире, но в инвентаре он всё ещё без текстуры, давайте это исправим.

bad-item.png

Текстурируем предмет

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

good-item.png

Прописываем название для блока

  • Идём в папку lang в ресурсах и в файле ru_ru.lang прописываем название для нашего блока в виде блока и предмета.

    item.mylittlestory.metal_block=Металлический блок block.mylittlestory.metal_block=Металлический блок

Чудесно, теперь наш блок имеет название, но он всё ещё не имеет логики, давайте это исправим.

good-block-name.png

Добавляем логику

  1. Возвращаемся в класс MetalBlock и переопределяем метод use. Для этого нажимаем Ctrl + o и вводим use, после чего нажимаем Enter.

    use.png
  2. В наш класс добавляется код:

    @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_); }
  3. Теперь мы реализуем логику проигрывания звука при клике на блок.

    Для этого мы используем метод 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 ваше мнение и что вы хотите видеть дальше!

Оставайтесь с нами!

Last modified: 03 декабря 2023