开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[BE教程] 附加包教程:51.拼图结构(三)

 发表于 2024-11-1 20:08:29 来自手机|显示全部楼层|阅读模式 IP:天津
本帖最后由 Cat_Anchor 于 2024-11-2 10:29 编辑

前言
上期,我们讲解了定义拼图结构的文件。这期,我们将介绍拼图结构集。拼图结构集就是一个或多个拼图结构组成的集合,可以在一个大范围内分散多个拼图结构。其功能主要是决定拼图结构之间的距离(就像原版中试炼密室之间的距离一样,这个距离通常以区块为单位)。
拼图结构集
拼图结构集是根据一组规则放置的拼图结构的集合。
如果要定义一个拼图结构集,要在行为包根目录的 worldgen 文件夹中新建一个 structure_sets 文件夹,在其中新建文件并定义拼图结构集。示例如下。
  1. {
  2.   "format_version": "1.21.20",
  3.   "minecraft:structure_set": {
  4.     "description": {
  5.       "identifier": "complementary:debug_hallway_spread"
  6.     },
  7.     "placement": {
  8.       "salt": 415411,
  9.       "separation": 6,
  10.       "spacing": 14,
  11.       "spread_type": "triangular",
  12.       "type": "minecraft:random_spread"
  13.     },
  14.     "structures": [
  15.       {
  16.         "structure": "complementary:debug_hallway",
  17.         "weight": 20
  18.       }
  19.     ]
  20.   }
  21. }
复制代码
以下是这些字段的描述。值的范围使用“区间”表示。
字段功能描述类型
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 值之和。
原版示例
以下是原版的古迹废墟的定义文件,作为参考。我也会在下面附上解释。
  1. {
  2.   "format_version": "1.21.20",
  3.   "minecraft:structure_set": {
  4.     "description": {
  5.       "identifier": "minecraft:trail_ruins"
  6.     },
  7.     "placement": {
  8.       "type": "minecraft:random_spread",
  9.       "salt": 83469867,
  10.       "separation": 8,
  11.       "spacing": 34,
  12.       "spread_type": "linear"
  13.     },
  14.     "structures": [
  15.       {
  16.         "structure": "minecraft:trail_ruins",
  17.         "weight": 1
  18.       }
  19.     ]
  20.   }
  21. }
复制代码

这个文件定义了古迹废墟拼图结构集,这个拼图结构集中只有一个结构,即 minecraft:trail_ruins,古迹废墟。它使用 83469867 作为种子,线性的生成模式生成拼图结构。在给定生物群系内,它会按照定义好的 spacing 和 separation 值生成。
后记
这一期,我初步讲解了拼图结构集,我们离生成拼图结构又近了一步。下期介绍模板池。


苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

粤公网安备 44200002445329号 | 由 木韩网络 提供支持 | GMT+8, 2024-12-27 23:10

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4 粤ICP备2023071842号-3