Seed Finding by Java [2]
一、对之前专栏的补充
首先是build.gradle这个文件,之前专栏里的这一句 :url "https://maven-snapshots.seedfinding.com" 是多余的,这个是很早之前的url了,最新的就是:url "https://maven.seedfinding.com" 这一句,所以可以删掉。
其次还有两个库之前忘记导入了,一个是mc_noise,一个是latticg。mc_noise是一个用来模拟Minecraft中使用的Perlin Noise(柏林噪声)等noise,但是我既不会用也没用过,具体如何使用也不是很懂。latticg反转Java的Java.util.Random类可能的内部种子,给定其输出信息,以各种随机调用的不等式系统的形式。该算法的工作原理是将问题简化为在格中找到某些向量,然后使用格的简化版本通过分枝定界算法来解决。说人话就是比如这个区块符合某个条件,可以通过一些办法来得到可能的种子,我用的很少,只用来研究如何筛眼,因此不会介绍如何使用,因为我懂的也不多。
最终的build.gradle文件如下:

可以看我GitHub上的build文件,直接复制粘贴就好
还有上期专栏说的随机筛种,其实就是创建一个Java随机然后用nextLong()方法随机一个long类型的值当中种子就好,如图所示,当然我没有对这个seed做什么,只是打印

上面的是无限循坏随机,如果想控制数量的话可以用for循环,比如10个

随机筛就是这样,不再赘述。之前说的列表筛会在本专栏后面教学,因为比较重要所以就单独说

这是上期专栏中用VillageGenerator筛村庄黑曜石的示例代码,请看obsidian += item.getCount()这一句。为什么是+=呢,因为一个村庄里的箱子有很多,我们遍历了每一个chest,每当有obsidian时都加上这个箱子里obsidian的数量。提这个的原因是后面我会讲宝藏的掠夺,然而它是一个单箱结构,也就是说只有一个箱子,不用+=,防止弄混
那么补充到此结束,接下来进入正题
二、宝藏

structureSeed之类的东西不必多说,至于为什么要先声明一个空的CPos变量呢,首先,宝藏与废弃矿井和除要塞外其他结构的生成是不一样的,它们会在每一个区块都尝试生成,所以使用getInRegion()方法时输入的regionX和regionZ应为区块坐标(可以当作它们的region大小为一个区块),很明显我们要用for循环来循环生成区块坐标x和z,这里我们遍历区块的x坐标-16到16,z坐标-16到16,如果它不为null(空),则判断它是否能在这个区块生成,即是否符合群系,如果符合,就把一开始的空变量重新赋值成这个坐标,这就是为什么要先声明空变量。再用getLootAtPos方法得到这个宝藏的战利品,indexed为false是因为不要让它指数化(有点难说明,总之记住基本都是false就好),然而这个方法得到的数据类型是List<ChestContent>,也就是一个箱子列表,显而易见的这个列表只有一个元素,因为宝藏是单箱结构,所以在它后面加上get(0),即得到第一个元素(也只有一个),如果你indexed填的是true那么它会报错,因为它指数化了。然后得到箱子里铁锭(iron ingot)的数量,如果小于7就return,检查下一个种子(至于为什么是7,SpeedRun玩家太清楚了)。宝藏会生成在区块里(9,9)的位置,所以再具体说明宝藏箱的坐标,用BPos(方块坐标)

最后再得到出生点的坐标,用distanceTo这个方法得到出生点离宝藏的距离(两个坐标都要是方块坐标BPos),如果大于50就return。50格内则打印出seed、宝藏坐标、铁锭数量

在main方法的for循环里调用treasure这个方法,运行

输出了两个种子,停止运行进游戏查看是否正确

用我堪比p神的技术20秒找到宝藏,确实有10铁

宝藏就在脚下,秒找!确实有8铁
最后补充,其实这样是有漏洞的,在给空变量重新赋值的时候:比如说区块(-10,-12)有一个宝藏,且在出生点50格内,但是因为赋值完之后还会继续循坏,在区块(10,8)又有一个宝藏,重新赋值,但它在出生点50格外了,所以会被认为是不符合要求的种子;你可能会说得到第一个之后终止循环就好了,但如果第一个50格外第二个50格内呢?具体解决办法会在以后写如何筛rsg种的时候介绍
三、群系

如何在给定的坐标得到一定距离内想要的群系呢?首先,加载主世界群系(OverworldBiomeSource),再声明一个群系列表,里面添加你想要的如何群系,我随便写了三个,河流、深海、海洋,再创建Java随机数(JRand,但它其实是筛种库里的一个类),填入参数seed,用locateBiome方法得到离(0,0)这个坐标(可以随意改,y也是)16格(也可以改)内的河流或深海或海洋的坐标,如果都没有则return,最后打印种子和坐标。运行后你会发现速度很快,停止运行后随便挑一个种子查看即可
四、1.17.1满眼种村庄20黑
首先进筛种群:956255985,下载群文件所有满眼种1171Unique.txt,把它放到筛种文件夹,再创建一个文本文档用来输出种子,比如:

20obsidian就是我创建的文本文档
因为这部分代码过长,所以我打算下一期单独讲,具体代码可以看我GitHub
GitHub:https://github.com/Xinyuuu7/Example
感谢支持!