メインコンテンツまでスキップ

FreeMinecraftModelsのリソースパック出力

FreeMinecraftModelsは現在、生成されたパックをoutputsではなくoutputに書き込みます。

デフォルト出力パス

プラグインは起動時と/fmm reload時にこのフォルダを再構築します:

plugins/FreeMinecraftModels/output/FreeMinecraftModels

その後、そのフォルダを以下にZIP圧縮します:

plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip

このZIPパスは、ResourcePackManagerがFreeMinecraftModelsと統合する際に期待するものです。

生成されるもの

生成されたフォルダには常に以下が含まれます:

  • pack.mcmeta
  • pack.png
  • assets/minecraft/atlases/blocks.json
  • assets/freeminecraftmodels/...モデルとテクスチャ出力

Minecraft 1.21.4+では、FreeMinecraftModelsは以下の下にアイテムモデル定義ファイルを生成します:

assets/freeminecraftmodels/items

古いサーバーでは、レガシーの革馬鎧オーバーライドモデルパスにフォールバックします。

ディスプレイモデル出力(1.21.4以降)

モデルに兄弟.jsonディスプレイモデルファイルがある場合(モデル制作メモ参照)、FMMはそのJSON(テクスチャ参照は抽出されたテクスチャと一致するように書き換えられる)を以下にコピーします:

assets/freeminecraftmodels/models/display/{modelId}.json

対応するアイテム定義も以下に生成します:

assets/freeminecraftmodels/items/display/{modelId}.json

DisplayModelRegistryは、どのモデルがディスプレイJSONを持っているかを実行時に追跡するため、ItemStackでItemMeta.setItemModel()を呼び出して正しい手持ちおよびインベントリ外観を与えることができます。

Bedrockカスタムエンティティバンドル

Javaパックのアセットと並行して、FreeMinecraftModelsは変換されたすべてのモデルについてBedrockのカスタムエンティティバンドルを次の場所へエクスポートします:

plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/rspm_bedrock_pack

各モデルは、テクスチャ、ジオメトリ、レンダーコントローラー、アニメーション、アニメーションコントローラー、エンティティ定義を提供し、すべてfreeminecraftmodels:ネームスペース(freeminecraftmodels:<model_id>)の下に配置されます。

オーサリング時に重要となる注意点:

  • テクスチャを1つも持たないモデルはスキップされ、コンソールに Skipping Bedrock custom entity export for <id>: model has no textures. が出力されます
  • Bedrock ジオメトリでは騎乗位置ボーン (m_)、自動生成された名札ボーン (fmm_nametag_bone_*)、hitbox を除外します。作者が作成した tag_ アンカーは、多くの場合キューブなしでジオメトリに残ります。
  • アニメーションを持たないモデルでも、idleアニメーションのスロットが1つエクスポートされます
  • Bedrockエンティティのランタイムのヒットボックスのwidthとheightはモデルのhitboxボーンから取得されます。存在しない場合は 1.0 × 2.0 にフォールバックします

Bedrock ランタイムには floodgateGeyser-SpigotGeyser のいずれかの名前で有効なプラグインが必要です。大文字小文字は区別しませんが、別の名前は一致しません。Java 専用サーバーでも FMM はバンドルを出力しますが、このバックエンドの生成や tick 処理は行いません。

弓とクロスボウの条件付きアイテム出力

FMMが弓またはクロスボウの状態モデル一式を検出した場合(モデル制作メモ参照)、_idleモデル用に単一のアイテム定義JSONを生成し、リソースパックレベルですべての状態間を条件的に切り替えます。サーバー側のパケット処理は不要です -- クライアントが状態遷移をネイティブに処理します。

弓の出力

弓の場合、生成されたアイテム定義は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}_idle.json

_idleモデルだけがアイテム定義ファイルを取得します。drawおよびchargedモデルはその内部の条件エントリとして参照されます。

Minecraft 26.1+との互換性修正

