mcpField
M
minecraft-multiloader

minecraft-multiloader

github.com/jahrome907開発192147 回インストール2 週間前に更新
リポジトリ

minecraft-multiloader について

minecraft-multiloaderは、Architecturyを使うMinecraft MOD開発者向けのガイドです。共通コードを保ち、FabricとNeoForge向けの成果物をビルドできます。

主な機能

  1. 01common、fabric、neoforgeのプロジェクト構成
  2. 02Architectury APIによるプラットフォーム差の抽象化
  3. 03@ExpectPlatformによる個別実装
  4. 04バージョン設定の静的チェック
  5. 05FabricとNeoForgeのJARビルド

活用シーン

  1. 01FabricとNeoForgeでMODコードを共有
  2. 02共通処理とローダー固有実装を分離
  3. 03Gradleプロパティのバージョン設定を確認
  4. 04両プラットフォームの成果物をビルドして確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jahrome907/minecraft-agent-skills --skill minecraft-multiloader

インストール後、Claude Code で/minecraft-multiloaderを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
architectury-reference.md
legacy-1.21.11-template.md
scripts/
check-version-sanity.sh

詳細

Minecraft Multiloader Skill(Architectury)

Architectury とは?

Architectury は、1 つの MOD コードベースを記述し、NeoForge と Fabric の両方の JAR にコンパイルできるフレームワークです。 common サブプロジェクトには共有 API があり、プラットフォームサブプロジェクトは @ExpectPlatform 抽象化の背後でプラットフォーム固有の動作を実装します。

適用範囲
  • Use when: 1 つの共有コードベースで NeoForge と Fabric の両方の成果物をビルドして配布する必要がある場合。
  • Do not use when: プロジェクトが単一ローダーのみを対象とする場合(両方ではなく、NeoForge または Fabric 向けの minecraft-modding を使用)。
  • Do not use when: Paper/Bukkit プラグインを開発する場合(minecraft-plugin-dev)。
コンポーネント目的
architectury-loomGradle プラグイン — Fabric Loom を拡張し、マルチローダーをサポートします
architectury-apiランタイムライブラリ — 両プラットフォームの抽象化を提供します
@ExpectPlatformプラットフォーム固有の実装を持つメソッドを示すアノテーション
common/共有コード(ローダー固有の API は使用しません)
fabric/Fabric 固有のコードとエントリーポイント
neoforge/NeoForge 固有のコードとエントリーポイント

バージョン(Minecraft 1.21.11)

# gradle.properties property names used by this skill's static helper.
# Get every tool version from the exact generated or known-working project.
mod_version=1.0.0
minecraft_version=1.21.11
enabled_platforms=fabric,neoforge

architectury_version=<project pin>
fabric_loader_version=<project pin>
fabric_api_version=<project pin ending in +1.21.11>
neoforge_version=<project pin in the 21.11.x family>
loom_version=<project pin>

architectury_version、Architectury プラグインのバージョン、loom_version は、同じ生成済みプロジェクトまたは動作確認済みのプロジェクト系列から指定してください。このスキルでは、特定のバージョンの組み合わせに互換性があるかどうかを静的ヘルパーでは判定できないため、コピーして使える依存関係の一覧は掲載していません。

Minecraft 26.2 / Java 25 では、バージョンセレクターに対象バージョンが正確に表示される場合に限り、公式の Architectury Template Generator を使用してください。Fabric と NeoForge を含む Multiplatform プロジェクトを生成し、生成された Gradle の構成とバージョン指定を一式のまま維持してください。ジェネレーターに対象バージョンがない場合は、そのバージョン系列で動作確認済みのプロジェクトを起点にして、解決済みのビルドを確認してください。1.21.11 テンプレートを 26.2 用として扱わないでください。公開されているテンプレートのダウンロードは、現在の対象に正確に合致するスキャフォールドの代わりにはなりません。

保持されているサンプルの minecraft_version だけを機械的に変更しないでください。26.2 は難読化されておらず、Loom とリマッピングの設定が 1.21.11 とは異なります。

同梱のリファレンスとヘルパー

  • バージョン整合性のリファレンス:references/architectury-reference.md
  • 整合性チェッカー:./scripts/check-version-sanity.sh --root <project>

