FreeMinecraftModels 資源包輸出
FreeMinecraftModels 目前將其生成的資源包寫入 output,而非 outputs。
預設輸出路徑
外掛在啟動時與 /fmm reload 時會重建此資料夾:
plugins/FreeMinecraftModels/output/FreeMinecraftModels
然後將該資料夾壓縮為:
plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip
當 ResourcePackManager 與 FreeMinecraftModels 整合時,預期使用的就是這個 zip 路徑。
會生成什麼
生成的資料夾始終包含:
pack.mcmetapack.pngassets/minecraft/atlases/blocks.jsonassets/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.0x2.0。
Bedrock 執行階段需要啟用名為 floodgate、Geyser-Spigot 或 Geyser 的外掛。名稱比對不區分大小寫,但其他名稱不會符合。在僅有 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 限制在來源材質自身的像素範圍(
0–textureWidth/0–textureHeight),再縮放到 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 的舊工作流程。