/* * 本文件为 AutoStore 模组自定义的 Baritone 寻路目标。 */ package autostore.client.bridge; import autostore.client.territory.ChunkPos; import baritone.api.pathing.goals.Goal; /** * 以“到达目标区块内”为完成条件的寻路目标。 * *
修复“目标区块错位”问题:Baritone 自带的 {@code GoalXZ} 容差为 0, * 会要求玩家精确站在区块中心的单个方块上(如 {@code x*16+8, z*16+8})。 * 一旦该方块不可达(被树、石头、水、建筑等占据),玩家会被停在区块边缘甚至 * 相邻区块,导致玩家所在区块与目标区块错位、反复寻路。
* *本目标把完成条件放宽为“玩家脚下方块落在目标区块内”,与控制器中 * {@code playerChunk.equals(target)} 的判定完全一致,从而彻底消除 * 中心点不可达带来的错位。
*/ public final class ChunkGoal implements Goal { /** 目标区块 X 坐标 */ private final int targetX; /** 目标区块 Z 坐标 */ private final int targetZ; /** 目标区块中心的方块 X 坐标(用于启发式距离估算) */ private final int centerX; /** 目标区块中心的方块 Z 坐标(用于启发式距离估算) */ private final int centerZ; public ChunkGoal(ChunkPos chunk) { this.targetX = chunk.x(); this.targetZ = chunk.z(); this.centerX = chunk.centerBlockX(); this.centerZ = chunk.centerBlockZ(); } /** 判断玩家脚下方块是否落在目标区块内 */ @Override public boolean isInGoal(int x, int y, int z) { return Math.floorDiv(x, 16) == this.targetX && Math.floorDiv(z, 16) == this.targetZ; } /** 启发式:到目标区块中心的水平欧几里得距离(可采纳,保证寻路效率) */ @Override public double heuristic(int x, int y, int z) { double dx = x - this.centerX; double dz = z - this.centerZ; return Math.sqrt(dx * dx + dz * dz); } }