2016年7月4日月曜日

マインクラフトのmod作成環境構築を行いシンプルなblockを作る方法


つまづきながらもテクスチャ付きのblockを作りに成功したので、そこまでの道のりを共有します。

全体像

  1. 環境構築
    1. jdk-8のインストール
    2. Minecraft FORGE MDKのダウンロード
    3. Minecraft FORGE MDKの配置
    4. Minecraft FORGE MDKのビルド
    5. ビルドの確認
  2. blockの作成
    1. modのmainファイルの作成
    2. blockファイルの作成
    3. 既存のmod設定ファイルに情報を追加
    4. assets:blockstatusファイルの作成
    5. assets:models/blockファイルの作成
    6. assets:models/itemファイルの作成
    7. テクスチャに使う画像の設置
    8. 名前ファイルの作成
  3. blockの動作確認
    1. modの情報確認
    2. blockの動作確認

環境構築

このような流れで行います。
  1. jdk-8のインストール
  2. Minecraft FORGE MDKのダウンロード
  3. Minecraft FORGE MDKの配置
  4. Minecraft FORGE MDKのビルド
  5. ビルドの確認
MDKを使えばMinecraftを起動できるため、Minecraft.jarは不要です。

jdk-8のインストール

ubuntuの場合は下記のコマンドでインストールできます。
sudo apt-get install openjdk-8-jdk

Minecraft FORGE MDKのダウンロード

記事を書いている時点で安定しているという噂の1.8.9を利用しました。

Downloads - 1.8.9


Minecraft FORGE MDKの配置

先ほどダウンロードしたzipファイルを解凍したものがMDKの開発環境になるので、その前提で解凍したファイルを配置してください。
自分はminecraftというディレクトリを作って、そこに配置しました。
cd ~/Downloads
unzip forge-1.8.9-11.15.1.1902-1.8.9-mdk.zip
mkdir ~/minecraft
mv forge-1.8.9-11.15.1.1902-1.8.9-mdk ~/minecraft

Minecraft FORGE MDKのビルド

下記のコマンドでビルドします。
cd minecraft/forge-1.8.9-11.15.1.1902-1.8.9-mdk/
./gradlew setupDecompWorkspace

■自分が詰まったこと
jdk-9ではforge-1.8.9で下記のエラーが出ました。
この場合はjdkのバージョンを8に変更してください。
Could not determine java version from '9-internal'.

