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

Java から Bedrock への変換

ResourcePackManagerは、マージされたJavaリソースパックをBedrockリソースパックに変換できるため、GeyserMCのクライアントもJavaクライアントと同じカスタムコンテンツを見ることができます。これは既定で有効です。

変換される対象

コンバーターはもはやFreeMinecraftModels専用ではありません。マージ済みのJavaパックに対して、2つのパイプラインを連続して実行します:

  1. FreeMinecraftModelsボーンスキャナーassets/freeminecraftmodels/models/ 配下のFMMボーンモデルを拾い、各ボーンをBedrockのアタッチャブルに変換します。
  2. 汎用アイテム定義パイプライン — 1.21.4以降の形式である assets/<namespace>/items/*.json ファイルをすべて走査します(minecraft および freeminecraftmodels ネームスペースはスキップ)。各リーフモデルに対して、次のいずれかを出力します:
    • 素朴な minecraft:item/generated などのフラットなビルトイン親を持つモデルには、フラットなBedrockのインベントリアイコンを出力します。
    • 真の3Dモデルには、Bedrockのジオメトリ、アタッチャブル、アニメーションファイル、そしてソフトウェアレンダリングされた2Dインベントリアイコンを出力します。

ユニークなBedrock識別子は (モデル × ベースアイテム) のペアごとに生成されます。これにより、たとえば1本の剣モデルが複数のベースアイテムに登録されていても、Geyser側で衝突しません。

カスタム防具セットは、姉妹ファイルとして assets/<namespace>/equipment/<material>.json が存在する場合に検出されます。コンバーターは、バニラの防具ジオメトリにJavaのテクスチャを可視レイヤーとして組み合わせる防具アタッチャブルを構成し、アイテムを装備したBedrockプレイヤーに正しい防具テクスチャが表示されるようにします。

BedrockパックのマニフェストUUIDはパック名から決定論的に導出されるため、再構築をまたいで安定します。バンプされるのはバージョントリプレットのみ(ビルド時刻から導出されたキャッシュバスト用トークン)です。

セッション単位のライブ配信

Geyser-Spigotが検出されると、ResourcePackManagerは SessionLoadResourcePacksEvent のサブスクライバーを登録します。再ミックス後に参加したすべてのBedrockプレイヤーには、最新のBedrockパックがディスクから直接配信されます。テクスチャやモデルの編集にサーバーの再起動は不要です。

ただし、Geyserのカスタムアイテムマッピングcustom_mappings/ 配下のJSON)は依然として起動時に固定されるため、新規のカスタムアイテムの追加や既存アイテムの削除はサーバー再起動が必要です。RSPMは前回実行時のマッピングファイルを起動の早い段階で事前にデプロイするため、Geyserの起動時カスタムアイテム登録に自動的に取り込まれます。

すでに接続中のBedrockプレイヤーは、自分が参加した時点で受け取ったパックをそのまま保持します。これはプラグインで上書きできるものではなく、Bedrockプロトコルの制約です。

出力ファイル

ミックスが成功すると、Bedrock関連のファイルは次の場所に置かれます:

plugins/ResourcePackManager/output/ResourcePackManager_Bedrock.zip
plugins/ResourcePackManager/output/rspm_geyser_mappings.json

自動デプロイが有効で、Geyserが検出された場合、マッピングファイルは次の場所にもコピーされます:

<geyser-folder>/custom_mappings/rspm_geyser_mappings.json

Bedrockパック本体は <geyser-folder>/packs/ にはコピーされず、代わりにセッション単位でライブ配信されます。RSPMは古いプラグインバージョンがそのフォルダーに残したかもしれないコピーも削除します。これは、Geyserが同じパックを二重に配信してしまう(同一UUIDの重複でBedrockクライアントが混乱する)のを防ぐためです。

config.yml 設定

# Java から Bedrock への変換そのものを切り替えます。
bedrockConversionEnabled: true

# 各ミックス時に、検出されたGeyserフォルダーの custom_mappings/ ディレクトリへ
# Geyserのカスタムマッピングファイルをコピーします。
bedrockAutoDeployToGeyser: true

# Geyserデータフォルダーの手動上書き。空 = 自動検出。
# 絶対パスか、plugins/ ディレクトリからの相対パスを指定できます。
bedrockGeyserFolder: ""

自動検出は次の順序で確認します:

  1. bedrockGeyserFolder が設定されていればそれを使用(最初は絶対パスとして、次に plugins/ からの相対パスとして扱います)。
  2. plugins/Geyser-Spigot/
  3. plugins/Geyser-*/(任意の派生)
  4. config/Geyser-*/(Fabric/NeoForge構成向け)

