この記事はMinecraftVer 26.3 NeoForgeに対応しています。
お疲れ様です。dnyrです。最近、マインクラフトのMod製作に奮闘しています。 Mod界隈はAIに否定的な意見も多いので多くの人に遊んでもらうべくAIを使用せずに作成しています。自分でここまでいろいろ考えたり調べたりするのは久々な気もしますが、楽しいもんですね
というのは前置きで、タイトルの通りなのですが「プレイヤーにMod用の情報を持たせたい」という状況になることが多々ありますので、その方法をここにメモします。
クラスを作成する
まずはクラスを作成します。必須ではないですがある程度汎用的に利用できたほうが良い内容なので用意しましょう。小さなプロジェクトであればクラス化する必要はないと思います。
ModAttachment
…というクラスを作成しました。
変数を用意する
下記のような変数を用意します。
public static final DeferredRegister<AttachmentType<?>> ATTACHMENT_TYPE =
DeferredRegister.create(
NeoForgeRegistries.ATTACHMENT_TYPES,
SampleMod.MODID
);
レジストリへの登録を管理するオブジェクトになります。DeferredRegister.create()の第一引数には登録対象となるレジストリ型を指定します。第二引数にはMODIDを指定します。
public static final Supplier<AttachmentType<SampleData>> SAMPLE_DATA =
ATTACHMENT_TYPE.register(
"sample_data",
() -> AttachmentType.builder(SampleData::new).build()
);
SampleDataを保持するAttachmentTypeをsample_dataというIDで登録します。
SAMPLE_DATAには、登録したAttachmentTypeを取得するためのSupplierが入ります。
Supplier<T>は、get()を呼ぶことでT型のオブジェクトを取得できる仕組みです。今回であればSAMPLE_DATA.get()でAttachmentType<SampleData>を取得できます。
アタッチされるタイミング
じゃあここで登録したものはいつアタッチされるの?という話ですが、登録したAttachmentTypeのデータには
player.getData(ModAttachment.SAMPLE_DATA)
でアクセス可能です。
この際、まだデータがアタッチされていなければSampleData::newが呼ばれて生成・アタッチされます。すでにアタッチされていれば、そのデータをそのまま取得します
Supplierについて
聞きなれない単語だったので念のため調べました。
Supplierでは<T>をgetすることができます。
今回の場合
SAMPLE_DATA.get()
でAttachmentType<SampleData>を返します。
「get()を呼ぶと指定した型の値を返してくれるオブジェクト」くらいの認識で良いと思います。
こうしないと型推論できないので、取得後に関数や変数を呼べないもしくはキャストする必要があるためこの形になっているものだと思います。
参考: