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

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

「MC篩種雜談2」結(jié)構(gòu)生成的位置選擇,箱子位置和戰(zhàn)利品的決定

2023-09-24 13:13 作者:De6ris  | 我要投稿

負(fù)一、宣群

????篩種、源碼解讀交流群956255985,歡迎。

零、上期課后題解

  • 一把金鎬,在設(shè)置隨機附魔(EnchantRandomly)時,得到效率5的概率

  • %5Cfrac%7B1%7D%7B6%7D%5Ctimes%20%5Cfrac%7B1%7D%7B5%7D%3D%5Cfrac%7B1%7D%7B30%7D%3D0.0333333%0A

  • 為什么說20附魔金蘋果的古城箱子是不存在的

  • %5Cfrac%7B1%7D%7B6%7D%5Ctimes%20%5Cleft(%20%5Cfrac%7B1%7D%7B86%7D%5Ctimes%20%5Cfrac%7B1%7D%7B2%7D%20%5Cright)%20%5E%7B10%7D%5Ctimes%202%5E%7B48%7D%3D2.07016%5Ctimes%2010%5E%7B-9%7D%0A

  • 預(yù)測一個廢棄傳送門的箱子,有6個附魔金蘋果的可能性

  • %5Csum_%7Bk%3D6%7D%5E8%7B%5Cleft(%20%5Cbegin%7Barray%7D%7Bc%7D%0A%09k%5C%5C%0A%096%5C%5C%0A%5Cend%7Barray%7D%20%5Cright)%20%5Cleft(%20%5Cfrac%7B1%7D%7B398%7D%20%5Cright)%20%5E6%5Cleft(%20%5Cfrac%7B397%7D%7B398%7D%20%5Cright)%20%5E%7Bk-6%7D%7D%5Csim%209%5Ctimes%2010%5E%7B-15%7D

  • 為什么橋類型的堡壘遺跡必出一個磁石

  • 因為第一個獎池抽獎次數(shù)是固定的1,且只有一個獎項——磁石。

  • mojang在1.20更新中,為許多結(jié)構(gòu)增加了鍛造模板的戰(zhàn)利品,而不影響原有的戰(zhàn)利品,這是怎么實現(xiàn)的

  • 在原有獎池后面添加了新獎池用以生成鍛造模板,這并不影響之前的戰(zhàn)利品對隨機數(shù)生成器的使用,也就保持了原有的隨機數(shù)序列,得到了一樣的戰(zhàn)利品。

一、結(jié)構(gòu)生成的位置選擇

????大部分結(jié)構(gòu)遵循區(qū)域(Region)生成。一個結(jié)構(gòu)的設(shè)定(setting)通常有三個要素:間距(spacing),間隔(separation),鹽(salt),散布(spread)。

????spacing代表了區(qū)域的大小,每個區(qū)域內(nèi),只會生成一次該結(jié)構(gòu)。separation進一步限制了一個區(qū)域內(nèi),有部分位置是無法生成結(jié)構(gòu)的,這使得兩個相鄰區(qū)域內(nèi)的兩個結(jié)構(gòu)不會距離過近。而salt相當(dāng)于結(jié)構(gòu)的標(biāo)識符,幾乎每個結(jié)構(gòu)都擁有唯一的salt,下面也會講解,salt還影響了位置的選取。spread有兩種,線性(linear)和三角(triangular),前者在區(qū)域內(nèi)均勻選取位置,后者則是均勻選取兩次再取平均值,這樣會更靠近區(qū)域的中心。

????例如,堡壘遺跡的spacing是27,separation是4,因此它的一個區(qū)域是27x27區(qū)塊大小,也就是432x432方塊大小,separation則表明一個區(qū)域中只有23x23區(qū)塊大小是可以生成結(jié)構(gòu)的。在下圖中綠色代表可生成區(qū)域,紅色代表不可生成。每塊綠色區(qū)域至多生成一個結(jié)構(gòu)。

堡壘遺跡的位置示意圖(轉(zhuǎn)自wiki)