gradle.properties を編集した後に整合性チェッカーを実行してください。これは構文とバージョン系列を事前確認する静的チェックです。キーの不足、スナップショット版の指定、fabric / neoforge プラットフォームの不足、明らかなバージョン系列の不整合を検出します。依存関係の解決やローダーとの互換性の証明は行わず、プロジェクトの Fabric および NeoForge のビルドとスモークテストの代わりにもなりません。


ルートプロジェクトの構成

my-mod/
├── build.gradle           ← root build (shared config)
├── settings.gradle
├── gradle.properties
├── common/
│   ├── build.gradle
│   └── src/main/java/com/example/mymod/
│       ├── MyMod.java               ← shared init
│       ├── registry/
│       │   └── ModItems.java        ← shared registry declarations
│       └── platform/
│           └── PlatformHelper.java  ← @ExpectPlatform methods
├── fabric/
│   ├── build.gradle
│   └── src/main/
│       ├── java/com/example/mymod/fabric/
│       │   ├── MyModFabric.java          ← Fabric entrypoint
│       ├── java/com/example/mymod/platform/
│       │   └── PlatformHelperImpl.java   ← Fabric @ExpectPlatform implementation
│       └── resources/
│           ├── fabric.mod.json
│           └── assets/...
└── neoforge/
    ├── build.gradle
    └── src/main/
        ├── java/com/example/mymod/neoforge/
        │   ├── MyModNeoForge.java        ← NeoForge @Mod entry
        ├── java/com/example/mymod/platform/
        │   └── PlatformHelperImpl.java   ← NeoForge @ExpectPlatform implementation
        └── resources/
            ├── META-INF/neoforge.mods.toml
            └── assets/...

レガシービルドテンプレート

以前の固定 Gradle スクリプトは 1.21.11 のスナップショットであり、現行のスキャフォールドとして提示しないようにしています。サポート対象のどちらのバージョンでも、生成されたビルドファイルを変更する前に references/legacy-1.21.11-template.md または references/architectury-reference.md を参照してください。これらのリファレンスでは、バージョンの基準点とソースセットの境界を維持しつつ、不完全なビルドスクリプトを別の Minecraft 系列にコピーすることを避けられます。


共通コード

common/.../MyMod.java
package com.example.mymod;

import dev.architectury.registry.registries.DeferredRegister;
import dev.architectury.registry.registries.RegistrySupplier;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.item.Item;

public class MyMod {
    public static final String MOD_ID = "mymod";

    // Architectury's DeferredRegister — works on both platforms
    public static final DeferredRegister<Item> ITEMS =
        DeferredRegister.create(MOD_ID, Registries.ITEM);

    public static final RegistrySupplier<Item> MY_ITEM =
        ITEMS.register("my_item", () -> new Item(new Item.Properties().setId(
            ResourceKey.create(Registries.ITEM,
                Identifier.fromNamespaceAndPath(MOD_ID, "my_item"))
        )));

    public static void init() {
        ITEMS.register(); // registers with both platforms
    }
}
@ExpectPlatform — プラットフォーム固有のメソッド

契約を common/ で定義します。

package com.example.mymod.platform;

import dev.architectury.injectables.annotations.ExpectPlatform;
import net.minecraft.world.level.material.Fluid;

public class PlatformHelper {

    @ExpectPlatform
    public static boolean isModLoaded(String modId) {
        // This body is replaced at compile time by the platform implementation
        throw new AssertionError("ExpectPlatform implementation not found");
    }

    @ExpectPlatform
    public static boolean isClient() {
        throw new AssertionError();
    }
}

各プラットフォームの実装は、common の @ExpectPlatform クラスと同じ Java パッケージに配置してください。変更するのは common/、fabric/、neoforge/ のソースセットだけです。

fabric/.../platform/PlatformHelperImpl.java に実装します。

package com.example.mymod.platform;

import net.fabricmc.loader.api.FabricLoader;

// Class name must match: <common class name>Impl
public class PlatformHelperImpl {

    public static boolean isModLoaded(String modId) {
        return FabricLoader.getInstance().isModLoaded(modId);
    }

    public static boolean isClient() {
        return FabricLoader.getInstance().getEnvironmentType() ==
            net.fabricmc.api.EnvType.CLIENT;
    }
}