下記のようなエラーはソースコードのダウンロードに失敗を意味します。
ネットワークを確認して再度ビルドを実行してみてください。
* What went wrong:
A problem occurred evaluating root project 'forge-1.8.9-11.15.1.1902-1.8.9-mdk'.
> Failed to apply plugin [id 'net.minecraftforge.gradle.forge']
> Unable to obtain url (http://export.mcpbot.bspk.rs/versions.json) with etag!

build試行錯誤中にjavaのバージョンを切り替えたりjdkをインストールしたりすると、下記のエラーが出ました。
「--refresh-dependencies」のオプションをつけてコマンドを再実行すると、解消されることがあります。
* What went wrong:
Execution failed for task ':getAssets'.
> java.io.FileNotFoundException: /home/asuki/.gradle/caches/minecraft/assets/indexes/1.8.json (そのようなファイルやディレクトリはありません)
参考: Finding assets error (Gradle) #116

ビルドの確認

ビルドが成功すれば、下記のコマンドでminecraftを起動できます。
遊んでみてください。
cd minecraft/forge-1.8.9-11.15.1.1902-1.8.9-mdk/
./gradlew runClient


blockの作成

下記の内容を行うことで、テクスチャ付きのブロックを作れます。
  1. modのmainファイルの作成
  2. blockファイルの作成
  3. 既存のmod設定ファイルに情報を追加
  4. assets:blockstatusファイルの作成
  5. assets:models/blockファイルの作成
  6. assets:models/itemファイルの作成
  7. テクスチャに使う画像の設置
  8. 名前ファイルの作成

ファイル名で[forge_dir]と記述している部分はforge-mdkのディレクトリと解釈してください。
上記の方法でforgeをインストールした場合は[~/minecraft/forge-1.8.9-11.15.1.1902-1.8.9-mdk/]が[forge_dir]です。

なお、ファイルやディレクトリが無い場合は適宜作成してください。

では、それぞれの手順を説明していきます。

modのmainファイルの作成

modが使用できる環境の定義や、blockファイルの読み込みなどを行うファイルです。
modの動作に必須です。
[forge_dir]/src/main/java/com/simplesamplemod/SimpleSample.java
package com.simplesamplemod;

import net.minecraft.block.Block;
import net.minecraft.client.resources.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.Mod.EventHandler;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

@Mod(modid                     = SimpleSample.MOD_ID,
     name                      = SimpleSample.MOD_NAME,
     version                   = SimpleSample.MOD_VERSION,
     dependencies              = SimpleSample.MOD_DEPENDENCIES,
     acceptedMinecraftVersions = SimpleSample.MOD_ACCEPTED_MC_VERSIONS,
     useMetadata = true)
public class SimpleSample {
  public static final String MOD_ID = "simplesamplemod";
  public static final String MOD_NAME = "Simple Sample Mod";
  public static final String MOD_VERSION = "0.0.1";
  public static final String MOD_DEPENDENCIES = "required-after:Forge@[1.8-11.14.0.1239,)";
  public static final String MOD_ACCEPTED_MC_VERSIONS = "[1.8,1.8.9]";

  // defined in src/com/simplesample/SimpleSampleBlock.java
  public static Block simpleSampleBlock;

  @EventHandler
  public void preInit(FMLPreInitializationEvent event) {
    simpleSampleBlock = new SimpleSampleBlock();

    if ( event.getSide().isClient() ) {
      // load resource to render texture
      ModelLoader.setCustomModelResourceLocation(Item.getItemFromBlock(simpleSampleBlock), 0, new ModelResourceLocation(MOD_ID + ":" + ((SimpleSampleBlock) simpleSampleBlock).getName(), "inventory"));
    }
  }

}

blockファイルの作成

blockを定義するファイルです。
modの動作に必須です。
[forge_dir]/src/main/java/com/simplesamplemod/SimpleSampleBlock.java
package com.simplesamplemod;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraftforge.fml.common.registry.GameRegistry;

public class SimpleSampleBlock extends Block {
  private final String name = "SimpleSampleBlock";

  public SimpleSampleBlock() {
    super(Material.rock);
    GameRegistry.registerBlock(this, name);
    setCreativeTab(CreativeTabs.tabBlock);
    setUnlocalizedName(name);
  }

  public String getName() {
    return name;
  }
}

既存のmod設定ファイルに情報を追加

mcmod.infoにsimplesamplemodの情報を追加します。
modの動作に必須です。
[forge_dir]/src/main/resources/mcmod.info
[
{
  "modid": "examplemod",
  "name": "Example Mod",
  "description": "Example placeholder mod.",
  "version": "${version}",
  "mcversion": "${mcversion}",
  "url": "",
  "updateUrl": "",
  "authorList": ["ExampleDude"],
  "credits": "The Forge and FML guys, for making this example",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
},
{
  "modid": "simplesamplemod",
  "name": "Simple Sample Mod",
  "description": "Simple example sample mod.",
  "version": "${version}",
  "mcversion": "${mcversion}",
  "url": "",
  "updateUrl": "",
  "authorList": ["Asuki Kono"],
  "credits": "Simple tutorial.",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
}
]

assets:blockstatusファイルの作成

assetsの入り口となるファイルです。
このファイルが無くてもmodは動作しますが、テクスチャが表示できません。
[forge_dir]/src/main/resources/assets/simplesamplemod/blockstates/SimpleSampleBlock.json
{
  "variants": {
    "normal": { "model": "simplesamplemod:SimpleSampleBlock" }
  }
}

参考: Block states

assets:models/blockファイルの作成

定義したblockの表面に表示したい画像を指定します。
このファイルが無くてもmodは動作しますが、テクスチャが表示できません。
今回は「logo.png」をテクスチャに設定します。
[forge_dir]/src/main/resources/assets/simplesamplemod/models/block/SimpleSampleBlock.json
{
  "parent":"block/cube_all",
  "textures": {
    "all": "simplesamplemod:blocks/logo"
  }
}

assets:models/itemファイルの作成

今回作成するのはblockですが「blockをitemとして持った時にどのように表示するか」の定義が必要なようです。
このファイルが無くてもmodは動作しますが、テクスチャが表示できません
[forge_dir]/src/main/resources/assets/simplesamplemod/models/item/SimpleSampleBlock.json
{
  "parent": "simplesamplemod:block/SimpleSampleBlock",
  "display": {
    "thirdperson": {
      "rotation": [ 10, -45, 170 ],
      "translation": [ 0, 1.5, -2.75 ],
      "scale": [ 0.375, 0.375, 0.375 ]
    }
  }
}

テクスチャに使う画像の設置

下記のパスに画像を設置しました。
[forge_dir]/src/main/resource/assets/simplesamplemod/texturess/blocks/logo.png

logo.png

16x16pxの画像が推奨されていますが、100x100pxの画像でも表示できました。
アルファチャンネル(透明色)が入っていても大丈夫でした。

名前ファイルの作成

作成したblockの名前を定義するファイルです。
このファイルが無くてもmodを動かせますが、ブロックの名前が「tile.SimpleSampleBlock.name」になります。
[forge_dir]/src/main/resource/assets/simplesamplemod/lang/en_US.lang
tile.SimpleSampleBlock.name=Simple Sample Block

日本語の設定はこちらです。
[forge_dir]/src/main/resource/assets/simplesamplemod/lang/ja_JP.lang
tile.SimpleSampleBlock.name=シンプルなサンプルブロック

blockの動作確認

下記のコマンドでminectaftを実行し、作成したblockを確認してみます。
cd [forge_dir]
./gradlew runClient

問題がある場合、上記コマンドを実行したコンソールにエラーが表示されます。
うまく動かない場合は見てみてください。

modの情報確認

modsを選択します。


Simple Sample Modを選択して、内容を確認します。


[forge_dir]/src/main/resources/mcmod.infoに記述した情報が表示されます。

blockの動作確認

SinglePlayerを選択します。


Create New Worldを選択します。


作ったmodを確認したいため、Game Modeを何回かクリックして、全てのアイテムが使えるCreativeモードを選択します。
Creativeモードが選択できたら、左下のCreate New Worldをクリックします。


Creative modeの世界へようこそ。


キーボードで「e」を押すとアイテムメニューが開きます。


ブロックのタブが選択されているので、そのメニューを下にスクロールします。


作ったblockがありました!


装備して播けます。


以上です。
modについてまだ良く分かっていませんが、ゲーム画面での確認ができたので、これをベースに試行錯誤できると思います。
足りていない設定や、間違いなどがありましたら、指摘していただけると嬉しいです。

参考

Minecraft 1.8.9 Forge の Mod 開発で Block を追加してみた
Updating 1.7 to 1.8 Part 3: Basic Blocks
Kurosawa/PerpetualCraft
Basic Modding - First Block

2 件のコメント :

匿名 さんのコメント...

参考になりました。ありがとうございます。

Asuki Kono さんのコメント...

コメントありがとうございます。
お役に立てたようで嬉しいです。