持ち物表示のチューニング:bedrock_display_offsets.yml

Bedrockは、Javaの一人称/三人称トランスフォームとは異なる基本姿勢を持つ親ボーン経由で持ち物アイテムを描画します。そのため、アルゴリズムによる変換では、Javaモデルの display トランスフォームが指定するものに加えてベースオフセットを適用する必要があります。既定のオフセットは典型的な右利きのJavaモデル向けに調整されていますが、特殊なケースではチューニングが必要になることがあります。

一人称と三人称は完全に独立したBedrockのレンダーパス(親ボーンも基本姿勢も異なる)になっているため、それぞれに独自の6個のつまみがあります。一方を調整しても他方には影響しません。

# ===== 一人称(右手、所持者が見るビュー) =====
firstPersonBaseRotationX: -90.0 # ピッチ(カメラに対する傾き)。既定は親の回転を打ち消します。
firstPersonBaseRotationY: 0.0 # ヨー(垂直線まわりの回転)
firstPersonBaseRotationZ: 0.0 # ロール(カメラ前方軸まわり)
firstPersonBasePositionX: 0.0 # 画面上の垂直方向(正 = 上)
firstPersonBasePositionY: 12.5 # 奥行き(正 = シーン奥)
firstPersonBasePositionZ: 0.0 # 画面上の水平方向(正 = 右)

# ===== 三人称(右手、他プレイヤー/F5から見たビュー) =====
thirdPersonBaseRotationX: 90.0 # 観測者から見たピッチ
thirdPersonBaseRotationY: 0.0 # ヨー
thirdPersonBaseRotationZ: 0.0 # アイテムの長軸まわりのロール
thirdPersonBasePositionX: 0.0 # 所持者の体を横切る水平方向(正 = 外向き)
thirdPersonBasePositionY: 12.5 # 垂直方向(正 = モデルを持ち上げる)
thirdPersonBasePositionZ: 0.0 # 所持者を基準にした奥行き(正 = 前方)

位置の値はピクセル単位で、1ピクセル = ブロックの1/16です。回転は度数で指定します。

Bedrockクライアントは再起動なしでアタッチャブルJSONをライブリロードします。Bedrockのテストクライアントがログイン中なら、値を変更して /rspm reload を実行すれば、次のBedrock参加(あるいは場合によっては、すでに接続中のプレイヤーがワールド内でアタッチャブルを再バインドする小さなアクションを行った後)で新しいオフセットが反映されます。良さそうな見た目になるまで繰り返してください。

制限事項と既知の挙動

  • 3DのインベントリアイコンはJavaモデルの display.gui トランスフォームからソフトウェアレンダリングされます。仕上がりはおおむね妥当ですが、ピクセル単位で完全とは限りません。アイコンがおかしい場合、もっとも多い原因はモデルが参照しているテクスチャファイルの欠落や名前の食い違いです。
  • アイテムアイコンとして使用されるフリップブックテクスチャはフレーム0にトリミングされます。Bedrockの item_texture.json はアニメーションするアイコンに対応しておらず、アニメーションは flipbook_textures.json 経由でブロック/地形テクスチャにのみ使えます。
  • アタッチャブルのジオメトリフォーマットバージョンは 1.21.0 に固定されています(古いプラグインバージョンでは 1.16.0 でした)。インストール環境がそれを解析できない場合はGeyserを更新してください。
  • バニラのアイテムモデル(shield.jsoncrossbow.json)は、パックをまたいだpredicateツリーの破損を避けるためにパック間で再帰的にマージされません。この2つに限り、最優先のパックのものが採用されます。
  • 参照されているテクスチャやモデルファイルをコンバーターが解決できない場合、そのリーフはスキップされ、[BedrockConverter] の警告がログに出力されます。残りのパイプラインはそのまま継続します。