使用带有 bukkit 的非实体块获取两个位置之间的距离

Get distance between two locations using non-solid blocks with bukkit

我的目标是让我的 bukkit 服务器上的玩家在没有墙的情况下只能听到彼此的声音。所以我的想法是使用(飞行)探路者(目标)获取 AsyncPlayerChatEvent 上消息的发送者与接收者(getRecipients())之间的距离,以便有一条路径(通过空气)到另一个玩家.如果没有办法或者路径太长,我会把收件人从列表中删除。

我目前拥有的:

    @EventHandler
    public void onAsyncPlayerChat(AsyncPlayerChatEvent e) {
        Player p = e.getPlayer();
        Location start = p.getLocation();
        if (start.getWorld() == null) {
            return;
        }
        PathfinderFlying pathfinder = new PathfinderFlying();
        World world = ((CraftPlayer) p).getHandle().getWorld();
        ChunkCache chunkCache = new ChunkCache(world,
                new BlockPosition(start.getX() - 500, 0, start.getZ() - 500),
                new BlockPosition(start.getX() + 500, 0, start.getZ() + 500)); //Dunno if this is correct
        // EntityInsentientImplementation is basically: EntityInsentientImplementation extends EntityInsentient with default constructor
        pathfinder.a(chunkCache, new EntityInsentientImplementation(EntityTypes.am, world));
        for (Player target : e.getRecipients()) {
            Location dest = target.getLocation();
            // How do I get the distance?
        }
    }

我已经尝试了 PathfinderFlying 中的函数 public int a(PathPoint[] var0, PathPoint var1) { 但这似乎 return 一个静态值 (26) 当 var0 是 发件人的位置,var1 是收件人的位置。

我正在使用 bukkit 1.17.1。

我正在研究如何找到到达特定位置的最佳方式。所以,我做了 BaritoneCalculator.

你应该这样做才能使用它:

GoalBlock goal = new GoalBlock(x, y, z); // create direction goal
BaritoneAPI.getProvider().getNewBaritone(p).getPathingBehavior().startGoal(goal);

现在,它将计算出更好的路径。

要获取路径,请使用:

BaritoneAPI.getProvider().getBaritone(p).getPathingBehavior().getPath();

或者,您也可以使用事件:PathCalculatedEvent

计算所有通过位置的完整代码(即您的问题):

PathingBehavior pathing = BaritoneAPI.getProvider().getNewBaritone(p).getPathingBehavior();
GoalBlock goal = new GoalBlock(x, y, z); // create direction goal
pathing.startGoal(goal); // start goal and calculate
Optional<IPath> optPath = pathing.getPath();
if(optPath.isPresent()) { // can be not found yet, use event to be sure
   int distance = pathing.get().positions().size() -1; // -1 to don't count current player position
   // now you have the distance
} else {
   // failed to find way
}

关于 readme 的更多信息(和更新)。