追記
今回の「ExceptionInInitializerError / Item id not set」は、client と main の分割ではなく、「アイテムの登録まわりを static 初期化の中で触っている」ことが原因の可能性が一番高いです。
理由を順に書きます。
1
ExceptionInInitializerError は「あるクラスの static フィールドや static ブロックの初期化中に例外が出た」時のエラーです。
その中の Caused by: NullPointerException: Item id not set は「まだレジストリに登録されていない Item を使おうとして null になった」ときによく出ます。
2
よくあるパターンは次のようなものです。
・ModItems などのクラスで、static フィールドの初期化や static ブロックの中で
ItemStack を作る、アイテムグループに追加するなどの処理をしている
・その時点では Registry.register(…) がまだ呼ばれておらず、アイテムに id が付いていない
・結果として NPE → ExceptionInInitializerError になる
3
対策としては次の形に整理すると安定します。
・src/main/Java の「共有」クラスには
public static final Item HOOKSHOT_ITEM = new Item(new Item.Settings());
のように、単に new Item するだけにしておく
(ここでは ItemStack を作ったり、クリエイティブタブに入れたりしない)
・アイテムの登録は、ModInitializer の onInitialize から呼ばれるメソッドの中で行う
Registry.register(Registries.ITEM, new Identifier(“modid”, “hookshot”), HOOKSHOT_ITEM);
のように、必ず一度だけ登録する
・クリエイティブタブに入れる、ItemStack を作るなど「id が必要な処理」は
登録が終わったあとに実行するクラスやハンドラに分ける
4
IntelliJ の Minecraft プラグインで作り直した環境でも、結局 Fabric ローダで起動している限り、この「登録のタイミング」のルールは同じです。
元の Fabric テンプレートでも、今のプロジェクトでも、
「アイテムの登録は onInitialize 内のメソッドで、static 初期化の中ではレジストリを触らない」
この形になっているかを一度見直してみてください。
もし自分で作った ModItems や ModBlocks のようなクラスがあれば、その static 部分を重点的にチェックすると原因が見つかりやすいと思います。
追記
結論から言うと、Identifier.of(MOD_ID, path) の使い方で合っていますし、それが原因で「Item id not set」が出ているわけではありません。
1
最新版の Yarn 付き Minecraft では、Identifier のコンストラクタが private になっていて、代わりに Identifier.of を使うのが正しい使い方になっています。
Fabric の公式テンプレートも、まさに質問者様と同じように
private Identifier identifier(String path) {
return Identifier.of(MOD_ID, path);
}
という形で書いているので、この部分は問題ありません。
2
「Item id not set」は、アイテムがレジストリに登録される前に、そのアイテムから ItemStack を作ったり、id を参照したりしたときに出る例外です。
今回の Registry.register 自体は正しく書けているので、別の場所で HOOK_SHOT を早すぎるタイミングで触っている可能性が高いです。
よくある原因は次のようなものです。
・ModItems クラスなどで
public static final ItemStack HOOK_SHOT_STACK = new ItemStack(HOOK_SHOT);
のような static フィールドを定義している
・クリエイティブタブなどで、static 初期化中に new ItemStack(HOOK_SHOT) している
こういうコードはクラス読み込み時にすぐ実行されてしまうので、onInitialize の Registry.register より先に動き、まだ id の付いていない HOOK_SHOT を触ってしまいます。
対策としては
・static フィールドや static ブロックの中では HOOK_SHOT から ItemStack を作らない
・HOOK_SHOT を使う処理は、必ず onInitialize の中か、その後に呼ばれるメソッドの中に移す
・どうしても共有したい場合は、ItemStack ではなく Item の参照だけを static に持つ
という形に整理すると安全です。
一度、プロジェクト全体で「HOOK_SHOT」を検索してみて、static フィールドや static ブロックの中で ItemStack を作っていないかを確認してみてください。
Identifier.of の部分はそのままで大丈夫です。