From 3cddee2abb449db4597f66a55aa825936982a1f0 Mon Sep 17 00:00:00 2001 From: lyizai <3945107889@qq.com> Date: Wed, 19 Aug 2026 21:21:46 +0800 Subject: [PATCH] =?UTF-8?q?v1.2.2:=20=E4=B8=80=E6=AD=A5=E4=B9=8B=E9=9A=94?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E8=AF=AF=E5=88=A4=E4=B8=8D=E5=8F=AF=E8=BE=BE?= =?UTF-8?q?=E2=80=94=E2=80=94ChunkGoal.isInGoal=E5=9B=9E=E5=BD=92=E7=BA=AF?= =?UTF-8?q?=E4=BA=8C=E7=BB=B4(=E9=AB=98=E5=BA=A6=E7=BA=A6=E6=9D=9F?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=90=AF=E5=8F=91=E5=BC=8F=E8=BD=AF=E5=BC=95?= =?UTF-8?q?=E5=AF=BC)=EF=BC=8C=E6=A0=B9=E6=B2=BB=E8=BE=B9=E7=BC=98?= =?UTF-8?q?=E8=90=BD=E7=82=B9=E8=A2=AB=E7=A7=92=E5=88=A4=E4=B8=8D=E5=8F=AF?= =?UTF-8?q?=E8=BE=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autostore/client/bridge/ChunkGoal.java | 41 +++++++++---------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/src/main/java/autostore/client/bridge/ChunkGoal.java b/src/main/java/autostore/client/bridge/ChunkGoal.java index 5d7e6c1..1937819 100644 --- a/src/main/java/autostore/client/bridge/ChunkGoal.java +++ b/src/main/java/autostore/client/bridge/ChunkGoal.java @@ -7,16 +7,16 @@ import autostore.client.territory.ChunkPos; import baritone.api.pathing.goals.Goal; /** - * 以“到达目标区块内地表”为完成条件的寻路目标。 + * 以“到达目标区块内”为完成条件的寻路目标。 * - *
在二维“到达区块内”的基础上增加高度约束:目标为该区块内地表高度最高处 - * (用排除树叶的实体地表计算,避免把目标定到树冠上)。只要玩家脚下方块落在 - * 目标区块内、且高度不低于目标地表,即视为到达。
+ *完成条件为纯二维:只要玩家脚下方块落在目标区块内即视为到达。 + * 这样目标区块的可达性与平坦地表相邻区块一致,绝不会因一步之隔、贴边落点、 + * 或高度起伏被误判为目标不可达(CALC_FAILED 后秒切目标)。
* - *修复“寻路带玩家下到地下矿坑”:旧实现只判断 x/z 是否落在区块内、不限制 y, - * 于是玩家停留在区块内的地下洞穴也算“到达”,对后续开垦很麻烦。新增高度下限后, - * Baritone 会把终点引导到目标区块的地表可达处;若留在地下,y 远低于目标地表, - * 不会被判定为到达。
+ *“避免寻路下到地下矿坑、尽量走地表”改为在启发式中做软引导: + * 仅当玩家远低于该区块的地表高度(很有可能是下了矿洞)时,给 heuristic 叠加 + * 向上的加权,促使 Baritone 优先走地表。它不改变 isInGoal 的完成判定,因此 + * 不会像“高度硬约束”那样导致本可达的目标被判成不可达。
*/ public final class ChunkGoal implements Goal { @@ -29,12 +29,12 @@ public final class ChunkGoal implements Goal { /** 目标区块中心的方块 Z 坐标(用于启发式距离估算) */ private final int centerZ; /** - * 目标地表高度(方块 Y):目标区块内 16×16 各列 “排除树叶的实体地表” 的最高值。 - * ≤0 表示不施加高度约束(保留旧的纯二维行为)。 + * 目标地表高度(方块 Y):目标区块内 16×16 各列 “排除树叶的实体地表”高度的中位数。 + * 仅用于启发式软引导(避开矿洞);≤0 表示暂无法确定地表高度,跳过引导。 */ private final int targetY; - /** 高度容差:脚下方块高于目标地表 2 格内都视为到达,容忍从最高点轻微回落 */ - private static final int Y_TOLERANCE = 2; + /** 深度容差:低于目标地表超过该值才视为“很可能下了矿洞”,触发向上引导 */ + private static final int DEPTH_TOLERANCE = 6; public ChunkGoal(ChunkPos chunk) { this(chunk, -1); @@ -48,25 +48,22 @@ public final class ChunkGoal implements Goal { this.targetY = targetY; } - /** 判断玩家脚下方块是否落在目标区块内,且(设置高度约束时)不深于地表 - 容差 */ + /** 完成条件:纯二维——玩家脚下方块是否落在目标区块内 */ @Override public boolean isInGoal(int x, int y, int z) { - if (Math.floorDiv(x, 16) != this.targetX || Math.floorDiv(z, 16) != this.targetZ) { - return false; - } - // 高度约束:地下矿坑的 y 远低于目标地表,不会被误判为“已到达” - return this.targetY <= 0 || y >= this.targetY - Y_TOLERANCE; + 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; double h = Math.sqrt(dx * dx + dz * dz); - if (this.targetY > 0 && y < this.targetY - Y_TOLERANCE) { - // 垂直引导:还在地表以下时,越深加权越高,促使 Baritone 优先走地表而非洞穴 - h += (this.targetY - y) * 0.25; + if (this.targetY > 0 && y < this.targetY - DEPTH_TOLERANCE) { + // 软引导:还在目标地表下较深处(疑似矿洞),给予越深越高的小幅加权, + // 让 Baritone 倾向走地表,但不把它变成 isInGoal 的硬约束(避免误判不可达)。 + h += (this.targetY - y) * 0.1; } return h; }