1201 forge modding
Skill code-onigiri/mc-modding-skill/.agent/skills/1201-forge-modding
Minecraft開発用スキル
npx -y skills add code-onigiri/mc-modding-skill --skill 1201-forge-moddingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Minecraft 1.20.1 Forge Moddingに関する開発支援。Modの新規作成、Block/Item/Entityの追加、 DataGen、ネットワーク処理、レシピ・進捗・ルートテーブルの生成、Capabilityの実装、 クラッシュ対応など。Minecraft 1.20.1 Moddingに関するタスクや、Gradle/MDKのセットアップ、 Registry/Event/sidednessに関する質問があった際に使用する。
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
7.7 KB, as published. Nobody here has run it
概要
このSkillは Minecraft 1.20.1 Forge 向けMod開発の標準パターンと落とし穴をまとめたものです。
✅ やるべきこと
- DeferredRegister + RegistryObject を使う — 旧来の
RegistryEventベースの登録は非推奨。 - DataGen を使う — 手書きJSONはミスとメンテナンスコストが爆発する。
- Mojang Mappings(official)が標準 — Parchmentでパラメータ名を補完する。
- すべてのDeferredRegisterをModBusにregisterする — コンストラクタで
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();を取得し、各register(modEventBus)を呼ぶ。 - Block登録時はBlockItemも登録する — Blockだけではインベントリに出ない。
level.isClientSideで論理サイド判定 — 物理サイドではなく論理サイドで分岐。- Networkingのハンドラでは
ctx.enqueueWork()でメインスレッドに戻す — ネットワークスレッドでワールド変更を行うとクラッシュ。 - Capability取得時は
LazyOptionalを使う —isPresent()/ifPresent()で安全にアクセス。invalidateCaps()も必ず実装する。 - BlockEntityのデータ変更時は
setChanged()+level.sendBlockUpdated()を呼ぶ — どちらか欠けると保存/同期されない。 sourceSets.main.resources { srcDir 'src/generated/resources' }を忘れない — DataGenの出力が読み込まれなくなる。
❌ やってはいけないこと
@OnlyInをModコードで使わない — Forge内部専用。使うとマルチプレイでクラッシュ。クライアント限定コードは@Mod.EventBusSubscriber(value = Dist.CLIENT)またはFMLClientSetupEventで分離する。ResourceLocationに大文字・ハイフンを使わない — 小文字と_/.//のみ。- ContainerDataの各スロットは16bit — 32bit整数(エネルギー量など)は2スロットに分割すること。
- PacketのID(int)を重複させない — SimpleChannelのregisterMessageでID衝突は通信破損。
- Capabilityを通常のBlockに直接付けない — BlockEntityが必要。
- runClientクラッシュ後は
./gradlew --stop— Daemonがポートを占有していることがある。
開発ワークフロー(新規Mod作成時)
- 1. Forge MDK(1.20.1)を入手し、Gradleプロジェクトとしてインポート
- 2.
gradle.properties/build.gradle/mods.tomlを確認・編集 - 3. メインModクラス(
@Mod)とDeferredRegister+RegistryObjectのセットアップ - 4. Block/Item/Entity などの登録とプロパティ定義
- 5. Data Provider(Recipe, LootTable, BlockState, Tags)の実装
- 6. 必要に応じてNetworking(SimpleChannel)、Capability、WorldGenを追加
- 7.
runClient/runDataで動作確認
よく使うGradleタスク
./gradlew build # 配布用jar生成
./gradlew runClient # クライアント起動
./gradlew runServer # サーバー起動
./gradlew runData # DataGen実行
./gradlew runGameTestServer # GameTest実行
./gradlew clean # ビルドキャッシュ削除
一般的なタスクチェックリスト
Blockを追加する
DeferredRegister<Block>→RegistryObject<Block>を登録- 同じ名前で
DeferredRegister<Item>→RegistryObject<BlockItem>を登録 - BlockState JSON / Block Model / Texture(DataGen推奨)
- 必要に応じて
BlockEntity+BlockEntityTypeを登録 BlockTagsProviderでツール要件・採掘判定を追加
Itemを追加する
DeferredRegister<Item>→RegistryObject<Item>を登録- Item Model / Texture(DataGen推奨)
- 必要に応じて
LanguageProviderで表示名を追加
Entityを追加する
DeferredRegister<EntityType<?>>→RegistryObject<EntityType<T>>を登録EntityAttributeCreationEventで属性(HP・移動速度など)を設定EntityRenderersEvent.RegisterRenderersでRendererを登録(クライアント限定)- Spawn Placements(自然スポーン条件)を設定
Recipeを追加する
RecipeProviderを継承したクラスを作成buildRecipes(Consumer<FinishedRecipe>)でレシピを定義./gradlew runDataを実行してJSONを生成
詳細リファレンス
| トピック | ファイル | 読むタイミング |
|---|---|---|
| 環境構築・Gradle・MDK | references/SETUP.md | プロジェクト初期セットアップ時 |
| Registry・Event・Sidednessの基礎 | references/CORE_CONCEPTS.md | メインクラスを書く前 |
| Block・Item・BlockEntity・Menuの実装 | references/BLOCKS_AND_ITEMS.md | Block/Itemを追加する際 |
| DataGen(Recipe, LootTable, Tags, Models) | references/DATA.md | JSONを書く必要がある際 |
| Networking(SimpleChannel) | references/NETWORKING.md | GUI同期・サーバー/クライアント通信が必要な際 |
| Capability・描画・WorldGen | references/ADVANCED.md | 高度な機能実装時 |
| コマンド(Brigadier) | references/COMMANDS.md | 独自コマンドを追加する際 |
| GameTest(自動テスト) | references/GAMETEST.md | 統合テストを書く際 |
| WorldGen(ワールド生成) | references/WORLDGEN.md | 鉱脈・構造物・バイオームを追加する際 |
| Resource Pack(モデル・テクスチャ・サウンド・言語) | references/RESOURCE_PACK.md | アセットファイルを手書きする際 |
| Datapack(バニラデータ形式) | references/DATAPACK.md | ModがデータパックJSONを内包する際 |
| Image Generation(テクスチャ・プロモーションアート) | references/IMAGEGEN.md | 画像生成・ブリーフ作成時 |
| CI・リリース・バージョン管理 | references/CI_RELEASE.md | GitHub Actions・Modrinth・CurseForge連携 |
| クラス・メソッド早見表 | references/QUICK_REFERENCE.md | クラス名を忘れた際 |
| クラッシュ対応・ログの読み方 | references/TROUBLESHOOTING.md | ビルド/実行が失敗した際 |
Scripts
| Script | Purpose |
|---|---|
scripts/check-build.sh | JDK, Gradle, key files確認 + clean build |
scripts/validate-datapack.sh | datapack JSON, pack.mcmeta, function tag参照の検証 |
scripts/validate-resource-pack.sh | mod asset JSON, model/texture/sound参照の検証 |
scripts/scaffold-asset-brief.sh | テクスチャ/プロモーションアート用Markdown brief生成 |
scripts/validate-test-layout.sh | JUnit 5 / GameTest / MockBukkit プロジェクトレイアウト検証 |