地形创造数据包可以按方块创造一个自定义的地形。它根据每个方块的坐标来计算Perlin噪声和Worley噪声。将这两种结合,并加上一些后处理步骤,就可以创造一个包含不同生物群系(包括河流、平原、平顶山等)的完整的世界。
这个数据包没有实用价值。下面动图实际生成时间为30分钟。如果有一天你闲的没事做,可以下载数据包,放到一个void预设的超平坦里,随便传送到一个坐标,启动生成,就可以坐着看戏了。
给一个实体或玩家添加一个map_generator的tag,就会自动在这个实体周围开始生成地形。它每tick生成20个方块,每个方块消耗1400条命令。光照更新可能带来很大的卡顿。
同样你可以在perlin:preset中修改一些参数,比如每个生物群系的基础高度,来生成你自定义的地形。
参见perlin:random/number。这个数据包使用了线性同余生成器来生成随机数。数据包内为了使数据不超过int最大数据的限制进行了一些修改,因此该生成器只能生成0-8192之间的数字。
实际上,我一开始准备用游戏内的伪随机数生成器。但是由于bugMC-174435的存在导致loot table seed对/loot命令无效,就此作罢。
参见perlin:random/xy。由三个数字计算哈希码有很多方法。Minecraft使用了乘并异或的方法。但在游戏内计算异或将消耗大量命令,因此这里使用了乘法来计算。
2D Perlin噪声的游戏内实现。和标准的算法不同的是,本算法只在12个随机向量中选择。噪声预览图见下。参见perlin:init和perlin:noise。
2D Worley噪声的游戏内实现。用了一个简单的办法查找不同块之间的边界。噪声预览图见下。参见perlin:noise_wm和这里。
Worley噪声生成的边界为直线,属实没劲。因此添加了一个波浪滤镜让它看起来更加的浪。参见perlin:wave。
使用Worley噪声确定生物群系,再让边界成为河流。使用平滑函数使边界更加平滑(perlin:fade)。最后把Perlin噪声叠加在上方。最终结果是,给perlin:terrain输入一个坐标,它就会返回一个高度和所对应的的生物群系。
每个区块生成一个游标,根据游标位置调用函数生成区块。参见perlin:new_map/。
- [PCD] 如何写一个世界生成器
- SPGoding的DHP和听我胡说八道
- 后面的爷忘了