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

Minecraft 20w45a 新内容特性+代码浅析

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

在这周四,MC1.17的第一个快照20w45a发布了,加入了不少新东西。接下来我将会对几个新快照的方块/物品进行代码层解析。

一.铜制方块(包括铜块,切制铜块,铜楼梯,铜半砖及其变种)

铜矿在这一版本新加入,它的生成规律和铁矿一样,方块性质也与铁矿近似(包括硬度,爆炸抗性等),烧炼之后获得铜锭,之后可以合成铜块,进而可以合成铜制的其他方块。

这些铜制方块都有共同特性:会随时间流逝锈蚀(说白了就是绿了)

第一层是未锈蚀的,第二层打了蜡,再往上几层是绿了的,P.S.Mojang命名方块真是越来越长了

这些可锈蚀方块都是由同一个类提供的功能:

net.minecraft.world.level.block.ChangeOverTimeBlock(接口)及其子类

这些类里面都写了一个通过计划刻(scheduleTick)进行方块转变的,转变的时间是1200000+random.nextInt(768000)刻,也就是1200000-1967999刻(游戏内50-82天,)之后会锈蚀到下一阶段。锈蚀阶段为lightly_wethered->semi_weathered->weathered。而打过蜡的方块变种是直接以SlabBlock、StairBlock等类进行初始化的,没有这个特性。

ChangeOverTimeBlock(Interface)的代码,能清晰地看到变化的代码
二。


二.避雷针(lightning_rod)

避雷针由铜锭合成,能吸引128格【此处是1.17的值!在20w45a中这个值是64!】(欧几里得距离)之内的所有雷电

在数据保存中,避雷针被保存为POI(Points Of Interest)

说实在的,POI现在已经不只是村民使用的AI寻路判据了,下界传送门,蜂巢都用了POI。可是现在POI的所有类还放在村民村庄AI的包下面。Mojang你不打算换一个包吗??

在雷雨天时,ServerLevel会进行生成闪电束,生成时调用findLightningTargetAround这个方法寻找闪电束落点,而这个方法又调用了findLightningRod通过POI寻找最近的避雷针。这个就是它引雷的原理。同时,闪电束击中避雷针会调用避雷针的onLightningStrike方法,这个方法能让避雷针发出时长为8gt强度为15的红石脉冲。

findClosest是一个寻找指定点周围N格(欧几里得距离)最近POI的方法,它的具体代码如下:

这段代码可以看出,findClosest会将距离小于paramInt的最近POI返回,如果找不到返回empty。也就是说,在雷击时,系统以雷击点为球心,做半径为128格的球,取球内里球心最近的避雷针POI。若找到,则将位置设置为找到的点上方;若找不到,则继续其他雷击点判断条件。

而用引雷三叉戟击中避雷针也能引雷,不同的是这个击中之后不会产生红石信号。

LightningRodBlock#onProjectileHit,处理抛掷物的方法

三.紫水晶晶芽与紫水晶簇

晶芽与晶簇共用了一个类注册方块:AmethystClusterBlock。它们唯一的区别只有注册属性不同而已。

晶芽与晶簇的方块定义

通过这里的定义能够看到它们的方块亮度不同:晶簇5,大晶芽4,中晶芽2,小晶芽1。同时,它们音效不同。并且,它们之中只有晶簇可以以普通方式采集下来紫水晶,收获等级为铁镐。

通过研究AmethystClusterBlock类,发现了它也属于含水方块。

晶芽与晶簇在水中的效果

并且,从类里面得知,它可以以正常方式用活塞推动(方块生存条件是背后必须有附着方块)

通过这个活塞推动的原理,那么复制紫水晶也不是难事了(原理类似于铁轨与死珊瑚复制,同时紫水晶簇可以用来代替死珊瑚用于TNT复制机):

复制紫水晶的两种结构

并且根据Mojang的bug体制,我们甚至不需要那么多粘液块,一个粘液球都能复制紫水晶。

一个粘性活塞就能完成复制

不过复制紫水晶可能会被修复,所以说这个可能在之后的版本中被消除。

四.Budding Amethyst Block(方块暂时没有中文译名)

这个方块可以在它的四周生成紫水晶晶芽,随时间流逝最后变为晶簇,也是紫水晶唯一的可再生方式(除了特性)

Budding Amethyst Block

在某方向上生成晶芽的条件是:对应方向上的方块要么是空气,要么是水源方块,如果是水方块但不是水源方块,则拒绝生成。

紫水晶晶芽的生成条件

知道了生成条件,那么它什么时候生成呢?

生成晶芽/发育都是在随机刻(random tick)里面进行的,也就是,调整随机刻速度也会对它有影响,具体代码如下:

BuddingAmethystBlock#randomTick