這里我整理了各種結(jié)構(gòu)的設(shè)定。

????十分方便的是,我們能利用庫得知一種結(jié)構(gòu)在一個種子中一個區(qū)域的位置。首先指定世界種子,然后new一個需要的結(jié)構(gòu)(注意廢門有主世界下界之分),然后調(diào)用getInRegion,填入世界種子,區(qū)域的X,Z坐標(biāo),再傳入一個ChunkRand(隨機數(shù)生成器)即可。

這串代碼會輸出Pos{x=9, y=0, z=3},是區(qū)塊坐標(biāo),可以換算得到方塊坐標(biāo)(144,?0, 48)。

對于埋藏的寶藏和廢棄礦井,可以發(fā)現(xiàn)spacing是1,separation是0,這表明它們每個Region就是一個區(qū)塊的大小。

需注意,部分結(jié)構(gòu)有可能會傳回null,后續(xù)處理坐標(biāo)時就要判斷是否為null。

例如:我們要查找種子114514中,距離原點160以內(nèi)的寶藏,那么計算過后就知道寶藏區(qū)塊的坐標(biāo)cx,cz滿足:

-10%5Cle%20cx%20%3C%2010%2C%20-10%5Cle%20cz%3C10

寫一個循環(huán)來遍歷這些區(qū)塊,并判斷傳回的值,當(dāng)不是null時輸出。

然后程序輸出了這些值:

可見這些區(qū)塊有可能生成寶藏。但事實上沒有生成,為什么呢?因為游戲還需要檢查相應(yīng)位置處的群系是否允許生成該結(jié)構(gòu)。對于寶藏,它要求沙灘或者積雪沙灘。我們擁有相應(yīng)的方法來檢查群系。對canSpawn方法傳入位置和一個主世界群系(overworldBiomeSource)即可。

經(jīng)過修改,我們的代碼不會輸出任何內(nèi)容,因為確實不存在這樣的寶藏。

二、箱子位置和戰(zhàn)利品的決定

????先從最簡單的單箱子結(jié)構(gòu)開始講解。對寶藏,它的箱子位置所在的區(qū)塊,就是寶藏結(jié)構(gòu)所在的區(qū)塊。例如,種子10410544844143616的(2,-4)區(qū)塊處擁有一個寶藏。MC的邏輯是:寶藏結(jié)構(gòu)先生成,然后生成裝飾品,箱子就屬于裝飾品。因此先將rand的種子設(shè)置為裝飾種子(decoratorSeed),這個裝飾種子的計算方法:對世界種子,區(qū)塊的起始點的方塊坐標(biāo),結(jié)構(gòu)對應(yīng)的裝飾鹽(salt)進行一些混合運算,具體公式可查看篩種庫的源碼。需注意,在這里<< 4起到了乘16的作用,就相當(dāng)于把區(qū)塊坐標(biāo)變成了方塊坐標(biāo);而30001是寶藏的裝飾鹽,這與上文的位置鹽需要區(qū)分。之后我會貼出裝飾鹽的列表。隨后對rand呼叫nextLong,這就是lootTableSeed了??梢娛?7766255326570070266。

????順便講解如何方便地用lootTableSeed得到最終戰(zhàn)利品。先創(chuàng)建戰(zhàn)利品背景(lootContext),傳入lootTableSeed,然后調(diào)出內(nèi)置的戰(zhàn)利品表,對它使用generate方法,傳入lootContext。

????可見該寶藏有16個TNT和其它若干物品。

????廢棄傳送門也類似。只需把salt改成40005,以及調(diào)整戰(zhàn)利品表。但箱子可能會罕見地跨越區(qū)塊,這導(dǎo)致裝飾種子被改成了另一個區(qū)塊所對應(yīng)的,因此戰(zhàn)利品也被改變了。

????對多箱子結(jié)構(gòu),例如沙漠神殿,它的四個箱子位置所在的區(qū)塊,都等同于沙漠神殿結(jié)構(gòu)所在的區(qū)塊。那么我們直接對rand呼叫四次nextLong,它們每一個對應(yīng)一個箱子。

