最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

Seed Finding by Java [1] 介紹與示例

2023-07-07 11:31 作者:Xinyuiiiiiii  | 我要投稿

一、篩種庫介紹:

篩種庫列表

如果你按照上期專欄做好了IDEA的準備工作,那么你會知道你導入了如圖的幾個庫,我將一一介紹它們并且附上Github鏈接

mc_math:https://github.com/SeedFinding/mc_math_java

???????從名稱我們可以知道,這是個和數(shù)學有關的庫。它的作用有世界生成、種子查找和種子破解

mc_seed:https://github.com/SeedFinding/mc_seed_java

????????這個庫用于LCG(代表線性同余生成器,Linear Congruential Generator)和種子查找,LCG是一種偽隨機數(shù)生成算法,用于生成看似隨機但實際上是基于某個初始種子值的序列,它確定了世界生成的方式,也就是為什么使用相同的種子,可以確保生成相同的世界

mc_core:https://github.com/SeedFinding/mc_core_java

????????用于以純Java存儲所有Minecraft實用程序和數(shù)據(用作核心庫),作用過多,不一一介紹

mc_terrain:https://github.com/SeedFinding/mc_terrain_java

????????一個用純Java模擬Minecraft地形的非常簡單的庫,目前僅支持1.14+,用于地形方面的處理,比如判斷一個廢門是否在地底,得到某個具體坐標是什么方塊等

mc_biome:https://github.com/SeedFinding/mc_biome_java

????????這個庫旨在方便地訪問Minecraft的不同生物群系,它不是Minecraft源代碼的直接副本,因為它是在考慮優(yōu)化的情況下從頭開始重寫的,目前僅支持到1.16.5(不含快照版本),它的作用有判斷一個結構能否生成、得到某個坐標具體是什么群系等

mc_feature:https://github.com/SeedFinding/mc_feature_java

????????一個提供結構以及它們的生成和各自戰(zhàn)利品的庫,還提供了一些實用功能,如獲取出生點的坐標等

mc_reversal:https://github.com/SeedFinding/mc_reversal_java

????????一個用于在純Java中反轉所有Minecraft內部random函數(shù)的庫,比如你在某個區(qū)塊進行了隨機數(shù)處理,根據結果可以反轉出原來的種子等(或許,我也不常用)

seed-checker:https://github.com/jellejurre/seed-checker

????????一個幾乎萬能的庫,因為它會生成整個世界,你可以得到某個具體坐標的方塊甚至它的狀態(tài)(例如傳送門方塊是否填充末影之眼),以及加載某個特定范圍內的所有箱子等,但是因為它是加載整個世界,所以會很慢

VillageGenerator:https://github.com/profotoce59/VillageGenerator

????????這個庫可以代替mc_feature中未完成(有bug)的VillageGenerator,模擬村莊的生成,在1.14-1.17版本支持得到房屋的位置,1.16和1.17兩個版本支持戰(zhàn)利品

二、遞增篩種與結構生成知識


新建軟件包

首先在src-main-java中新建一個軟件包,你可以把它命名為自己的名字(比如我命名為XinyuQi)

新建Java類

在新建的軟件包中新建一個類(我把它叫做test,你可以把它叫做example等等)

接下來我先介紹第一種篩種方式,遞增篩種.什么意思呢,說已知Minecraft中有2的64次方個種子,也就是18,446,744,073,709,551,616個,即-9223372036854775808~9223372036854775807.那么我們只需要用for循環(huán)遞增即可,如圖?

遞增


在本專欄中,將用遞增篩種做一些項目示范,后面的專欄會介紹剩下兩種(隨機篩和通過文本文件來篩)

初始化設置.1

首先在圖中所示位置輸入psvm四個字符,再按Tab鍵,就會彈出如圖所示的main方法

初始化設置.2

接下來,按照前文介紹的遞增篩種的設置方法,聲明seed_start和seed_end變量(long是一種數(shù)據類型,需要在后面加L),再創(chuàng)建ChunkRand對象,命名為rand(名稱隨意),這是一個Minecraft隨機數(shù)的對象,它可以用來在確定某個結構的位置(能否生成還要再由群系決定)等

初始化設置.3

long seed_start = -9223372036854775808L;
long seed_end = 9223372036853775807L;
ChunkRand rand = new ChunkRand();
for (long seed = seed_start;seed <= seed_end;seed++) {

}

復制上去后ChunkRand或許會顯示紅色,只需要指針對著它按Alt+Tab導入即可

在開始示范之前,我要先講一些和結構生成有關的知識.在Minecraft結構生成中,世界被分割成一系列的區(qū)域(region),所有結構(除了寶藏、要塞、礦井)都有相應的區(qū)域大小,在每個區(qū)域中只會有一個結構的生成點,它由前文說的ChunkRand隨機決定,當然這僅僅是生成點,舉個例子,某個種子中64,64是沙漠神殿在region(0,0)的生成點,但是因為不是沙漠群系,因此無法生成.我用眾所周知的豬堡(以下稱bastion)來具體的說明一下

