没有生成规则时,生物只能通过刷怪蛋或 /summon 出现。生成规则告诉游戏它可以在何时何地自己出现:在哪些生物群系、需要多暗、一次出现几只,以及与其他生物相比出现得有多频繁。
本页使用实体文件中的红宝石傀儡。想了解完整的生物,请从你的第一个自定义生物开始。
文件结构
BP/
entities/
ruby_golem.json
spawn_rules/
ruby_golem.json文件名无关紧要。把规则和生物联系起来的是文件里的 identifier。
生物必须可生成
只有当生物行为文件的 description 中有 "is_spawnable": true 时,生成规则才会生效。
第一条生成规则
红宝石傀儡会在白天出现在沙漠和恶地的沙子或红沙上,成小群出现:
{
"format_version": "1.8.0",
"minecraft:spawn_rules": {
"description": {
"identifier": "wiki:ruby_golem",
"population_control": "animal"
},
"conditions": [
{
"minecraft:spawns_on_surface": {},
"minecraft:spawns_on_block_filter": ["minecraft:sand", "minecraft:red_sand"],
"minecraft:brightness_filter": {
"min": 7,
"max": 15,
"adjust_for_weather": false
},
"minecraft:weight": { "default": 6 },
"minecraft:herd": { "min_size": 1, "max_size": 2 },
"minecraft:biome_filter": {
"any_of": [
{ "test": "has_biome_tag", "value": "desert" },
{ "test": "has_biome_tag", "value": "mesa" }
]
}
}
]
}
}几乎所有原版生成规则都仍在使用 "format_version": "1.8.0",你也可以这样用。
description 部分
| 字段 | 作用 |
|---|---|
identifier | 生物的 ID。必须与实体文件中的完全一致。 |
population_control | 生物计入哪个数量池。每个池都有自己的上限,所以你的生物不会挤满整个世界。 |
最常用的数量池:
| 数量池 | 使用者 |
|---|---|
animal | 陆地动物,比如牛、猪和羊 |
water_animal | 鱼、鱿鱼、海豚和美西螈 |
monster | 敌对生物,比如僵尸和骷髅 |
ambient | 小型背景生物,比如蝙蝠 |
原版还有几个特殊的池,比如 cat 和 pillager,专供个别生物使用。
条件
conditions 是一个列表。每一项都是一套完整的规则。如果游戏找到一个与任意一项匹配的位置,生物就可以在那里生成。
在一项内部,每个组件都必须通过。所以上面的规则意思是“在地表 并且 在沙子上 并且 在白天 并且 在沙漠或恶地生物群系中”。
想让生物出现在两个截然不同的地方,比如夜晚的洞穴和白天的海滩?在列表中添加第二项,而不是把所有东西都塞进一项里。
在哪里:地表、地下还是水中
至少需要其中一个,否则生物就没有地方可以生成。它们是空对象:只要写上就会开启。
| 组件 | 生物生成的位置 |
|---|---|
minecraft:spawns_on_surface | 地面上,头顶是开阔的天空 |
minecraft:spawns_underground | 洞穴中,头顶有方块 |
minecraft:spawns_underwater | 水中 |
minecraft:spawns_lava | 熔岩中,就像炽足兽 |
它们可以组合使用。原版美西螈同时使用 spawns_underground 和 spawns_underwater,从而出现在洞穴的水中。
哪些方块
"minecraft:spawns_on_block_filter": ["minecraft:sand", "minecraft:red_sand"],
"minecraft:spawns_on_block_prevented_filter": ["minecraft:cactus"]spawns_on_block_filter:生物脚下的方块必须是其中之一。只有一个方块时可以直接写成字符串。spawns_on_block_prevented_filter:生物绝不会在这些方块上生成。
哪些生物群系
minecraft:biome_filter 是一个普通的过滤器,通常使用 has_biome_tag 测试。每个生物群系都带有几个标签,比如 desert、forest、ocean、frozen、overworld 或 nether。测试标签比一个个列出生物群系更好,因为它还能覆盖生物群系的变种以及其他附加包中的生物群系。
"minecraft:biome_filter": [
{ "test": "has_biome_tag", "value": "overworld" },
{ "test": "has_biome_tag", "operator": "not", "value": "ocean" }
]单纯的列表效果与 all_of 相同:这里的意思是“在主世界,但不在海洋中”。每个生物群系有哪些标签,请在原版生物群系中查阅;生物群系如何获得标签,请看生物群系标签。
animal 和 monster 标签
大多数陆地生物群系都带有 animal 和 monster 标签。原版的牛在 has_biome_tag 中使用 animal,僵尸使用 monster。用它们来表达“任何普通生物能生存的地方”非常方便。
光照等级
"minecraft:brightness_filter": {
"min": 0,
"max": 7,
"adjust_for_weather": true
}光照从 0(漆黑一片)到 15(完全的日光)。动物通常使用 7 到 15,怪物使用 0 到 7。把 adjust_for_weather 设为 true 后,下雨和雷暴会让光照按更暗来计算,这样怪物就能在暴风雨天出现。
多频繁:权重
"minecraft:weight": { "default": 6 }游戏在某个位置挑选要生成的生物时,权重越大的生物被选中得越频繁。参考一下:原版的牛是 8,蝙蝠是 10,僵尸是 100。稀有生物先从较低的值开始,测试时再逐步调高。
几只:群体
"minecraft:herd": {
"min_size": 2,
"max_size": 4,
"event": "minecraft:entity_born",
"event_skip_count": 2
}min_size和max_size:一起生成多少只。event(可选):群体中的生物生成时对它们触发的事件。event_skip_count:在事件开始触发之前先生成多少只。
上面的例子是原版用来生成一家子的小技巧:前 2 只作为普通成年个体生成,其余的会收到 minecraft:entity_born。在这些生物的实体文件中,这个事件会添加幼年组,所以其余的都是幼崽。狐狸和美西螈正是这样做的。
多拥挤:密度上限
"minecraft:density_limit": {
"surface": 4,
"underground": 2
}这是在数量池上限之外,专门针对这个生物的上限。周围已经有这么多只时,地表(或地下)就不会再生成。适合那些不应该成群出现的强大或稀有生物。
难度
"minecraft:difficulty_filter": {
"min": "easy",
"max": "hard"
}难度有 peaceful、easy、normal 和 hard。敌对生物通常从 easy 开始,这样它们永远不会在和平难度下出现。
更多条件
| 组件 | 检查内容 |
|---|---|
minecraft:height_filter | 生物可以生成的高度范围(min、max) |
minecraft:distance_filter | 它必须离玩家多远(min、max) |
minecraft:world_age_filter | 世界要存在多久之后生物才能出现(min) |
minecraft:disallow_spawns_in_bubble | 阻止它在气泡柱中生成 |
minecraft:permute_type | 有时按权重改为生成另一种生物。僵尸用它来生成少量僵尸村民。 |
夜间版本
想让洞穴里也出现愤怒的红宝石傀儡?添加第二个条件,使用不同的规则:
"conditions": [
{
"minecraft:spawns_on_surface": {},
"minecraft:spawns_on_block_filter": ["minecraft:sand", "minecraft:red_sand"],
"minecraft:brightness_filter": { "min": 7, "max": 15, "adjust_for_weather": false },
"minecraft:weight": { "default": 6 },
"minecraft:herd": { "min_size": 1, "max_size": 2 },
"minecraft:biome_filter": { "test": "has_biome_tag", "value": "desert" }
},
{
"minecraft:spawns_underground": {},
"minecraft:brightness_filter": { "min": 0, "max": 4, "adjust_for_weather": false },
"minecraft:height_filter": { "min": -64, "max": 0 },
"minecraft:weight": { "default": 2 },
"minecraft:herd": { "min_size": 1, "max_size": 1, "event": "wiki:become_angry" },
"minecraft:density_limit": { "underground": 2 },
"minecraft:biome_filter": { "test": "has_biome_tag", "value": "overworld" }
}
]第二项会在地下深处生成落单的傀儡,并立即对它们触发 wiki:become_angry。这个事件来自实体事件页面。
测试生成规则
自然生成测试起来很慢,所以要让它变得简单些:
- 创建一个创造模式的新世界,如果你的生物是敌对的,把难度设为简单或更高。
- 测试时把
weight调得很高(比如100),之后再调低。 - 在对应的生物群系里飞来飞去。生物只会在离玩家一定距离之外生成。
- 用
/kill @e[type=wiki:ruby_golem]清除它们,然后观察新的出现。
出问题时
| 你看到的现象 | 最可能的原因 |
|---|---|
| 从来不生成 | is_spawnable 是 false、identifier 不匹配,或者条件中没有 spawns_on_surface 这类“在哪里”的组件 |
| 在某个生物群系中从不生成 | 该生物群系没有那个标签。查看原版生物群系。 |
| 数量太多了 | 降低 weight 或 max_size,或者添加 density_limit |
| 敌对生物在和平难度下从不出现 | 这正是 difficulty_filter 在发挥作用 |
| 白天出现怪物 | adjust_for_weather 已开启,并且正在下雨 |