← 回方塊靈感庫

# 下載下來的結構檔怎麼用

從 <https://muse.mcfallout.net/> 按「下載結構檔+圖片」或「下載投影藍圖檔」拿到的 **`.nbt`**,
就是 Minecraft **原版結構方塊的存檔格式**——不是我們自創的格式,
資料包、外掛、WorldEdit 都吃得下。

## 最快的用法:在遊戲裡放出來

1. 把 `你的名字.nbt` 放到存檔的
   `saves/<世界>/generated/minecraft/structures/` 底下
   (單人世界;伺服器是 `<世界資料夾>/generated/minecraft/structures/`)
2. 遊戲裡 `/give @s structure_block`,放下去、右鍵
3. 模式切到 **載入(LOAD)**,名字填檔名(不含 `.nbt`),按「載入」→「放置」

## 資料包作者:放進資料包

```
你的資料包/
└── data/
    └── <你的命名空間>/
        └── structure/            ← 1.21 之後是單數 structure;1.20 以前是 structures
            └── my_house.nbt
```

放好之後可以:

- 用指令直接放:`/place template <命名空間>:my_house ~ ~ ~`
- 掛進**拼圖池**(jigsaw pool)讓它自然生成——見下一節
- 用 `/setblock` 放結構方塊指向它

> ⚠ **1.21 把資料夾從 `structures/` 改成 `structure/`**(單數)。
> 用錯的話遊戲不會報錯,只會安靜地找不到。這是最常見的坑。

## 掛進拼圖池(讓它自然生成)

我們輸出的檔案裡**沒有拼圖方塊**——所有 `minecraft:jigsaw` 在匯出時就已經
換成它的 `final_state` 了,所以放下去就是成品,不會留下一堆拼圖方塊。

要拿它當拼圖樣板的話,自己在結構裡加 `minecraft:jigsaw` 方塊,
再寫一個樣板池:

```json
// data/<命名空間>/worldgen/template_pool/houses.json
{
  "name": "<命名空間>:houses",
  "fallback": "minecraft:empty",
  "elements": [
    {
      "weight": 1,
      "element": {
        "element_type": "minecraft:single_pool_element",
        "location": "<命名空間>:my_house",
        "projection": "rigid",          // rigid=照原樣;terrain_matching=貼合地形
        "processors": "minecraft:empty" // 要做風化/破損就換成你的處理器清單
      }
    }
  ]
}
```

拼圖方塊本身要設 `name`(自己的接點名)、`target`(要接到誰)、
`pool`(往下接哪個池)、`final_state`(生成後這一格要變成什麼,通常是
`minecraft:air` 或牆材)。

## 外掛作者(Paper / Spigot)

```java
StructureManager sm = Bukkit.getStructureManager();
Structure s = sm.loadStructure(new File(plugin.getDataFolder(), "my_house.nbt"));
s.place(location, true, StructureRotation.NONE, Mirror.NONE, 0, 1.0f, new Random());
```

也可以用 `sm.registerStructure(NamespacedKey, Structure)` 註冊後重複使用。

## WorldEdit

WorldEdit 讀的是自己的 `.schem`(Sponge schematic),**不是這個格式**。
要轉的話用結構方塊在遊戲裡載入,再 `//copy` `//schem save`。

## 檔案裡面長什麼樣

根標籤是一個沒有名字的 `TAG_Compound`,整份 gzip 壓縮:

| 欄位 | 型別 | 說明 |
| --- | --- | --- |
| `DataVersion` | `TAG_Int` | 存檔版本。我們寫的是 **4903**(Minecraft Java 26.2)。比你的遊戲新的話會載不進去;比較舊的話遊戲會自動跑升級器 |
| `size` | `TAG_List<Int>` | `[寬, 高, 深]` |
| `palette` | `TAG_List<Compound>` | 每筆 `{ Name: "minecraft:stone_bricks", Properties: { … } }`。屬性值一律是字串(`"true"` 不是 `true`) |
| `blocks` | `TAG_List<Compound>` | 每筆 `{ pos: [x,y,z], state: <palette 索引> }`,座標是相對於結構原點的 |
| `entities` | `TAG_List` | 我們不輸出實體,一律是空的 |

我們**不寫** `palettes`(複數,原版用來做隨機變體的)——只有一份 palette,
所以每次放出來都一樣。

## 我們做了什麼、沒做什麼

**做了**

- 把原始結構的**建材整批換成你骰到的那組配色**(牆/框架/屋頂/地板/地面/細節)
- 換材質時**保留方塊屬性**(樓梯朝向、門的上下半、原木軸向),形狀不相容就保留原方塊
- 拼圖方塊換成 `final_state`
- 去掉我們自己墊的那層地面(`subsoil`),只留結構本體

**沒做**

- 沒有實體(村民、盔甲座、掉落物)
- 沒有方塊實體資料(箱子裡的東西、告示牌的字、生怪磚的設定)——
  這些在原始樣板裡就有,但我們的管線只保留方塊狀態
- 沒有 `palettes` 隨機變體

## 授權

structure 的**幾何**來自社群作者的作品(授權都驗過,只收允許改作與再散布的:
MIT/LGPL/MPL/Apache/GPL/CC-BY/CC-BY-NC)。
畫面下方會標出這一棟出自哪個專案與授權,**你再散布時要照那個授權標示作者**。
`CC-BY-NC` 的不可用於商業用途,`-SA` 的衍生作品要用同樣的授權。
完整清單見 `docs/THIRD-PARTY-STRUCTURES.md`。

**建材配色**(也就是我們換上去的那部分)沒有版權主張,隨便你用。