はじめに
軽く、IntelliJ IDEAの使い方、Javaの書き方を勉強してきました。
早速、Modを作っていきたいと思います。
MODの作成において主に以下のサイトを参考にさせていただきます。
チュートリアル一覧
💻開発環境
- Windows 10
- JDK 8u211
- Minecraft 1.12.2
- Minecraft Forge 1.12.2 (14.23.5.2838)
- IntelliJ IDEA 2019.1.3
Mod情報
後でもいいけど、最初にこれをやっておきたかった。
src/main/resources/mcmod.info
というファイルがあります。
こいつにMinecraftのMod Listに表示してほしい情報を書き込みます。
mcmod.infoの設定を参考に書いてみます。
こんな感じ。
[
{
"modid": "biwako_mod",
"name": "Biwako Mod",
"description": "Biwako is the largest lake in Japan.",
"version": "${version}",
"mcversion": "${mcversion}",
"url": "https://github.com/Hiroya-W/biwakoMC",
"updateUrl": "",
"authorList": ["Hiroya_W"],
"credits": "",
"logoFile": "assets/biwako_mod/logo.png",
"screenshots": [],
"dependencies": ["mod_MinecraftForge"]
}
]
src/main/resources
フォルダを作ってlogo.png
を配置。
Biwako_mod.java
の21行目、22行目も書き換えておく。
public static final String MOD_NAME = "Biwako Mod";
public static final String VERSION = "1.0.1";
アイテムの追加
琵琶湖バーガー(食べ物)を登録
ただし、まだ食べられる状態にはしません。追加だけ。
- アイテム保持用の内部クラス
ここにメンバーを書いていくのだが、後々Javaクラスに分けて書くことになると思う。
とりあえず、書く。
@GameRegistry.ObjectHolder(MOD_ID)
public static class Items {
public static final Item biwakoBurger = null; /** 琵琶湖バーガー */
}
- アイテム登録用イベント
addItems
メソッドがこの部分に当たります。
また、ブロック追加はaddBlocks
メソッドに分けてソースコードを読みやすくする(のだと思います)。
今まではItem ClassにsetUnlocalizedName
というメソッドが用意されていたのだが、名前がsetTranslationKey
に変更されたらしい。
setUnlocalizedName
なんて無いんだけど!?と言って泣かなくても大丈夫です。
僕は泣きました
Internationalization and localizationより引用。
As of July 14th 2018, the term “unlocalized name” has been replaced by “translation key” in MCP.
- モデル登録用イベント
registerModels
メソッドがこの部分に当たります。
他クラスは用意されていたが、このイベントに関しては用意されていなかったので自分で書いた。
モデル登録用イベントもアイテム登録用イベントと同様にObjectRegistryHandler
クラス内に作成します。
@Mod.EventBusSubscriber
public static class ObjectRegistryHandler {
@SubscribeEvent
public static void addItems(RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(
new Item()
.setRegistryName(MOD_ID, "biwakoBurger")
.setCreativeTab(CreativeTabs.FOOD)
.setTranslationKey("biwakoBurger")
);
}
@SubscribeEvent
public static void addBlocks(RegistryEvent.Register<Block> event) {
}
@SubscribeEvent
public static void registerModels(ModelRegistryEvent event) {
ModelLoader.setCustomModelResourceLocation(Items.biwakoBurger, 0, new ModelResourceLocation(Items.biwakoBurger.getRegistryName(), "inventory"));
}
}
ここまでのソースコードぺたり。
Biwako_mod.java
package jp.yuyu.biwako_mod;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
@Mod(
modid = Biwako_mod.MOD_ID,
name = Biwako_mod.MOD_NAME,
version = Biwako_mod.VERSION
)
public class Biwako_mod {
public static final String MOD_ID = "biwako_mod";
public static final String MOD_NAME = "Biwako Mod";
public static final String VERSION = "1.0.1";
@Mod.Instance(MOD_ID)
public static Biwako_mod INSTANCE;
@Mod.EventHandler
public void preinit(FMLPreInitializationEvent event) {
}
@Mod.EventHandler
public void init(FMLInitializationEvent event) {
}
@Mod.EventHandler
public void postinit(FMLPostInitializationEvent event) {
}
@GameRegistry.ObjectHolder(MOD_ID)
public static class Blocks {
}
/**
* アイテム保持用内部クラス
*/
@GameRegistry.ObjectHolder(MOD_ID)
public static class Items {
public static final Item biwakoBurger = null; /** 琵琶湖バーガー */
}
/**
* アイテム登録用イベント
*/
@Mod.EventBusSubscriber
public static class ObjectRegistryHandler {
@SubscribeEvent
public static void addItems(RegistryEvent.Register<Item> event) {
event.getRegistry().registerAll(
new Item()
.setRegistryName(MOD_ID, "biwakoburger")
.setCreativeTab(CreativeTabs.FOOD)
.setTranslationKey("biwakoburger")
);
}
@SubscribeEvent
public static void addBlocks(RegistryEvent.Register<Block> event) {
}
/**
* モデル登録用イベント
*/
@SubscribeEvent
public static void registerModels(ModelRegistryEvent event) {
ModelLoader.setCustomModelResourceLocation(Items.biwakoBurger, 0, new ModelResourceLocation(Items.biwakoBurger.getRegistryName(), "inventory"));
}
}
}
Minecraftを起動
テクスチャを適用
jsonファイルを書く
テクスチャはjsonファイルで指定するようです。
jsonファイルはsrc/main/resources/assets/biwako_mod/models/item
フォルダに
setRegistryNameで登録した名前.json
という形で配置します。
私の場合はbiwakoburger.json
を配置します。
ほとんどの場合、変えるのはlayer0
の値だけで、MOD_ID:items/TEXTURE_FILE_NAME
という形で書きます。
TEXTURE_FILE_NAME
はbiwakoburger.png
という画像を用意したのであれば、
拡張子以外の部分のbiwakoburger
となります。
{
"parent": "item/generated",
"textures": {
"layer0": "biwako_mod:items/biwakoburger"
}
}
テクスチャファイルを置く
テクスチャファイルはsrc/main/resources/assets/biwako_mod/textures/items
フォルダに
jsonファイルを書いたときのファイル名で置きます。
私の場合はbiwakoburger.png
を配置します。
Minecraftを起動
テクスチャが指定されないよ
左下の実行ログを見てみると、エラーが出ているのでなぜ出来ないのかがわかると思います。
例としてログを張り付けておきます。
この例では、jsonファイルに
biwako_mod:items/biwakoburger
と書くところを
biwako_mod:items/biwakoburge
と末尾のr
を忘れてしまい、ファイルが見つからないということがわかります。
実行ログ(runClient)
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: The following texture errors were found.
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: ==================================================
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: DOMAIN biwako_mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: --------------------------------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: domain biwako_mod is missing 1 texture
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: domain biwako_mod has 1 location:
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: unknown resourcepack type net.minecraft.client.resources.LegacyV2Adapter : FMLFileResourcePack:Biwako Mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: -------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: The missing resources for domain biwako_mod are:
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: textures/items/biwakoburge.png
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: -------------------------
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: No other errors exist for domain biwako_mod
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: ==================================================
[22:05:18] [Client thread/ERROR] [FML.TEXTURE_ERRORS]: +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
名前の指定
Minecraft用の翻訳ファイル(?)を配置します。
日本語用のファイル名はja_JP.lang
、英語(US)はen_US.lang
とするルールがあります。
IntelliJ IDEAを使用している場合はデフォルトでファイルエンコードにutf-8
が選択されていますが、
他のエンコードが指定されていれば、文字化けするようなので注意。
これらはsrc/main/resources/assets/biwako_mod/lang
フォルダに置きます。
中身は以下の通り。
# English Language File
item.biwakoburger.name=Biwako Burger
# 日本語言語ファイル
item.biwakoburger.name=琵琶湖バーガー
エンコードにShift-JISを指定した場合に文字化けする
できましたー!!
ここまでのフォルダ階層
おわりに
2回目で諦めようかと思ったくらいできませんでした
仕様変更がたびたび行われているのだと思うのですが、同じMinecraft 1.12.2でもForgeのバージョンが異なれば、
ソースコードの書き方が違っていて、過去の素晴らしい記事が全く参考になりません...。ナンテコッタイ
(今までの書き方もできるハズだけどね)
モデル登録用イベントなんて、どこに書けばいいんだ...みたいな状態で、
ObjectRegistryHandler
クラス内に書くってことに気が付くのに1日使いました...。
テクスチャが適用されなくて泣きそうでした...。
(気づいた時には、当たり前やん。ってなったけど...。)
アイテムの追加(1.12.2)
こちらのサイトも参考にさせていただいたのですが、コメント欄で
最新のforgeのバージョン(14.23.3.2655)だとen_US.lang, ja_JP.langでは読み込まず、en_us.lang,ja_jp.langに変更しないといけないみたいですね…
と書かれてありました。が、結局現在はまたen_US.lang
、ja_JP.lang
じゃないと読み込まれないみたいですし...。
今1.14.2
出てるのに2年前の1.12.2
で開発するのかよ!って需要もないやろなって思っていたのですが、
こんな感じならちゃんと記事として成り立っていそうな気がします...。
誰かの参考になれば嬉しいですね。
なので、次も頑張ります。
次はツールを追加したいです。
Minecraft 1.12.2 Forge Modの作成 その1 【開発環境の準備 IntelliJ IDEA】
Minecraft 1.12.2 Forge Modの作成 その2 【mcmod.infoの編集と無機能アイテムの追加】
Minecraft 1.12.2 Forge Modの作成 その3 【剣の追加とレシピ登録,クラフト後に返ってくるアイテムの設定】
Minecraft 1.12.2 Forge Modの作成 その4 【ブロックの追加】
2019/07/16 初版
2019/07/17 表記ゆれの修正
2019/08/08 目次の追加