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

Minecraft 20w48a 新内容特性+代码解析

2020-11-29 23:32 作者:Nickid2018  | 我要投稿

这周的快照又来了!虽然上周没有快照,但是感觉更新的东西不多,有可能是在讨论地形生成吧。那么现在来看看这周的20w48a。

一.漏洞修复

1.MC-205454 收纳袋复制

没错,这个复制它不复存在了,所以大家还是不要白嫖的好。由于这边代码太复杂(Mojang写的太恶心)就不解析了。

2.MC-3615 流体透视

这个bug是远古bug,持续了200以上个版本,首次报告记录在2012年(Mojang,真有你的,修个bug花了8年)。由于还是找不到改在哪里了,所以就不解析了(真应该写一个对比程序)。

对比图:新快照透视不复存在

3.MC-205041 皮革盔甲不能防止冰冻

   MC-205069 创造模式不会冰冻

MC-205041应该是上次快照忘加了,现在是正常的,而另一个和它原理一样,就放到一起了。

现在创造模式也会冰冻,皮革盔甲可以抵御

皮革装备都有一个标签:freeze_immune_wearables,这个标签代表了穿着它们不会受到冰冻。

上一个快照这里没有写下面那几句话,应该是他们忘加了

同时,增加了新的游戏规则“freezeDamage”决定是否有冰冻伤害。

二.收纳袋存储的修改

收纳袋现在又有了新的修改。首先是在高级提示框的时候会出现“Fullness”的提示,它代表了收纳袋内有什么内容物。

显示部分

对于存储物品方面,现在它能按装入顺序的倒序取出。这听起来,...栈??

收纳袋的新UI与存储

说说是怎么实现的吧:收纳袋有一个NBT标签“Items”,是一个列表型的数据,内部存储物品标签。列表数据具有顺序,当你添加一个物品,这个物品就被放到列表的第一格数据;当你拿出物品,第一格数据取出,删除。这种方式遵循了LIFO(Last-In-First-Out)原则,所以就是一个栈。

取出物品的操作

当你右键使用收纳袋时,上一个版本会直接把物品放到物品栏,现在则是直接丢出去(垃圾袋?)

右键释放______

代码这里就简单了,就是调用了drop,和普通丢出物品没两样。

dropContents,丢出所有物品

三.滴水石锥

这是这个快照增加的两种方块其中之一,另一种“滴水石块”暂时没有用处,所以不在这里说了。

滴水石锥,按照附着方式形成钟乳石和石笋,连接时成为石柱

滴水石锥有三个属性:TIP_DIRECTION(方向), THICKNESS(大小), WATERLOGGED(含水)。方向有两种:向上(成为石笋)或者向下(成为钟乳石)。大小有5种:TIP、FRUSTUM,MIDDLE,BASE和形成石柱时才会出现的TIP_MERGE。

首先来说说它的方块特性。

当它是石笋时,它会对落到上方的实体产生伤害。这个伤害实质上是摔落伤害,通过覆盖fallOn方法,将摔落距离乘以4倍,所以当无盔甲、无效果、非免疫摔落伤害的实体从6格摔落会立刻暴毙(平常要24格)。

实体掉落到石笋上面调用,causeFallDamage是产生摔落伤害的方法,第一个参数是摔落距离,第二个是摔落伤害比例

按照这个原理,我们可以知道跳跃提升效果(让摔落距离减去等级)、缓降效果(fallDistance强制置零)、保护附魔、摔落保护附魔对此都有保护效果。

说完了扎死,下面说说砸死,不过在此之前了解一下它的方块生存条件。

canSurvive调用了这里,这是检查放置合理性的

当钟乳石没有上方方块,石笋没有下方方块,就会掉落。同时,活塞推动和三叉戟(有速度要求:至少要0.6m/tick,也就是12m/s)也会导致它掉落。

上面是活塞推动,下面是三叉戟射它的方法

好了,回到钟乳石,它在破坏上方方块时会产生下落的钟乳石方块(FallingBlock)。这个操作发生于检查的2tick之后,因为调用的是计划刻。

检查是否进行掉落
添加计划刻的执行

当2tick一到,计划刻被调用,开始生成下落方块,这里通过tick调用了spawnFallingStalactite这个方法。

生成掉落实体,可以看出它是掉落物品、伤害实体的

然而这里出现了一个问题。当你尝试去撸掉连起来的第51格钟乳石的时候,所有钟乳石都不会掉下来;只有在敲掉第50格以下的才能掉落,这是为什么呢?

吃我一剑!华夏第一剑!白帝圣剑!

在scheduleStalactiteFallTicks这个方法里面我们看到了findTip这个方法,它返回null就不会执行下落方块生成,看来问题出现在这里。

findTip,寻找钟乳石尖端

从代码中看出,寻找尖端只会调用50次,找不到就拉倒返回null,如果下方是石柱,也是返回null。所以你在第51格打掉就不会找到尖端,也就不会导致它整体掉落了。

钟乳石还有另一个特性:滴水/岩浆

这个特性需要保证:钟乳石只有一格,上方附着方块的上方是水源/岩浆源


钟乳石的滴水/岩浆

当钟乳石上方不具有岩浆源/水源方块时,它不会滴水/岩浆,只会呈现出虚假的粒子效果。

当上方是水源,会产生滴水的粒子效果(和啥也没有一样);如果是岩浆源,则是滴岩浆的效果。

滴水/岩浆的先决条件:向下、只有一格、不含水
渲染刻,当渲染时调用此方法

这段代码看出:当没有流体源方块时,会有1/50的概率产生粒子效果;当有流体源方块,滴落粒子效果是3/25触发。

生成粒子的方法

这个方法能看出为什么能产生不同的粒子效果。

介绍完表面功夫,下面说说真功夫。

首先,滴入炼药锅流体是随机刻触发,所以randomTickSpeed有效(不像某细雪)。下面这个是随机刻的代码。

真是短小精悍,Mojang应该是故意这么设计的,因为调用的方法开放测试,没准下个版本就直接放里面了

调用的方法maybeFillCauldron就是填充炼药锅用的,代码如下:

maybeFillCauldron,调用滴落的实际方法

这段代码解读起来是这样的:首先是条件判定,前面已经说过了。之后是判断流体类型,如果是水,那么有0.29296875的机会滴落填充下方;如果是岩浆,就是0.17578125的机会。判断要滴落之后,寻找下方炼药锅,这里只会寻找十格以内的炼药锅,多了也不去找。之后发送更新,在计划刻50+相距高度后进行填充炼药锅。

滴水石锥和草有相似的方块偏移

最后,关于滴水石锥的方块偏移可能有人已经发现它和草差不多,这是因为它们用了相似的方式实现了方块的偏移:getOffestType。普通方块返回的都是“NONE”,而滴水石锥是“XZ”,草是“XYZ”。这些参数在BlockState里面解析成为方块的偏移,具体代码如下:

将OffsetType解析成为偏移的方法

这段代码就不解析了,主要是在Vec3创建那里的代码比较重要:可以看到无论是XZ还是XYZ类型的偏移都用了同一种算法,所以方块的偏移是一样的。

这个偏移在反推方块位置有一些用处,比如pack.png的种子寻找就用了这个。

偏移种子的生成代码

那么到这里代码解析就结束了,期待下一次的快照!

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

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

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

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

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



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

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