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

Minecraft 20w51a 新特性+代码分析

2020-12-18 23:40 作者:Nickid2018  | 我要投稿

周三晚上等到了1点钟,终于看到了20w51a出了。也许它是今年最后一个快照,那么照老样子,反混淆反编译一套凑齐!

20w49a->20w51a文件对比表:https://paste.ubuntu.com/p/N2TctxC9yt

首先,老规矩,修复的特性(啊不,bug)挑重要说一说怎么修的。

一.MC-176615,MC-204146,MC-207405一族:收纳袋/潜影箱内部不可破坏物品摧毁bug

这几个bug的原理类似,甚至不需要进行讲解原因:在潜影盒出现之后,它本身就可以被岩浆烧毁/爆炸炸毁,内部的物品自然而然就丢失了,包括不可被爆炸波及的下界之星和不可被岩浆烧毁的下界碎片一族。

解决这个,Mojang的操作确实很给力:这回潜影盒/收纳袋在被摧毁时会爆出物品,这样这些不可破坏的物品就不会消失了。

潜影盒物品破坏代码实现(代码定位:@迟昫123)

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

收纳袋的实现

二.振动系统的部分修改

首先,游戏事件(GameEvent)中eating_start(开始进食)删除了,也就是现在只会在食物吃完之后才会触发潜声传感器。(原因是官方不认为这个事件有用)

之后,振动数据值现在有修改,具体如下:

官网给出的新的振动频率

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

当实体(掉落物或者玩家)不进行振动就不会触发

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

在ItemEntity中的方法覆盖,显示了具有occludes_vibration_signals的掉落物实体不会被检测

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

实体掉落到有occludes_vibration_signals标签的方块上不会触发振动(代码定位:@迟昫123)

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

实体在带有occludes_vibration_signals的方块上的移动不会触发振动(代码定位:迟昫123)

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

激活的一部分代码,有关于声音产生

三.美西螈(Axolotl)

接下来说一说这个版本最重要的更新吧!一只可爱的美西螈!(等等,美西螈核...咳咳)

首先,这个小东西还没有自然生成,所以游戏中是不能看到自然的美西螈的,必须用summon指令、美西螈桶或美西螈刷怪蛋才能召唤它。

它的最大血量是14,移动速度1。

首先说说它的属性,一共有3个属性:DATA_VARIANT(类型),DATA_PLAYING_DEAD(装死状态)和FROM_BUCKET(从桶中释放)。

属性数据定义

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

Variant数据值的枚举定义,参数列表为:数据值,类型名称,是否常见

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

五种类型的美西螈,最右方的即为稀有蓝色品种(但是有点偏紫?)

那么稀有品种的概率是多少呢?无所不知无所不晓的代码告诉我们:1/1200(0.083%)

(布置作业:算出放出多少只美西螈才有50%几率在其中开出一只稀有品种)

定义是否为稀有品种,传入的随机数发生器是实体自身的随机数发生器

说完了这个属性,接下来看看FROM_BUCKET属性。这个属性在美西螈是从桶中放出时才为true。由于现在Mojang做这个的机制还没有完善,所以这个应该是给下一个快照留的。这个属性现在的唯一用处是防止美西螈因为自然刷新消失。

最后说说DATA_PLAYING_DEAD装死属性。它代表美西螈是否处于装死状态,这个在一会会重要讲解。

说完属性,接下来说说行为。行为分为IDLE(空闲),CORE(核心),PLAYING_DEAD(装死)和FIGHT(攻击)。由于行为分为很多种,我就挑几个重要的说一说。

首先看看IDLE状态,这是大部分时间下的状态。

初始化空闲时刻的AI

解析这部分代码:

每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没什么好说的)

初始化攻击AI

这里的代码简单来说是这样的:

验证目标合法性

当目标不能触及,以0.15(陆地)/0.6(水中)的速度追杀

攻击,冷却时间是20tick,攻击伤害为2

如果美西螈有繁殖意向,停止追杀

最后是PLAYING_DEAD,也就是装死的AI。

初始化装死的AI

这里的代码解析如下:

如果有繁殖意向,停止装死

接下来是PlayDead这个具体行为的解析:

PlayDead,装死行为的类

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

装死状态下的美西螈

装死开始,清除看向/走向的目标记忆,给予200tick的生命恢复1

装死前提:在水中或气泡柱中

装死状态中,美西螈不能成为任何生物的攻击目标

那么怎么触发装死呢?

受到伤害调用的方法

从此处代码得知,装死的条件是:

前提条件:不是在客户端进行计算、具有AI、伤害不能是因干燥受到的伤害,伤害不能溢出。

触发条件:生成的随机数小于受到的伤害,血量小于总血量的一半。

说完了行为,下面看看其他的特性:

美西螈在陆地上6000tick后会持续因为干燥掉血,每20tick掉2滴血。

判断在陆地上的空气供应

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

子代性状表现型判断

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

消除挖掘疲劳

在玩家杀死了美西螈的攻击目标之后,美西螈会以自身20格范围内寻找玩家,将玩家身上的挖掘疲劳效果清除,增加生命恢复时间100tick(没有则给予效果)

接下来有关于美西螈的攻击目标。普通状态下它们就会主动攻击鳕鱼等鱼类和鱿鱼(带有AXOLOTL_ALWAYS_HOSTILES标签)。

美西螈的攻击目标

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

美西螈在诱惑下的攻击目标

那么到这里美西螈的主要特性就说完了。(可以看出Mojang还没有开发完全,等一等吧,已经看到之后自然生成的方法了,条件是能看见天空的水中)

四.游戏规则playersSleepingPercentage

这种新的规则能在多人服务器下让部分玩家睡觉就可以跳过夜晚。

如果值为0,直接跳过;如果大于100,则永远不能跳过夜晚。

睡眠的代码实现的部分代码,其中调用的canSleepThroughNights是判断值是否大于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对本专栏中的错误指正


Minecraft 20w51a 新特性+代码分析的评论 (共 条)

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