HaLake Magazine

コワーキングスペースHaLakeの技術情報発信サイト!IoT,AR,VRなど最新技術情報をお届け!

Minecraft(1.12.2)Mod作成 環境構築&ブロック作成

初心者でも簡単にModを作成する環境と自作ブロックの追加する方法を書いていきます。
今回、作りこむ気はないので簡単に何の効果もないブロックを作成します。
「こうやってブロックをつくるんだなぁ」程度にわかってもらえればと思います。

前提条件

開発環境

  • windows10(macでもほぼ同じように環境を整えられる:動作確認済み)
  • JDK 8u211
  • IntelliJ
  • Minecraft Forge(1.12.2)

参考記事

目次

環境のセットアップ

JDKのダウンロード&インストール

まずは下記のURLからJDKをダウンロードしインストールしていきます。

www.oracle.com

画像の手順でダウンロードしてください。 f:id:mischief_cat:20200403142739p:plain f:id:mischief_cat:20200403142757p:plainf:id:mischief_cat:20200403142806p:plainf:id:mischief_cat:20200403142813p:plain

Oracleのプロファイルを持っている人はメールアドレスとパスワードを入力後サインインボタンを押すことで数秒後、ダウンロードが開始します。
Oracleのプロファイルを持っていない人は画像下のプロファイル作成を行ってください。学生や企業ではない方は下記のURLを参考にプロファイル作成をしてください。
作成後、登録した情報を入力しダウンロードしてください。

qiita.com

その後ダウンロードしたファイルを実行しインストーラに従ってインストールしてください。

IntelliJのダウンロード&インストール

下記URLにアクセス
www.jetbrains.com 画像の手順でダウンロード
f:id:mischief_cat:20200403150904p:plainf:id:mischief_cat:20200403150914p:plain 数秒後にダウンロードが開始される。
ダウンロード後、下記の参考サイトからの画像があるのでその手順でインストールと初期設定してください。 f:id:mischief_cat:20200403151552p:plain その後プラグインの設定をしていきます。 初回起動時にはWelcome to IntelliJ IDEAのウィンドウが出てくるはずなので下記の画像に従って操作する。 f:id:mischief_cat:20200403152853p:plain f:id:mischief_cat:20200403152902p:plain ウィンドウが出てくるのでacceptをクリックしインストールできればリスタートボタンが出現するので再起動したら成功です。

プロジェクトの作成

再起動後またWelcome to IntelliJ IDEAウィンドウが開かれるので下記画像に従って操作する。

f:id:mischief_cat:20200403161541p:plain f:id:mischief_cat:20200403161544p:plain f:id:mischief_cat:20200403161554p:plain f:id:mischief_cat:20200403161558p:plain f:id:mischief_cat:20200403162922p:plain 最後に"finish"ボタンを押すことでプロジェクトの作成が開始されます。
プロジェクト作成に少し時間がかかる場合があるので止まったとは思わず気長に待ちましょう。
作成終了後、ウィンドウか右下にgradleに関しての通知が来るのでその場合はウィンドウに何もせずOKを押してインポートしてください。
ウィンドウも何も出てこない場合はintellijを再起動してもう一度確かめれば出てくるはずです。
詳しくは参考サイトのImport Module from Gradleを参照してください。
f:id:mischief_cat:20200403164735p:plain 上記画像のようなgradleのウィンドウが開けたら成功です。

  • 注意:windows defenderが問題でログが出た場合はfiXを選び対応する
    windowsのonedriveが有効なディレクトリの場合エラーを出してくることがある?
    書き込みや読み出し、実行の権限がないユーザーやディレクトリで作るとエラーなど正常に動作しないので注意。

動作確認

ここまでで環境は整えられたので実際にMinecraftを起動させてみましょう。f:id:mischief_cat:20200403165724p:plain 画像の赤く下線が引かれたもの上から順番にクリックし最後の赤下線を左クリック f:id:mischief_cat:20200403170133p:plain 一番上の青くなっているRun...をクリックすると起動準備に入ります。
pcのスペックによっては途中で止まることもありますがもういちど同じ方法で何回か試すと起動できるようになります。ある程度時間がかかる場合があるので気長に待ちましょう。
起動出来たらマインクラフトの最初の画面が表示されます。
f:id:mischief_cat:20200403170851p:plain 赤枠をクリック f:id:mischief_cat:20200403170952p:plain 先ほど自分が設定した名前にmod名がなっていたら成功です。(やっとここまで来ました...)

Mods作成

Mod詳細設定

手始めにmodの情報を編集していきます。
今後のブロック作成には関係のないことなので飛ばしたい方は無視してください。

halake_mod/src/main/resources/mcmod.info

というファイルがあるのでこれを書き換えることによって先ほど確認した画像のmod詳細を変えることができる。
例えばこんな感じ。

