Open Hylberra opened 3 weeks ago
游戏客户端在每帧渲染中都会使用一条“射线”来探测交互点的位置,这条射线从玩家眼睛出发,沿着玩家视线方向,最终到达你的准星所指的位置,当然也可能因距离太远而什么也探测不到。探测结果会存储在 Minecraft#hitResult
中。
对于大多数物品,在交互时会直接使用上述探测结果来计算交互(放置)位置。客户端会将这个位置告诉服务端。服务端只会简单地检查交互位置与玩家间的距离(如果允许千里之外给人木房子放岩浆就不妙了),而不会检查玩家是否真的正在用准星指着那里。
在本模组的第三人称视角下,无论玩家看向哪里,你都应当随时可以与准星所指的地方交互,只要那里别离玩家太远。因此我的实现方式是:修改上述探测射线的方向,使其朝向当前相机准星所指的位置,这样一来,玩家实体就可以在第三人称下直接将物品放在身边任何地方,而无需每时每刻都盯着相机准星所指的位置了。
但有些物品比较特殊,例如青蛙卵和睡莲,它们必须被放置在水面,这意味着探测射线不应当忽略水体,而上面所说的计算是忽略水体的。因此 mojang 为这类物品实现了专门的探测方法。这些物品的交互点探测不仅在客户端计算,也会在服务端计算,最终会以服务端计算的探测结果为准。而本模组目前是纯客户端的,并不会修改服务端逻辑。因此游戏服务端仍然会按照玩家的视线方向来探测,造成这类物品无法被放置在玩家期望的位置上。
对于这个问题,我想出了三种解决方法:
然后我选择了最简单的方法,会自动瞄准的物品包括:
#minecraft:boats
minecraft:bucket
minecraft:water_bucket
minecraft:lava_bucket
minecraft:cod_bucket
minecraft:salmon_bucket
minecraft:tropical_fish_bucket
minecraft:pufferfish_bucket
minecraft:axolotl_bucket
minecraft:tadpole_bucket
minecraft:lily_pad
minecraft:frogspaw
所以本质上是因为检测方式不同使得它恰好可以正常放置了...
如果说为模组添加服务端支持,告知服务端当前相机位置,服务端根据相机位置来探测——将以上流程应用于所有方块放置和交互,是否可以修复clockwork环境下本模组不按预期工作的问题
我其实本来想把这个交到bug或者模组冲突然而这个难绷程度我只能用特性来称呼了:
我在测试2.2.0-beta-1有没有提供对clockwork的支持的时候,刚好随手打开的一张出生点在大洋中间的地图 周围是茫茫大洋,为了测试在有clockwork的情况下第三人称能不能放方块,我只能拿出了睡莲,这时候我注意到视角变成了诡异的强制瞄准状态——尽管我并没有按下它
然后我试了一下能不能在第三人称状态下正常放置
它 能 放 上 去 它能朝着任何一处你瞄准的水面放置上去
以至于我一度以为有clockwork时第三人称没法正常放方块的问题已经修好了然后欢呼雀跃了一阵 几分钟后发现只有睡莲是正常的...
虽然不懂为什么,但 It just works
然后我测试了一下,但无论我怎么使用强制瞄准模式都不能在其他类型的方块上复现这个特性 只有自带强制瞄准的睡莲可以!
现在我琢磨过来了,导致拿起睡莲会进入强制瞄准状态的这个未知特性,也正好导致了它可以在有clockwork的情况下正常放置方块 完全不知道为什么但就是恰好正常了 IT JUST WORKS 草.png