/* * 本文件由 autostore-1.0-SNAPSHOT.jar 反编译并整理而来(CFR 0.152), * 混淆名已替换为 Minecraft 1.21.4 Yarn 可读映射,并补充中文注释。 */ package autostore.client.bridge; import baritone.api.pathing.goals.Goal; import baritone.api.pathing.goals.GoalXZ; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; /** * 带高度偏好的区块中心寻路目标。 * *
到达判定与 Baritone 原生 {@link GoalXZ} 完全一致(水平到达目标区块中心即成功, * 不约束高度,避免旧版 ChunkGoal 因高度硬约束误判“不可达”); * 但启发式成本中加入高度项:y 越大启发成本越低(A* 更倾向走高处), * y 越低成本越高(对走低处施惩罚),从而实现“寻路优先往高处走”。
*/ @Environment(EnvType.CLIENT) public final class GoalXZAltitude implements Goal { /** 目标区块中心 X */ private final int x; /** 目标区块中心 Z */ private final int z; /** 高度偏好权重:每上升 1 格减少的启发成本;越大越明显偏向高处 */ private final double altitudeWeight; public GoalXZAltitude(int x, int z, double altitudeWeight) { this.x = x; this.z = z; this.altitudeWeight = altitudeWeight; } /** 到达判定与 GoalXZ 相同:水平坐标命中目标区块中心即算到达,不限制高度 */ @Override public boolean isInGoal(int x, int y, int z) { return this.x == x && this.z == z; } /** * 启发式成本 = 水平基础成本(复用 GoalXZ 的对角线切比雪夫估计) - 高度奖励。 * y 越高启发值越小(优先级越高),y 越启发值越大(惩罚);clamp 非负避免破坏 A* 排序。 */ @Override public double heuristic(int x, int y, int z) { double base = GoalXZ.calculate(x - this.x, z - this.z); double altitudeCost = this.altitudeWeight * y; return Math.max(0.0, base - altitudeCost); } }