截图
介绍
Custom-Block — 为 BONE:MSD 添加自定义方块,每个方块只需一行
本项目在 Claude Code(Anthropic 的 AI 编程助手)的帮助下完成。
它协助编写了生成器、将 BONE:MSD 引擎移植到 Minecraft 26.3、编写测试和本文档。
在 blocks.json 中用列表描述方块,格式类似枚举值:完整方块、台阶和
楼梯。其余内容都由生成器完成:方块物品、战利品表、创造模式菜单
条目、模型、翻译和原版覆盖项。最终生成一个
适用于 Minecraft 26.3、且已包含 BONE:MSD 引擎的整合包。
Custom-Block/
├── blocks.json ← your block "enum" (edit this)
├── textures/ ← 16×16 PNG textures (put them here)
├── slots.lock.json ← which slab each full block occupies (auto-generated, do NOT delete)
├── generator/build.py ← the generator
├── engine-patches/26.3/ ← fixes that port the BONE:MSD engine to Minecraft 26.3
├── tests/ ← build check on a real 26.3 server, no client needed
├── build/ ← output: custom_blocks.zip (recreated on every build)
└── extension/ ← original BONE:MSD engine, author's example and PDF (reference, do not edit)
快速开始
- 将纹理放入
textures/,例如textures/marble.png。 - 在
blocks.json中添加一项:
{ "id": "marble", "name": { "en_us": "Marble", "ru_ru": "Мрамор" }, "material": "stone", "texture": "marble" }
同一纹理的台阶或楼梯各加一行,并设置 shape:
{ "id": "marble_slab", "name": "Marble Slab", "material": "stone", "shape": "slab", "texture": "marble" },
{ "id": "marble_stairs", "name": "Marble Stairs", "material": "stone", "shape": "stairs", "texture": "marble" }
- 构建并安装到世界:
python3 generator/build.py --install "<path to the world folder>"
- 重新进入世界。
/reload还不够:新的创造模式菜单条目(画作)只有在世界加载时才会注册。如果只更改了纹理或模型,按 F3+T 即可。
获取方块:/function custom_blocks:give_all 或 /function custom_blocks:give/<id>。
在创造模式中,它们位于 功能方块 标签页的画作列表中。
需要 Python 3.9 或更高版本(仅使用标准库)。生成器提示信息为俄语。
方块字段
| 字段 | 必填 | 含义 |
|—|—|—|
| id | 是 | 方块名称:a-z、0-9、_。重命名会导致世界中已放置的方块丢失。 |
| name | 否 | 字符串(en_us)或 { "en_us": "...", "ru_ru": "..." }。默认根据 id 派生。 |
| title | 否 | 创造模式菜单中的标题。仅限 A-Z a-z 0-9 和空格,因为引擎字体不支持其他字符。默认为 name.en_us。 |
| material | 否 | wood · stone(默认)· copper · wool · concrete。用于设置声音、硬度、所需工具和易燃性。 |
| shape | 否 | full(默认)· slab · stairs。台阶和楼梯由 item_display 绘制(见下文);对它们来说,model 只能是 cube_all、cube_column 或 cube_bottom_top。 |
| texture | * | 所有面使用同一张材质(模型 cube_all)。 |
| model + textures | * | cube_column(side、end)· cube_bottom_top(side、top、bottom)· cube(up、down、north、south、east、west,可选 particle)。 |
| model_file | 否 | 仅适用于完整方块。自定义 JSON 模型的路径(例如由 Blockbench 创建的模型),相对于 Custom-Block/。textures 中的条目会合并到该模型中。模型仍必须是完整方块(见限制)。 |
| drop | 否 | 改为掉落的其他战利品表,例如 minecraft:blocks/oak_planks。默认掉落方块本身。 |
| creative | 否 | false 会将方块从创造模式菜单中隐藏。 |
| slab / waterlogged | 否 | 仅适用于完整方块。将方块固定到指定台阶上,例如 "slab": "cherry_slab"。很少需要使用。 |
\* 必须提供 texture 或 textures 其中之一。对于台阶和楼梯,texture 会应用于每个面;
使用 cube_column 时,end 材质会用于顶面和底面;使用 cube_bottom_top 时,top、bottom
和 side 材质会用于名称所指的对应面。
不带 : 的材质值表示文件 textures/<name>.png。你可以在旁边放置一个 .png.mcmeta
来添加动画。带有 : 的值表示现有材质,例如 minecraft:block/calcite。
全局设置位于 blocks.json:
namespace— 生成内容的命名空间(custom_blocks);description— 资源包描述;minecraft_version— 目前仅支持26.3。它用于选择资源包格式编号和数据语法:26.3 对战利品表和谓词进行了大量改动(modifier、condition、match_block);use_waterlogged_slots— 也使用每个台阶的第二种含水状态。默认关闭:PDF 列出了这些状态下的错误;reserved_slabs— 生成器不得修改的台阶,因为其他资源包正在使用它们。
工作原理
槽位。每个方块都会占用一个原版台阶的 <slab>[type=double] 状态。
BONE:MSD 引擎会将玩家制作的双层台阶转换为完整方块,因此该状态在
世界中空闲。资源包会在其上绘制你的模型,数据包则会替换其掉落物。方块
没有方块实体:运行速度快,可被活塞推动,也不会发生不同步。
每种材料可用的槽位:木材 12 个、石头 44 个、铜 3 个、羊毛 15 个、混凝土 15 个。使用
use_waterlogged_slots
时,槽位数量会翻倍。每种材料会留出一个台阶,不纳入可用槽位:
它是自定义台阶的基础(见下文)。
槽位稳定性。每个槽位只分配一次,并保存在 slots.lock.json 中,因此
blocks.json 的顺序无关紧要。移除方块时,其槽位会被永久弃用,不会再分配给
新方块;否则,世界中已放置的方块就会变成新方块。若仍要重新使用
已弃用的槽位:python3 generator/build.py --free-retired。
放置方块。 方块物品是携带 bone_cb 数据的屏障方块。引擎会拦截屏障方块的放置
操作,在其位置放置命令方块;下一刻,命令方块会放置真正的
方块。
台阶和楼梯("shape",1.1.0 新增)。 台阶或楼梯方块不能使用空闲方块状态:因为没有形状合适的空闲台阶或楼梯状态。于是,这些方块会以一个原版基础方块为底,
并在其上方显示一个
:item_display
| 材料 | 台阶基础方块 | 楼梯基础方块 |
|—|—|—|
| 木头 | oak_slab | oak_stairs |
| 石头 | stone_slab | stone_stairs |
| 铜 | waxed_cut_copper_slab | waxed_cut_copper_stairs |
| 羊毛 | white_wool_slab | white_wool_stairs |
| 混凝土 | white_concrete_slab | white_concrete_stairs |
- 方块物品实际上是基础方块物品(例如
oak_slab),并带有你的模型和bone_cs数据。游戏会像往常一样放置它,因此上下位置、朝向、楼梯转角和含水状态都能正常工作。放置操作会触发进度,随后从玩家视角发出的射线会找到方块,并在方块位置召唤一个item_display,其中携带该物品的副本。基础方块提供碰撞箱、声音和硬度。 - 模型使用原版
slab/stairs模型并替换为你的纹理,尺寸比基础方块大 1%,防止基础方块纹理透出来。楼梯的显示实体每刻都会读取方块状态并切换模型(直梯、内角、外角)及旋转方向,因此转角会像原版楼梯一样跟随相邻方块变化。 - 破坏方块时,基础方块消失后,显示实体会查找刚掉落的基础方块物品,取走一个并改为掉落你的物品。如果没有掉落物(创造模式、
/setblock),则不会额外掉落任何物品。 - 两个自定义台阶可以在同一格中叠放(生成两个显示实体)。引擎不会把这种双台阶转换成木板。
引擎移植。原版引擎(extension/bone-msd-26-5)在 26.3 中无法加载:
世界会以安全模式打开,并显示 Failed to parse bone_msd:block_engine/placed_block。生成器会复制引擎,并在其上应用
:engine-patches/26.3/
- 新的
placed_block进度格式; - 放置修复:原版引擎会响应任何已放置的屏障方块,并将 7 格范围内的所有屏障方块转换成命令方块。普通屏障因此变成了多余的命令方块,而放置自定义方块附近的屏障则会变成它的副本。现在,只有携带
bone_cb的物品才会触发进度,并且只转换玩家准星所指向的屏障方块; item modify中的新语法;update_slot- 作者的存档中缺失的五个红石方块标签;
- 引擎射线中的检查(
raycast/trigger):如果双台阶中包含 Custom-Block 台阶,就不会将其转换为原版完整方块。
资源包只包含引擎实际使用的文件:字体未引用的纹理和作者的
演示字符串都不会打包进去。
一个包,兼具两种用途。在 26.3 中,数据包和资源包使用不同的格式编号
(121 和 97),但该包只有一个 pack.mcmeta。因此它声明了
min_format: 97、max_format: 121。游戏自身代码会将该包报告为两种用途都兼容;已对此进行验证。
从 1.0.x 升级
已经放置的方块会继续正常工作;它们的槽位不会改变。不同之处在于:现在有五种台阶
作为自定义台阶的基底,不再分配给完整方块:oak_slab、stone_slab、
waxed_cut_copper_slab、white_wool_slab、white_concrete_slab。如果你的 slots.lock.json 将
其中一种分配给了完整方块,构建就会报错并指出该方块名称。用 "slab" 将该方块固定到
另一种台阶上;已经放置的该类方块随后会显示为普通的双层台阶。使用默认顺序时,只有当某种材料几乎没有空闲槽位后才会发生这种情况。
安装
build/custom_blocks.zip 是唯一需要的文件:一个包含 data/ 和 assets/ 的 zip 文件。
自动安装:运行 --install(参见快速入门),会将 zip 复制到 <world>/datapacks/ 和同一游戏实例的
resourcepacks/ 文件夹中。它还会移除这些资源包的旧版本,并在作者提供的原版文件仍存在时发出警告。请在游戏设置中启用该资源包一次。
手动安装:将 custom_blocks.zip 复制到 <world>/datapacks/ 以及 resourcepacks/ 中。
不要将原版 bone-msd-26-5 或作者的 bone-msd-example-pack 与此资源包一同安装。原版引擎会破坏 26.3 地图,而示例资源包会覆盖同一个
items/painting.json。
如果遇到问题,请检查该游戏实例的 logs/latest.log。包含 Missing data pack、
Failed to load function、Failed to parse 或 Missing block model 的日志行会指出原因。
创造模式菜单提示框(omg_font)
omg_font 是引擎资源包中的字体。它的“字符”实际上是图片:
…— 高 47 像素的背景部件,外观类似原版提示框(深色填充、紫色边框);…— 空格,包括负空格;A-Z a-z 0-9— 大号字母。
在创造模式中,方块就是一幅画,而它的提示框内容为:画作 / 变体标题 / 作者 /
尺寸。变体标题使用这种字体显示。背景向上延伸,覆盖画作这一行,并绘制出带有方块名称的伪提示框。背景宽度会根据名称调整(生成器中的 painting_title)。
标题之后的行会在之后绘制,也就是说会显示在伪提示框上方:
- 画作尺寸(“16×16”)。引擎只会在英文中将其清空,所以其他语言会显示出尺寸。现在生成器会为所有语言清空尺寸,因此原版画作的尺寸也会被隐藏。
- 高级提示(F3+H):
minecraft:painting和组件数量。资源包无法移除这些内容;关闭 F3+H 即可获得干净的提示框。
无需游戏客户端进行测试
python3 tests/run_gametest.py
该脚本会从 Prism Launcher 获取 Java 和 26.3 的 jar,并启动 Minecraft 内置的
GameTest 服务器,加载 build/ 中的资源包以及测试资源包 tests/cbtest。大约 15 秒内
会检查:
- 资源包能否无错误或警告地加载;
- 方块物品是否带有
bone_cb; - 屏障 → 命令方块 → 已放置的方块,且不会触碰附近的普通屏障;
- 自定义方块和普通台阶的掉落物;
- 画作 → 方块物品的转换;
- 台阶和楼梯:显示放置、楼梯跟随形状变化、由两个自定义台阶组成的双层台阶,以及破坏后的掉落物(共 16 项检查)。
测试针对示例方块 split_oak、engraved_copper、split_oak_slab 和 split_oak_stairs。无法通过这种方式检查资源包;只有游戏客户端才能渲染它。
限制
- 完整方块就是双层台阶,因此它们的命中箱、碰撞箱和遮挡效果始终都是完整方块。非立方体
model_file只会改变外观,在世界中留下可透视的空隙。 - 台阶和楼梯(1.1.0 新增;逻辑已通过服务端测试,但尚未在游戏客户端中检查外观):
- 每个方块都是一个实体(双层台阶则是两个),每刻都会进行检查,因此成千上万个这类方块比完整方块更耗性能;
- 旋转楼梯时,贴图会随模型一起旋转(原版楼梯会保持贴图方向不变,
uvlock),所以带方向性的贴图看起来会与原版不同; - 破坏粒子和裂纹使用基础方块(例如橡木)的效果;
- 活塞只会移动基础方块:该方块会变成普通的基础方块;
- 自定义双层台阶会使用上方方块的光照;
- 中键选取会得到原版基础方块。
- 贴图必须是不透明的:台阶会渲染成实心方块。
- 在创造模式中使用中键选取,得到的是原版台阶,而不是你的方块。
- 玩家将同类型台阶叠成双层时,自定义方块会闪现 1 刻(已知的引擎问题)。
- 世界中已有的双层台阶,或由世界生成创建的双层台阶,都会变成自定义方块。因此会优先使用较少见的台阶(pale_oak、bamboo_mosaic、resin_brick……)。
- 引擎通过命令方块放置方块:服务器需要安装
enable-command-block=true。 - 引擎会将待放置的方块存放在一个共享存储区。如果两名玩家在同一刻放置自定义方块,两人都会得到第二名玩家放置的方块。
鸣谢
BONE:MSD(“Bhex’s Over-Named Extension for Mod-Sized Datapacks”)由 Bhex 制作。原始
引擎、示例包和文档位于extension/。这里唯一的改动是:删除了
作者的草稿(*-old函数)和未使用的字体贴图,并替换了整合包图标和
说明。textures/中的贴图来自该示例包。这些内容由第三方制作,不属于
本项目;所有权利均归其作者所有。如作者提出要求,我们会将其移除。
常见问题
Custom Block 支持哪些 Minecraft 版本?
Custom Block 支持 Minecraft Java 版 26.3。下载时注意选择和你游戏版本一致的文件。
Custom Block 怎么安装?
把下载的 .zip 文件(不用解压)放进游戏目录的 resourcepacks 文件夹,进游戏后在「选项 → 资源包」里把它移到右边启用。
评论
登录后评论和评分