FreeMinecraftModelsのリソースパック出力
FreeMinecraftModelsは生成したパックをoutputに書き込みます。
デフォルト出力パス
プラグインは起動時と/fmm reload時にこのフォルダを再構築します:
plugins/FreeMinecraftModels/output/FreeMinecraftModels
その後、そのフォルダを以下にZIP圧縮します:
plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip
このZIPパスは、ResourcePackManagerがFreeMinecraftModelsと統合する際に期待するものです。
生成時には、最後に公開されたFreeMinecraftModels.zipを除いてoutput内のすべてが削除され、作り直されます。作成したモデルやその他のファイルは別の場所に保存してください。FMMがフォルダを空にできない場合、生成はFailed to prepare output folderで失敗し、FMMの初期化は完了しません。
生成されるもの
生成処理は同梱のパックメタデータ、アイコン、アトラスをコピーし、読み込んだモデルとテクスチャを追加します:
pack.mcmetapack.pngassets/minecraft/atlases/blocks.jsonassets/freeminecraftmodels/...モデルとテクスチャ出力
同梱リソースの欠落や、FMMが作成できないフォルダがあると、生成は失敗します。1つのモデルのファイル書き込みに失敗した場合はログに記録されて生成が続行されるため、出力だけでなくコンソールも確認してください。ZIPを作成する前に、FMMはパーティクルのテクスチャを含むエンティティテクスチャの明示的なアトラスエントリを追加し、自身のエンティティディレクトリを参照するアトラスソースを置き換えます。他のソースは保持されます。アトラスの読み書きに失敗すると、生成は失敗します。
FreeMinecraftModelsは以下にアイテムモデル定義ファイルを生成します:
assets/freeminecraftmodels/items
コードには1.21.4未満のサーバー向けに革の馬鎧モデルを置き換える旧処理が残っています。ただし、プラグインはapi-version: 1.21.4を宣言しているため、読み込み可能なサーバーでその分岐が使われることはありません。
ディスプレイモデル出力(1.21.4以降)
モデルと同じ場所に有効な.jsonディスプレイモデルファイルがある場合(モデル制作メモ参照)、FMMはそのtexturesマップを処理し、以下に書き込みます:
assets/freeminecraftmodels/models/display/{modelId}.json
対応するアイテム定義も以下に生成します:
assets/freeminecraftmodels/items/display/{modelId}.json
名前空間付きのテクスチャ値は変更されません。それ以外は数値のテクスチャインデックスで解決し、解決できなければ利用可能な抽出済みテクスチャを使います。不正なディスプレイJSONは警告を出し、登録されません。実行時のレジストリにより、処理済みディスプレイモデルを手持ち・インベントリ内のアイテムの外観に割り当てられます。
パーティクルのスプライト
モデルが使用するパーティクルエフェクトごとに、FMMはエフェクトのテクスチャと、スプライトごとに1つの平面アイテムモデルを書き出します:
assets/freeminecraftmodels/textures/entity/fmm_particles/{modelId}/{effect}.png
assets/freeminecraftmodels/models/particle/{modelId}/{effect}/{index}.json
assets/freeminecraftmodels/items/particle/{modelId}/{effect}/{index}.json
これらのスプライトが見えるのはJavaプレイヤーだけです。Bedrockプレイヤーは、下記のBedrockバンドルからネイティブのパーティクルとしてエフェクトを受け取ります。
ResourcePackManager用のサイドカーファイル
FMMは、ResourcePackManagerがパックをBedrock向けに変換する際に読み取る小さなJSONファイルを書き出します。Javaクライアントには影響しません。
| ファイル | 書き出される条件 | 目的 |
|---|---|---|
assets/freeminecraftmodels/rspm_item_bases/display/{modelId}.json | モデルにディスプレイモデルがあり、兄弟の.ymlがサーバーの認識するmaterialを設定している場合。LEATHER_CHESTPLATE:ff8800のような革の染色サフィックスがあると、このファイルは書き出されません | カスタムアイテムのベースとなるバニラアイテム(minecraft:blaze_rodなど)を示し、Bedrockがファイル名から推測したアイテムではなく、正しいベースアイテム上にモデルを表示できるようにします |
assets/freeminecraftmodels/rspm_item_particles/display/{modelId}.json | モデルにディスプレイモデルがあり、パーティクルのキーフレームを含むアニメーションがある場合 | ResourcePackManagerがアイテムのBedrockアタッチャブルに追加するエフェクト、ロケーター、ループするパーティクルのタイムラインを列挙します |
assets/freeminecraftmodels/rspm_item_java_only/particle/{modelId}/{effect}.json | モデルがパーティクルエフェクトを使用する場合 | そのエフェクトのスプライトアイテムをBedrockのカスタムアイテムに変換しないよう、ResourcePackManagerに伝えます |
particleEffectsEnabledがfalseの間、FMMはrspm_item_particlesファイルとBedrockのパーティクルファイルを書き出しません。Javaのパーティクルスプライトとそのrspm_item_java_onlyファイルは引き続き書き出されます。
Bedrockカスタムエンティティバンドル
Javaパックのアセットに加え、FreeMinecraftModelsはテクスチャを持つ読み込み済みモデルごとにBedrockカスタムエンティティバンドルのエクスポートを試みます。出力先は次の場所です:
plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/rspm_bedrock_pack
各モデルは、テクスチャ、ジオメトリ、レンダーコントローラー、アニメーション、アニメーションコントローラー、エンティティ定義を提供し、すべてfreeminecraftmodels:ネームスペース(freeminecraftmodels:<model_id>)の下に配置されます。パーティクルエフェクトを持つモデルは、particles/<model_id>_<effect>.json(識別子fmm:<model_id>_<effect>)と、FMMがエフェクトのテクスチャを見つけた場合はtextures/entity/fmm_particles/<model_id>/<effect>.pngも提供します。パーティクルを参照してください。
オーサリング時に重要となる注意点:
- テクスチャを1つも持たないモデルはスキップされ、コンソールに
Skipping Bedrock custom entity export for <id>: model has no textures.が出力されます - Javaのインポーターはテクスチャのない定義も受け入れます。明示的に省略されるのはBedrockカスタムエンティティバンドルのエントリだけです。
- Bedrock ジオメトリでは騎乗位置ボーン (
m_)、自動生成された名札ボーン (fmm_nametag_bone_*)、hitboxを除外します。作者が作成したtag_アンカーは、多くの場合キューブなしでジオメトリに残ります。 - アニメーションを持たないモデルでも、
idleアニメーションのスロットが1つエクスポートされます - モデルのジオメトリは、アニメーションが672を超えるモデルを除き、生成された
freeminecraftmodels_leanボーンから吊り下げられます。このボーンにより、Bedrockプレイヤーに移動方向への傾きと中心合わせが表示されます。MoLangキーフレームを持つアニメーションのチャンネルは記述されたとおりに書き出され、Bedrockクライアントがそれを評価します - Bedrockエンティティのランタイムのヒットボックスのwidthとheightはモデルの
hitboxボーンから取得されます。存在しない場合は1.0×2.0にフォールバックします
空のhitboxグループは寸法がゼロで、この代替値を使いません。b_プレフィックスはJavaの描画を隠しますが、Bedrockジオメトリでは除外されません。Bedrockアニメーションのエクスポートには、FMMが実行時に計算するIKの結果は焼き込まれません。アニメーションを参照してください。エクスポートエラーはログに記録され、バンドルが不完全な状態で残ることがあります。
Bedrockランタイムにはfloodgate、Geyser-Spigot、Geyserのいずれかの名前で有効なプラグインが必要です。この判定では大文字小文字を区別しません。プレイヤー単位の検出は別途FloodgateまたはGeyser-Spigotを確認するため、バックエンドが有効になっただけではプレイヤー検出やパック配信の成功を示しません。Java専用サーバーでもFMMはバンドルを出力しますが、このバックエンドの生成やtick処理は行いません。
弓とクロスボウの条件付きアイテム出力
FMMがディスプレイJSONの登録済みの、読み込み済み弓・クロスボウ状態モデル一式を検出すると(モデル制作メモ参照)、モデルのベースIDで1つのアイテム定義を生成します。この定義がクライアント上で状態を切り替えます。作成するアイテムには対応するBOWまたはCROSSBOWマテリアルが必要です。
弓の出力
弓の場合、生成されたアイテム定義はusing_itemに対するminecraft:conditionと、use_duration(スケール0.05)に対するminecraft:range_dispatchを使用します:
| 条件 | 使用されるモデル |
|---|---|
| アイテムを使用していない | _idle |
| 使用中、フォールバック(開始したばかり) | _draw_start |
使用中、しきい値0.65 | _draw_half |
使用中、しきい値0.9 | _draw_full |
クロスボウの出力
クロスボウの場合、生成されたアイテム定義はcharge_typeに対するminecraft:selectを使用します。チャージされている(矢またはロケット)場合、_chargedモデルを表示します。チャージされていないフォールバックはcrossbow/pullに対するminecraft:range_dispatchを使用します:
| 条件 | 使用されるモデル |
|---|---|
| 未使用、未チャージ | _idle |
| 使用中、フォールバック(開始したばかり) | _draw_start |
使用中、しきい値0.58 | _draw_half |
使用中、しきい値1.0 | _draw_full |
| チャージ済み(矢またはロケット) | _charged |
出力場所
生成された条件付きアイテム定義は、他のアイテム定義と並べて以下に書き込まれます:
assets/freeminecraftmodels/items/display/{baseModelId}.json
ベースIDが公開用ディスプレイアイテムになります。各状態の個別アイテム定義は出力と実行時レジストリから削除されますが、条件付き定義が参照するディスプレイジオメトリは残ります。
Minecraft 26.1+との互換性修正
パックジェネレーターは、Minecraft 26.1以降を含むすべての対応バージョンで以下の修正を適用します:
- UVクランプ: 面のUVは、Minecraftの16x16 UV空間へ変換される前に、テクスチャのUV範囲(
0–textureWidth/0–textureHeight)に制限されます。この範囲にはテクスチャのUVメタデータがあればそれを使い、なければ画像寸法またはモデルの代替解像度を使います。負の座標や範囲を超えた座標を制限すると、その面のテクスチャの細部が失われる場合があります。 - 空のボーンとアンカーのみのボーンはスキップされます: キューブを持たないボーンはジオメトリJSONを書き出さないため、それに対してアイテムモデル定義を書くと参照が宙に浮いてしまいます。1.21.xはこれを静かに許容していましたが、26.1以降はそのすべてを
Missing block model: freeminecraftmodels:...としてログに出力します。ジェネレータは現在、そうしたボーンについてジオメトリファイルとアイテム定義の両方をスキップします。これはhitboxボーン(衝突判定専用)、tag_nameの位置アンカー、FMMが自動生成するfmm_nametag_bone_*のバリアント、純粋なラッパー/アンカーボーンにも適用されます。
これらの修正は自動的に適用されます。設定は不要です。
tag_ネームタグアンカーにキューブは不要です。キューブのないアンカーはジオメトリを生成しませんが、プレフィックスだけでキューブ付きのすべてのボーンが非表示になるわけではありません。名前が正確にtag_nameであるボーンは特別に扱われます。ネームタグアンカーを参照してください。
決定的な出力
FMMはボーンごとのアイテム定義とモデルのdisplayブロックに挿入順を保持するマップを使い、不要な出力変更を減らしています。ZIP書き込み処理もエントリのタイムスタンプを固定します。
ZIPのバイト列が同一になる保証はありません。ZIP書き込み処理はエントリをソートせず、ファイルシステムの順序でディレクトリを走査します。モデル、テクスチャ、ディスプレイJSON、設定、ジェネレーターやサーバーのバージョン変更でもパックは変わり得ます。
予期せずパックのハッシュが変わった場合は、生成に使うデータだけでなく、アーカイブ内のエントリの内容と順序を比較してください。ダウンロードが繰り返されたという事実だけでは原因を特定できません。
リロード時の挙動
/fmm reloadでは、現在のランタイムを動かしたまま、最初にコンテンツをインポートして新しいアイテム、エンチャント、レシピのカタログを準備します。この準備に失敗した場合はリロードを拒否し、現在のカタログを保持します。準備に成功した後、以下を実行します:
- アクティブなモデル、プロップ、変身、スクリプトランタイム、リスナーの状態、スクリプトのクールダウン記録を破棄してから再構築する
- 設定とレシピを読み直す
output/FreeMinecraftModelsフォルダを再構築するoutput/FreeMinecraftModels.zipを再生成する- ResourcePackManagerが有効な場合、
resourcepackmanager reloadを実行する - 40 tick後にメインスレッドで
FmmReloadedEventを発生させ、依存プラグインがモデルの接続を再作成できるようにする
FMMはアーカイブをまずoutput/FreeMinecraftModels.zip.pendingに書き込み、その後FreeMinecraftModels.zipに上書き移動します。書き込みまたは移動に失敗すると生成は失敗し、以前のZIPがそのまま残ります。完全なZIPができても配信されたことの証明にはならないため、ResourcePackManagerによる配信とクライアントでの受け入れも確認してください。完全なリロードとインポート済みコンテンツの更新の違いは設定を参照してください。