使用带有 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 的更多信息(和更新)。
我的目标是让我的 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 的更多信息(和更新)。