对于紫水晶之后可能潜在的重要用处,这个方块我们都想让它掉落,但是不行,它定义中没有掉落物生成,包括精准采集也不能使它掉落。那么挖不动,我还推不动吗?抱歉,这个方块拒绝推动,推动直接破坏方块;也不能拉动,粘性活塞无法把它粘回来。

这就是没法推动的原因

对于这几种紫水晶方块,它们的性质和玻璃类似,无法进行强充能。

紫水晶类方块的红石特性


五.紫水晶洞的生成

紫水晶洞是以Feature(地形)生成而非Structure(结构),外层是凝灰岩,中层为方解石,里层是紫水晶类方块,由于这里的代码太繁杂,就不解释了。

六.蜡烛与蜡烛蛋糕

蜡烛及变种蛋糕都继承了AbstractCandleBlock类,都是有蜡烛粒子效果的方块。

蜡烛能在同一个方块堆叠四个,能用打火石点燃,亮度是3乘以蜡烛根数。在水中它不能被点燃,并且蜡烛熄灭时也有音效。

由于蜡烛的方块生存条件是任意的,所以我们能在蜡烛上面叠蜡烛,变成一个蜡烛塔。

而蜡烛蛋糕不同。首先,它不是一个含水方块;再者,它是没有对应物品的,必须要用蜡烛插到蛋糕上;最后,它能用打火石点燃,但是它的亮度是3。在插上蜡烛后再次点击则会让蜡烛掉落,变成普通蛋糕(并且你还咬了一口)。

蜡烛蛋糕有它的方块生存条件:方块下方必须是一个固体方块。

CandleCakeBlock类的一部分,这里可以看出即使是选取方块也不能获得蜡烛蛋糕物品,应用比较器检测将输出7(完整蛋糕的红石信号)

七.收纳袋

收纳袋能存储不同类型的一组物品(注意,按照不同物品的物品最大比例大小存储),但是没法放潜影箱(套娃破灭)

BundleItem#getWeight

它的NBT标签是“Items”,是一个列表,存储内部物品,可以通过give获得一个修改NBT的收纳袋。

八.遮光玻璃

这是一种玻璃的变种,不过与普通玻璃不同:它不会透过任何光。如果你用它堆了一个屋子,那么内部的亮度为0.

搭建小屋,亮度为0


并且和玻璃不同,它不是一个严格意义上的透明方块:生物在其中会产生窒息,无论是玩家还是生物。

生物和玩家都会在其中受到伤害

在代码中,它继承AbstractGlassBlock类,但是它在propagatesSkylightDown方法中返回false,也就是不能透光。

TintedGlassBlock类的定义

九.望远镜

望远镜是一个可以替代OptiFine的C键的物品(?),它可以将远处/近处的渲染影像放大。

使用望远镜看到的景象

在第三人称视角下,还有一个特殊动作。

Mojang你这动作认真的??

对于望远镜的使用效果来看,是一种Overlay,也就是可以更换外面那层黑圈的材质。事实上,这个代码在net.minecraft.client.gui.Gui的render方法里面写到了。如果我们要更换望远镜的Overlay,我们可以改掉“textures/misc/spyglass_scope.png”这个材质文件。

绘制望远镜黑圈Overlay的方法

十.经验球合并

这一版本中,经验球能合并了,也就意味着在产生大量经验球时,系统会合并经验球降低服务端卡顿。

测试去魔32767级锋利的剑,看来我也是神机了(

对于电脑不好的玩家来说,这个优化很好。至于它的实现,是服务端处理实体的时候调用了award函数进而进行经验球合并。

net.minecraft.world.entity.ExperienceOrb,这是经验球实体的类,这里是有关于合并的几个方法

十一.水下的铁轨

这一版本中,铁轨全被改为含水方块,这对许多玩家的运输和一些特殊需求(比如做红石机器水淹了一大片铁轨)

所有类型铁轨都变为含水方块了

但是在水中,矿车移动会变慢。根据代码,空气中最快速度是0.4,而到水中则降为0.2。并且在空气中矿车移动的阻力系数(阻力系数是在原速度上进行速度乘除,越大越快)是0.997(有乘客)或者0.96(无乘客),如果在水中,这个值还要再乘以0.95。所以在水中,速度降低会更快,也会更快停下来(在deltaMovement的水平方向速度小于0.03时矿车移动停止,具体可以参照前一篇专栏)

net.minecraft.world.entity.vehicle.AbstractMinecart#applyNaturalSlowdown,那个怪异的小数是浮点数误差


这些仍然是快照更新的一小部分(有可能有暗改,还有潜影贝的新特性我也不打算在这里说,我一次也没成功过-_||),不过这几项更新是比较重要的。期待下周的快照更新!

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

反混淆器:MCDynamicExchanger beta 6 (GitHub)

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

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

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

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