# 了解自定义单方块特征规则

在本节中,我们继续来看另外一种特征,也就是单方块特征的生成。我们制作一个蓝色蕨方块来进行演示。

# 使用编辑器配置蕨类方块

我们在编辑器中配置一个蓝色的蕨。注意,我们需要将其配置为非固体、透明且不吸收光线,同时具备一个裁剪体积却不具备碰撞体积的样子。我们将其标识符设置为tutorial_demo:blue_fern

然后,为了使其具备蕨类的形状,我们需要使用原版的方块形状来做到这一点。我们在资源包的blocks.json中手动配置如下:

{
    "format_version": [1, 1, 0],
    "tutorial_demo:blue_fern": {
        "blockshape": "cross_texture",
        "textures": "tutorial_demo:blue_fern"
    }
}

这样,我们就成功使用了交叉纹理的方块形状,使其具备了如原版的草和树苗等方块的交叉形状。

# 设置蕨类单方块特征

我们在特征文件夹中新建一个blue_fern_feature.json文件,并填充如下:

{
  "format_version": "1.13.0",
  "minecraft:single_block_feature": {
    "description": {
      "identifier": "tutorial_demo:blue_fern_feature"
    },
    "places_block": "tutorial_demo:blue_fern",
    "enforce_survivability_rules": true,
    "enforce_placement_rules": true,
	"may_attach_to": {
      "auto_rotate": false,
      "min_sides_must_attach": 1,
      "bottom": [
        "minecraft:grass",
        "minecraft:dirt"
      ]
    },
    "may_replace": [
      "minecraft:air"
    ]
  }
}

我们希望我们的蓝色蕨只能在泥土和草方块上生成,并且只能替换空气,这是因为我们想避免其在空中、水中生成或者直接替换了其他的不该替换的方块比如树干方块,所以我们修改may_attach_tomay_replace来达到这一效果。

单方块特征的输入和输出位置为同一个坐标,同时如若方块成功放置即可判定成功,方块放置失败即为判定失败。

# 挂接特征规则

我们在特征规则文件夹中建立overworld_first_blue_fern_feature.json文件,然后写入:

{
  "format_version": "1.13.0",
  "minecraft:feature_rules": {
    "description": {
      "identifier": "tutorial_demo:overworld_first_blue_fern_feature",
      "places_feature": "tutorial_demo:blue_fern_feature"
    },
    "conditions": {
      "placement_pass": "first_pass",
      "minecraft:biome_filter": [
        {
          "any_of": [
            {
              "test": "has_biome_tag",
              "operator": "==",
              "value": "overworld"
            },
            {
              "test": "has_biome_tag",
              "operator": "==",
              "value": "overworld_generation"
            }
          ]
        }
      ]
    },
    "distribution": {
      "iterations": 1,
      "x": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      },
      "y": "query.heightmap(variable.worldx, variable.worldz)",
      "z": {
        "distribution": "uniform",
        "extent": [ 0, 16 ]
      }
    }
  }
}

习惯上我们命名特征规则时将生成的位置,比如主世界还是哪些生物群系放在最前面,然后生成的放置阶段放在中间,生成的物体名称放在阶段之后,最后和特征一样使用feature结尾。不过,每个开发者也有自己的命名习惯,不必拘泥于原版我的世界的命名习惯。

我们在每个区块中生成一个我们的蓝色蕨方块来试验效果。所以我们将迭代次数iterations设为1。

可以看到,我们的蓝色蕨确实如我们希望的那样进行生成了!