アイテムの追加(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<Item> 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");
    }
}

 

アセット

 alminium.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=<名称> で登録できる。
全角スペースを使うととてもダサい見た目の翻訳名になるため十分気をつけていただきたい。

アイテムの追加(1.12.2)” への9件のフィードバック

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

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

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

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

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

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

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

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

    1. デバッグ環境でリソースが認識されない問題を確認しました。ビルドで出力された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/にコピーします。

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

コメントはこちらです。(スパム対策の為コメントは手動承認になっています。未承認のコメントは表示されないので連投はお控え下さい。)

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