如何解决如何与箱子互动以打开它Minecraft 1.16.5
我目前坚持使用客户端 mod 在我的服务器上打开一个箱子。我想为我的客户发送数据包以与我指定的箱子进行交互。我已经在 1.8 中实现了这个目标,我可以这样做:
BlockPos chestPos; // I got this from somewhere else,not important.
p.sendQueue.addToSendQueue(new C08PacketPlayerBlockPlacement(
chestPos,(double)chestPos.getY()+0.5D < minecraft.getminecraft().thePlayer.posY + 1.7D ? 1:0,minecraft.getminecraft().thePlayer.getCurrentEquippedItem(),0.0F,0.0F));
p.swingItem();
这让我的播放器在给定的 BlockPos
处模仿了与我的胸部的互动。
现在我想把它翻译成 1.16.5 代码。我已经开始调查给定的方法,但我只能找到
ClientPlayerEntity player = minecraft.getInstance().player;
player.swingArm(Hand.MAIN_HAND);
相当于 1.8 代码的最后一行,但这只会触发手臂的动画。
我能找到的最好的替代 sendQueue
是 player.connection
,它是 ClientPlayNetHandler
的一个实例。这个类有大量的 handleXYZPacket(XYZPacket packet)
-方法,但没有一个看起来有用......
解决方法
我最终放弃了该帖子,并继续我的搜索。不过我确实找到了解决方案,所以就在这里。我还想说明一下,关于 1.16 数据包的网络上有 0 个文档,所以我希望这对将来的人有用。
我决定在某个时候调查 net.minecraft.network.play.client
包中定义的所有数据包,并找到了当时最接近解决方案的东西。我包含一个名为 CPlayerTryUseItemOnBlockPacket
的类,它似乎正是我所需要的。但是,起初我能找到的所有用法都需要一个 ServerPlayerEntity
,或者更确切地说是它的连接。最终虽然...
经过一个非常令人沮丧的小时后,我终于让它起作用了:
Minecraft.getInstance().player.connection.sendPacket(
new CPlayerTryUseItemOnBlockPacket(Hand.MAIN_HAND,blockRayTraceResult));
以下是我如何获得玩家当前正在查看的方块的 blockRayTraceResult:
public static BlockRayTraceResult getLookingAt() {
PlayerEntity player = Minecraft.getInstance().player;
World world = Minecraft.getInstance().world;
double rayLength = 100d;
Vector3d playerRotation = player.getLookVec();
Vector3d rayPath = playerRotation.scale(rayLength);
Vector3d from = player.getEyePosition(0);
Vector3d to = from.add(rayPath);
RayTraceContext rayCtx = new RayTraceContext(from,to,RayTraceContext.BlockMode.OUTLINE,RayTraceContext.FluidMode.ANY,player);
return world.rayTraceBlocks(rayCtx);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。