Minecraft Forge 1.13.2版 Modding してみた。 アイテム、エンティティ・レンダーの追加

noriokun4649

Minecraft Modding をForge1.13.2のベータバージョンでやりました。


いやぁ、、、あれですね。

どっこも日本語の情報ないんで大変ですわw

とは言ってもまぁ、普通の検索能力があれば英語でなんとかなると思います。(私のは簡単なMODだからね??

いやぁ、結構変わりましたね1.13.2で。

Twitterでもつぶやきましたが、個人的に躓いた点としては以下の点ですね。

・Modの基本的な処理が変わった並列的に読み込まれるようになった。
・クライアントとサーバー別の処理がしやすくなった。(SidedProxy的なアレがなくてもいいみたい
 でも一応SidedProxy的なやつも用意されてるぽい
・アイテムとブロックのレジスト(登録)は1.12の面影あるが変わった。
・エンティティの追加が一新された。まじわけわかめだった
・META-INFなるフォルダの中にModの情報ファイル?みたいな「mods.toml」を造る必要がある
・recipeのフォルダがassetsからdataになった
・言語ファイルがlangからjsonになった(クソクソクソ
・pack.mcmetaが必要?(データパック用かな?

こんな感じですね。

私のMODはそんな深いところまでいじらないMODなのでこの程度ですが、大型MODなどになるとこれじゃすまないかなぁ。。。

あ。一応ですがこれ個人的に思っただけなので確かかどうかはわかりませんし、責任とりません(

MinecraftFogeとかGitHub漁ってただけなので((

ここで宣伝、今回1.13.2対応したModはこれ↓ よろしくね。

TorchBowMod

Can shoot a torch with a bow.



松明を弓で射れるだけのMod。ね?簡単なMODでしょ?

さて早速どんな感じなのかみてみましょうか?

といっても私Moddingもコーディングも素人なのでよろしくお願いします。。。

今までModのメインとしては@Modアノテーションがあるクラスファイルが最初に呼ばれ

なんかEventハンドラーだかなんだかのメソッドが呼び出されるみたいな感じだった気がします。

ですが1.13.2からはコンストラクタでそれぞれのリスナーを登録しておく感じっぽいですね。

AndroidのListenerみたいな。


final IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
modEventBus.addListener(this::preInit);
modEventBus.addListener(this::enqueueIMC);
modEventBus.addListener(this::processIMC);
modEventBus.addListener(this::initServer);
modEventBus.addListener(this::initClient);
modEventBus.addListener(this::postInit);
MinecraftForge.EVENT_BUS.register(this);

コンストラクタ内でこんな感じに書きました。まぁ使わないリスナー多いですね。

実際に使ってるのはpreInitとinitClientだけですね。

preInitではイベントバスの登録。クライアントではレンダーレジストリへのレンダーの登録ですね。

このレンダーの登録は今までではSideProxy的なアレ使ってました。

そうそうこのコロン2つの奴、あまり見慣れない人も多いかと思いますがわからない人は調べた方が良いかもですね。

あと今回のバージョンアップ、かなりラムダ式が積極的に使われてるような気が。。。。

ということでラムダ式も調べとくと良いかも?

さて、さっきのコンストラクタで登録したリスナーではアレよアイテム等の登録はしないのよ。

MDKにはいってるサンプルSourceであるとおりに、以下の感じ


@Mod.EventBusSubscriber(bus = Mod.EventBusSubscriber.Bus.MOD)
public static class RegistryEvents {
@SubscribeEvent
public static void onItemsRegistry(RegistryEvent.Register event) {
event.getRegistry().register(hogeItem);//登録したいあいてむー
}

@SubscribeEvent
public static void onBlocksRegistry(final RegistryEvent.Register blockRegistryEvent) {
event.getRegistry().register(hogeBlock);//登録したいブロック
}

@SubscribeEvent
public static void registerEntityTypes(final RegistryEvent.Register> event) {
      //登録したいエンティティ
}
}

こんな感じです。

アイテムとブロックは面影有るのでさほどむずかしくないかと

あ。そうそう今回のバージョンからアイテムやブロックのプロパティの指定方法が変わったので

そこら辺でも躓くかもです。

今まではアイテムやブロックのクラスに直接setMaxDamageとかうんぬんかんぬんしてたのが

プロパティとしてまとめてコンストラクタに渡すようになりました。

なのでItemの場合は以下の感じで


public static Item torchbow = new TorchBow(new Item.Properties().group(TorchBowModTab).defaultMaxDamage(384)).setRegistryName(new ResourceLocation(MODID, "torchbow"));


TorchBowってのがItemを継承したクラスですね。んでコンストラクタでプロパティを渡してます。

スタック数とDamage値は共存出来ないぽいですね。メタタグが無くなったからだとおもいますん。

で、プロパティで渡してるグループってのが従来のクリエイティブタブに変わる奴ですね。

ModのGUIとしては従来通りのクリエイティブタブですが、登録方法と

クリエイティブタブの増やし方が変わった感じです。


public static ItemGroup TorchBowModTab = (new ItemGroup("TorchBowModTab") {
@Override
public ItemStack createIcon() {
return new ItemStack(torchbow);
}
});


これでTorchBowModTabって名前のタブが出来ました。

今はこれ決め打ちしてますが、


TextComponentTranslation(key).getUnformattedComponentText();


でランゲージファイルから持ってくれば各言語ファイルの定義通り日本訳されます。

さてさて、エンティティの追加ですがこれはさっきのアイテムとかブロック登録したとこでします。

今まででは


EntityRegistry.registerModEntity(new ResourceLocation(MODID,"entitytorch"),EntityTorch.class, "EntityTorch",3, this, 60, 5, true);


これをPreInitにでも突っ込んどけばエンティティの追加ができてました。

んですが、今回1.13.2ではEntityRegistryが削除され、EntityTypeなるものが使われるようになりました。

EntityTypeでは「EntityType.Builder.create」を使ってエンティティのタイプ?作成し

それを登録する感じ?ぽいです。

今回はEntityTorchのエンティティの追加なので

public static EntityType EMERALD_ARROW;

こんな感じにグローバル変数を定義しておきます。

んで、登録時にこんなかんじ


EMERALD_ARROW = EntityType.Builder.create(EntityTorch.class, EntityTorch::new).tracker(60, 5, true).build(MODID + ":entitytorch");
EMERALD_ARROW.setRegistryName(new ResourceLocation(MODID, "entitytorch"));
event.getRegistry().register(EMERALD_ARROW);


セットレジストリネームしないとえらーでるのでちゅーい

このとき、1.12.2までのエンティティを流用する際は、一致するコンストラクタがみつかんないので

「 EntityTorch::new」にえらーの波線が出ると思います。

んがこれは EntityTorchクラスにワールド変数を受け取るコンストラクタを作り

superでコンストラクタを呼び出せばOKです。

そのさいにコンストラクタにEntityTypeとワールドをわたすかんじになります。

そこで渡すEntityTypeは登録した際に使ったEntityTypeをつかいます。

まぁ、あとは簡単なMODならばMinecraft本体のソースコードを参考にしていけば

問題なく作れると思います。

繰り返しますが、この情報絶対間違ってるところあるので鵜呑みにせず、

いろいろ調べてみてください。

このクソみたいなコードと説明が検索ワードの参考になればと思います。

一応リソースの方ではMETA-INFと言語ファイル以外は流用可能なので

私が1.7.10から1.12.2に移行したときのようなリソースの面倒くささはないとおもいます。

ではまた今度。
関連記事
スポンサーサイト



Comments 0

There are no comments yet.

Leave a reply