【Java + Mod開発】Minecraftでオリジナルのブロックに機能を追加する

Java

はじめに

今回は、マイクラのMod開発としてオリジナルのブロックに特殊な機能を追加していきたいと思います。

 

前提

ドロップ作成の前提として、以下記事を参考にModの開発環境が構築されていること。

【参照】
【開発環境構築】VSCodeでMinecraft(Java版)のMOD作成環境を構築する – SEもりのLog (selifemorizo.com)

【Java + Mod開発】オリジナルのアイテムを追加してみる – SEもりのLog (selifemorizo.com)

【Java + Mod開発】オリジナルのブロックをMinecraftで追加してみる – SEもりのLog (selifemorizo.com)

 

ブロックに機能を追加する

追加する機能は以下です。
・しゃがんでいる場合、ブロックに対してブロックを設置できる
・しゃがんでいない場合、ブロックに対してブロックを設置できない

 

フォルダ構成

赤字のフォルダ・ファイルが今回必要な追加・修正対象になります。

└─src
    ├─generated
    │  └─resources
    │      └─.cache
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─mori
    │  │          └─morimod
    │  │              │  Config.java
    │  │              │  MoriMod.java
    │  │              │
    │  │              ├─blocks
    │  │              │  │  MoriModBlock.java
    │  │              │  │
    │  │              │  └─customize
    │  │              │          HiraganaBlock.java
    │  │              │
    │  │              └─items
    │  │                  │  MoriModCreativeModeTabs.java
    │  │                  │  MoriModFood.java
    │  │                  │  MoriModItem.java
    │  │                  │
    │  │                  └─customize
    │  │                          IronSearcherItem.java
    │  │                          JudgeItem.java
    │  │
    │  └─resources
    │      │  pack.mcmeta
    │      │
    │      ├─assets
    │      │  └─morimod
    │      │      ├─blockstates
    │      │      │      a_block.json
    │      │      │      moriblock.json
    │      │      │      mo_block.json
    │      │      │      ri_block.json
    │      │      │
    │      │      ├─lang
    │      │      │      en_us.json
    │      │      │      ja_jp.json
    │      │      │
    │      │      ├─models
    │      │      │  ├─block
    │      │      │  │      a_block.json
    │      │      │  │      moriblock.json
    │      │      │  │      mo_block.json
    │      │      │  │      ri_block.json
    │      │      │  │
    │      │      │  └─item
    │      │      │          a_block.json
    │      │      │          humbarger.json
    │      │      │          iron_searcher.json
    │      │      │          judge_rod.json
    │      │      │          moriblock.json
    │      │      │          moriitem.json
    │      │      │          moriitem2.json
    │      │      │          mo_block.json
    │      │      │          ri_block.json
    │      │      │
    │      │      └─textures
    │      │          ├─block
    │      │          │      a_block.png
    │      │          │      moriblock.png
    │      │          │      mo_block.png
    │      │          │      ri_block.png
    │      │          │
    │      │          └─item
    │      │                  humbarger.png
    │      │                  iron_searcher.png
    │      │                  judge_rod.png
    │      │                  moriitem.png
    │      │                  moriitem2.png
    │      │
    │      ├─data
    │      │  ├─minecraft
    │      │  │  └─tags
    │      │  │      └─blocks
    │      │  │          │  needs_diamond_tool.json
    │      │  │          │  needs_iron_tool.json
    │      │  │          │  needs_stone_tool.json
    │      │  │          │
    │      │  │          └─mineable
    │      │  │                  axe.json
    │      │  │                  hoe.json
    │      │  │                  pickaxe.json
    │      │  │                  shovel.json
    │      │  │
    │      │  └─morimod
    │      │      ├─loot_tables
    │      │      │  └─blocks
    │      │      │          moriblock.json
    │      │      │          mo_block.json
    │      │      │          ri_block.json
    │      │      │
    │      │      └─recipes
    │      │              humbarger.json
    │      │              moriblock.json
    │      │              moriitem_from_block.json
    │      │
    │      └─META-INF
    │              mods.toml

 

ソース編集

HiraganaBlock.java

ブロックに対しての挙動を記載するクラスを用意します。

package com.mori.morimod.blocks.customize;

import org.slf4j.Logger;

import com.mojang.logging.LogUtils;
import com.mori.morimod.blocks.MoriModBlock;

import net.minecraft.core.BlockPos;
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 HiraganaBlock extends Block {

    private static final Logger LOGGER = LogUtils.getLogger();

    public HiraganaBlock(Properties properties) {
        super(properties);
    }

    @Override
    /**
     * 右クリック時のイベント
     */
    public InteractionResult use(BlockState p_60503_, Level p_60504_, BlockPos p_60505_, Player p_60506_,
            InteractionHand p_60507_, BlockHitResult p_60508_) {

        if (!p_60504_.isClientSide() && p_60507_ == InteractionHand.MAIN_HAND) {
            LOGGER.info("サーバーサイド処理", p_60508_);

            // あブロックの場合
            if (p_60503_.is(MoriModBlock.A_BLOCK.get())) {
                LOGGER.info("あブロック", p_60508_);

                // しゃがんでいる場合の処理は、ブロック情報を返却
                if (p_60506_.isCrouching()) {
                    return super.use(p_60503_, p_60504_, p_60505_, p_60506_, p_60507_, p_60508_);
                }

                return InteractionResult.SUCCESS;
            }
        }
        return super.use(p_60503_, p_60504_, p_60505_, p_60506_, p_60507_, p_60508_);
    }
}

 

