Minecraft 20w51a 新特性+代码分析

周三晚上等到了1点钟,终于看到了20w51a出了。也许它是今年最后一个快照,那么照老样子,反混淆反编译一套凑齐!
20w49a->20w51a文件对比表:https://paste.ubuntu.com/p/N2TctxC9yt
首先,老规矩,修复的特性(啊不,bug)挑重要说一说怎么修的。
一.MC-176615,MC-204146,MC-207405一族:收纳袋/潜影箱内部不可破坏物品摧毁bug
这几个bug的原理类似,甚至不需要进行讲解原因:在潜影盒出现之后,它本身就可以被岩浆烧毁/爆炸炸毁,内部的物品自然而然就丢失了,包括不可被爆炸波及的下界之星和不可被岩浆烧毁的下界碎片一族。
解决这个,Mojang的操作确实很给力:这回潜影盒/收纳袋在被摧毁时会爆出物品,这样这些不可破坏的物品就不会消失了。

收纳袋和潜影盒的实现不同。

二.振动系统的部分修改
首先,游戏事件(GameEvent)中eating_start(开始进食)删除了,也就是现在只会在食物吃完之后才会触发潜声传感器。(原因是官方不认为这个事件有用)
之后,振动数据值现在有修改,具体如下:

之后是有关于羊毛物品掉落和走在羊毛上的效果,之前会触发传感器,现在则不会。

掉落物实体中定义了是否可以阻塞振动传播。

同样,掉落到羊毛上现在也不会造成振动。

同样地,在羊毛上的移动(走动或跑动)都不会触发振动。

最后,现在在传感器为含水方块是不会在激活/取消激活时发出声音的。

三.美西螈(Axolotl)
接下来说一说这个版本最重要的更新吧!一只可爱的美西螈!(等等,美西螈核...咳咳)
首先,这个小东西还没有自然生成,所以游戏中是不能看到自然的美西螈的,必须用summon指令、美西螈桶或美西螈刷怪蛋才能召唤它。
它的最大血量是14,移动速度1。
首先说说它的属性,一共有3个属性:DATA_VARIANT(类型),DATA_PLAYING_DEAD(装死状态)和FROM_BUCKET(从桶中释放)。

首先说说DATA_VARIANT这个属性,在NBT标签中它就是“Variant”,是一个枚举值,在召唤美西螈时可以进行设置,数据值0-4。

所以通过summon指令,你可以召唤出来稀有的蓝色品种。

那么稀有品种的概率是多少呢?无所不知无所不晓的代码告诉我们:1/1200(0.083%)
(布置作业:算出放出多少只美西螈才有50%几率在其中开出一只稀有品种)

说完了这个属性,接下来看看FROM_BUCKET属性。这个属性在美西螈是从桶中放出时才为true。由于现在Mojang做这个的机制还没有完善,所以这个应该是给下一个快照留的。这个属性现在的唯一用处是防止美西螈因为自然刷新消失。
最后说说DATA_PLAYING_DEAD装死属性。它代表美西螈是否处于装死状态,这个在一会会重要讲解。
说完属性,接下来说说行为。行为分为IDLE(空闲),CORE(核心),PLAYING_DEAD(装死)和FIGHT(攻击)。由于行为分为很多种,我就挑几个重要的说一说。
首先看看IDLE状态,这是大部分时间下的状态。

解析这部分代码:
每30-60tick,看向6格内的玩家
生孩子时速度参数为0.2
追随诱惑(带有AXOLOTL_TEMPT_ITEMS标签的物品),在陆地上时,速度参数为0.15,在水中/气泡柱,该参数为0.6
小美西螈跟随成年美西螈(范围5-16格),在陆地上时,速度参数为0.15,在水中/气泡柱,该参数为0.6
寻找6格内的水,速度参数0.15
随机移动,在陆地上时,速度参数为0.15,在水中/气泡柱,该参数为0.5
接下来是FIGHT(因为CORE没什么好说的)

这里的代码简单来说是这样的:
验证目标合法性
当目标不能触及,以0.15(陆地)/0.6(水中)的速度追杀
攻击,冷却时间是20tick,攻击伤害为2
如果美西螈有繁殖意向,停止追杀
最后是PLAYING_DEAD,也就是装死的AI。

这里的代码解析如下:
如果有繁殖意向,停止装死
接下来是PlayDead这个具体行为的解析:

这里的代码可以看出来美西螈装死发生了什么:

装死开始,清除看向/走向的目标记忆,给予200tick的生命恢复1
装死前提:在水中或气泡柱中
装死状态中,美西螈不能成为任何生物的攻击目标
那么怎么触发装死呢?

从此处代码得知,装死的条件是:
前提条件:不是在客户端进行计算、具有AI、伤害不能是因干燥受到的伤害,伤害不能溢出。
触发条件:生成的随机数小于受到的伤害,血量小于总血量的一半。
说完了行为,下面看看其他的特性:
美西螈在陆地上6000tick后会持续因为干燥掉血,每20tick掉2滴血。

繁殖时有几率(还是1/1200)出现稀有蓝色品种,其余时候则随机选择亲本一方的品种外形。

之后是有关于帮助取消挖掘疲劳效果的:

在玩家杀死了美西螈的攻击目标之后,美西螈会以自身20格范围内寻找玩家,将玩家身上的挖掘疲劳效果清除,增加生命恢复时间100tick(没有则给予效果)
接下来有关于美西螈的攻击目标。普通状态下它们就会主动攻击鳕鱼等鱼类和鱿鱼(带有AXOLOTL_ALWAYS_HOSTILES标签)。

在诱惑之下,它们也将溺尸和守卫者(带有AXOLOTL_TEMPTED_HOSTILES)纳入目标之中。

那么到这里美西螈的主要特性就说完了。(可以看出Mojang还没有开发完全,等一等吧,已经看到之后自然生成的方法了,条件是能看见天空的水中)
四.游戏规则playersSleepingPercentage
这种新的规则能在多人服务器下让部分玩家睡觉就可以跳过夜晚。
如果值为0,直接跳过;如果大于100,则永远不能跳过夜晚。


代码:Mojang官方混淆表+反混淆+反编译
反混淆器:MCDynamicExchanger beta 6(开发进度:50%)
beta 6 ONLY REMAPPING DECOMPILING COMPARING 版本在GitHub上可用,
网址https://github.com/Nickid2018/MCDynamicExchanger
反编译器:Eclipse插件, JD-Core/CFK
文章中若有错误请大家指出,我将修改专栏。
// P.S.修改于20/12/20 12:08 感谢@迟昫123对本专栏中的错误指正