name: 1211-mods-exsample description: > Minecraft 1.21.1 NeoForge Moddingにおける実践的な実装パターン集。 エネルギー・GUI・ネットワーク・マルチブロック・レシピ・レンダリング・ スペル/AI/スクリプトなどの設計パターンを、16の主要Modの実装から抽出して解説。 Forge 1.20.1 → NeoForge 1.21.1 の移行差分(Data Component・Payload System・ Data Attachment)を加味したNeoForge版パターン集。 license: MIT compatibility: Minecraft 1.21.1 NeoForge, JDK 21+ metadata: author: code-onigiri version: "2.0.0" mods: - Mekanism - Create - JustEnoughItems - Jade - EMI - KubeJS/Rhino - ModernUI - TouhouLittleMaid - Botania - Applied-Energistics-2 - Ars-Nouveau - SuperbWarfare - Farmer's-Delight - GregTech-Modern - LDLib-Architectury - Multiblocked2
概要
このSkillは Minecraft 1.21.1 NeoForge における設計パターンを、主要Modの実装から抽出したリファレンスです。 Forge 1.20.1からの移行(LazyOptional→直接Capability、NBT→Data Component、SimpleChannel→Payload System等) に加え、NeoForge 1.21.1特有のAPI(Data Component / Data Attachment / Payload System)を活用した 設計パターンを提供します。
✅ やるべきこと — 設計パターン別
BlockEntity設計
- BEが必要かどうかを最初に判断する — Botania機能花はBlock.tick() + scheduleTickで動作。BEは持続状態/Tick/ネットワーク参加が必要な場合のみ。
- BE登録方式はModの規模に合わせて選ぶ — 小規模: DeferredRegister / 中規模: Registrate / 大規模: 型安全ラッパーかMachineBuilder / マルチローダー: abstract bind。
- 保存データと同期データは分離して考える — 永続化(Data Component)・全量同期(getUpdateTag)・差分同期(Payload System/SyncData/@SyncToClient)の3層構造。
- NeoForgeではData Component + Payload Systemが基本同期方式 — 低頻度: Data Component + getUpdateTag / 高頻度: Payload Systemカスタムパケット / 宣言的: @SyncToClient。
- Capabilityは
@Nullable T直接取得に移行 — 1.20.1のLazyOptional/CapabilityTokenは廃止。BlockCapabilityを使う。
エネルギーシステム
- 独自電力型のData Component化はGregTech / Mekanismを参考にする — FloatingLongやChemicalStackをDataComponentとして定義し、Codec+StreamCodecで永続化+同期。
- 魔法エネルギーのNeoForge適応はBotania(80+ Component) / Ars Nouveauを参考にする — Mana/Sourceの保持と送受信をData Component + AttachmentTypeで再設計。
- 他Modエネルギーとの互換はMekanismのBlockCapability/ItemCapabilityラッパーを参考にする —
@Nullable T直接取得パターンに移行。
GUI/UIフレームワーク
- NeoForge対応WidgetツリーはLDLib ModularUIを参考にする — Widget親子構造 + SyncData自動双方向同期。1.21.1ではData Componentと連携。
- 高パフォーマンスUIはModernUIのスレッド分離+Granite GPUを参考にする — 1.21.1ではPayload Systemでのメッセージパイプ置き換え。
- Containerのデータ同期はData Component + Payload Systemの組み合わせを理解する — ContainerDataに代わるData Component同期パターン。
ネットワーク/同期
- Payload Systemへの移行はCreate CatnipPacketRegistry / Mekanism PayloadRegistrarを参考にする — SimpleChannel →
CustomPacketPayloadrecord +StreamCodec+PayloadRegistrar。 - 大規模ネットワークグラフはAE2 ME Network(27 Component化)を参考にする — MEネットワークのData Component + Payload 移行パターン。
- ブロック状態の自動同期はFarmer's DelightのPayload版調理Componentを参考にする — 調理状態のComponent管理 + Payload同期。
マルチブロック
- NeoForge対応マルチブロックはGregTech / Multiblocked2を参考にする — Trait分離 + Capability直接取得 + Payload移行。
- Mekanismの4層マルチブロック抽象は1.21.1でも維持 — MultiblockManager/Data/Cache/FormationProtocol の構造はそのままCapability直接取得に置き換え。
レシピ・データ駆動設計
- Data Component対応レシピAPIはJEI/EMIの1.21.1 Pluginを参考にする — ComponentChanges + Codecシリアライズ + サブタイプ統合。
- Interface InjectionによるMod連携はKubeJSの手法を参考にする — Mixinより安全なInterface Injectionで25+クラスに注入。CodecTypeWrapperでJS/JSON双方向変換。
- データ駆動装備はSuperbWarfareのGunData Component化を参考にする — GunDataをData Component化 + AttachmentシステムのPayload移行。
レンダリング
- NeoForgeインスタンスレンダリングはCreate Flywheel Visual/Renderer二重パスを参考にする — BERフォールバック付きインスタンスレンダリングのNeoForge適応。
- カスタムモデルはSuperbWarfare GeoRender+Data Component同期を参考にする — GeckoLib + Data Componentによるアニメーション状態同期。
スペル/エフェクトシステム
- スペルData Component化はArs Nouveauを参考にする — SpellDataをData Component化 + Payload Systemでの同期。
- 機能花のCapability直接取得はBotaniaを参考にする — LazyOptional廃止に伴い、
@Nullable T直接取得 + Data Attachment に移行。
AI/エンティティ
- Data Attachment移行はTouhouLittleMaid / Botania Familiarを参考にする — EntityデータのAttachmentType化とPayload同期。
- JSONアニメーション定義はTouhouLittleMaidを参考にする — カスタムモデルパイプライン+JSアニメーションのNeoForge適応。
スクリプト連携
- Interface InjectionベースのJS統合はKubeJSを参考にする — MixinではなくInterface Injectionでクラス拡張 + Componentラッパー。
- CodecTypeWrapperパターン — KubeJSのCodecTypeWrapperでCodec→JSラッパー変換。
パーティクルシステム
- カスタムパーティクルのフルライフサイクルを理解する — ParticleType登録(+Codec/StreamCodec)→Particleクラス実装→Provider+SpriteSet→テクスチャ/particles.json→スポーン。1.21.1ではParticleTypeコンストラクタにMapCodec+StreamCodecが必要。
- サーバー発動パーティクルはPayload Systemで送信する — SimpleChannel非推奨に伴い、CustomPacketPayload + StreamCodec + PayloadRegistrar を使用。
カスタムシェーダー
- カスタムシェーダーは
RegisterShadersEventでCoreShaderとして登録する — GLSL + RenderType.CompositeRenderType + CompositeState の3点セット。1.21.1のShader APIは1.20.1と互換。 - PostChainポストプロセスはフルスクリーンGLパスのため高コスト — 軽量エフェクトはParticle/シェーダーで済ませ、PostChainは画面全体の色調変更など限定的に使う。
ワールドジェン/鉱石生成
- ワールドジェンはConfiguredFeature/PlacedFeatureの2段階分離を理解する — 1.21.1ではデータ駆動JSONが基本。DatagenでJSONを生成し、
neoforge:biome_modifierでバイオーム注入。 - カスタム鉱脈はFeatureクラス継承 + Partパイプラインで実装する — 1.20.1のBiomeModification APIは廃止。datapack JSONベースのbiome_modifierに移行。
- 鉱石生成データは
ConfiguredFeatureProviderでDatagenする — 1.21.1では全FeatureがJSONデータ駆動。DatapackBuiltinEntriesProviderで一元管理。
設定システム
- ConfigはForgeConfigSpecで型安全に定義する — NeoForgeでもForgeConfigSpec互換。SpecPair + CommonConfig/ClientConfig/ServerConfigの3分割。
- 動的ConfigやホットリロードはCachedConfig + JSONパターンを検討する — ConfigEvent.Reloading購読 + CodecベースJSON Config。
- マルチローダー対応はInterfaceベースConfigを検討する — Configインターフェース + Forge/Fabric実装分離。NeoForgeでは
neoforge.mods.toml。
Mixin戦略
- Mixinは@Mixin + @Inject + @Atの基本3点を押さえる — NeoForge 1.21.1はJAVA_21互換、MixinBooter不要。@Accessor/@Invokerでprivate公開。
- Mixinはdomain別パッケージ + mixin.jsonプラグインで組織化する — IMixinConfigPluginで条件付き適用。shouldApplyMixin()で他Mod競合回避。
- Mixin以外の選択肢を常に先に検討する — イベント購読 / Interface Injection / Capability / CoreModの順。
サンドボックス/スクリプトセキュリティ
- スクリプトサンドボックスはClassFilter + カスタムClassLoaderの直列で実装する — ホワイトリスト/ブラックリスト2段階フィルター。ASM ClassVisitorでバイトコード検証。
- スクリプト実行にはタイムアウト制御 + 例外ハンドリングを必須とする — Watchdogスレッドによる割り込み。GraalVMではStatement LimitsでPrecise制御。
パフォーマンス/キャッシュ
- 高頻度ルックアップはLoadingCache + LRU + TTLでキャッシュする — Caffeine/LRU + ヒット率/ミス率のMetrics計測を組み込む。
- BlockEntityキャッシュはチャンク単位の無効化 + ワールドアンロードリスナーで設計する — ChunkedBECache + WorldEvent.Unload購読。
Mod統合/互換
- 他Mod統合はServiceLoaderベースのSPIで設計する — IModIntegration + ModIntegrationManagerで一括管理。Payload SystemベースのクロスMod通信。
- JEI/Jade/Curios統合は専用Pluginクラスで疎結合に保つ — Data Component + Payloadでデータ共有。NeoForgeではCapability直接取得で連携。
レジストリ管理
- 登録はDeferredRegister + 型安全ラッパーで統一する — 1.21.1では
DeferredRegister.Blocks/Itemsのショートカット利用可能。RegisterEventでの動的追加。 - カスタムレジストリはRegistryBuilder + NewRegistryEventで作成する — Codec + StreamCodec実装必須。1.21.1ではData ComponentとのCodec統一が重要。
- DataFixerUpperでレジストリ名変更に備える — RenameDataFixで破壊的変更回避。MissingMappingsEventで未登録エントリのリマップ。
❌ やってはいけないこと
- LazyOptionalを使わない — 1.21.1で廃止。
@Nullable T直接取得に移行。 - Data AttachmentをItemStackに使わない — ItemStackにはData Componentを使う。
- SimpleChannelを使わない — Payload Systemに移行。
new ResourceLocation()を使わない —ResourceLocation.fromNamespaceAndPath()を使う。@OnlyInをModコードで使わない — NeoForge内部専用。@Mod(dist = Dist.CLIENT)またはFMLClientSetupEventで分離。- チュートリアルレベルの質問にこのSkillを使わない — 基礎は
1211-neoforge-moddingスキルを参照。 - 外部Modの実装をそのままコピペしない — ライセンス違反になる。設計思想のみ参考にする。
- パーティクルシステムをスクラッチで書かない —
Particle/TextureSheetParticleの継承とParticleProviderのファクトリパターンを理解してから実装する。 - MCのレンダリングパイプラインを無視してGL呼び出しを直接書かない — カスタムシェーダーは
RegisterShadersEvent+RenderTypeの枠組みに従う。 - 独自Featureをスクラッチで書かない — 標準Feature + データ駆動JSONで十分なケースが大半。Partパイプラインは本当に必要な場合のみ。
- Mixinの@Overwriteを避ける — compat問題の原因。Interface Injection / @Inject / @Redirectで代替する。
- サンドボックスなしで外部スクリプトを実行しない — ClassFilter + カスタムClassLoader + タイムアウト制御の3点セットが必須。
- 大規模Modで全設定を1ファイルに詰め込まない — CommonConfig/ClientConfig/ServerConfigに分割する。
Forge 1.20.1 → NeoForge 1.21.1 移行チェックリスト
| 項目 | Forge 1.20.1 | NeoForge 1.21.1 |
|---|---|---|
| Capability | LazyOptional<T> |
直接 @Nullable T |
| ItemStackデータ | NBT (CompoundTag) |
Data Component (DataComponentType<T>) |
| BE/Entityデータ | Capability + NBT | Data Attachment (AttachmentType<T>) |
| ネットワーク | SimpleChannel + registerMessage |
CustomPacketPayload + StreamCodec + PayloadRegistrar |
| ResourceLocation | new ResourceLocation(...) |
ResourceLocation.fromNamespaceAndPath(...) |
| DeferredRegister | DeferredRegister.create(...) |
DeferredRegister.Blocks/Items.create(...) |
| クライアント分離 | @OnlyIn(Dist.CLIENT) |
@Mod(dist=Dist.CLIENT) / FMLClientSetupEvent |
| イベントバス | bus = Bus.MOD / Bus.FORGE |
bus = Bus.MOD / Bus.GAME |
| Mixin compat level | JAVA_17 |
JAVA_21 |
| 設定ファイル | mods.toml |
neoforge.mods.toml |
設計パターンリファレンス
| 設計カテゴリ | 内容 | ファイル | 読むタイミング | |---|---|---|---|---| | BlockEntity実装 | BE登録4方式、BEライフサイクル、ティック戦略、データ保存/読込、ネットワーク同期5方式、Capability提供、GUI連携、設計判断フローチャート | references/patterns/BE_IMPLEMENTATION.md | BEを新規実装・設計する際の最初に読むべき参照 | | エネルギーシステム | GregTech EU, Botania Mana, Ars Source, Mekanism Chemical, FE互換 (Data Component化含む) | references/patterns/POWER_SYSTEMS.md | 独自電力/エネルギー型をNeoForgeで実装する際 | | GUI/UIフレームワーク | LDLib ModularUI NeoForge対応, ModernUI Granite GPU, Data Component連携 | references/patterns/GUI_FRAMEWORKS.md | NeoForgeでカスタムGUIを実装する際 | | ネットワーク/同期 | AE2 ME Network 27 Component化, Create Catnip→Payload, Mekanism PayloadRegistrar | references/patterns/NETWORK_SYNC.md | Payload System移行やネットワーク同期を実装する際 | | マルチブロック | GregTech MetaMachine, Multiblocked2, Mekanism 4層抽象 (Capability直接取得版) | references/patterns/MULTIBLOCK.md | NeoForgeでマルチブロック構造を実装/移行する際 | | レシピ・データ駆動 | JEI/EMI 1.21.1 Plugin, KubeJS Interface Injection, SuperbWarfare Component化 | references/patterns/RECIPE_DATA.md | Data Component対応レシピ・データ駆動を実装する際 | | レンダリング | Create Flywheel Visual/Renderer二重パス, GeoRender + Data Component同期, VertexConsumer実践, EntityRenderer | references/patterns/RENDERING.md | NeoForgeでインスタンスレンダリングを適応する際 | | パーティクルシステム | ParticleType登録, Particleクラス実装, Provider/SpriteSet, テクスチャ設定, Payload同期, 応用パターン, 1.20.1→1.21.1移行ポイント | references/patterns/PARTICLE_SYSTEM.md | カスタムパーティクルエフェクトをNeoForgeで実装する際 | | カスタムシェーダー | CoreShader登録, GLSLソース, RenderType+CompositeState, PostChain, 1.21.1互換ノート | references/patterns/SHADER_SYSTEM.md | 発光/カスタム描画効果にシェーダーを使いたい際 | | スペル/エフェクト | Ars Nouveau Spell Component化+Payload同期, Botania機能花 Capability直接取得 | references/patterns/SPELL_EFFECT.md | スペルシステムをData Component化する際 | | AI/エンティティ | TouhouLittleMaid Data Attachment化, Botania Familiar, Ars Familiar | references/patterns/AI_ENTITY.md | エンティティデータのAttachment移行やAIを実装する際 | | スクリプト連携 | KubeJS Interface Injection + CodecTypeWrapper, Componentラッパー | references/patterns/SCRIPTING.md | NeoForgeでJS連携を実装する際 | | 移行ガイド | Forge 1.20.1 → NeoForge 1.21.1 全体移行パターン | references/MIGRATION_GUIDE.md | 既存Modを1.21.1に移行する際 | | ビルドアーキテクチャ | マルチモジュールBuild, Xplat/Forge/Fabric分離, ServiceLoader抽象, アノテーションプロセッサ | references/patterns/BUILD_ARCHITECTURE.md | 大規模Modのビルド構成・マルチローダー対応を設計する際 | | レジストリ管理 | カスタムレジストリ+フリーズ, 型安全RegistryObject, DoubleDeferredRegister, Addonアノテーション発見 | references/patterns/REGISTRY_MANAGEMENT.md | 多数のオブジェクトを体系的に登録するレジストリ設計を行う際 | | コンポジション/Trait | BEBehaviour, MachineTrait, Capability Resolver/Proxy, Composition over Inheritance | references/patterns/COMPOSITION_TRAIT.md | 継承ではなくTrait合成でマシン/BEを設計する際 | | 設定システム | ファイル分割, CachedConfig+無効化, インターフェースベース設定, 動的Config生成, JSON/ホットリロード | references/patterns/CONFIG_SYSTEMS.md | 大規模Modの設定管理アーキテクチャを設計する際 | | Mixin戦略 | Mixin不使用戦略, プロパティ制御, Xplat/Forge/Fabric三段階分割, Interface Injection代替 | references/patterns/MIXIN_STRATEGY.md | Mixinの組織化や使用判断・代替手法を検討する際 | | サンドボックス/スクリプト | クラスフィルター, アノテーション公開面制御, TypeInfo階層, ScriptPack, カスタムイベントシステム | references/patterns/SANDBOX_SCRIPTING.md | スクリプトエンジンのサンドボックス分離・型変換設計を行う際 | | パフォーマンス/キャッシュ | RecipeDB木構造, 入力キャッシュ階層, LazyTagLookup, ForkJoinPool並列処理, EnumMap効率化 | references/patterns/PERFORMANCE_CACHE.md | 大規模レシピ検索・低レイテンシ同期・並列処理を最適化する際 | | 統合/互換モジュール | LookingAt抽象化, XEI統合, 互換ファサード, IMC拡張, Plugin発見パターン | references/patterns/INTEGRATION_MODULE.md | 他Modとの疎結合な統合システム・プラグイン設計を行う際 | | ワールドジェン/鉱石 | 三相パイプライン, Codec Dispatch鉱脈, データ駆動ローダー, DimensionMarker, チャンク消費管理 | references/patterns/WORLDGEN_ORES.md | 大規模なワールドジェン・鉱石生成システムを設計する際 |
補足: Addon開発のための各Modトピック
以下のModはAddon開発で直接参照するケースが多いため、関連性の高い設計パターンへのリンクを記載する。
| Mod | ファイル | 主に関心を持つべき設計パターン | |---|---|---|---| | Mekanism | mods/MEKANISM.md | エネルギーシステム / ネットワーク/同期 / マルチブロック / レシピ・データ駆動 | | Create | mods/CREATE.md | ネットワーク/同期(Payload化) / マルチブロック(Contraption) / レンダリング | | GregTech Modern | mods/GREGTECH_MODERN.md | エネルギーシステム(EU/Component化) / マルチブロック / GUI/UI | | Botania | mods/BOTANIA.md | エネルギーシステム(Mana/80+ Component) / スペル/エフェクト / AI/エンティティ | | AE2 | mods/AE2.md | ネットワーク/同期(ME Network 27 Component化) | | Ars Nouveau | mods/ARS_NOUVEAU.md | スペル/エフェクト / エネルギーシステム(Source) / AI/エンティティ | | Farmer's Delight | mods/FARMERS_DELIGHT.md | レシピ・データ駆動 / ネットワーク/同期(Payload) | | LDLib | mods/LDLIB.md | GUI/UIフレームワーク | | ModernUI | mods/MODERNUI.md | GUI/UIフレームワーク / レンダリング | | KubeJS/Rhino | mods/KUBEJS_RHINO.md | スクリプト連携(Interface Injection) | | TouhouLittleMaid | mods/TOUHOU_LITTLE_MAID.md | AI/エンティティ / レンダリング | | SuperbWarfare | mods/SUPERB_WARFARE.md | レシピ・データ駆動 / レンダリング(GeoRender) | | Multiblocked2 | mods/MULTIBLOCKED2.md | マルチブロック | | JEI | mods/JEI.md | レシピ・データ駆動(プラグインAPI) | | Jade | mods/JADE.md | レシピ・データ駆動(ツールチップ) | | EMI | mods/EMI.md | レシピ・データ駆動(Codecシリアライズ) |
関連スキル
- NeoForge 1.21.1 基礎 →
1211-neoforge-moddingスキル - Mixin実装 →
minecraft-mixinスキル - Forge 1.20.1 版 →
1201-mods-exsampleスキル
ライセンス
このSkill自体は MIT License で提供されます。
重要: 本Skillは16のオープンソースMinecraft Modの内部構造を分析したものです。
分析テキストはオリジナル作成ですが、参照元のModソースコードは各Modのライセンスに従います。
Modのライセンス情報は mods-references-neoforge/ 内の各Modディレクトリにあります。
| Mod | ライセンス | 備考 |
|---|---|---|
| Mekanism | MIT | |
| Create | MIT (コード), ARR (アセット) | コードのみMIT、アセットはAll Rights Reserved |
| Just Enough Items (JEI) | MIT | |
| Jade | CC BY-NC-SA 4.0 | 非商用利用 |
| EMI | MIT | |
| KubeJS | LGPL v3 | |
| Rhino | MPL 2.0 | |
| ModernUI | LGPL v3 | |
| TouhouLittleMaid | MIT (コード), CC BY-NC-SA 4.0 (アセット) | デュアルライセンス |
| Botania | Botania License (オープン、要帰属表示) | カスタムオープンライセンス |
| Applied Energistics 2 | LGPL v3 | |
| Ars Nouveau | LGPL v3 | |
| SuperbWarfare | MIT | |
| Farmer's Delight | MIT | |
| GregTech Modern | LGPL v3 | |
| LDLib-Architectury | LGPL v3 | |
| Multiblocked2 | LGPL v3 |