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

Minecraft 21w05a 新更改+代码简析

2021-02-05 00:54 作者:Nickid2018  | 我要投稿

经过Mojang两周的努(g)力(ū)后,21w05a发布了。由于东西有点多,只会讲一部分。

版本修改表:https://paste.ubuntu.com/p/MdkxXkCjF8/

注意:官方中文译名还没有发布,这里只是用中文直译的结果

一.苔藓方块和苔藓地毯(Moss Block&Moss Carpet)

这两种方块将在新的Lush Cave繁茂洞穴中生成,两种方块材质相同,只是类型不一样而已。

首先说说苔藓方块。官方对它的介绍也就寥寥几笔,但是代码中写出:它可以施用骨粉催熟

Mojang,你忘写的东西还要别人查代码才能发现,真有你的

它施用骨粉时的行为如下:

首先是判定范围,1x1到5x5不等的范围。在范围内的方块进行下一步操作。

如果范围内的方块具有lush_plants_replaceable标签,则替换为苔藓方块。

之后每个方块会计算一次随机数(就是概率的表现)判断是否进行下一步操作,这个概率是0.8。

最后判定上方放置什么方块,生成的东西如下:Flowering Azalea杜鹃花花丛(4%),Azalea杜鹃花树丛(10%),Moss Carpet苔藓地毯(25%),草(50%)和高草(11%)

判定生成方块,不要问我为啥概率那么奇怪,Bugjump就是这么写的

接下来,苔藓地毯上场,它可以由苔藓方块合成。

它在代码中和地毯共用一个类。等下,这是否意味着它能刷?——遗憾的是,不能。

尝试用传统地毯机结构进行复制,活塞推动一瞬间苔藓地毯被摧毁

无法复制具体原因不详(其实是懒得找),猜测为BlockBehaviour.Properties不同:苔藓地毯为PLANT,而地毯为CLOTH_DECORATION。

二.洞穴藤蔓(Cave Vine)和荧光浆果(Glow Berries)

先说洞穴藤蔓,它是和垂泪藤一样从上向下生长的植物,和海带一样分为Head(具有Age属性)和Body部分。当施用骨粉时会变为带浆果的藤蔓,亮度为14。

洞穴藤蔓

当右键带浆果的藤蔓会得到一个荧光浆果并且藤蔓的浆果清除。

执行掉落

掉落物荧光浆果右键会种植洞穴藤蔓,同时它也是一种食物。它的饱食度为2,饱和度比例系数为0.1。

三.浮萍植物(Dripleaf)

浮萍植物分为小型和大型两种,两种的特性不同,先从小的说起。

小型浮萍植物和高草一样属于两格高的植物,方块生存条件为黏土上或者在水中的植物可生长方块。

方块生存条件检查(至少没像上次一样光写一个isFluid了)

在执行骨粉催熟时,小型浮萍植物会生长成为大型浮萍植物,高度为1-5格。但是,Mojang你怎么又把前置条件忘了??在成长判定放置方块的时候,Mojang没有判定将要生长的方块,于是——基岩都被破掉了(MC-213971)。

这就是Mojang突然失去理智的代码,应该在for里面加一个判定,不过幸好你没忘检查建筑高度

大型浮萍植物和小型的不同,它分为两部分:上面的叶子和下面的梗(Stem)

先说说它的梗,梗无法用骨粉,和叶子不同,所以不再细说。

而叶子部分就大有讲究了。

首先是它与骨粉的交互,骨粉能让它长高一格,同样这个也没检查方块。

另一个就是之前就说过要实现的特性:在上面站着会掉下来。

首先是前提条件:如果玩家潜行,那么就不会导致叶子倾斜(Tilt)。

判断能否倾斜

倾斜的阶段有4个:NONE(不倾斜),UNSTABLE(不稳定),PARTIAL(部分倾斜),FULL(完全倾斜)。其中,UNSTABLE阶段能持续20tick(1s),PARTIAL阶段持续10tick(0.5s),FULL阶段持续100tick(5s)。所以从玩家站上去开始至完全倾斜掉落只需要30tick(1.5s)。