[
  {
    "modid": "halake_mod",
    "name": "Halake mod",
    "description": "HaLaKe is lots of fun.",
    "version": "${version}",
    "mcversion": "${mcversion}",
    "url": "https://www.halake.com/",
    "updateUrl": "",
    "authorList": ["halaker"],
    "credits": "",
    "logoFile": "assets/halake_mod/logo.png",
    "screenshots": [],
    "dependencies": []
  }
]

もともとあったファイルの中身と見比べるとところどころ変わっているのがわかるでしょうか?
同じように書き換えることによって自由に表示させることができます。 上記のmod詳細の画像と比べると変わっているのがわかります。 f:id:mischief_cat:20200403235223p:plain もしロゴ画像を登録したい場合はすでに上記のプログラムに記載済みなのですが、"logoFile"の欄の右側に記載されているようにロゴにしたい画像の相対パスを記入することで登録できます。パスのようにファイルを作って画像を保存していきましょう。

  • Tips:コマンドプロンプトtreeと入力し調べたいフォルダをプロンプトのウィンドウにドラッグ&ドロップし実行することでファイルの階層関係を視覚化できる。同じようになっているか確認してみよう!最後にオプションの/fを付けてください。 <例>tree C:\Users\M.Shinoda\Desktop\halake_mod /f
halake_mod
│
省略
│
└─src
    ├─main
    │  ├─java
    │  │  └─halake
    │  │      └─halake_mod
    │  │              Halake_mod.java
    │  │
    │  └─resources
    │      │  mcmod.info
    │      │
    │      └─assets                   ←追加
    │          └─halake_mod           ←追加
    │                  logo.png       ←追加
    │
    └─test
        ├─java
        └─resources

使う画像はこちら

f:id:mischief_cat:20200403233337p:plain
logo.png
サイズは縦横120ピクセルくらいでいいと思います。自由な画像を使う場合、windowsだったら標準アプリのペイント3Dあたりを使えば大きさを変更できます。
成功例がこちら f:id:mischief_cat:20200404000915p:plain いい感じにできました!

ブロック作成

今回の本題、ブロック作成に入っていきたいと思います。

まずはメインとなるプログラムをいじっていきます。
初めにサンプルとして記述されているので思い切ってすべて削除していきましょう。

halake_mod/src/main/java/halake/halake_mod/halake_mod.java

をすべて削除し、下のプログラムをコピペする。

package halake.halake_mod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.registry.GameRegistry;


@Mod(
        modid = Halake_mod.MOD_ID,
        name = Halake_mod.MOD_NAME,
        version = Halake_mod.VERSION
)
public class Halake_mod {

    public static final String MOD_ID = "halake_mod";
    public static final String MOD_NAME = "Halake_mod";
    public static final String VERSION = "2019.3-1.3.4";

    /*
    メンバーの追加
     */
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Items {
        public static final Item halakeblock = null;
    }
    @GameRegistry.ObjectHolder(MOD_ID)
    public static class Blocks{
        public static final Block halakeblock = null;
    }

    /*
    アイテムの登録
     */
    @Mod.EventBusSubscriber
    public static class ObjectRegistryHandler {
        @SubscribeEvent
        public static void addItems(RegistryEvent.Register<Item> event) {
            event.getRegistry().registerAll(
                    new ItemBlock(Blocks.halakeblock)
                            .setRegistryName("halakeblock")
            );
        }

        /*
        ブロックの登録
         */
        @SubscribeEvent
        public static void addBlocks(RegistryEvent.Register<Block> event) {
            event.getRegistry().registerAll(
                    new Block(Material.ROCK)
                            .setRegistryName(MOD_ID,"halakeblock")
                            .setCreativeTab(CreativeTabs.BUILDING_BLOCKS)
                            .setTranslationKey("halakeblock")
                            .setHardness(1.5F)
                            .setResistance(1.0F)
                            .setLightLevel(1.0F)
            );

        }

        /*
        モデルの登録
         */
        @SubscribeEvent
        public static void registerModels(ModelRegistryEvent event) {
            ModelLoader.setCustomModelResourceLocation(Items.halakeblock, 0, new ModelResourceLocation(Items.halakeblock.getRegistryName(), "inventory"));
        }
    }
}
  • 注意:プログラムにコメントが記述されているとエラーがでるが問題なく動くことは確認済みなので気になるかたはコメント部分を削除してください。

次に必要なファイルを作成してきます。

