微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何与箱子互动以打开它Minecraft 1.16.5

如何解决如何与箱子互动以打开它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 代码的最后一行,但这只会触发手臂的动画。

我能找到的最好的替代 sendQueueplayer.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 举报,一经查实,本站将立刻删除。