我如何让《我的世界》玩家看一个街区

时间:2019-06-16 15:24:57

标签: java math vector delay minecraft

目前正在为我的世界编码我的mod。我想让玩家看x,y,z座标。我还希望能够在那些x,y,z坐标处单击该块(因此如果玩家靠近它,则将其断开)。

我遇到的另一个问题是我想遍历坐标/块坐标并查看并单击它们中的每一个,但是我需要在它们之间放置一个延迟,而不能使我的游戏停滞。

我尝试了一些已经在该论坛上建议的代码,但是Minecraft角色在正确的方向上看起来并不完美:

public void LookAt(double px, double py, double pz) {
        EntityPlayer me = Minecraft.getMinecraft().player;
        World world = me.world;
        int x = (int) me.posX;
        int y = (int) me.posY + 1;
        int z = (int) me.posZ;
        double dirx = x - px;
        double diry = y - py;
        double dirz = z - pz;
        double len = Math.sqrt(dirx * dirx + diry * diry + dirz * dirz);
        dirx /= len;
        diry /= len;
        dirz /= len;
        double pitch = Math.asin(diry);
        double yaw = Math.atan2(dirz, dirx);
        // to degree
        pitch = pitch * 180.0 / Math.PI;
        yaw = yaw * 180.0 / Math.PI;
        yaw += 90f;
        me.rotationPitch = (float) pitch;
        me.rotationYaw = (float) yaw;
    }

sorta上面的代码可以像上面所说的那样工作,但是当我从另一个角度/位置使用该方法时,它并不总是看相同的EXACT坐标。

对于我已经尝试使用Thread.sleep()的延迟,这导致了Minecraft Freezing。我也尝试过robot.delay(),(我使用机器人来模拟点击),但结果相同。当我不延迟时,不会冻结,但会跳到循环中的最后一组坐标,并且只会中断该一个块。

1 个答案:

答案 0 :(得分:1)

您可以使用Bukkit API简化插件代码。

如果您想让玩家看到障碍物,则需要使用:

Block b = player.getTargetBlock(new HashSet<Material>(), 100);
if (b.getState() instanceof Block) {
    // your code
}