パックジェネレータは、Minecraft 26.1以降向けに2つの自動互換性修正を適用します:

  • UVクランプ: 面のUVは、Minecraftの16x16のUV空間へ再スケールされる前に、元テクスチャ自身のピクセル境界(0textureWidth / 0textureHeight)へクランプされます。.bbmodelの作者が面に負またはサイズ超過のUVを残していることがあり(アトラスがリサイズされた、autouvが端をはみ出したなど)、26.1のより厳格なバリデータはそれを拒否します。クランプによってモデルはベイクできるようになり、境界外のUVを持つ面が失うのはせいぜい数ピクセルのテクスチャ情報だけです。
  • 空のボーンとアンカーのみのボーンはスキップされます: キューブを持たないボーンはジオメトリJSONを書き出さないため、それに対してアイテムモデル定義を書くと参照が宙に浮いてしまいます。1.21.xはこれを静かに許容していましたが、26.1以降はそのすべてを Missing block model: freeminecraftmodels:... としてログに出力します。ジェネレータは現在、そうしたボーンについてジオメトリファイルとアイテム定義の両方をスキップします。これはhitboxボーン(衝突判定専用)、tag_nameの位置アンカー、FMMが自動生成するfmm_nametag_bone_*のバリアント、純粋なラッパー/アンカーボーンにも適用されます。

これらの修正は自動的に適用されます。設定は不要です。

注記

これらのボーンがスキップされることが、tag_ネームタグボーンにキューブが不要な理由です — 位置アンカーであり、ジェネレータは意図的に何も書き出しません。ネームタグにはtag_ボーンが必要を参照してください。

決定的な出力

生成されるパックはバイト単位で安定しています。変更のないモデルから再生成すれば、まったく同じzipが、したがってまったく同じSHA1が得られます。

これが重要なのは、ResourcePackManagerが、SHA1がリモートホスト側と既に一致しているパックの再アップロードをスキップするためです。バイト列が毎回変わると、このチェックが一度も一致せず、RSPMは再起動のたびに再アップロードし、すべてのプレイヤーが内容の変わっていないパックを再ダウンロードすることになります。

ジェネレータ内の2箇所は、JSONを直接ディスクへ書き出すため、マップの反復順序がそのままファイルのバイト順になります:

  • assets/freeminecraftmodels/items 配下のボーンごとのアイテムモデル定義
  • assets/freeminecraftmodels/models 配下のボーンごとのモデルJSONの display ブロック

どちらも現在は挿入順を保持するマップを使用しています。以前は Map.of を使用していましたが、これは java.util.ImmutableCollections に支えられており、JVMごとにランダムなソルトを生成してソルト依存のインデックスから探索します。そのため、同じ少数のキーがサーバー起動のたびに異なる順序で出てきていました。translation / scale や、type / index / default といったキーが起動のたびに入れ替わり、理由もなくすべてのアイテム定義とすべてのモデルファイルが書き換えられていたのです。

何も変更していないのに再起動のたびにプレイヤーがリソースパックを再ダウンロードしていたなら、原因はこれでした。

注記

決定性が保たれるのはモデルセットが変わっていない場合だけです。モデルの追加、削除、リネーム、編集はパックのバイト列を正当に変化させるため、再アップロードが発生すべきです。

リロード時の挙動

FreeMinecraftModelsがリロードすると、以下が行われます:

  • コンテンツインポートステップを再実行する
  • output/FreeMinecraftModelsフォルダを再構築する
  • output/FreeMinecraftModels.zipを再生成する
  • ResourcePackManagerがインストールされている場合、resourcepackmanager reloadをディスパッチする

これが、最新のFMM + ResourcePackManagerセットアップが古い手動ZIPコピーワークフローを必要としなくなった理由です。

再構築が成功すると FmmReloadedEvent が発生します。Bedrock エクスポートは先にモデルを検証し、テクスチャのないエンティティを不完全なまま公開せず省略します。