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

這周Mojang又出了一個新快照,加入了細雪,這一期專欄將主要與它相關(guān)。不過再講它之前,先來點開胃菜,看看上一個版本增加的方塊和物品怎么樣了。
一.望遠鏡-視野修改
望遠鏡上一個版本的視野渲染為圓形,并且是以一張材質(zhì)來進行圓形框的渲染的。但是這個版本,時代變了。這回,Mojang把這里修改為直接用自己的VBO渲染,雖然材質(zhì)資源位置相同,但是實際上已經(jīng)是修改很大的了。

二.收納袋特性
收納袋現(xiàn)在能在GUI里面直接顯示物品,和潛影盒不同了。
但是在籽岷的最新視頻中,有這樣的特性:通過收納袋收走工作臺物品時還能正常獲取到物品!

這顯然是一個惡性的bug(MC-205454 Bundles can be used to duplicate items in the crafting grid,https://bugs.mojang.com/browse/MC-205454?jql=project%20%3D%20MC%20AND%20issuetype%20%3D%20Bug%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22))。至于它的原理如下:
收納袋在收取物品的時候,不會對工作臺網(wǎng)格內(nèi)部的合成數(shù)據(jù)有影響(不調(diào)用slotChangedCraftingGrid),所以會導(dǎo)致即使物品被收走了,工作臺還能合成物品的bug。
注意,這個工作臺網(wǎng)格包括了背包的2x2工作臺和普通3x3工作臺,其他可合成方塊不影響。

三.煉藥鍋數(shù)據(jù)標簽修改
從此版本起,煉藥鍋的數(shù)據(jù)標簽從cauldron分成了四個:空煉藥鍋cauldron,盛水的煉藥鍋water_cauldron,盛巖漿的煉藥鍋lava_cauldron和盛細雪的煉藥鍋powder_snow_cauldron。

其中盛水和細雪的煉藥鍋用了一個類:LayeredCauldronBlock,巖漿煉藥鍋用的是LavaCauldronBlock,普通煉藥鍋是CauldronBlock,這些類都繼承了AbstractCauldronBlock。

在這里我要詳細說明一下LayeredCauldronBlock,有關(guān)與承接水和細雪的代碼就在這里。

其中,CauldronBlock.shouldHandlePrecipitation是一個以世界隨機數(shù)(注意:不是世界種子)進行判斷是否執(zhí)行的方法,執(zhí)行幾率是1/20。
同時,由于世界降水不屬于隨機刻范疇,所以更改隨機刻速度對此速度無影響。
另外,LayeredCauldronBlock還有一個滅火的性質(zhì)。在滅火之后,內(nèi)部的水/細雪減少一格。

四.細雪方塊
終于來到了這一篇專欄的重頭戲:細雪方塊。
細雪方塊不存在方塊物品,只能通過細雪桶收集或放置。細雪桶要通過細雪煉藥鍋收集。

當你走在其上方時,如果沒有皮革靴子,你會從中陷入。

那么你是怎么陷入到細雪里面的呢?在細雪方塊的類中,我們就能找到答案:在你不穿皮革靴子的時候,方塊的碰撞箱會消失,所以你就會從中陷入。

當你陷入細雪中,即使只有一點,你也會開始被冰凍,在300tick后達到完全冰凍(按照Mojang官方說法,皮革套能減緩冰凍時間,可是代碼中確實沒有看到有減緩,這就是Bugjump的厲害嗎,i了i了)

冰凍的原理下一部分說,首先看看細雪中的運動:makeStuckInBlock是一個把fallDistance強制置為0,并且把第二個參數(shù)作為stuckSpeedMultiplier的一個在Entity定義的方法。這個就導(dǎo)致了玩家能通過細雪方塊不受影響(但是速度會降,stuckSpeedMultiplier曾經(jīng)在運動那篇專欄講過),并且玩家落在里面(類似于落地水)沒有摔落傷害。
但是如果你穿著皮革靴子,就會導(dǎo)致細雪對于你有碰撞箱,所以不會觸發(fā)entityInside,導(dǎo)致傷害發(fā)生。

當玩家著火進入細雪方塊中時,火會被熄滅。
五.冰凍
當一個LivingEntity進入細雪方塊中,它會漸漸地被冰凍(Freeze)。和著火一樣,這是一種在實體類中的硬定義的狀態(tài)而非效果。冰凍時間是300tick,在冰凍完全之后會導(dǎo)致冰凍傷害,每60tick會觸發(fā)一次hurt。如果你在受到冰凍后離開細雪方塊,那么就會慢慢化凍,化凍速度是冰凍速度的兩倍,也就是完全冰凍之后,150tick就能恢復(fù)普通狀態(tài)。

在冰凍狀態(tài)下,實體將會減速,減速與冰凍時間有關(guān)。

對于玩家來說,冰凍效果會影響畫面。隨著冰凍時間增長,屏幕會出現(xiàn)一圈冰花。在完全冰凍之后,血條也會變成藍色的冰凍血條。

玩家的視角渲染是從Gui類繪制的,下面來看看它這里怎么寫。

POWDER_SNOW_OUTLINE_LOCATION是冰凍的Overlay的資源,資源位置在“textures/misc/powder_snow_outline.png”,材質(zhì)包可以修改此處。
藍色血條渲染是另一個部分的代碼,如下:

在冰凍狀態(tài)下,如果你進入火中,冰凍則會瞬間消失。

六.其他的話
這個版本中令玩家開心的事情有挺多,尤其是收納袋bug(下一個快照應(yīng)該就沒了)。除此之外,紫水晶復(fù)制還沒有修掉,不知道未來會怎么樣。

下一個版本應(yīng)該是鐘乳石和“Wifi植物”了,期待下周的快照吧。

代碼:Mojang官方混淆表+反混淆+反編譯
反混淆器:MCDynamicExchanger beta 6(正在開發(fā))?
beta 5 版本在GitHub上可用,網(wǎng)址https://github.com/Nickid2018/MCDynamicExchanger
反編譯器:Eclipse插件, FernFlower/CFK
文章中若有錯誤請大家指出,我將修改專欄。