【Java + Mod開発】オリジナルのブロックをMinecraftで追加してみる

ゲーム

はじめに

今回は、マイクラのMod開発としてオリジナルブロックの追加をやってみたいと思います。

 

前提

以下記事を参考にModの開発環境が構築されていること。

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

【Java + Mod開発】Minecraftで作成するModの名前を変更してみる – SEもりのLog (selifemorizo.com)

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

 

フォルダ構成を作成する

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

│  .gitattributes
│  .gitignore
│  build.gradle
│  changelog.txt
│  CREDITS.txt
│  gradle.properties
│  gradlew
│  gradlew.bat
│  LICENSE.txt
│  README.txt
│  runClient.launch
│  runData.launch
│  runGameTestServer.launch
│  runServer.launch
│  settings.gradle
│
├─.vscode
│      settings.json
└─src
    ├─generated
    │  └─resources
    ├─main
    │  ├─java
    │  │  └─com
    │  │      └─mori
    │  │          └─morimod
    │  │              │  Config.java
    │  │              │  MoriMod.java
    │  │              │
    │  │              ├─blocks
    │  │              │      MoriModBlock.java
    │  │              │
    │  │              └─items
    │  │                      MoriModItem.java
    │  │
    │  └─resources
    │      │  pack.mcmeta
    │      │
    │      ├─assets
    │      │  └─morimod
    │      │      ├─blockstates
    │      │      │      moriblock.json
    │      │      │
    │      │      ├─lang
    │      │      │      en_us.json
    │      │      │      ja_jp.json
    │      │      │
    │      │      ├─models
    │      │      │  ├─block
    │      │      │  │      moriblock.json
    │      │      │  │
    │      │      │  └─item
    │      │      │          moriblock.json
    │      │      │          moriitem.json
    │      │      │
    │      │      └─textures
    │      │          ├─block
    │      │          │      moriblock.png
    │      │          │
    │      │          └─item
    │      │                  moriitem.png
    │      │
    │      └─META-INF
    │              mods.toml
    │

 

ソース編集

MoriModBlock.java

ブロックMod用のjavaファイルを作成します。

package com.mori.morimod.blocks;

import java.util.function.Supplier;

import com.mori.morimod.MoriMod;
import com.mori.morimod.items.MoriModItem;

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.SoundType;
import net.minecraft.world.level.block.state.BlockBehaviour;
import net.minecraft.world.level.block.state.properties.NoteBlockInstrument;
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)));

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

 

MoriMod.java

Modの大元のクラスでブロックMod用のクラスを読み込みます。

@Mod(MoriMod.MODID)
public class MoriMod
{
~~~~~~~~~~~~~~~
    public MoriMod()
    {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();

        MoriModItem.register(modEventBus);
        MoriModBlock.register(modEventBus);
~~~~~~~~~~~~~~~
    }
~~~~~~~~~~~~~~~
    // Add the example block item to the building blocks tab
    private void addCreative(BuildCreativeModeTabContentsEvent event)
    {
        // クリエイティブモードのタブにアイテムをセット
        // INGREDIENTSは材料のグループになる
        if (event.getTabKey() == CreativeModeTabs.INGREDIENTS) {
            event.accept(MoriModItem.MORIITEM.get());
        }

        // クリエイティブモードのタブにアイテムをセット
        // BUILDING_BLOCKSは建材
        if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) {
            event.accept(MoriModBlock.MORIBLOCK.get());
        }
    }
~~~~~~~~~~~~~~~
}

 

設定の追加

blockstates/moriblock.json

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

 

block/moriblock.json

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

 

テクスチャ格納

画像サイズは、できる限り小さくしたほうが良いです。
この例はは大きくして張っています。

 

ja_jp.json

{
    "item.morimod.moriitem": "もり アイテム",

    "block.morimod.moriblock": "もり ブロック"
}

 

実行確認

実行して独自のアイテムが作成されていることを確認しましょう!

 

クリエイティブモードに変更する

/gamemode creative

 

建材の確認

建材のグループに独自のブロックが追加されていることを確認。

 

操作してみる

置いたり持ったりできたら今回は完了です。

 

公式サイト

公式サイト | Minecraft

 

最後に

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

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

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

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

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

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

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

コメント

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