API
方块形状
方块不必是立方体。你用一个或多个方框来描述它的形状,Crafting 会把它绘制出来、使它具有碰撞,并在方块未填满的地方让光线和相邻的面透过。想要独特的外观,就给它一个模型。
形状:方框列表
block "half" { shape: [[0, 0, 0, 16, 8, 16]] }
block "pedestal" {
shape: [[2, 0, 2, 14, 2, 14], [5, 2, 5, 11, 12, 11], [3, 12, 3, 13, 14, 13]]
}每个方框是以像素为单位的 [x1, y1, z1, x2, y2, z2],范围 0 到 16(16 是整整一格方块)。方块由这些方框绘制,每个面都贴有它的纹理,并与这些方框发生碰撞:玩家可以站在方框上,选取轮廓也会贴合方框。
模型:独特的外观
block "lamp" {
model: "block/lamp"
shape: [[7, 0, 7, 9, 12, 9], [5, 12, 5, 11, 16, 11]]
light: 15
}| 属性 | 取值 | 默认值 |
|---|---|---|
shape |
以像素为单位(0–16)的方框列表 [x1, y1, z1, x2, y2, z2] |
完整的立方体 |
model |
模组中方块模型的路径:block/lamp 即模组的 models/block/lamp.json |
由 shape 绘制,否则为立方体 |
模型是 JSON 格式的标准方块模型,与模型编辑器导出的相同。其中引用的纹理写作 <mod id>:block/<name>。同时写了 shape 时,方块的碰撞以 shape 为准;没有写时,方块按完整立方体碰撞。
文件放在哪里
| 模组 | 位置 |
|---|---|
| CraftScript(文件夹) | mods/lamps/models/block/lamp.json、mods/lamps/textures/block/lamp.png |
| Kotlin 或 Java | src/main/resources/assets/lamps/models/block/lamp.json |
按状态区分的形状
shape_when 为方块提供只在某些状态下才有的方框(见方块、物品与配方中的方块状态)。每个键是 "state=value";在每个状态下,方块拥有 shape 的方框,加上所有匹配的键的方框。
block "stone_column" {
states: [{ part: ["single", "bottom", "top"] }]
shape: [[4, 0, 4, 12, 16, 12]]
shape_when: {
"part=single": [[2, 0, 2, 14, 2, 14], [2, 14, 2, 14, 16, 14]],
"part=bottom": [[2, 0, 2, 14, 2, 14]],
"part=top": [[2, 14, 2, 14, 16, 14]]
}
}值按状态显示的方式书写:开关用 true 或 false,也可以是数字、名称,或 north 这样的方向。这些方框是方块发生碰撞的范围,轮廓线也沿着它们;方块在各个状态下的外观来自该状态对应的纹理或模型。
注意事项
- 非立方体的方块会自动让光线和相邻方块的面透过,你不需要把它标记为
transparent。 - 方块的其他所有属性(
hardness、light、tool、loot……)用法完全相同;见方块、物品与配方。
Kotlin 中
block("half") { box(0, 0, 0, 16, 8, 16) }
block("lamp") {
model = "block/lamp"
box(7, 0, 7, 9, 12, 9)
box(5, 12, 5, 11, 16, 11)
light = 15
}每次调用 box(x1, y1, z1, x2, y2, z2) 就添加一个方框;model 与 CraftScript 中的路径相同。boxWhen(state, value, x1, y1, z1, x2, y2, z2) 为某一个状态添加一个方框:
block("stone_column") {
choice("part", "single", "bottom", "top")
box(4, 0, 4, 12, 16, 12)
boxWhen("part", "bottom", 2, 0, 2, 14, 2, 14)
boxWhen("part", "top", 2, 14, 2, 14, 16, 14)
}