halake_mode
│
省略
│
└─src
    ├─main
    │  ├─java
    │  │  └─halake
    │  │      └─halake_mod
    │  │              Halake_mod.java
    │  │
    │  └─resources
    │      │  mcmod.info
    │      │
    │      └─assets                     ←mod詳細設定で説明済み(飛ばしていれば追加)
    │          └─halake_mod             ←mod詳細設定で説明済み(飛ばしていれば追加)
    │              │  logo.png          ←mod詳細設定で説明済み(なくてもOK)
    │              │
    │              ├─blockstates        ←追加
    │              │
    │              ├─models             ←追加
    │              │  ├─block           ←追加
    │              │  │
    │              │  └─item            ←追加
    │              │
    │              └─textures            ←追加
    │                  └─blocks          ←追加
    │
    └─test
        ├─java
        └─resources

ファイル作成はwindowsエクスプローラーで行うとやりやすい。(気がする) 前述のtreeコマンドで同じような階層になっているか確認する

ブロックのモデルを設定

先ほどのロゴに使った画像を名前をhalakeblock.pngに変えて下記のように配置する

/src/main/resources/assets/halake_mod/textures/blocks/halakeblock.png

jsonファイルは

/src/main/resources/assets/halake_mod/models/block/halakeblock_model.json

に配置し、以下を記述。

{
    "parent":"block/cube_all",
    "textures":{"all":"halake_mod:blocks/halakeblock"}
}

ブロックの状態設定

jsonファイルは

/src/main/resources/assets/halake_mod/blockstates/halakeblock.json

に配置し、以下を記述。

{
    "variants": {
        "normal": { "model": "halake_mod:halakeblock_model" }
    }
}

アイテムのモデル設定

sonファイルは /src/main/resources/assets/halake_mod/models/item/halakeblock.json に配置し、以下を記述。

{
    "parent":"halake_mod:block/halakeblock_model"
}

ここまで出来たらもう一度treeコマンドを使って同じようになっているか確認しましょう。

halake_mod
│
省略
│
└─src
    ├─main
    │  ├─java
    │  │  └─halake
    │  │      └─halake_mod
    │  │              Halake_mod.java
    │  │
    │  └─resources
    │      │  mcmod.info
    │      │
    │      └─assets
    │          └─halake_mod
    │              │  logo.png
    │              │
    │              ├─blockstates
    │              │      halakeblock.json
    │              │
    │              ├─models
    │              │  ├─block
    │              │  │      halakeblock_model.json
    │              │  │
    │              │  └─item
    │              │          halakeblock.json
    │              │
    │              └─textures
    │                  └─blocks
    │                          halakeblock.png
    │
    └─test
        ├─java
        └─resources

名前や階層が違うだけで動作しないのでよく確認しエラーが出たときは内容に応じてもう一度確認してみることをお勧めします。
これらすべての設定が終わったら前述の方法でMinecraftがエラーを出さずに起動出来れば完成です。 f:id:mischief_cat:20200404022955p:plain f:id:mischief_cat:20200404023006p:plain こんな感じ!
ワールドをクリエイティブ、スーパーフラット、チートオン、で作成するとブロックの呼び出しとサバイバルの切り替えなどデバッグしやすいのでお勧めです。
起動時の動作の軽減には表示チャンク数を下げるのと難易度をピースフルに設定するのもいいかも。

l名前の指定とレシピの追加(おまけ)

プレイ中のアイテム名の表示を言語に応じて変えてみる。

src/main/resources/assets/halake_mod/lang

を作成し、この中に以下の二つを追加する。
en_US.lang

# English Language File
tile.halakeblock.name=HaLaKe Block

ja_JP.lang

# 日本語言語ファイル
tile.halakeblock.name=ハレイクブロック

これらを追加することで言語を日本語に設定したとき”ハレイクブロック”と表記される。
次にレシピに追加をしていきます。

resources/assets/halake_mod/recipes/halakeblock_recipe.json

を作成し下記を記述。

{
  "type": "minecraft:crafting_shaped",
  "pattern": [
    "BBB",
    "BBB",
    "BBB"
  ],
  "key": {
    "B": [
      {
        "item": "minecraft:water_bucket",
        "data": 0
      }
    ]
  },
  "result": {
    "item": "halake_mod:halakeblock",
    "data": 0,
    "count": 1
  }
}

水のバケツ9個を作業台でクラフトするとハレイクブロックを作れるようなレシピをつくりました。(ハ....レイクだけに水で....)スベリorz
Minecraftを起動しクラフトしてみるとできるはずです。

まとめ

プログラムの細かい説明は省きましたが序盤にも申し上げた通りこんな風にできてるんだなぁと思ってもらうためにかきました。(自分が一番理解できてないだけ)
正直に言うと今後はMinecraftのmodは触りたくないと思うほどめんどくさかった。バージョンが少し違うだけでプログラムの書き方が変わるので記事があっても使えなかったり...
簡単な仕組みと流れは理解できたのでプログラミング初心者の私からすると良い体験ができました。