Minecraft 20w45a 新內(nèi)容特性+代碼淺析

在這周四,MC1.17的第一個(gè)快照20w45a發(fā)布了,加入了不少新東西。接下來我將會(huì)對(duì)幾個(gè)新快照的方塊/物品進(jìn)行代碼層解析。
一.銅制方塊(包括銅塊,切制銅塊,銅樓梯,銅半磚及其變種)
銅礦在這一版本新加入,它的生成規(guī)律和鐵礦一樣,方塊性質(zhì)也與鐵礦近似(包括硬度,爆炸抗性等),燒煉之后獲得銅錠,之后可以合成銅塊,進(jìn)而可以合成銅制的其他方塊。
這些銅制方塊都有共同特性:會(huì)隨時(shí)間流逝銹蝕(說白了就是綠了)

這些可銹蝕方塊都是由同一個(gè)類提供的功能:
net.minecraft.world.level.block.ChangeOverTimeBlock(接口)及其子類
這些類里面都寫了一個(gè)通過計(jì)劃刻(scheduleTick)進(jìn)行方塊轉(zhuǎn)變的,轉(zhuǎn)變的時(shí)間是1200000+random.nextInt(768000)刻,也就是1200000-1967999刻(游戲內(nèi)50-82天,)之后會(huì)銹蝕到下一階段。銹蝕階段為lightly_wethered->semi_weathered->weathered。而打過蠟的方塊變種是直接以SlabBlock、StairBlock等類進(jìn)行初始化的,沒有這個(gè)特性。

二.避雷針(lightning_rod)
避雷針由銅錠合成,能吸引128格【此處是1.17的值!在20w45a中這個(gè)值是64!】(歐幾里得距離)之內(nèi)的所有雷電。
在數(shù)據(jù)保存中,避雷針被保存為POI(Points Of Interest)
說實(shí)在的,POI現(xiàn)在已經(jīng)不只是村民使用的AI尋路判據(jù)了,下界傳送門,蜂巢都用了POI??墒乾F(xiàn)在POI的所有類還放在村民村莊AI的包下面。Mojang你不打算換一個(gè)包嗎??
在雷雨天時(shí),ServerLevel會(huì)進(jìn)行生成閃電束,生成時(shí)調(diào)用findLightningTargetAround這個(gè)方法尋找閃電束落點(diǎn),而這個(gè)方法又調(diào)用了findLightningRod通過POI尋找最近的避雷針。這個(gè)就是它引雷的原理。同時(shí),閃電束擊中避雷針會(huì)調(diào)用避雷針的onLightningStrike方法,這個(gè)方法能讓避雷針發(fā)出時(shí)長(zhǎng)為8gt強(qiáng)度為15的紅石脈沖。
findClosest是一個(gè)尋找指定點(diǎn)周圍N格(歐幾里得距離)最近POI的方法,它的具體代碼如下:
這段代碼可以看出,findClosest會(huì)將距離小于paramInt的最近POI返回,如果找不到返回empty。也就是說,在雷擊時(shí),系統(tǒng)以雷擊點(diǎn)為球心,做半徑為128格的球,取球內(nèi)里球心最近的避雷針POI。若找到,則將位置設(shè)置為找到的點(diǎn)上方;若找不到,則繼續(xù)其他雷擊點(diǎn)判斷條件。
而用引雷三叉戟擊中避雷針也能引雷,不同的是這個(gè)擊中之后不會(huì)產(chǎn)生紅石信號(hào)。

三.紫水晶晶芽與紫水晶簇
晶芽與晶簇共用了一個(gè)類注冊(cè)方塊:AmethystClusterBlock。它們唯一的區(qū)別只有注冊(cè)屬性不同而已。

通過這里的定義能夠看到它們的方塊亮度不同:晶簇5,大晶芽4,中晶芽2,小晶芽1。同時(shí),它們音效不同。并且,它們之中只有晶簇可以以普通方式采集下來紫水晶,收獲等級(jí)為鐵鎬。
通過研究AmethystClusterBlock類,發(fā)現(xiàn)了它也屬于含水方塊。

并且,從類里面得知,它可以以正常方式用活塞推動(dòng)(方塊生存條件是背后必須有附著方塊)
通過這個(gè)活塞推動(dòng)的原理,那么復(fù)制紫水晶也不是難事了(原理類似于鐵軌與死珊瑚復(fù)制,同時(shí)紫水晶簇可以用來代替死珊瑚用于TNT復(fù)制機(jī)):

并且根據(jù)Mojang的bug體制,我們甚至不需要那么多粘液塊,一個(gè)粘液球都能復(fù)制紫水晶。

