问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Minecraft 1.21地狱门传送机制深度解析

创作时间:
作者:
@小白创作中心

Minecraft 1.21地狱门传送机制深度解析

引用
1
来源
1.
https://www.bilibili.com/opus/1012887257034522676

Minecraft 1.21版本对地狱门传送机制进行了重大更新,不仅改变了实体创建新门的方式,还调整了骑乘实体通过门的规则。本文将深入解析新版地狱门的传送逻辑,并探讨其与旧版本的区别,以及在实践中可能遇到的各种问题。

地狱门的完整传送逻辑

  1. 由实体传送瞬间坐标决定对面搜索的方块起始点坐标
  2. 如果搜索半径内有地狱门,传送到直线距离最近且最高的
  3. 没有的话按照水平东,南,西,北方向螺旋向外搜索一个3*4平台,在上面放置地狱门,一个高度失败就找次近的Y继续螺旋搜索
  4. 如果还没有,放宽条件变成1*4,同上
  5. 全部失败,就在特定高度强行生成一个悬空门

我们以地狱传送到主世界为例,反方向就是*8和/8的区别

最最开始,当实体碰到门并且确定可传送后(这里1.21-玩家和1.21+所有实体的区别不大,可以一并概括),首先游戏会调用实体的浮点数坐标,直接乘以八并且向下取整得到int,即对应主世界搜索“起始点”方块坐标

net\minecraft\world\level\block\NetherPortalBlock.java

接下来获取±128正方形范围内的所有传送门POI,丢到一个List中,按第一优先级:初始点的直线距离排序,第二优先级:Y高度倒序排列,决定到底从哪个门出来(也就是高的优先)

这也就验证了跨纬度药水史莱姆农场在地狱门数量多的时候奇卡无比,只拿First位置,但是依然有大量的地狱门片片都放到了这个List做无谓的排序,每个实体都需要进行一次遍历+排序,在上千万的实体+几百个地狱门片片的情况下计算量颇为夸张,考虑到POI中的存储本身就是离散的,这个还真没有什么特别好的简化方法


演示的是主世界往地狱的16范围,简单易懂

第二步

没有已有的门,以起始点向外,按照东,南,西,北挨个步进长度的方式螺旋搜索半径16格以内的方块,(这一部分有点辣眼睛,定量的就不看了)如果这个方块A是实心方块且其上方四格为可替换(空气和花草),继续后续判断

此时判断中心从A变更为其上方的红色玻璃,按照入口门的朝向选择两种出口门生成方式,依次判定白色玻璃范围内是可替换+底座黑色玻璃是3*4实心方块


根据方向,对应的放置原点和检测范围,紫色玻璃即是最终放置的传送门

值得注意的是底座方块只需要isSolid,这意味着这应该是原版中除了无头活塞外唯一一种能拆掉基岩的方法


如图:什么Solid方块都能吞

第三步

如果这个也不符合,使用次级要求,底座只需要1*4实心方块即可,搜索同上

第四步

前三步都失败了的话,

如果进入位置低于海平面(70),在Y=70高度对应位置生成门

高于世界最高高度i-9,在i-9生成门,

否则按进入高度生成

悬空门会多出4块黑曜石,和其他的生成方式区别还是很大的


一个经典的悬空门

新旧地狱门的区别

由于地狱门方块本体全部重写了逻辑,直接拿两版对比代码比较辣眼睛,这里就给出一些关键性的内容

首先是一些已经有的结论,地狱门传送主要调用两个方法findClosestPortalPosition寻找最近的地狱门和createPortal创建新地狱门,

在1.20-,创建地狱门只在玩家实体ServerPlayer处调用,而寻找地狱门的方法使用之前先要判定是否可使用传送门,这里也把骑乘实体排除掉了

但是到了1.21,所有的Entity都可以在检查合法后调用这两个方法,这也包括有乘客的载具,**于是所有实体(玩家,掉落物,投掷物,生物和骑乘混合)全都可以使用门+创建门,**但是值得注意的是这里只有“根载具”碰到传送门才会传送,乘客碰到并不会(所以还是可以有实体卡在各种传送门内部的)


net\minecraft\world\level\portal\PortalForcer.java

另外这里还有一个抽象bug,1.20-当玩家从边境角外面传送回主世界,执行到地狱门逻辑的第四步时,客户端会直接被踢出游戏,因为1.20的createPortal一开始检测到在世界边境外就会一路往下跳出if,直接摆烂不生成地狱门了,日志输出“Unable to create a portal, likely target out of worldborder”,所以麻将是真的以为这帮恐怖的玩家不会到边境外面去吗

1.21终于把位置扭回到边境角了

一些常见的问题

堆门猪人塔的串门

已经很清楚了,麻将在地狱门搜索逻辑上一点没变,只是能用这些逻辑的对象增加了,堆门塔串门100%是做错或者服务端不是Vanilla,所以要是再有群友问为什么猪人塔门对不准就把这个文档扔出去就好了

以手里的存档为例,手把手算

两个角落的方块坐标是

(-32,48),(-64,16)

那么上方生成的猪人实体坐标是

(-31.5,48.5)(-63.5,16.5)

按照乘以8向下取整,那么是

(-252,388)(508,132)

注意到两者正好都差了256格,由于搜索半径是加减128格,因此坐标计算是0容错的,也就是说只能在主世界(-380,256)的位置有传送门方块能保证不串门,偏一格就寄,这个计算过程也就是堆门塔正中心位置公式的本质

地狱门黑曜石机

上面的搜索“游走”基本说的很清楚了,

如果是基于第二步,就是345的空间需求,给地狱门3*4的实心地板+上方4高的空间,并确保对坐标的时候尽量靠近生成原点,这样地狱门总会生成在这个平台上,无需环境处理,如果地狱门走远了可以核对一下平台上多余的辅助方块有没有拆掉

而追求高效率,第二步地板的空间需求太苛刻且一只凋零的收益很低,就会使用第四步+堆叠,这样的话黑曜石机周围16*16就必须是类空置域,且此时地狱门的生成位置和掉落物进入门时候的坐标高精度对齐,不能有投掷器投入这种随机动量

因此开荒黑曜石机和极限效率的两种原理上有着本质的不同

弱加载处死

这个其实和主题有点偏了

映射关系

大致来说,地狱门添加加载票是在搜索过程的,添加给“距离搜索原点最近的传送门方块对应的区块”,即起始点如果在钻石块所在的区域,那么在绿色羊毛的位置添加加载票,

而生物从门的哪个位置出来,是取决于“他在这个门里面的相对位置”,于是位于左边,就会从超长门的左边出来,直接跨两个区块出现在弱加载的位置,

因此结合刚才的原理,如果是主世界往地狱传送,就是以最右边地狱门方块作为搜索优先点位的,和他平齐往外延伸128*256的矩形范围,都能享受弱加载处死,所以弱加载史莱姆岩浆怪架构什么时候出(有了的话欢迎考古)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号