v1.1.8: 回退寻路逻辑至 1.1.3 并修复目标区块错位
回退:移除 1.1.4+ 引入的回城自救/接壤校验等寻路改动(导致玩家原地不动),恢复 1.1.3 的寻路行为。 修复错位:Baritone 自带 GoalXZ 容差为 0,精确到区块中心单格,中心不可达时玩家停在相邻区块造成目标错位与反复寻路。新增 ChunkGoal,完成条件改为「玩家脚下方块落在目标区块内」,与 playerChunk.equals(target) 判定一致。
这个提交包含在:
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* 本文件为 AutoStore 模组自定义的 Baritone 寻路目标。
|
||||
*/
|
||||
package autostore.client.bridge;
|
||||
|
||||
import autostore.client.territory.ChunkPos;
|
||||
import baritone.api.pathing.goals.Goal;
|
||||
|
||||
/**
|
||||
* 以“到达目标区块内”为完成条件的寻路目标。
|
||||
*
|
||||
* <p>修复“目标区块错位”问题:Baritone 自带的 {@code GoalXZ} 容差为 0,
|
||||
* 会要求玩家精确站在区块中心的单个方块上(如 {@code x*16+8, z*16+8})。
|
||||
* 一旦该方块不可达(被树、石头、水、建筑等占据),玩家会被停在区块边缘甚至
|
||||
* 相邻区块,导致玩家所在区块与目标区块错位、反复寻路。</p>
|
||||
*
|
||||
* <p>本目标把完成条件放宽为“玩家脚下方块落在目标区块内”,与控制器中
|
||||
* {@code playerChunk.equals(target)} 的判定完全一致,从而彻底消除
|
||||
* 中心点不可达带来的错位。</p>
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户