跳至主要內容

FreeMinecraftModels 資源包輸出

FreeMinecraftModels 目前將其生成的資源包寫入 output,而非 outputs

預設輸出路徑

外掛在啟動時與 /fmm reload 時會重建此資料夾:

plugins/FreeMinecraftModels/output/FreeMinecraftModels

然後將該資料夾壓縮為:

plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip

當 ResourcePackManager 與 FreeMinecraftModels 整合時,預期使用的就是這個 zip 路徑。

會生成什麼

生成的資料夾始終包含:

  • pack.mcmeta
  • pack.png
  • assets/minecraft/atlases/blocks.json
  • assets/freeminecraftmodels/... 模型與紋理輸出

FreeMinecraftModels 會在下列路徑下產生物品模型定義檔:

assets/freeminecraftmodels/items

程式碼中仍保留供 1.21.4 之前版本使用的舊版皮革馬鎧覆寫路徑,但外掛宣告 api-version: 1.21.4,因此能載入此外掛的伺服器都不會使用該分支。

Display Model 輸出(1.21.4+)

當模型有同伴 .json display model 檔案(請參閱 模型製作說明),FMM 會將該 JSON(紋理參考會重寫以匹配已擷取的紋理)複製到:

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

它也會在下列路徑生成對應的物品定義:

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

DisplayModelRegistry 在執行階段追蹤哪些模型有 display JSON,使 ItemMeta.setItemModel() 可以對 ItemStack 呼叫,賦予它們正確的手中與物品欄外觀。

Bedrock 自訂實體套件

除了 Java 資源包資產之外,FreeMinecraftModels 也會為每個已轉換的模型匯出 Bedrock 自訂實體套件到:

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

每個模型會提供材質、幾何、render controller、動畫、animation controller 和實體定義,全部位於 freeminecraftmodels: 命名空間(freeminecraftmodels:<model_id>)。

製作模型時請注意:

  • 沒有材質的模型會被略過,主控台會顯示 Skipping Bedrock custom entity export for <id>: model has no textures.
  • Java 匯入器仍接受沒有材質的定義;略過只適用於該模型的 Bedrock 自訂實體套件項目。
  • Bedrock 幾何排除騎乘點骨骼(m_)、自動產生的名稱骨骼(fmm_nametag_bone_*)和 hitbox。作者建立的 tag_ 錨點仍保留在幾何中,通常不含方塊。
  • 沒有動畫的模型仍會匯出單一 idle 動畫槽。
  • Bedrock 實體執行階段的碰撞箱寬度和高度來自模型的 hitbox 骨骼;沒有該骨骼時使用 1.0 x 2.0

Bedrock 執行階段需要啟用名為 floodgateGeyser-SpigotGeyser 的外掛。名稱比對不區分大小寫,但其他名稱不會符合。在僅有 Java 玩家的伺服器上,FMM 仍會匯出套件檔案,但不會建立或更新該後端。

弓與弩條件性物品輸出

當 FMM 偵測到一組弓或弩狀態模型(請參閱 模型製作說明),它會為 _idle 模型生成單一物品定義 JSON,該 JSON 會在資源包層級條件性地切換各個狀態。不需要伺服器端的封包工作 -- 客戶端會原生處理狀態轉換。

弓的輸出

對於弓,生成的物品定義在 using_item 上使用 minecraft:condition,並在 use_duration 上使用 minecraft:range_dispatch(scale 0.05):

條件使用的模型
不在使用該物品_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 及更新版本的相容性修正:

  • UV 鉗制: 先將表面的 UV 限制在來源材質自身的像素範圍(0textureWidth / 0textureHeight),再縮放到 Minecraft 的 16x16 UV 空間。有些 .bbmodel 的表面含有負值或超出範圍的 UV,例如材質圖集調整大小或自動 UV 越界;26.1 的嚴格驗證會拒絕這些值。鉗制後模型便能正常處理,越界表面最多損失少量材質細節。
  • 略過空骨骼和僅含錨點的骨骼: 沒有方塊的骨骼不會寫入幾何 JSON,因此若為它產生物品模型定義,就會留下失效參照。1.21.x 會忽略此問題,但 26.1+ 會逐一記錄 Missing block model: freeminecraftmodels:...。產生器現在會同時略過這類骨骼的幾何檔和物品定義。這也涵蓋僅用於碰撞的 hitbox 骨骼、tag_name 位置錨點、FMM 自動產生的 fmm_nametag_bone_*,以及純包裝或錨點骨骼。

這些修正會自動套用,無需設定。

備註

正因為會略過這些骨骼,tag_ 名稱骨骼不需要方塊:它只是位置錨點,產生器會刻意不為其寫入檔案。請參閱 名稱標籤需要 tag_ 骨骼

確定性輸出

產生的資源包是位元組穩定的:從未變動的模型重新產生會得到完全相同的 zip,因此也會得到完全相同的 SHA1。

這一點很重要,因為當某個資源包的 SHA1 已與遠端主機上的相符時,ResourcePackManager 會略過重新上傳。若位元組會亂跳,該檢查永遠不會相符,RSPM 每次重新啟動都會重新上傳,而每位玩家都得重新下載一個內容根本沒變的資源包。

產生器中有兩處會直接把 JSON 寫到磁碟,因此它們的 map 迭代順序就是檔案的位元組順序:

  • assets/freeminecraftmodels/items 底下的每個骨骼物品模型定義
  • assets/freeminecraftmodels/models 底下每個骨骼模型 JSON 的 display 區塊

兩者現在都使用保留插入順序的 map。先前它們使用 Map.of,其底層是 java.util.ImmutableCollections —— 它會設定一個每個 JVM 隨機的 salt,並從依 salt 而定的索引開始探測,因此同樣的那幾個鍵在每次伺服器啟動時都會以不同順序輸出。像 translation / scale,以及 type / index / default 這些鍵,每次開機都會互換位置,導致每個物品定義與每個模型檔案都被無謂地重寫。

如果你先前遇過「明明什麼都沒改,玩家每次重新啟動後卻都要重新下載資源包」的情況,原因就在這裡。

備註

確定性只有在你的模型集合未變動時才成立。新增、移除、更名或編輯模型都會正當地改變資源包位元組,並且應該觸發重新上傳。

重新載入行為

FreeMinecraftModels 重新載入時會:

  • 先清除作用中的模型、擺設、偽裝、腳本執行個體、監聽器狀態和腳本冷卻儲存,再重新建立。
  • 重新執行內容匯入。
  • 重建 output/FreeMinecraftModels 資料夾。
  • 重新產生 output/FreeMinecraftModels.zip
  • 若已安裝 ResourcePackManager,執行 resourcepackmanager reload
  • 新的初始化完成後,在主執行緒觸發 FmmReloadedEvent,讓相依外掛重新建立模型附件。

因此,現代 FMM + ResourcePackManager 配置不再需要手動複製 zip 的舊工作流程。