P.S.Wiki上写为40tick,在测试之后得到数据确实为30tick而非40tick,希望能快一点改过来。

倾斜的不同阶段和持续时间

倾斜的开始是从实体进入方块内部开始的(叶子上表面没有全部高度,整好少一个像素,所以上方不刷怪),这时候会检查前置条件,检查之后开始倾斜过程,Tilt标签会从NONE变为UNSTABLE。

实体进入方块时触发

之后就是一系列的变化:不稳定-》部分倾斜-》完全倾斜,这些都由计划刻执行。当处于完全倾斜时,整个方块的碰撞箱就消失了(只有叶片有碰撞箱,梗只有包围盒而没有碰撞箱)

设置计划刻执行

在FULL阶段持续5s后,它会自动恢复为NONE阶段。

FULL结束,恢复成原样

到这里,我们解释了这个过程的基本内容和潜行不会掉下去的原理,可是另外一个还没有解释:为什么跳来跳去也不会导致它倾斜。

原理如下:

在计划刻执行时,会再次检查是否有实体在上面,如果没有,恢复原状。这也是为什么跳来跳去的时候会有“Dripleaf Tilt Up”的声音而潜行没有。

tick,计划刻执行

最后,它可以被任何投掷物摧毁掉落。

被投掷物摧毁

四.铜类方块锈蚀改变

之前说过铜类方块是以计划刻运行的,现在则以随机刻进行判定。这个变化比之前要复杂一点。

首先是判定是否生效,每次随机刻触发都运行判定,这个判定成功的概率是0.05688889(真搞不懂这啥玩意,可能是3/512?)

randomTick时调用此方法

这就完事了?不,下一步才是最主要的。

接下来还要进行一次判定是否进行变化,有关与附近曼哈顿距离小于等于4的所有方块。首先将这些方块遍历,如果是同一类型方块,总体方块计数加一;如果这个方块锈蚀程度比它还大,那么锈蚀计数加一。然后将这些数据集合起来,得到下面的概率公式:

a:周围锈蚀程度更大的方块量;b:周围同类方块量;c:改变比例,纯铜块为0.75,其他为1

通过公式看出:旁边的方块越少概率越大,最大取值为旁边没有任何方块的暴露铜块(Exposed)或锈蚀的铜块,这些方块的这个概率为100%;最小取值是周围全都是铜块的铜块,这个方块的这个概率为3/66564(0.045%)

applyChangeOverTime,变化调用

最后,更新方块,我们才能看到一个成功锈蚀的铜块。

五.细雪方块的变化

细雪方块在这个版本中可以被活塞推拉,这里没有什么好讲的,主要是下面两个。

第一个:带火的箭射过细雪方块时火焰熄灭

和在水、雨中一样,现在带火的箭穿过细雪方块的时候火焰熄灭。

实现的代码

但是有的时候这个不起效果,原因是:MC计算移动时只考虑前进路径上是否有碰撞,之后会直接将实体移动到计算的点而不考虑中间过程,所以有的时候穿过细雪方块是没有计算到它在细雪方块里面所以火焰不熄灭。

第二个:骷髅小白变流浪者(流髑)

现在骷髅进入细雪方块会变化为流浪者,一共耗时900tick(45s),但是如果它在细雪里面已经呆了超过600tick(30s),则变化不可逆转,即使现在立刻从细雪里面出来最终也会变为流浪者。

骷髅每刻运行的代码

六.发光苔藓没法变水了

上一个版本发光苔藓能把岩浆变为含水的发光苔藓,导致下界能够产生水。现在已经修复了(修复花了3天)

七.世界冻结bug MC-213788 在2月4日晚21:15修复 

代码源:基于Mojang官方混淆表的反混淆+反编译(CFK、JD-Core)

反混淆器:正在努力开发中的MCDynamicExchanger beta 7

发布版本为beta 6 ONLY REMAPPING DECOMPILING COMPARING

项目地址 https://github.com/Nickid2018/MCDynamicExchanger

文章中出现了错误?欢迎留言在下面!

Minecraft 21w05a 新更改+代码简析的评论 (共 条)

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