アイテムの追加(1.12.2)

ソースコード

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本体を登録することで、アイテムやブロック、モデルの登録が可能になる。

 

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/<アイテム名>"を渡す。

 

textures

テクスチャを指定する。基本は"layer0"のみで良い。
指定方法は<modid>:items/<テクスチャ名>。テクスチャ名も小文字にしたほうが良い。
これで指定したパスのテクスチャをアイテムのものとして読み込める。

 

display

表示の大きさ、場所等を調整する。
"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=<名称> で登録できる。
全角スペースを使うととてもダサい見た目の翻訳名になるため十分気をつけていただきたい。

17件のコメント

  1. 羽卒山風

    アイテムの追加を一通り模倣したのですが、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でソースコードをご確認ください。ご迷惑をおかけし申し訳ありません。

  2. Tosirukun

    サイト上にphpのエラーがすごい出てます。
    これは修正が可能でしょうか?

    おそらくgitからソースコードを取得する部分みたいです。
    このままではサイト上でコードが確認できないので、修正お願いします。

    • Tom Kate

      ご報告ありがとうございます。
      gitからコードスニペットを取得するためのAPIがエラーを吐いているようなので一時的に機能を停止しました。

  3. src/main/resources/の中にaseetsがありません。
    どうすれば良いでしょうか。

    • 赤砂蛇 凪浜

      assetsaluminiummodなど指定された名前のフォルダを新しく作り、aluminium.jsonなどのファイルを新しく作って配置してください。
      IntelliJ IDEAの使い方については、マニュアルの日本語訳などをご覧ください。

  4. Tsukineko

    aluminium.jsonのところ、alminium.jsonになってます。

  5. forge1.12.2-14.23.5.2854のmodを作ったのですがresourcesのところが読み込まれません。
    レシピやモデルを読み込んでいないので合っていると思います。どうすればいいですか?

    • 赤砂蛇 凪浜

      デバッグ環境でリソースが認識されない問題を確認しました。ビルドで出力されたjarファイルは正常に動作します。また、Forgeのサポートが切れているので、更新によりこの問題が解決することはないでしょう。

      build.gradleの末尾に以下のコードを加えれば解決できます。Gradleに詳しければもっと上手く書けると思います。

      copy {
          delete {
              delete "$buildDir/classes/java/main"
          }
          into "$buildDir/classes/java/main"
          from sourceSets.main.resources
      }
      

      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/にコピーします。

      • ありがとうございます!
        解決できなくて悩んでいましたが,すっきりしました。

  6. しおぐまー

    MOD作りを始める上でとても参考になりました。
    マインクラフト1.11 以降の仕様では、pack.mcmeta ファイルの pack_format の値が 3 の場合は、言語ファイルを含めたすべてのリソースファイル名は小文字である必要があるらしいです。(en_us.lang 等)
    古いリソースパックの形式( pack_format: 2 )の場合は逆に、大文字がある前提で読み込むらしいです。(en_US.lang 等)

    • Tom Kate

      ありがとうございます。moddingに関しては必要になるまでは他のバージョンから変更する手間を考えて過去版とできる限り同じやり方をとるつもりです。

      • うぃんちゃん

        pack.mcmetaは自動で作成され、pack_formatの値が3であるため、チュートリアル通りにすすめてもうまくいきません。

        他のページを辿ってもpack.mcmetaを削除したり編集したりの記述もないですし、「準備」の章でforgeのバージョンが固定されていないので、結果的に順番通り進めても失敗してしまうため修正したほうがよろしいかなと思います。

        • Tom Kate

          ありがとうございます。pack_format=3の状態に対応したlangファイルの名称に変更しました。

  7. modder見習い

    最新のforgeのバージョン(14.23.3.2655)だとen_US.lang, ja_JP.langでは読み込まず、en_us.lang,ja_jp.langに変更しないといけないみたいですね…

    • Tom Kate

      ご報告ありがとうございます。
      同じ2655forge環境下の私のMOD開発環境では読み込んでますね……
      詳しく確認した後、追記いたします。

うぃんちゃん へ返信するコメントをキャンセル

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください