目次
概要
何の機能もない基本的なアイテムを追加する。
ついでにテクスチャと言語ファイルも実装しちゃう。
ソースコード
AluminiumMod.java
package com.tntmodders.tutorial;
import net.minecraft.client.renderer.block.model.ModelResourceLocation;
import net.minecraft.item.Item;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelRegistryEvent;
import net.minecraftforge.client.model.ModelLoader;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
@Mod(modid = "aluminiummod", version = "1.0", name = "AluminiumMod")
public class AluminiumMod {
public static final Item ALUMINIUM = new ItemAluminium();
@Mod.EventHandler
//この関数でMODファイル自体をイベントの発火先にする。
public void construct(FMLConstructionEvent event) {
MinecraftForge.EVENT_BUS.register(this);
}
//アイテムを登録するイベント。旧preinitのタイミングで発火する。
@SubscribeEvent
public void registerItems(RegistryEvent.Register- event) {
event.getRegistry().register(ALUMINIUM);
}
//モデルを登録するイベント。SideOnlyによってクライアント側のみ呼ばれる。旧preinitのタイミングで発火する。
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void registerModels(ModelRegistryEvent event) {
ModelLoader.setCustomModelResourceLocation(ALUMINIUM, 0, new ModelResourceLocation(new ResourceLocation("aluminiummod", "aluminium"), "inventory"));
}
}
ItemAluminium.java
package com.tntmodders.tutorial;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.item.Item;
public class ItemAluminium extends Item {
public ItemAluminium() {
super();
//レジストリに保存する名称を登録する。大文字禁止。
this.setRegistryName("aluminiummod", "aluminium");
//クリエイティブタブを設定する。
this.setCreativeTab(CreativeTabs.MATERIALS);
//翻訳名を登録する。大文字非推奨。
this.setUnlocalizedName("aluminium");
}
}
アセット
aluminium.json
src/main/resources/assets/aluminiummod/models/item/に配置する
{
"parent": "item/generated",
"textures": {
"layer0": "aluminiummod:items/aluminium"
},
"display": {
"thirdperson": {
"rotation": [0, 90, -35],
"translation": [0, 1.25, -3.5],
"scale": [0.85, 0.85, 0.85]
},
"firstperson": {
"rotation": [0, -135, 25],
"translation": [0, 4, 2],
"scale": [1.7, 1.7, 1.7]
}
}
}
en_us.lang
#AluminiumMod English Language File
item.aluminium.name=aluminium
ja_jp.lang
#アルミニウムMOD 日本語言語ファイル
item.aluminium.name=アルミニウム
aluminium.png
解説
AluminiumMod.java
@Modの使い方は1.7.10版参照。MODIDは小文字推奨。
construct
(FMLConstructionEvent event)
MODを起動した最初のときに呼ばれる。(クライアントだとマインクラフトのウィンドウが起動した直後)
ここでイベントとしてMOD本体を登録することで、アイテムやブロック、モデルの登録が可能になる。
ここでイベントとしてMOD本体を登録することで、アイテムやブロック、モデルの登録が可能になる。
registerItems
(RegistryEvent.Register<Item> event)
アイテム登録用のイベント。このイベント(RegistryEvent.Register<Item>)を今までのGameRegistry.register(item,name)代わりに使う。
レジスタ名はここの代わりにアイテムのインスタンス側に保存される。
レジスタ名はここの代わりにアイテムのインスタンス側に保存される。
registerModels
(ModelRegistryEvent event)
モデル登録用のイベント。引数は使われない。
ModelLoader
setCustomModelResourceLocation
(Item item, int metadata, ModelResourceLocation model)
アイテム、メタデータに対応したモデルを登録する。第三引数のModelResourceLocationにはResourceLocation(MODIDと名称[小文字限定])を第一引数に、状態を第二引数に渡す。(基本的に"inventory")。
aluminium.json
アイテムのモデルjsonはsrc/resources/assets/<modid>/models/item/ に配置する。名称はsetCustonResourceLocationに渡したModelResourceLocationでの名称にする。
要素ごとに解説する。
要素ごとに解説する。
parent
親となるjsonを取得する。通常アイテムなら基本チュートリアル通りでよい。
バニラのjsonを取りたい場合は"item/<アイテム名>"を渡す。
バニラのjsonを取りたい場合は"item/<アイテム名>"を渡す。
textures
テクスチャを指定する。基本は"layer0"のみで良い。
指定方法は<modid>:items/<テクスチャ名>。テクスチャ名も小文字にしたほうが良い。
これで指定したパスのテクスチャをアイテムのものとして読み込める。
指定方法は<modid>:items/<テクスチャ名>。テクスチャ名も小文字にしたほうが良い。
これで指定したパスのテクスチャをアイテムのものとして読み込める。
display
表示の大きさ、場所等を調整する。
"thirdperson"(二人称・三人称視点)と"firstperson"(一人称視点)でそれぞれ指定できる。
"thirdperson"(二人称・三人称視点)と"firstperson"(一人称視点)でそれぞれ指定できる。
- rotation …… 角度
- translation …… 位置
- scale …… 大きさ
の三要素を変更できる。
en_us.lang, ja_jp.lang
src/resources/assets/<modid>/lang/に配置する。
ファイル名は英語がen_us.lang,日本語がja_jp.lang。
pack.mcmetaというファイルのpack_formatの値が3(レガシーでないバージョン)になっていると、assetsファイル内での大文字使用ができないためファイル名を小文字にする必要がある。
一行目は読み込まれないのでコメントを配置しておくと良い。
アイテムの名称は item.<翻訳名>.name=<名称> で登録できる。
全角スペースを使うととてもダサい見た目の翻訳名になるため十分気をつけていただきたい。
ファイル名は英語がen_us.lang,日本語がja_jp.lang。
pack.mcmetaというファイルのpack_formatの値が3(レガシーでないバージョン)になっていると、assetsファイル内での大文字使用ができないためファイル名を小文字にする必要がある。
一行目は読み込まれないのでコメントを配置しておくと良い。
アイテムの名称は item.<翻訳名>.name=<名称> で登録できる。
全角スペースを使うととてもダサい見た目の翻訳名になるため十分気をつけていただきたい。
アイテムの追加を一通り模倣したのですが、Minecraftを起動しようとするとエラーが出てしまい、読み込み画面が表示された後、すぐ閉じてしまうようになりました。
どうすればよいのでしょうか。
以下はクラッシュレポートの全文です。
---- Minecraft Crash Report ----
// Don't do that.
Time: 10/1/23 3:12 PM
Description: Initializing game
java.lang.ClassCastException: com.tntmodders.tutorial.ItemAluminium cannot be cast to net.minecraft.block.Block
at net.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:319)
at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:357)
at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:288)
at net.minecraftforge.registries.ForgeRegistry.register(ForgeRegistry.java:120)
at com.tntmodders.tutorial.AluminiumMod.registerItems(AluminiumMod.java:29)
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_4_AluminiumMod_registerItems_Register.invoke(.dynamic)
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
at net.minecraftforge.fml.common.eventhandler.EventBus$1.invoke(EventBus.java:144)
at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:847)
at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630)
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252)
at net.minecraft.client.Minecraft.init(Minecraft.java:467)
at net.minecraft.client.Minecraft.run(Minecraft.java:378)
at net.minecraft.client.main.Main.main(Main.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraftforge.legacydev.Main.start(Main.java:86)
at net.minecraftforge.legacydev.MainClient.main(MainClient.java:29)
A detailed walkthrough of the error, its code path and all known details is as follows:
-- Head --
Thread: Client thread
Stacktrace:
at net.minecraftforge.registries.GameData$BlockCallbacks.onAdd(GameData.java:319)
at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:357)
at net.minecraftforge.registries.ForgeRegistry.add(ForgeRegistry.java:288)
at net.minecraftforge.registries.ForgeRegistry.register(ForgeRegistry.java:120)
at com.tntmodders.tutorial.AluminiumMod.registerItems(AluminiumMod.java:29)
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_4_AluminiumMod_registerItems_Register.invoke(.dynamic)
at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
at net.minecraftforge.fml.common.eventhandler.EventBus$1.invoke(EventBus.java:144)
at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
at net.minecraftforge.registries.GameData.fireRegistryEvents(GameData.java:847)
at net.minecraftforge.fml.common.Loader.preinitializeMods(Loader.java:630)
at net.minecraftforge.fml.client.FMLClientHandler.beginMinecraftLoading(FMLClientHandler.java:252)
at net.minecraft.client.Minecraft.init(Minecraft.java:467)
-- Initialization --
Details:
Stacktrace:
at net.minecraft.client.Minecraft.run(Minecraft.java:378)
at net.minecraft.client.main.Main.main(Main.java:118)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraft.launchwrapper.Launch.launch(Launch.java:135)
at net.minecraft.launchwrapper.Launch.main(Launch.java:28)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at net.minecraftforge.legacydev.Main.start(Main.java:86)
at net.minecraftforge.legacydev.MainClient.main(MainClient.java:29)
-- System Details --
Details:
Minecraft Version: 1.12.2
Operating System: Windows 11 (amd64) version 10.0
Java Version: 1.8.0_382, Temurin
Java VM Version: OpenJDK 64-Bit Server VM (mixed mode), Temurin
Memory: 630209384 bytes (601 MB) / 879755264 bytes (839 MB) up to 3767533568 bytes (3593 MB)
JVM Flags: 0 total;
IntCache: cache: 0, tcache: 0, allocated: 0, tallocated: 0
FML: MCP 9.42 Powered by Forge 14.23.5.2859 5 mods loaded, 5 mods active
States: 'U' = Unloaded 'L' = Loaded 'C' = Constructed 'H' = Pre-initialized 'I' = Initialized 'J' = Post-initialized 'A' = Available 'D' = Disabled 'E' = Errored
| State | ID | Version | Source | Signature | |:----- |:------------ |:------------ |:------------------------------------------------------------------ |:--------- | | LCH | minecraft | 1.12.2 | minecraft.jar | None | | LCH | mcp | 9.42 | minecraft.jar | None | | LCH | FML | 8.0.99.99 | forge-1.12.2-14.23.5.2859_mapped_snapshot_20171003-1.12-recomp.jar | None | | LCH | forge | 14.23.5.2859 | forge-1.12.2-14.23.5.2859_mapped_snapshot_20171003-1.12-recomp.jar | None | | LCH | aluminiummod | 1.0 | main | None | Loaded coremods (and transformers): GL info: ' Vendor: 'Intel' Version: '4.6.0 - Build 31.0.101.4575' Renderer: 'Intel(R) UHD Graphics 770' Launched Version: ${MC_VERSION} LWJGL: 2.9.4 OpenGL: Intel(R) UHD Graphics 770 GL version 4.6.0 - Build 31.0.101.4575, Intel GL Caps: Using GL 1.3 multitexturing.
Using GL 1.3 texture combiners.
Using framebuffer objects because OpenGL 3.0 is supported and separate blending is supported.
Shaders are available because OpenGL 2.1 is supported.
VBOs are available because OpenGL 1.5 is supported.
Using VBOs: Yes Is Modded: Definitely; Client brand changed to 'fml,forge' Type: Client (map_client.txt) Resource Packs: Current Language: 日本語 (日本) Profiler Position: N/A (disabled) CPU: 20x 12th Gen Intel(R) Core(TM) i7-12700
ページの表示に不具合があり、
<>
が欠けているようです。修正まではリンク先のGitHubでソースコードをご確認ください。ご迷惑をおかけし申し訳ありません。サイト上にphpのエラーがすごい出てます。
これは修正が可能でしょうか?
おそらくgitからソースコードを取得する部分みたいです。
このままではサイト上でコードが確認できないので、修正お願いします。
ご報告ありがとうございます。
gitからコードスニペットを取得するためのAPIがエラーを吐いているようなので一時的に機能を停止しました。
src/main/resources/の中にaseetsがありません。
どうすれば良いでしょうか。
assets
やaluminiummod
など指定された名前のフォルダを新しく作り、aluminium.json
などのファイルを新しく作って配置してください。IntelliJ IDEAの使い方については、マニュアルの日本語訳などをご覧ください。
aluminium.jsonのところ、alminium.jsonになってます。
ご指摘ありがとうございます。修正いたしました。
forge1.12.2-14.23.5.2854のmodを作ったのですがresourcesのところが読み込まれません。
レシピやモデルを読み込んでいないので合っていると思います。どうすればいいですか?
デバッグ環境でリソースが認識されない問題を確認しました。ビルドで出力されたjarファイルは正常に動作します。また、Forgeのサポートが切れているので、更新によりこの問題が解決することはないでしょう。
build.gradle
の末尾に以下のコードを加えれば解決できます。Gradleに詳しければもっと上手く書けると思います。1.12.2でMODのデバッグ環境のリソースは、クラスファイルと同一のディレクトリに入っている前提で読み込まれています。(FMLFolderResourcePackなどを参照。)しかし、IntelliJ IDEAとGradleの更新により、クラスとリソースがそれぞれ
build/classes/java/main/
とbuild/resources/main/
に出力されるようになったため、リソースが認識されなくなりました。この英語記事の手順を行っても、IntelliJ IDEAの更新の影響か、out/production/classes/
とout/production/resources/
に出力され、解決できませんでした。上記の解決法では、Gradleのタスクが実行されるたびに、src/main/resources/
のファイルをすべてbuild/classes/java/main/
にコピーします。ありがとうございます!
解決できなくて悩んでいましたが,すっきりしました。
MOD作りを始める上でとても参考になりました。
マインクラフト1.11 以降の仕様では、pack.mcmeta ファイルの pack_format の値が 3 の場合は、言語ファイルを含めたすべてのリソースファイル名は小文字である必要があるらしいです。(en_us.lang 等)
古いリソースパックの形式( pack_format: 2 )の場合は逆に、大文字がある前提で読み込むらしいです。(en_US.lang 等)
ありがとうございます。moddingに関しては必要になるまでは他のバージョンから変更する手間を考えて過去版とできる限り同じやり方をとるつもりです。
pack.mcmetaは自動で作成され、pack_formatの値が3であるため、チュートリアル通りにすすめてもうまくいきません。
他のページを辿ってもpack.mcmetaを削除したり編集したりの記述もないですし、「準備」の章でforgeのバージョンが固定されていないので、結果的に順番通り進めても失敗してしまうため修正したほうがよろしいかなと思います。
ありがとうございます。pack_format=3の状態に対応したlangファイルの名称に変更しました。
最新のforgeのバージョン(14.23.3.2655)だとen_US.lang, ja_JP.langでは読み込まず、en_us.lang,ja_jp.langに変更しないといけないみたいですね…
ご報告ありがとうございます。
同じ2655forge環境下の私のMOD開発環境では読み込んでますね……
詳しく確認した後、追記いたします。