只有一个条件的判断式没有包装,这是一种真正的形状变化
一个条件就是对象本身。两个或更多条件会被包装在 all_of 或 any_of 中。此外还有八种条件类型,以及为什么反转是一种包装而不是一个标志。
数据包判断式(datapack predicate)是一个描述条件的 JSON 文件,其结构会根据条件的数量而变化。这正是人们在复制示例并进行扩展时容易出错的地方。
一个不是一个列表
| 条件数量 | 输出形状 |
|---|---|
| 0 | {} |
| 1 | 条件对象本身 |
| 2+ | { "condition": "minecraft:all_of", "terms": [ … ] } |
单个条件没有包装。添加第二个条件时,整个文件的形状会发生变化——原始条件会成为新根下 terms 数组的第一个元素。任何读取或生成这些内容的代码都必须处理这两种形式,而从一个条件构建的示例并不会向你展示当你添加另一个条件时所需的形状。
any_of 是替代的组合器:所有条件都必须通过,或者其中任何一个通过。
反转也是一种包装,而不是一个标志
没有 "invert": true 字段。一个被否定的条件会被包装起来:
{ "condition": "minecraft:inverted", "term": { …the original condition… } }
请注意 term,它是单数——inverted 只接受一个,而 all_of 和 any_of 接受一个 terms 数组。两个看起来相似的键具有不同的形状,并且反转是针对每个条件应用的,因此一个判断式可以在一个 all_of 中自由混合反转和普通条件。
八种条件类型
entity_properties random_chance
value_check random_chance_with_looting
weather_check time_check
location_check match_tool
random_chance_with_looting 值得我们关注:它接受一个基础几率和一个 looting_multiplier,因此概率会随着击杀者的抢夺(Looting)等级而变化。这使得它只在存在击杀者的情况下才有意义——它是一个掉落率条件,而不是一个通用的随机门。在其他所有地方,random_chance 才是首选。
value_check 将一个数字与三个来源之一进行比较:附魔等级(enchantment level)、幸运(luck)或你复制后手动编辑到 JSON 中的自定义表达式。
选择器与原版集合完全一致
当你检查生物群系或结构 ID 是否真实时,了解这一点很有用:构建器的下拉菜单并非精选样本。
- 66 个生物群系——游戏中的所有生物群系,无一遗漏,也无一虚构
- 34 个结构——同样如此
- 18 个方块标签和 15 个物品,这些是一个工作子集
这已根据游戏自身的注册表数据进行了验证,而非假设,因此如果某个 ID 不存在于生物群系或结构列表中,则该 ID 不存在。对于方块标签和物品则相反:不存在仅表示选择器未列出它,自行输入 ID 即可。