UID82897性别保密经验 EP铁粒 粒回帖0主题精华在线时间 小时注册时间2021-7-23最后登录1970-1-1
| 本帖最后由 Cat_Anchor 于 2024-11-2 10:29 编辑
前言 | 上期,我们讲解了定义拼图结构的文件。这期,我们将介绍拼图结构集。拼图结构集就是一个或多个拼图结构组成的集合,可以在一个大范围内分散多个拼图结构。其功能主要是决定拼图结构之间的距离(就像原版中试炼密室之间的距离一样,这个距离通常以区块为单位)。 | | 拼图结构集 | 拼图结构集是根据一组规则放置的拼图结构的集合。
如果要定义一个拼图结构集,要在行为包根目录的 worldgen 文件夹中新建一个 structure_sets 文件夹,在其中新建文件并定义拼图结构集。示例如下。- {
- "format_version": "1.21.20",
- "minecraft:structure_set": {
- "description": {
- "identifier": "complementary:debug_hallway_spread"
- },
- "placement": {
- "salt": 415411,
- "separation": 6,
- "spacing": 14,
- "spread_type": "triangular",
- "type": "minecraft:random_spread"
- },
- "structures": [
- {
- "structure": "complementary:debug_hallway",
- "weight": 20
- }
- ]
- }
- }
复制代码 以下是这些字段的描述。值的范围使用“区间”表示。
字段 | 功能描述 | 类型 | identifier | 拼图结构集的ID。 | 字符串 | placement | 放置模式,即集合中的结构相对于彼此的生成位置。目前仅支持random_spread类型,即以给定的间隔和分布随机分散结构。 | 对象 | salt | 用于随机生成器的种子。防止多个结构集使用相同配置时相互重叠。范围是整型的范围,即 -2147483648 到 2147483647。 | 整数 | separation | 每个网格单元内的填充(以区块为单位)。填充区域内不会生成结构。值必须大于等于0,而且小于 spacing 值的一半。 | 整数 | spacing | 生成结构时使用的网格单元大小(以区块为单位)。结构将尝试在每个单元格内的随机位置生成。值必须大于等于1。 | 整数 | spread_type | 可选,放置结构时使用的随机性算法。 | 字符串 | type | 拼图结构集的类型,目前只能写minecraft:random_spread。 | 字符串 | structures | 集合中拼图结构的加权列表。 | 对象列表 | structure | 拼图结构的ID。 | 字符串 | weight | 拼图结构在集合中的权重。更高的权重更有可能被选择。范围是[1, 200]。 | 整数 |
| | 参数解释 | | 放置模式
放置模式代表集合中的结构相对于彼此的生成位置。 | type
这是这个拼图结构集要使用的放置模式的类型。类型决定了拼图结构的分布特征。目前只能填写 minecraft:random_spread,以指定的距离和范围随机分布结构。推测以后可能会添加其他选项,其他字段的填写情况根据这个字段决定。
| spread_type
随机分布拼图结构时需要用到随机算法,这个字段用于决定使用什么随机算法。可以选择填写二者之一:linear 或 triangular。linear 对应均匀分布(Uniform Distribution),在给定范围内均匀分布拼图结构。triangular 对应三角分布(Triangular Distribution),拼图结构将更有可能放置在给定范围的中心,越向四周走,拼图结构就越少。
| salt
随机分布拼图结构时不仅需要用到随机算法,还需要加“盐”,也就是用于随机分布的种子。其他参数相同时,如果不同的拼图结构集使用同样的种子,那么拼图结构的分布就是完全一致的。此时不同的拼图结构会交叠在一起,无法正常生成。如果指定不同的种子,多个结构集使用相同配置放置时就不会相互重叠了。
| spacing
这个字段指定放置拼图结构时使用的网格单元大小(以区块为单位)。结构将尝试在每个单元格内的随机位置生成。
这么说不好理解,让我们做个比喻。假设现在有网格状排列的一块一块的草地区域,每块草地中都要选择一个地方盖一座房子。那么这个字段就决定了草地的边长,以区块为单位。注意草地只是限制了房子地基的位置,房子的一部分可能会超出它所在的草地,因为房子代表拼图结构,而拼图结构通常可以蔓延出去一段距离。
| separation
继续上一段里的比喻,每块草地中,任意一个位置都可以盖房子。现在甲有一块草地A,乙有一块草地B,两块草地水平紧挨着——注意草地与草地之间用一根假想的没有宽度的线划分。如果甲决定把房子盖在草地A的右上角,而乙决定把房子盖在草地B的左上角,那么两座房子是紧挨着的。如果甲想要向右扩建一个平台,乙想要向左挖个地下室,他们都不能这样做,因为没有空间了。为了避免这种情况,给每座房子留下向四周扩建的空间,引入了这个字段。现在给草地的边缘铺一条环绕草地的路,有路的地方就不能盖房子了。separation 的值就是这条路的宽度,以区块为单位。
(示意图。由于“路”是两片草地的四周拼起来的,separation * 2 才是路的宽度。)
| 结构列表
结构列表中包含所有可能放置的拼图结构。一个对象代表一个拼图结构和它的权重,因此每个对象中有如下两个字段: | structure
填写拼图结构的 ID。
| weight
指定这个拼图结构有多大可能被放置。值越高,概率越大,范围是 1 和 200 之间的整数(含)。概率计算公式是:此结构的 weight 值 / 全部结构的 weight 值之和。 | | 原版示例 | 以下是原版的古迹废墟的定义文件,作为参考。我也会在下面附上解释。
- {
- "format_version": "1.21.20",
- "minecraft:structure_set": {
- "description": {
- "identifier": "minecraft:trail_ruins"
- },
- "placement": {
- "type": "minecraft:random_spread",
- "salt": 83469867,
- "separation": 8,
- "spacing": 34,
- "spread_type": "linear"
- },
- "structures": [
- {
- "structure": "minecraft:trail_ruins",
- "weight": 1
- }
- ]
- }
- }
复制代码
这个文件定义了古迹废墟拼图结构集,这个拼图结构集中只有一个结构,即 minecraft:trail_ruins,古迹废墟。它使用 83469867 作为种子,线性的生成模式生成拼图结构。在给定生物群系内,它会按照定义好的 spacing 和 separation 值生成。 | | 后记 | 这一期,我初步讲解了拼图结构集,我们离生成拼图结构又近了一步。下期介绍模板池。 |
|
|