BastionRegion

如圖所示,bastion的每個region大小都是432*432個方塊,也就是27個區(qū)塊,但它只能在圖中綠色的區(qū)域中生成,紅色的區(qū)域不能生成,比如++象限中它只可以在(0,0)區(qū)塊至(23,23)區(qū)塊中選取生成點.

一般來說,我們只需要得到原點附近四個region中的結構就可以滿足我們的需求.region(0,0)是++象限(圖中右下角),region(-1,0)是-+象限(圖中左下角),region(-1,-1)是--象限(圖中左上角),region(0,-1)是+-象限(圖中右上角).這四個region便是我們一般情況下會用到的,它會在馬上到來的示例的getInRegion方法中體現(xiàn)

三、項目示范

spawn

先講如何獲取出生點.創(chuàng)建一個void類型的spawn(名稱隨意)方法,然后在for循環(huán)中調用它,輸入參數(shù)seed和rand.它的原理是出生點是由群系和地形決定的,所以先加載主世界的生物群系(OverworldBiomeSource),再加載主世界地形(OverworldTerrainGenerator),之后再創(chuàng)建SpawnPoint對象,用getSpawnPoint方法得到出生點,它是BPos類型的,即Block Position(方塊坐標).這是基于mc_feature獲取出生點的方法,可能會有幾格誤差(這個誤差并不是游戲中離出生點的那幾格偏差,而是因為它并不能像seed-checker一樣加載整個世界,所以有一些信息不完全,也就是說是這個方法產生的偏差),但是并不大.但它速度很慢(seed-checker更慢),所以一般放到最后處理,比如找到了符合要求的結構,判斷它是否在離出生點滿意的范圍內.

village.1

然后是村莊,創(chuàng)建一個void類型的village(名稱隨意)方法,然后在for循環(huán)里調用它,輸入參數(shù)seed和rand

village.2

(村莊的region大小是上圖bastion432換為512,368換為384)

首先,將世界種子換成結構種子,因為getInRegion方法中需要結構種子.用getInRegion方法得到region(0,0),也就是++象限中離原點最近的村莊的生成點(這里為了方便,只需要++象限的村莊),它是CPos類型,即ChunkPosition(區(qū)塊坐標),然后用if判斷它是否為null,是null則return,檢查下一個種子.再加載主世界生物群系,用canSpawn方法檢查這個生成點能否生成村莊,如果不能,則檢查下一個種子.然后再創(chuàng)建VillageGenerator對象(它需要主世界地形,即OverworldTerrainGenerator,所以也要創(chuàng)建),用generate方法生成這個村莊,再用generateLoot方法加載所有箱子的BPos(方塊坐標)以及所包含的Item(物品),存儲為chests.用for循環(huán)遍歷chests列表,也就是說遍歷每一個箱子,由于每個箱子的信息都是坐標+物品,所以用getSecond得到物品.然后如果箱子中有黑曜石,就把賦值為0的obsidian變量加上黑曜石的數(shù)量,最后判斷黑曜石的數(shù)量,這里我就看它是否大于10了,如果是,則打印種子和村莊的方塊位置(它是CPos,所以用toBlockPos方法)以及黑曜石的數(shù)量.

運行

在空白處右鍵,運行Test.main

運行中

我們可以看見,它在控制它打印了一些種子,我們可以在游戲里查看

停止

如果想停止運行,可以點圖中的紅色正方形

我們進游戲查看第一個找到的種子-9223372036854775723

村莊圖

它有三個鐵匠鋪

所有戰(zhàn)利品

如圖,三個鐵匠鋪的所有戰(zhàn)利品,確實有11個黑曜石,good!


出生點和村莊已經被你拿下了,如果想繼續(xù)拿下更多東西,還請繼續(xù)支持我的專欄!

所有代碼都上傳到了github,可以自行復制等

https://github.com/Xinyuuu7/Example

感謝支持!!!

Seed Finding by Java [1] 介紹與示例的評論 (共 條)

分享到微博請遵守國家法律
阳新县| 罗城| 凤山县| 尼勒克县| 桑日县| 休宁县| 广州市| 九江市| 桓仁| 威海市| 涟水县| 蒙山县| 南投市| 富蕴县| 榕江县| 乌兰浩特市| 石狮市| 绥江县| 厦门市| 九江县| 德江县| 南江县| 巴中市| 织金县| 永修县| 申扎县| 元朗区| 河东区| 和平区| 巧家县| 宜兰市| 思茅市| 宾阳县| 漠河县| 乌审旗| 奈曼旗| 巩义市| 明光市| 崇信县| 遂川县| 滦南县|