/* * 本文件由 autostore-1.0-SNAPSHOT.jar 反编译并整理而来(CFR 0.152), * 混淆名已替换为 Minecraft 1.21.4 Yarn 可读映射,并补充中文注释。 */ package autostore.client.bridge; import baritone.api.BaritoneAPI; import baritone.api.IBaritone; import baritone.api.Settings; import baritone.api.pathing.goals.Goal; import baritone.api.pathing.goals.GoalXZ; import autostore.client.config.ExpansionConfig; import autostore.client.territory.ChunkPos; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; /** * Baritone API 封装(桥接层)。 * *
将模组对 Baritone 寻路机器人的调用集中在此类中,包括:应用寻路行为配置、 * 前往目标区块、取消寻路、查询寻路状态等。所有调用都做了空安全保护, * 当 Baritone 未加载时相关操作会安全地静默失败。
*/ @Environment(EnvType.CLIENT) public final class BaritoneBridge { /** * 将模组配置同步到 Baritone 的全局设置。 * * @param config 扩地配置 */ public void applyConfig(ExpansionConfig config) { Settings settings = BaritoneAPI.getSettings(); settings.allowSprint.value = config.allowSprint; settings.allowBreak.value = config.allowBreak; settings.allowPlace.value = config.allowPlace; settings.allowParkour.value = config.allowJump; settings.avoidance.value = config.avoidMobs; // 减少走入地下矿洞:限制无水源时的下落高度,避免掉进深坑/矿洞。 // 放宽到 10 格,仍允许穿越峡谷、下坡等正常地形,同时避免掉入深坑 settings.maxFallHeightNoWater.value = 10; // 轻微提高挖掘方块的额外代价,让寻路尽量绕行地面而非挖洞穿山, // 但不会阻止必要挖掘(高山、峡谷等仍可通行) settings.blockBreakAdditionalPenalty.value = 0.5; } /** * 让 Baritone 寻路前往指定区块的中心。 * * @param chunk 目标区块 */ public void pathTo(ChunkPos chunk) { IBaritone baritone = this.primary(); if (baritone == null) { return; } // 使用 GoalXZ 前往区块中心:Baritone 的 GoalXZ 自带约 10 格容差, // 只需到达区块中心附近即可,避免中心点不可达导致寻路卡死 baritone.getCustomGoalProcess().setGoalAndPath(new GoalXZ(chunk.centerBlockX(), chunk.centerBlockZ())); } /** 强制取消当前寻路任务。 */ public void cancel() { IBaritone baritone = this.primary(); if (baritone == null) { return; } baritone.getPathingBehavior().forceCancel(); } /** * 发送服务器聊天命令(如 /u return 回城),command 参数不含前导斜杠。 * 用于寻路超时后的回城自救,避免玩家被困在地下矿洞等位置。 */ public void sendCommand(String command) { MinecraftClient client = MinecraftClient.getInstance(); if (client == null || client.player == null || client.getNetworkHandler() == null) { return; } client.getNetworkHandler().sendChatCommand(command); } /** @return 当前是否正在寻路 */ public boolean isPathing() { IBaritone baritone = this.primary(); return baritone != null && baritone.getPathingBehavior().isPathing(); } /** @return Baritone 是否可用(已加载并存在主实例) */ public boolean isAvailable() { return this.primary() != null; } /** * 获取 Baritone 主实例;加载失败或异常时返回 null。 * * @return 主 Baritone 实例,或 null */ private IBaritone primary() { try { return BaritoneAPI.getProvider().getPrimaryBaritone(); } catch (Throwable ignored) { return null; } } }