MC1.13.2 刷怪机制详细讲解
红石科技搬运组
编辑于 2019年08月19日 14:02

        之前收到私信,有人对《剖析MC》第十集中的刷怪机制讲解存在疑问。我看了一下,的确视频中讲解的不是很清晰,并且存在少量错误。所以在本篇专栏中,会对刷怪机制进行更加详细的解释,也算作对视频内容的一种补充(视频:av61867160)

一些前言:

        1. 本专栏主要是科普性质的,大佬们还请忽略

        2. 由于《剖析MC》中是1.13.2 Java版本,所以这里讨论的也是1.13.2版本的刷怪机制

        3. 本专栏只讨论刷怪机制,不包含水生生物、环境生物、动物、溺尸、幻翼等

        4. 水平有限,如有疏漏,欢迎在评论区指出


刷怪每gt都在进行,以下内容是1gt中刷怪算法的具体实现方式

一、 选取区块

1. 计算总区块(刷怪上限用)

        游戏首先选中所有不在旁观者模式的玩家,对每个玩家取其周围的17×17区块,计算总区块数量为A(多个玩家同时加载的区块只计数一次)

2. 选取可刷怪区块

        对所有不在旁观者模式的玩家,取每个玩家周围的15×15区块。这些区块中,在世界边界以内并且被玩家加载的区块,都符合刷怪条件,加入可刷怪区块列表L中(同样,重复区块只计一次

二、 条件确认

1. 确认不在和平模式

        在和平模式则会直接中断本gt刷怪

2. 确认没有达到刷怪上限

刷怪上限 = A×70/(17^2)

        由于这个公式,多人服务器中,玩家相距越远刷怪上限越大。只要当前怪物数量小于等于刷怪上限,就可以执行后面的刷怪步骤。

三、 刷怪初始点选取

1. 坐标选取

        对所有列表L中的区块,都执行如下操作(开始遍历):

        对每个区块,随机选取区块中的一组X轴和Z轴坐标,如图2-1,其中红色玻璃表示可能选取的坐标。

图2-1

        选中坐标后,在该坐标位置中,找到最高的遮光方块,在Y=0此方块Y值+1中,随机选取一个高度,作为刷怪初始点的高度。下图2-2图2-3中,红色方块表示可能选取到的方块高度。

图2-2

图2-3

        按如上方法选中初始方块后,会检查其是否是“普通方块”。如果是“普通方块”,则直接结束此区块的刷怪。这里的“普通方块”需要满足的条件有:a.方块的材料是遮光的 b.是完整方块 c.不能提供能量(如红石块可以提供能量)

四、 刷怪

1. 三组刷怪尝试

        刷怪初始点确认之后,游戏会围绕初始点进行三组刷怪尝试(三次“成群刷出”)。每组刷怪包含一到多次刷怪尝试(通常为4)。每组中刷怪尝试的数量与怪物种类有关,通常在“群最小数量”到“群最大数量”之间随机选取,具体数据请见专栏结尾处的附录-1

2. 单次刷怪尝试

2.1 位置游走

2.1.1 游走开始位置

        如果是组中的第一次刷怪尝试,则从刷怪初始点开始游走。如果是组中的第2-n次刷怪尝试,则从上次刷怪尝试位置开始游走,如下图4-1

图4-1 单组游走示意图(红色为刷怪初始点,绿色为选中刷怪位置)

2.1.2 游走方法

        游走只在X与Z轴上移动,Y轴高度不变。具体的,每个轴移动-5到5格,公式如下:

移动 =(随机0到5)-(随机0到5)

2.1.3 游走概率

        可以看到,游走时并不是简单的调用随机函数生成-5到5之间的数字,而是用两个随机数做差。这种方法导致概率分布不均,靠近0的概率比+5/-5大,具体概率分布如下图4-2

图4-2

        不过这只是单次单轴移动的概率,不能反映实际情况。所以我们这里假设每组刷怪都进行4次刷怪尝试,并记录所有刷怪尝试的坐标,运行一千万次后,我们可以得到如下概率热图4-3

图4-3

        因为4×5=20,所以可刷怪范围是以刷怪初始点为中心的41×41格,可以看到概率分布呈圆形,越靠近刷怪初始点概率越大。

2.2 距离判定(1)

        游走后我们可以得到新的刷怪尝试位置,游戏会选取与此位置最近的玩家,判断距离是否大于24格,同时距离出生点大于等于24格。如果满足则继续刷怪,否则直接进行下一次游走。

2.3 刷怪种类

        如果在之前的游走中,由于距离判定不通过等原因,还没有取得这组怪的种类,或者这是本组中的第一次游走。那么这一步中,游戏会获取当前刷怪尝试位置所处的群系,根据群系的怪物权重随机选取一种类型的怪来刷(如僵尸、骷髅等)。一组刷怪尝试只能刷同一种怪,不过每区块的三组尝试之间可以不同。如果此坐标为蘑菇岛,则会直接中断,进行下一次游走。

2.4 刷怪条件判断(1)

        刷怪前首先会对选中位置以及其上下两格进行条件判断,如果不满足会跳到下次游走,这几个方块的位置如下图4-4所示:

图4-4

2.4.1 选中位置下方一格条件

        脚下一格需要有“完整上表面”,这里的“完整上表面”对于一般的方块而言需要:a.方块材料遮光 b.方块完整。对于台阶,半砖等特殊方块有单独设置,如上半砖也算有“完整上表面”。同时基岩屏障方块也被特殊排除在外,如果下方一格是基岩/屏障,也不满足条件。

2.4.2 选中位置以及上方一格条件

        选中的方块和选中方块上方一格需要满足:a.不是“普通方块”(与上文定义不同)(上文使用“isNormalCube”这里使用“isBlockNormalCube”) b.不能提供能量 c.没有液体 d.不是铁轨。这里的“普通方块”需要满足:a. 方块完整 b.有碰撞体积

2.5 距离判定(2)

        怪物需要满足距离最近的玩家小于等于128格或不能消失,才可以继续刷出,否则跳到下次游走。

2.6 刷怪条件判断(2)

2.6.1 光照损失

        这里只讨论普通怪物的光照条件,不包含一些特例,如史莱姆等。

2.6.1.1 天空光照损失

        天空光照需要满足如下条件才能继续刷怪:

(天空光照)<=(随机0-31)

        通过这个公式,我们可以计算出不同天空光照下通过这个条件的成功率,如下图4-5所示

图4-5

2.6.1.2 普通光照损失

        对于普通判断,会选取天空光照方块光照较高的一个。如果当前天气为雷雨,则将这个亮度再减去10。然后判断如下条件:

(亮度)<=(随机0-7)

        我们可以得到,相应亮度的成功率如下图4-6:

图4-6

2.6.2 特殊条件

        如史莱姆、恶魂、尸壳等怪物,有特殊的生成条件需求,由于数量很多,这里不做具体展开了。此处还排除了生物下方为岩浆块的情况,所以岩浆块上也不能刷怪。

2.6.3 碰撞条件

        在这个条件判断中,游戏会检查要刷的这种怪物碰撞箱,是否与其他方块/液体/实体存在碰撞。如果存在碰撞,则会直接中断,跳到下一次游走。

2.7 正式刷怪

        通过上文中所有的判断之后,游戏终于可以在当前游走选中位置刷出一只怪了。

2.8 单区块上限判断

        刷怪完成后,会进行单区块刷怪上限检查。只要当前区块这一gt中刷出怪物的总数量大于等于当前怪物在这个区块中的单区块上限,就会直接终止当前区块的刷怪,跳转到下一区块刷怪。

        这看似是一个很简单的机制,然而这个机制会导致一个问题。我们知道单区块中有3组刷怪尝试,每组尝试可以刷不同类别的怪物。而这里的单区块上限是比较这个区块刷出的总数,与当前刷怪类别的单区块上限

        也就是说,我们假设在这个区块的第一组刷怪尝试中,首先刷出了2只怪物A,在第二组尝试中刷出了两只怪物B,这时区块内刷出总数达到了怪物B的上限4,哪怕怪物A的上限是6,也不能再刷怪了。

        然而实际上刷怪塔不会遇到这种问题,因为常见怪物的单区块上限基本都是4(见附录-1),动物塔之类的可能才会有影响。

3. 循环

        如果本组刷怪中还有游走次数没有用完,则跳转到(四、2.)继续游走

        如果当前刷怪组的所有游走次数都已经用完,则开始下一刷怪组的刷怪,跳转到(四、1.)的下一组,重新开始游走。

        如果当前区块所有三组的所有游走次数都用完,则跳转到(三、1.)的下一个区块,继续刷怪。

        直到所有区块刷怪完毕本gt刷怪正式结束

Q&A

1. 游走是否可以跨越区块?

        可以,4×5=20,最多距离刷怪初始点20格,可跨越区块边界。不过每一gt中每个区块只有唯一的一个刷怪初始点

2. 为什么刷怪总数有时会超过上限?

        通过上文可以看出,刷怪上限的检查在开始遍历区块进行刷怪之前。而刷怪循环是每gt运行一次。所以如果上一gt还没有超过刷怪上限,这一gt就可以进行一次完整刷怪循环。所有可刷怪区块都会进行3组刷怪尝试,这时是不检查刷怪上限的(视频中MethodZz说错了)。直到这一gt的所有刷怪结束,下一gt刷怪开始时才会检查上限。所以多出的部分就是单gt中刷出的怪。

3. 为什么有的刷怪塔会使用红石块?

        由上文的刷怪条件可以看出,“普通方块”等判定特殊标明了排除可提供能量的方块,所以红石块对刷怪的影响小,加上它的一些其他特性,在某些条件下有奇效(如守卫者农场)。

4. 刷怪塔屋顶到底需要延伸多少格?

        通过文章,我们可以看出,游戏只有在真正刷怪时才会检查亮度初始刷怪点不受亮度影响。所以对于亮度而言,我们只需要确保农场可刷怪位置亮度为0就可以了。而多余的屋顶纯粹是为了提高农场周围方块的可刷怪高度,即提高“刷怪初始点”可能出现的高度。所以最多延伸20格就足够了。

5. 我在刷怪塔上方做存储系统会不会影响效率?

        只要使用了遮光方块会影响,不过只会影响放了遮光方块的坐标不是整个区块。具体的,会影响“刷怪初始点”的选取减低选中可刷怪Y值的可能性

附录-1

生物生成参数

        因为我懒得挨个查看源码了,所以本数据摘自gnombon的视频的17:44(https://youtu.be/ckhe8ws-a4w 或 av32031679)注意,上文中的部分刷怪条件均以陆地怪物为标准不适用于表格中的溺尸等水中生成的生物。不过如果看附录-2中的代码可以得知,动物和水生生物等一定程度上和刷怪共用一个函数,所以“最大/小群大小”以及单区块上限等参数同样适用。这里因为我没有深入阅读,所以不做进一步讲解。

附录-2

        如果你看完了这些,还闲的无聊的话,可以看看下面这份刷怪源码,这是游戏刷怪的主函数(此函数每gt运行一次),里面包含了我自己添加的注释(如果有错的话别打我)。推荐使用电脑/手机下载图片后放大观看。

刷怪算法主函数+中文注释

撰写——hiback

十分感谢CCS_Covenant在百忙之中帮忙审阅专栏

2019/08/09