MoriModItem.java

ブロック自体の定義を実施する。

package com.mori.morimod.blocks;

import java.util.function.Supplier;

import com.mori.morimod.MoriMod;
import com.mori.morimod.blocks.customize.HiraganaBlock;
import com.mori.morimod.items.MoriModItem;

import net.minecraft.util.valueproviders.UniformInt;
import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.DropExperienceBlock;
import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.material.MapColor;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;
import net.minecraftforge.registries.RegistryObject;

/**
 * ブロックMod用クラス
 */
public class MoriModBlock {
    // MODIDは自身で設定したものを指定します
    public static final DeferredRegister<Block> BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MoriMod.MODID);

    // 既存ブロックの設定をコピーしたブロックの設定が可能(↓は鉄ブロック)
    // public static final RegistryObject<Block> MORIBLOCK = registerBlock("moriblock",
    //        () -> new Block(BlockBehaviour.Properties.copy(Blocks.IRON_BARS)));

    // ブロックの設定(下は草ブロックの設定をパクってきたもの)
    public static final RegistryObject<Block> MORIBLOCK =
    registerBlock("moriblock",
    () -> new Block(BlockBehaviour.Properties.of()
    .mapColor(MapColor.GRASS)
    .randomTicks()
    .strength(0.6F)
    .sound(SoundType.GRASS)));

    // あブロック
    public static final RegistryObject<Block> A_BLOCK =
    registerBlock("a_block",
    () -> new HiraganaBlock(BlockBehaviour.Properties.copy(Blocks.IRON_BLOCK)));

    private static <T extends Block> RegistryObject<T> registerBlock(String name, Supplier<T> block) {
        RegistryObject<T> returnObj = BLOCKS.register(name, block);
        registerBlockItem(name, returnObj);
        return returnObj;
    }

    /**
     * ブロックをアイテムとして登録するメソッド
     */
    private static <T extends Block> RegistryObject<Item> registerBlockItem(String name, RegistryObject<T> block) {
        return MoriModItem.ITEMS.register(name, () -> new BlockItem(block.get(), new Item.Properties()));
    }

    public static void register(IEventBus eventBus) {
        BLOCKS.register(eventBus);
    }
}

 

設定の追加

blockstates/a_block.json

{
    "variants": {
      "": {
        "model": "morimod:block/a_block" 
      }
    }
}

 

models/block/a_block.json

どのテクスチャをどういう形式で出力させるかを設定するファイルです。
ファイル名は自身でつけたアイテムのIDを設定します。

{
    "parent": "block/cube_all",
    "textures":{
        "all": "morimod:block/a_block"
    }
}

 

models/item/a_block.json

{
    "parent": "morimod:block/a_block"
}

 

textures

テクスチャ(画像データ)を格納します。

 

ja_jp.json

ゲーム内で表示するアイテム名を指定します。

{
    "item.morimod.moriitem": "もり アイテム",
    "item.morimod.moriitem2": "もり アイテム2",
    "item.morimod.iron_searcher": "鉄探知",
    "item.morimod.judge_rod": "ブロック鑑定",

    "block.morimod.moriblock": "もり ブロック",
    "block.morimod.mo_block": "も ブロック",
    "block.morimod.ri_block": "り ブロック",
    "block.morimod.a_block": "あ ブロック",

    "item.morimod.humbarger": "ハンバーガー",

    "creativetab.moritab": "もり タブ"
}

 

実行確認

実際にブロックの挙動を確認してみます。
挙動が確認できたら今回は完了です。

 

公式サイト

公式サイト | Minecraft

 

最後に

以上、ログになります。
これからも継続していきましょう!!

Javaゲーム趣味/その他
おすすめIT本
良いコード/悪いコードで学ぶ設計入門

「ITエンジニア本大賞2023」技術書部門で大賞を受賞した本です。
・コードの可読性
・普段意識したほうが良いこと
・リファクタリング考え方
等、普段のコードを設計する際に意識することが書かれています。
コードのあるべき姿に迷ったら一度読んでみると良い本です。

仕組みと使い方がわかる Docker&Kubernetesのきほんのきほん

Dockerって何?となったときに私が最初に読んだ本です。
Dockerがどんな仕組みで動いているのか、コマンドでは何を命令しているのかを理解できるように、イラストを多用して説明しています。

1冊ですべて身につくJavaScript入門講座

「ITエンジニア本大賞2024」技術書部門で大賞を受賞した本です。
私が次に読もうと思っている本なのでおすすめとして挙げておきたいと思います。

コメント

タイトルとURLをコピーしました