????對復(fù)雜的結(jié)構(gòu),如掠奪者前哨站,它的箱子所在區(qū)塊與整個結(jié)構(gòu)的朝向有關(guān),因此我們需要額外寫一個“前哨站生成器”來模擬朝向,并得到最終箱子所在區(qū)塊。

????對更復(fù)雜的結(jié)構(gòu),如豬靈堡壘,村莊,我們也需要額外寫一個生成器(Generator)來模擬得到各個箱子所在的區(qū)塊坐標(biāo),以及對應(yīng)的戰(zhàn)利品表。

????例如,在這段代碼中,我檢查了(0,0)區(qū)域是否有豬靈堡壘,然后使用setCarverSeed來確定雕刻種子,隨后nextInt決定朝向和種類。2代表藏寶室種類,若不是2我將結(jié)束。然后調(diào)用下界群系(netherBiomeSource)來確定它是否會因為位于玄武巖三角洲而取消生成。

????接下來我使用Xinyu神帶領(lǐng)我們寫的BastionGenerator來模擬整個豬堡生成,得到了豬堡所有的片段(piece)的位置,種類,朝向。然后我判斷是否存在藏寶室底部兩個箱子的片段。這些都不重要,我想向你們呈現(xiàn)的是最后一段,如何得到豬堡所有箱子的位置和內(nèi)容。

????我們調(diào)用generateLoot方法,就得到了一個列表。列表中的每個元素都是一對坐標(biāo)和一列物品。然后我遍歷這個列表,看看是否有一個箱子擁有鉆石鎬。這很好理解。

三、各種結(jié)構(gòu)的裝飾鹽

? ? 值得注意的是,這個表格同時也起到提示世界生成順序的作用。這能解釋許多關(guān)于結(jié)構(gòu)被“頂?shù)簟钡氖虑?。例如,埋藏的寶藏的生成在廢棄礦井之后,因此它可能頂?shù)魪U棄礦井的內(nèi)容。

????寶藏結(jié)構(gòu)生成時,會用原先該位置的方塊覆蓋寶藏箱子的各面。這里原先存在的是洞穴蜘蛛的刷怪籠,因此刷怪籠被復(fù)制為五個了。然而復(fù)制時并沒有攜帶nbt數(shù)據(jù),導(dǎo)致刷怪籠只能使用默認(rèn)nbt數(shù)據(jù)——豬刷怪籠。此外,因為寶藏箱子繼承了原先洞穴蜘蛛刷怪籠的nbt數(shù)據(jù),這又使箱子忘記了自己是箱子,因此無法被人打開,而且內(nèi)容也是空的。

????這么神奇的種子是怎么發(fā)現(xiàn)的呢?本期點贊過0,投幣過0,收藏過0,轉(zhuǎn)發(fā)過0,我之后就會寫一篇文章來講解五豬刷怪籠發(fā)現(xiàn)的歷史。但下期我想先寫一下如何通過反轉(zhuǎn)lootTableSeed來得到逆天戰(zhàn)利品。54黑曜石,16TNT,都是來源于此。

「MC篩種雜談2」結(jié)構(gòu)生成的位置選擇,箱子位置和戰(zhàn)利品的決定的評論 (共 條)

分享到微博請遵守國家法律
遂溪县| 兴化市| 安泽县| 施秉县| 阿克| 龙岩市| 栖霞市| 三亚市| 远安县| 安岳县| 清远市| 拜城县| 云南省| 德庆县| 云霄县| 桃园县| 小金县| 轮台县| 榆中县| 景宁| 龙里县| 内乡县| 宁海县| 和静县| 武陟县| 遵义市| 马公市| 霸州市| 蒙山县| 南投市| 蒙自县| 五原县| 平凉市| 建水县| 周口市| 万州区| 北安市| 会东县| 江安县| 乌鲁木齐县| 防城港市|