不過復(fù)制紫水晶可能會(huì)被修復(fù),所以說這個(gè)可能在之后的版本中被消除。
四.Budding Amethyst Block(方塊暫時(shí)沒有中文譯名)
這個(gè)方塊可以在它的四周生成紫水晶晶芽,隨時(shí)間流逝最后變?yōu)榫Т?,也是紫水晶唯一的可再生方式(除了特性?/p>
在某方向上生成晶芽的條件是:對(duì)應(yīng)方向上的方塊要么是空氣,要么是水源方塊,如果是水方塊但不是水源方塊,則拒絕生成。

知道了生成條件,那么它什么時(shí)候生成呢?
生成晶芽/發(fā)育都是在隨機(jī)刻(random tick)里面進(jìn)行的,也就是,調(diào)整隨機(jī)刻速度也會(huì)對(duì)它有影響,具體代碼如下:

對(duì)于紫水晶之后可能潛在的重要用處,這個(gè)方塊我們都想讓它掉落,但是不行,它定義中沒有掉落物生成,包括精準(zhǔn)采集也不能使它掉落。那么挖不動(dòng),我還推不動(dòng)嗎?抱歉,這個(gè)方塊拒絕推動(dòng),推動(dòng)直接破壞方塊;也不能拉動(dòng),粘性活塞無法把它粘回來。

對(duì)于這幾種紫水晶方塊,它們的性質(zhì)和玻璃類似,無法進(jìn)行強(qiáng)充能。

五.紫水晶洞的生成
紫水晶洞是以Feature(地形)生成而非Structure(結(jié)構(gòu)),外層是凝灰?guī)r,中層為方解石,里層是紫水晶類方塊,由于這里的代碼太繁雜,就不解釋了。
六.蠟燭與蠟燭蛋糕
蠟燭及變種蛋糕都繼承了AbstractCandleBlock類,都是有蠟燭粒子效果的方塊。
蠟燭能在同一個(gè)方塊堆疊四個(gè),能用打火石點(diǎn)燃,亮度是3乘以蠟燭根數(shù)。在水中它不能被點(diǎn)燃,并且蠟燭熄滅時(shí)也有音效。
由于蠟燭的方塊生存條件是任意的,所以我們能在蠟燭上面疊蠟燭,變成一個(gè)蠟燭塔。
而蠟燭蛋糕不同。首先,它不是一個(gè)含水方塊;再者,它是沒有對(duì)應(yīng)物品的,必須要用蠟燭插到蛋糕上;最后,它能用打火石點(diǎn)燃,但是它的亮度是3。在插上蠟燭后再次點(diǎn)擊則會(huì)讓蠟燭掉落,變成普通蛋糕(并且你還咬了一口)。
蠟燭蛋糕有它的方塊生存條件:方塊下方必須是一個(gè)固體方塊。

七.收納袋
收納袋能存儲(chǔ)不同類型的一組物品(注意,按照不同物品的物品最大比例大小存儲(chǔ)),但是沒法放潛影箱(套娃破滅)

它的NBT標(biāo)簽是“Items”,是一個(gè)列表,存儲(chǔ)內(nèi)部物品,可以通過give獲得一個(gè)修改NBT的收納袋。
八.遮光玻璃
這是一種玻璃的變種,不過與普通玻璃不同:它不會(huì)透過任何光。如果你用它堆了一個(gè)屋子,那么內(nèi)部的亮度為0.

并且和玻璃不同,它不是一個(gè)嚴(yán)格意義上的透明方塊:生物在其中會(huì)產(chǎn)生窒息,無論是玩家還是生物。

在代碼中,它繼承AbstractGlassBlock類,但是它在propagatesSkylightDown方法中返回false,也就是不能透光。

九.望遠(yuǎn)鏡
望遠(yuǎn)鏡是一個(gè)可以替代OptiFine的C鍵的物品(?),它可以將遠(yuǎn)處/近處的渲染影像放大。

在第三人稱視角下,還有一個(gè)特殊動(dòng)作。

對(duì)于望遠(yuǎn)鏡的使用效果來看,是一種Overlay,也就是可以更換外面那層黑圈的材質(zhì)。事實(shí)上,這個(gè)代碼在net.minecraft.client.gui.Gui的render方法里面寫到了。如果我們要更換望遠(yuǎn)鏡的Overlay,我們可以改掉“textures/misc/spyglass_scope.png”這個(gè)材質(zhì)文件。

十.經(jīng)驗(yàn)球合并
這一版本中,經(jīng)驗(yàn)球能合并了,也就意味著在產(chǎn)生大量經(jīng)驗(yàn)球時(shí),系統(tǒng)會(huì)合并經(jīng)驗(yàn)球降低服務(wù)端卡頓。

對(duì)于電腦不好的玩家來說,這個(gè)優(yōu)化很好。至于它的實(shí)現(xiàn),是服務(wù)端處理實(shí)體的時(shí)候調(diào)用了award函數(shù)進(jìn)而進(jìn)行經(jīng)驗(yàn)球合并。

十一.水下的鐵軌
這一版本中,鐵軌全被改為含水方塊,這對(duì)許多玩家的運(yùn)輸和一些特殊需求(比如做紅石機(jī)器水淹了一大片鐵軌)

但是在水中,礦車移動(dòng)會(huì)變慢。根據(jù)代碼,空氣中最快速度是0.4,而到水中則降為0.2。并且在空氣中礦車移動(dòng)的阻力系數(shù)(阻力系數(shù)是在原速度上進(jìn)行速度乘除,越大越快)是0.997(有乘客)或者0.96(無乘客),如果在水中,這個(gè)值還要再乘以0.95。所以在水中,速度降低會(huì)更快,也會(huì)更快停下來(在deltaMovement的水平方向速度小于0.03時(shí)礦車移動(dòng)停止,具體可以參照前一篇專欄)

這些仍然是快照更新的一小部分(有可能有暗改,還有潛影貝的新特性我也不打算在這里說,我一次也沒成功過-_||),不過這幾項(xiàng)更新是比較重要的。期待下周的快照更新!

代碼:Mojang官方混淆表+反混淆+反編譯
反混淆器:MCDynamicExchanger beta 6 (GitHub)
反編譯器:Eclipse插件, FernFlower/CFK
文章中若有錯(cuò)誤請(qǐng)大家指出,我將修改專欄。