neoforge/.../platform/PlatformHelperImpl.java に実装します。

package com.example.mymod.platform;

import net.neoforged.fml.ModList;
import net.neoforged.fml.loading.FMLEnvironment;

public class PlatformHelperImpl {

    public static boolean isModLoaded(String modId) {
        return ModList.get().isLoaded(modId);
    }

    public static boolean isClient() {
        return FMLEnvironment.dist.isClient();
    }
}

Fabric エントリーポイント

fabric/.../MyModFabric.java
package com.example.mymod.fabric;

import com.example.mymod.MyMod;
import net.fabricmc.api.ModInitializer;

public class MyModFabric implements ModInitializer {
    @Override
    public void onInitialize() {
        MyMod.init();
    }
}
fabric/.../resources/fabric.mod.json

この保持対象の 1.21.11 メタデータの例は、 Architectury 1.21.11 の上流ブランチにある最小依存関係に準拠しています。 生成されたプロジェクトで、これより厳しい範囲が指定されている場合は、そちらを維持してください。

{
  "schemaVersion": 1,
  "id": "mymod",
  "version": "${version}",
  "name": "My Mod",
  "description": "A multiloader example mod",
  "license": "MIT",
  "environment": "*",
  "entrypoints": {
    "main": ["com.example.mymod.fabric.MyModFabric"]
  },
  "depends": {
    "fabricloader": ">=0.18.2",
    "fabric-api": ">=0.139.4+1.21.11",
    "architectury": ">=19.0",
    "minecraft": "~1.21.11"
  }
}

NeoForge エントリーポイント

neoforge/.../MyModNeoForge.java
package com.example.mymod.neoforge;

import com.example.mymod.MyMod;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.fml.common.Mod;

@Mod(MyMod.MOD_ID)
public class MyModNeoForge {
    public MyModNeoForge(IEventBus modEventBus) {
        MyMod.init();
    }
}
neoforge/.../resources/META-INF/neoforge.mods.toml
modLoader = "javafml"
loaderVersion = "[1,)"
license = "MIT"

[[mods]]
modId = "mymod"
version = "${file.jarVersion}"
displayName = "My Mod"
description = "A multiloader example mod"

[[dependencies.mymod]]
modId = "neoforge"
type = "required"
versionRange = "[21.11,)"
ordering = "NONE"
side = "BOTH"

[[dependencies.mymod]]
modId = "minecraft"
type = "required"
versionRange = "[1.21.11,1.22)"
ordering = "NONE"
side = "BOTH"

ビルドコマンド

# Build both JARs simultaneously
./gradlew build

# Inspect the project's actual outputs. Generated templates choose their own
# archive base name and version convention:
find fabric/build/libs neoforge/build/libs -maxdepth 1 -type f -name '*.jar' \
  ! -name '*-sources.jar' ! -name '*-dev.jar' ! -name '*-javadoc.jar'

# Run in dev environment
./gradlew :fabric:runClient
./gradlew :neoforge:runClient
./gradlew :neoforge:runServer

# Datagen (if applicable)
./gradlew :neoforge:runData

よくある落とし穴

落とし穴解決策
common/ で net.neoforged.* / net.fabricmc.* を使用するcommon ではバニラ MC と Architectury API のみを使用してください
common で DeferredRegister のフィールドに直接アクセスする(NeoForge スタイル)Architectury の DeferredRegister を使用してください
レジストリキーを指定せずに 26.2 のアイテムを構築するResourceKey<Item> を作成し、new Item の前に Item.Properties#setId を呼び出してください
@ExpectPlatform が実行時に AssertionError をスローすることを忘れるfabric/ と neoforge/ の両方に、同じパッケージ内で対応する *Impl クラスが必要です
fabric/ と neoforge/ でアセットが重複しているアセットは common/src/main/resources/assets/ に配置してください
common の Mixin がローダー API をインポートする、または一方のローダーの側を対象にするそのプラットフォームのサブプロジェクトに配置してください。両方の生成済みプラットフォーム設定に含まれている場合、ローダーに依存しない Mixin は common に配置できます
mod の初期化スレッドでワールド/レジストリにアクセスするセットアップには mod bus イベントを使用し、初期化時にワールドへアクセスしないでください

参考資料

コメント