Skip to content

从零创建地物结构

本教程将会讲述地形包中,以树木为例创建地物结构的步骤。

如果你还没有准备好,请在开始阅读前浏览“配置开发介绍”章节。

更多创建地物的深入教程,请参阅这个非官方开发教程,地物配置

如果你遇到问题或需要示例,你可以在 Github 仓库中找到本教程的参考用配置包。

设置新结构

步骤

1. 创建结构文件

结构文件可以为动态的 TerraScript,即 .tesf 文件,也可以为静态的 .schem 结构文件。

危险

如果你决定同时使用两种类型的结构文件,在命名时两个结构文件的名称不可以相同。

2. 创建新生成阶段

最好将地物分类至不同的生成阶段,这样不仅可以让文件结构保持整洁,也可以更好地安排其他地物的生成。

例如,你可能需要让树木先于草丛生成,这样树木就不会因草的生成而被阻止。

我们将会利用“设置地物”中引入的 generation-stage-feature 附属,创建一个新的生成阶段。

pack.yml
YAML
id: YOUR_PACK_ID

...

stages:
  - id: trees
    type: FEATURE
  # 配置中的顺序为先树木后植被, 即树木将会先于植被生成.
  - id: flora
    type: FEATURE

警告

生成阶段 ID 可自行编辑,地物的生成按配置中从上到下的顺序进行。

3. 创建地物配置

我们将会利用“设置地物”中引入的 config-feature 附属,创建一个新的地物配置文件。

创建一个空配置文件,名称为 oak_tree_feature.yml

通过 type 参数设置配置类型,并按如下所示的内容配置 id

oak_tree_feature.yml
YAML
id: OAK_TREE_FEATURE
type: FEATURE

4. 添加地物分布器

我们将会利用“设置地物”中引入的 config-distributors 附属,创建一个地物分布器。

如下所示,在 oak_tree_feature.yml 中使用 PADDED_GRID 分布器。

oak_tree_feature.yml
YAML
id: OAK_TREE_FEATURE
type: FEATURE

distributor:
  type: PADDED_GRID
  width: 12
  padding: 4
  salt: 5864

PADDED_GRID 分布器类型将一片区域划分为带间隔的网格,确保地物生成时不会挨得太近。

PADDED_GRID 有三个参数widthpaddingsalt

  • width - 决定了每个包含地物的网格区域边长。
  • padding - 决定区域之间的间隔大小。
  • salt - 通常是一个用于偏移分布器结果的随机数,防止同一分布器下地形重叠生成。盐值功能的详细讲述可以在这里浏览。

信息

PADDED_GRID 和其他分布器类型的相关文档可以在这里找到。

5. 添加地物定位器

现在,我们将利用“设置地物”中引入的 config-locators 附属,创建一个定位器。

如下所示,在 oak_tree_feature.yml 中使用 TOP 定位器。

oak_tree_feature.yml
YAML
id: OAK_TREE_FEATURE
type: FEATURE

distributor:
  ...

locator:
  type: TOP
  range:
    min: 0
    max: 319

TOP 定位器与 SURFACE 定位器搭配使用,将不止搜索上方有空间的方块,而是会选择其中 Y 轴最高的位置生成。

信息

可用的各种定位器相关文档可以在这里找到。

6. 改进地物定位器

SURFACE 定位器在添加矮草丛的行为类似,TOP 适合将地物放置在方块最高点,但它不会检查地物所放置的方块。

利用 AND 定位器,我们可以结合多个定位器,使得地物生成的条件更加精确。

通过 type 设置为 MATCH_SETPATTERN 定位器,我们可以指定地物生成的位置附近的方块组合。

将如下高亮内容添加至配置,以应用这些定位器。

feature.yml
YAML
id: OAK_TREE_FEATURE
type: FEATURE

distributor:
  ...

locator:
  type: AND
  locators:
    - type: TOP
      range: &range # 为其他定位器备用的锚点
        min: 0
        max: 319
    - type: PATTERN
      range: *range  # 引用先前锚定的值
      pattern:
        type: MATCH_SET
        blocks:
          - minecraft:grass_block
          - minecraft:dirt
        offset: -1

7. 添加结构

如下高亮部分所示,现在可以将结构添加至 oak_trss_feature 配置中。

oak_tree_feature.yml
YAML
id: OAK_TREE_FEATURE
type: FEATURE

distributor:
  ...

locator:
  ...

structures:
  distribution:
    type: CONSTANT
  structures: oak_tree

提示

地物配置可以通过噪声采样器,从权重列表中选择结构,如下所示。

feature.yml
YAML
structures:
  distribution:
    type: WHITE_NOISE
    salt: 4357
  structures:
    - oak_tree_1: 1
    - oak_tree_2: 1
    - oak_tree_3: 1

权重列表的详细讲述可以在这里找到。

8. 将地物应用于群系

现在,我们就要将树木地物添加至 FIRST_BIOME

将如下高亮配置加入 FIRST_BIOME 配置中。

first_biome.yml
YAML
id: FIRST_BIOME
type: BIOME

vanilla: minecraft:plains

...

features:
  trees:
    - OAK_TREE_FEATURE
  flora:
    - GRASS_FEATURE

OAK_TREE_FEATURE 地物将会在 FIRST_BIOME 生物群系中生成。

9. 载入地形包

到了这一步,你的包就可以正常在世界中生成树木了!你可以通过开发客户端/服务器载入你刚刚编写的包。你可以通过 /packs 命令确认插件是否显示了(验证文件中指定的)包 ID,或者在服务器/客户端启动时从日志中确认。

如果你的包出于某种原因没有载入,控制台中会出现其无法载入的报错,请仔细解读并尝试自行排除问题所在,并重新尝试之前的步骤。

如果你还是没有办法载入地形包,随时欢迎带着相关报错联系我们

总结

在你的包成功载入之后,你就可以使用你的新地形包生成一片带着草和树木的世界了!

本章节的参考配置可以在 Github 的这个地方找到。

贡献者

页面历史