所有装点大地的东西都是地物:矿脉、树木、花、草、巨石、泉水、珊瑚。只要它不是基础地形,也不是生物,那多半就是地物。
要让地物出现在世界中,你需要两个文件:
- 地物说明放置什么:一条矿脉、一棵树、一个方块。
- 地物规则说明放在哪里、多频繁:哪些生物群系、每个区块多少次、在什么高度。
在本指南中,你将让红宝石矿石出现在每个主世界生物群系的地下。
文件一览
BP/
blocks/
ruby_ore.json
features/
ruby_ore_feature.json
feature_rules/
ruby_ore_rule.json第 1 步:矿石方块
首先你需要一个用来放置的方块。做一个普通的自定义方块,命名为 wiki:ruby_ore,配上纹理和战利品表。如果你还没做过方块,请按照你的第一个自定义方块操作。
第 2 步:地物
{
"format_version": "1.13.0",
"minecraft:ore_feature": {
"description": {
"identifier": "wiki:ruby_ore_feature"
},
"count": 6,
"replace_rules": [
{
"places_block": "wiki:ruby_ore",
"may_replace": [
"minecraft:stone",
"minecraft:granite",
"minecraft:diorite",
"minecraft:andesite"
]
}
]
}
}- 根键(这里是
minecraft:ore_feature)就是地物类型。每个文件只有一个。本页底部的表格列出了所有类型。 count是一条矿脉尝试放置的方块数量。钻石的矿脉小,煤的矿脉大。replace_rules说明哪个方块放在哪里。矿石只会替换may_replace中列出的方块,所以它不会悬浮在洞穴中,也不会把泥土吃穿。
深板岩版本
在 replace_rules 中再加一个条目,写上 "places_block": "wiki:deepslate_ruby_ore" 和 "may_replace": ["minecraft:deepslate"]。这样一条矿脉在两个岩层中都会使用正确的外观,和原版矿石一样。
命名规则
- 每个文件一个地物。
- 文件名必须和标识符的名称部分一致。
wiki:ruby_ore_feature放在ruby_ore_feature.json中。命名空间不参与匹配。 - 如果两个包使用了完全相同的标识符,列表中排在更上面的包优先。这就是替换原版地物的方法。
第 3 步:地物规则
在地物规则把地物绑定到生物群系之前,地物什么都不会做:
{
"format_version": "1.13.0",
"minecraft:feature_rules": {
"description": {
"identifier": "wiki:ruby_ore_rule",
"places_feature": "wiki:ruby_ore_feature"
},
"conditions": {
"placement_pass": "underground_pass",
"minecraft:biome_filter": [
{
"test": "has_biome_tag",
"operator": "==",
"value": "overworld"
}
]
},
"distribution": {
"iterations": 4,
"coordinate_eval_order": "zyx",
"x": {
"distribution": "uniform",
"extent": [0, 16]
},
"y": {
"distribution": "triangle",
"extent": [-48, 16]
},
"z": {
"distribution": "uniform",
"extent": [0, 16]
}
}
}
}规则由三部分组成。
description
identifier是规则的名称。和地物一样,名称部分必须和文件名一致。places_feature是这条规则放置的地物。一条规则控制一个地物。
conditions
minecraft:biome_filter 选择生物群系。它是一个过滤测试列表,你几乎每次都会用到的是 has_biome_tag。每个生物群系都会检查这个过滤器:通过的就会生成这个地物。
你可以用 all_of 和 any_of 组合测试。下面这个选择的是不属于海洋的温暖主世界生物群系:
"minecraft:biome_filter": [
{ "test": "has_biome_tag", "operator": "==", "value": "overworld" },
{
"any_of": [
{ "test": "has_biome_tag", "operator": "==", "value": "desert" },
{ "test": "has_biome_tag", "operator": "==", "value": "mesa" }
]
},
{ "test": "has_biome_tag", "operator": "!=", "value": "ocean" }
]要让红宝石矿石只出现在红宝石林地中,就测试它自己的标签:"value": "ruby_grove"。
placement_pass 说明这个地物相对于其他地物何时放置。各阶段按以下顺序运行:
| 阶段 | 适用于 |
|---|---|
first_pass | 其他所有东西都要在其上生成的内容。 |
before_underground_pass、underground_pass、after_underground_pass | 矿石、成团的泥土或沙砾、洞穴装饰。 |
before_surface_pass、surface_pass、after_surface_pass | 树木、花、草、巨石。 |
before_sky_pass、sky_pass、after_sky_pass | 空中的东西。 |
final_pass | 在所有其他内容之后做最后的修饰。 |
pregeneration_pass | 仅用于洞穴雕刻器。 |
同一阶段中的地物之间没有固定的顺序。
distribution
它决定每个区块中尝试生成多少个副本,以及生成在哪里。
| 字段 | 作用 |
|---|---|
iterations | 每个区块尝试多少次。这里是 4 条矿脉。 |
x、y、z | 每次尝试落在哪里。可以是固定数字、范围或 Molang 表达式。 |
scatter_chance | 可选。整个区块的生成概率,比如 { "numerator": 1, "denominator": 4 } 表示四个区块中有一个。如果没通过,就一次都不会尝试。 |
coordinate_eval_order | 计算坐标的顺序,比如 "xzy"(默认)或 "zyx"。当一个坐标用到另一个坐标时,这个顺序就很重要。 |
在地物规则中,x 和 z 从区块的角落开始计算,所以 [0, 16] 覆盖整个区块。y 是世界高度。
每个范围都有一个 distribution 类型,决定值的分布方式:
| 类型 | 结果 |
|---|---|
uniform | 每个值出现的概率相同。 |
triangle | 大多数值靠近范围中间,两端较少。非常适合矿石。 |
gaussian | 集中在中间,像一口钟。 |
inverse_gaussian | 集中在两端,中间很少。 |
fixed_grid | 均匀间隔的步长,用 step_size 和 grid_offset 设置。 |
jittered_grid | 一个网格,每个点都随机偏移一点。 |
对于地面上的东西,比如植物,用 Molang 设置 y,让它落在地表上:
"y": "query.heightmap(variable.worldx, variable.worldz)"矿石只出现在新区块中
地物只在区块首次生成时生成一次。去很远的地方探索,或者新建一个世界,才能看到你的矿石。已经探索过的地方永远不会有。
测试
- 在新世界中启用这个包。
- 用
/gamemode spectator进入旁观模式,飞到 Y 0 附近的地下。 - 在石头中寻找红宝石纹理。太稀有了?调高
iterations或count。
如果什么都没出现,请打开内容日志。常见原因有:文件名和标识符不一致、places_feature 名称写错,或 places_block 中的方块名有拼写错误。
所有地物类型
每个地物文件都使用以下其中一个作为根键。有些会放置方块,有些只负责在其他地物之间做选择、移动或重复。大多数原版装饰都会把好几个串在一起:比如一个散布地物运行一个搜索地物,搜索地物再运行一棵树。
| 类型 | 作用 |
|---|---|
minecraft:aggregate_feature | 在同一位置放置一组地物,没有固定顺序。 |
minecraft:beards_and_shavers | 填高或削平地形,为另一个地物(通常是结构)腾出一块平整空旷的地方。 |
minecraft:cave_carver_feature | 在本区块及相邻区块中挖出主世界洞穴。需要 pregeneration_pass。 |
minecraft:conditional_list | 按顺序检查一组地物,放置第一个条件通过的地物。 |
minecraft:fossil_feature | 用骨块加上你选择的矿石方块搭建一具埋在地下的骨架。 |
minecraft:geode_feature | 生成一个圆形晶洞,带有分层的外壳和可替换的内部填充物。 |
minecraft:growing_plant_feature | 从地面向上或从顶部向下长出一列植物,有茎和尖端,比如洞穴藤蔓。 |
minecraft:height_difference_filter_feature | 只有当该位置周围的地面通过高度检查时,才允许放置另一个地物。 |
minecraft:horizontal_tree_decoration_feature | 把一个方块朝随机方向贴在某物的侧面,比如原木上的层架菇。 |
minecraft:multi_block_feature | 放置一个由多个部分组成的方块,可选择随机旋转方向。 |
minecraft:multiface_feature | 放置贴附在地面、墙壁或天花板上的薄方块,比如发光地衣。 |
minecraft:multipart_block_column_feature | 堆叠一列最多由四种方块(底部、中部、收窄部分和尖端)组成的柱子,方向任意。 |
minecraft:nether_cave_carver_feature | 在下界挖出洞穴。需要 pregeneration_pass。 |
minecraft:ore_feature | 放置一条只替换你允许的方块的矿脉。所有矿石都用它。 |
minecraft:partially_exposed_blob_feature | 放置一团大部分埋在地下、只露出一面的方块。 |
minecraft:rect_layout | 用网格状的区域铺满区块表面,每个区域放一个地物,并留出一些空白。 |
minecraft:scan_surface | 遍历区块表面的每一列,并在每一列上尝试放置一个地物。 |
minecraft:scatter_feature | 在某个位置周围多次放置另一个地物,使用和地物规则相同的 x、y、z 范围。 |
minecraft:sculk_patch_feature | 蔓延出一片幽匿块。游戏尚未提供文档。 |
minecraft:search_feature | 在一个盒状空间中逐层搜索,寻找能放下另一个地物的位置。 |
minecraft:sequence_feature | 依次放置多个地物,每个都从上一个结束的地方开始。 |
minecraft:single_block_feature | 放置一个方块,或从加权列表中随机选一个,并有它能放在什么上面的规则。 |
minecraft:snap_to_surface_feature | 在放置另一个地物之前,把位置移到最近的地面、天花板或墙上。 |
minecraft:structure_template_feature | 放置行为包 structures 文件夹中保存的 .mcstructure。 |
minecraft:surface_relative_threshold_feature | 只有当位置在地表以下足够深时,才放置另一个地物。 |
minecraft:tree_feature | 用树干、树冠和可选的树根搭建一棵树,有大量形状选项。 |
minecraft:underwater_cave_carver_feature | 在海平面以下挖出洞穴。需要 pregeneration_pass。 |
minecraft:vegetation_patch_feature | 用一种方块覆盖一片地面,然后在上面长出植物,比如苔藓地块。 |
minecraft:weighted_random_feature | 从列表中随机选一个地物。权重越大,被选中的概率越高。 |
下一步
- 给你的矿石安个家:生物群系文件。
- 查找可用于过滤的生物群系标签:minecraft:tags。