欢迎光临散文网 会员登陆 & 注册

Minecraft 20w46a 新内容特性+代码简析

2020-11-15 13:00 作者:Nickid2018  | 我要投稿

这周Mojang又出了一个新快照,加入了细雪,这一期专栏将主要与它相关。不过再讲它之前,先来点开胃菜,看看上一个版本增加的方块和物品怎么样了。

一.望远镜-视野修改

望远镜上一个版本的视野渲染为圆形,并且是以一张材质来进行圆形框的渲染的。但是这个版本,时代变了。这回,Mojang把这里修改为直接用自己的VBO渲染,虽然材质资源位置相同,但是实际上已经是修改很大的了。

net.minecraft.client.gui.Gui#renderSpyglassOverlay,绘制望远镜边框的方法,Tesselator是MC中调用OpenGL的包装对象
er

二.收纳袋特性

收纳袋现在能在GUI里面直接显示物品,和潜影盒不同了。

但是在籽岷的最新视频中,有这样的特性:通过收纳袋收走工作台物品时还能正常获取到物品!

这显然是一个恶性的bug(MC-205454 Bundles can be used to duplicate items in the crafting gridhttps://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))。至于它的原理如下:

收纳袋在收取物品的时候,不会对工作台网格内部的合成数据有影响(不调用slotChangedCraftingGrid),所以会导致即使物品被收走了,工作台还能合成物品的bug。

注意,这个工作台网格包括了背包的2x2工作台和普通3x3工作台,其他可合成方块不影响。

net.minecraft.world.inventory.CraftingMenu#slotChangedCraftingGrid,服务器端操作

三.炼药锅数据标签修改

从此版本起,炼药锅的数据标签从cauldron分成了四个:空炼药锅cauldron,盛水的炼药锅water_cauldron,盛岩浆的炼药锅lava_cauldron和盛细雪的炼药锅powder_snow_cauldron。

炼药锅方块数据变了!

其中盛水和细雪的炼药锅用了一个类:LayeredCauldronBlock,岩浆炼药锅用的是LavaCauldronBlock,普通炼药锅是CauldronBlock,这些类都继承了AbstractCauldronBlock。

几种炼药锅的方块定义

在这里我要详细说明一下LayeredCauldronBlock,有关与承接水和细雪的代码就在这里。

方块上方有降雨时调用这个方法

其中,CauldronBlock.shouldHandlePrecipitation是一个以世界随机数(注意:不是世界种子)进行判断是否执行的方法,执行几率是1/20。

同时,由于世界降水不属于随机刻范畴,所以更改随机刻速度对此速度无影响

另外,LayeredCauldronBlock还有一个灭火的性质。在灭火之后,内部的水/细雪减少一格。

炼药锅内容物的灭火方法

四.细雪方块

终于来到了这一篇专栏的重头戏:细雪方块。

细雪方块不存在方块物品,只能通过细雪桶收集或放置。细雪桶要通过细雪炼药锅收集。

细雪桶

当你走在其上方时,如果没有皮革靴子,你会从中陷入。

陷入细雪之中

那么你是怎么陷入到细雪里面的呢?在细雪方块的类中,我们就能找到答案:在你不穿皮革靴子的时候,方块的碰撞箱会消失,所以你就会从中陷入。

获取方块碰撞箱的方法

当你陷入细雪中,即使只有一点,你也会开始被冰冻,在300tick后达到完全冰冻(按照Mojang官方说法,皮革套能减缓冰冻时间,可是代码中确实没有看到有减缓,这就是Bugjump的厉害吗,i了i了)

实体在细雪方块中的方法,setBodyIsInPowderSnow就是触发在细雪方块内的方法

冰冻的原理下一部分说,首先看看细雪中的运动:makeStuckInBlock是一个把fallDistance强制置为0,并且把第二个参数作为stuckSpeedMultiplier的一个在Entity定义的方法。这个就导致了玩家能通过细雪方块不受影响(但是速度会降,stuckSpeedMultiplier曾经在运动那篇专栏讲过),并且玩家落在里面(类似于落地水)没有摔落伤害。

但是如果你穿着皮革靴子,就会导致细雪对于你有碰撞箱,所以不会触发entityInside,导致伤害发生。

在水、气泡柱和细雪中火焰熄灭

当玩家着火进入细雪方块中时,火会被熄灭。

五.冰冻

当一个LivingEntity进入细雪方块中,它会渐渐地被冰冻(Freeze)。和着火一样,这是一种在实体类中的硬定义的状态而非效果。冰冻时间是300tick,在冰冻完全之后会导致冰冻伤害,每60tick会触发一次hurt。如果你在受到冰冻后离开细雪方块,那么就会慢慢化冻,化冻速度是冰冻速度的两倍,也就是完全冰冻之后,150tick就能恢复普通状态。

LivingEntity#aiStep,执行冰冻和伤害的部分


在冰冻状态下,实体将会减速,减速与冰冻时间有关。

这里是一个进行冰冻效果的方法,里面写到了减速

对于玩家来说,冰冻效果会影响画面。随着冰冻时间增长,屏幕会出现一圈冰花。在完全冰冻之后,血条也会变成蓝色的冰冻血条。

好冷啊~~

玩家的视角渲染是从Gui类绘制的,下面来看看它这里怎么写。

上半部分:渲染冰冻的Overlay,下半部分是渲染Overlay的方法

POWDER_SNOW_OUTLINE_LOCATION是冰冻的Overlay的资源,资源位置在“textures/misc/powder_snow_outline.png”,材质包可以修改此处。

蓝色血条渲染是另一个部分的代码,如下:

判断血条类型的部分,血条的心都是在一张材质上的,所以如果材质是旧版本就会渲染错误

在冰冻状态下,如果你进入火中,冰冻则会瞬间消失。

Entity#baseTick,设置TicksFrozen就是设置冰冻时间,为0就是完全化冻了

六.其他的话

这个版本中令玩家开心的事情有挺多,尤其是收纳袋bug(下一个快照应该就没了)。除此之外,紫水晶复制还没有修掉,不知道未来会怎么样。

这种结构目前为止还能运作

下一个版本应该是钟乳石和“Wifi植物”了,期待下周的快照吧。

代码:Mojang官方混淆表+反混淆+反编译

反混淆器:MCDynamicExchanger beta 6(正在开发) 

beta 5 版本在GitHub上可用,网址https://github.com/Nickid2018/MCDynamicExchanger

反编译器:Eclipse插件, FernFlower/CFK

文章中若有错误请大家指出,我将修改专栏。


Minecraft 20w46a 新内容特性+代码简析的评论 (共 条)

分享到微博请遵守国家法律