Baritone攀爬机制:MovementAscend与垂直移动

【免费下载链接】baritone cabaletta/baritone: 是一个用于 Minecraft 的开源 Java 客户端,具有多样的游戏模式和游戏修改功能,可以用于 Minecraft 游戏的自定义和修改。 【免费下载链接】baritone 项目地址: https://gitcode.com/gh_mirrors/ba/baritone

在Minecraft自动化路径规划中,垂直移动是地形导航的关键挑战。Baritone作为开源Java客户端,通过MovementAscend类实现了高效的攀爬机制,解决了玩家在垂直空间中的移动难题。本文将深入解析这一核心功能的实现原理与应用场景。

核心实现类与架构

Baritone的攀爬功能主要通过MovementAscend类实现,该类继承自抽象基类Movement,位于路径规划模块中:

MovementAscend专注于处理垂直向上的移动场景,如方块攀爬、垂直跳跃等动作,通过精确的状态管理和成本计算,实现了高效的垂直导航。

成本计算机制

攀爬的核心在于准确计算移动成本,MovementAscend通过calculateCost方法实现这一功能:

public static double cost(CalculationContext context, int x, int y, int z, int destX, int destZ) {
    BlockState toPlace = context.get(destX, y, destZ);
    double additionalPlacementCost = 0;
    if (!MovementHelper.canWalkOn(context, destX, y, destZ, toPlace)) {
        additionalPlacementCost = context.costOfPlacingAt(destX, y, destZ, toPlace);
        if (additionalPlacementCost >= COST_INF) {
            return COST_INF;
        }
        // 检查是否可替换目标方块
        if (!MovementHelper.isReplaceable(destX, y, destZ, toPlace, context.bsi)) {
            return COST_INF;
        }
        // 检查是否有放置位置
        boolean foundPlaceOption = false;
        for (int i = 0; i < 5; i++) {
            int againstX = destX + HORIZONTALS_BUT_ALSO_DOWN_____SO_EVERY_DIRECTION_EXCEPT_UP[i].getStepX();
            int againstY = y + HORIZONTALS_BUT_ALSO_DOWN_____SO_EVERY_DIRECTION_EXCEPT_UP[i].getStepY();
            int againstZ = destZ + HORIZONTALS_BUT_ALSO_DOWN_____SO_EVERY_DIRECTION_EXCEPT_UP[i].getStepZ();
            if (MovementHelper.canPlaceAgainst(context.bsi, againstX, againstY, againstZ)) {
                foundPlaceOption = true;
                break;
            }
        }
        if (!foundPlaceOption) {
            return COST_INF;
        }
    }
    // 检查上方掉落方块
    BlockState srcUp3 = context.get(x, y + 3, z);
    if (srcUp3.getBlock() instanceof FallingBlock && 
       (MovementHelper.canWalkThrough(context, x, y + 1, z) || 
       !(context.get(x, y + 2, z).getBlock() instanceof FallingBlock))) {
        return COST_INF;
    }
    // 检查攀爬方块或藤蔓
    BlockState srcDown = context.get(x, y - 1, z);
    if (srcDown.getBlock() == Blocks.LADDER || srcDown.getBlock() == Blocks.VINE) {
        return COST_INF;
    }
    // 计算步行成本
    boolean jumpingFromBottomSlab = MovementHelper.isBottomSlab(srcDown);
    boolean jumpingToBottomSlab = MovementHelper.isBottomSlab(toPlace);
    // ... 步行成本计算逻辑
    return totalCost;
}

成本计算考虑了多种因素:

  • 方块放置成本(如需放置方块)
  • 掉落方块风险评估
  • 攀爬方块/藤蔓特殊处理
  • 台阶方块跳跃惩罚
  • 灵魂沙/岩浆块等特殊方块处理

状态更新与执行流程

updateState方法负责处理攀爬过程中的状态管理,实现了从准备到完成的完整生命周期:

public MovementState updateState(MovementState state) {
    if (ctx.playerFeet().y < src.y) {
        return state.setStatus(MovementStatus.UNREACHABLE);
    }
    super.updateState(state);
    if (state.getStatus() != MovementStatus.RUNNING) {
        return state;
    }
    
    if (ctx.playerFeet().equals(dest) || ctx.playerFeet().equals(dest.offset(getDirection().below()))) {
        return state.setStatus(MovementStatus.SUCCESS);
    }
    
    BlockState jumpingOnto = BlockStateInterface.get(ctx, positionToPlace);
    if (!MovementHelper.canWalkOn(ctx, positionToPlace, jumpingOnto)) {
        ticksWithoutPlacement++;
        if (MovementHelper.attemptToPlaceABlock(state, baritone, dest.below(), false, true) == PlaceResult.READY_TO_PLACE) {
            state.setInput(Input.SNEAK, true);
            if (ctx.player().isCrouching()) {
                state.setInput(Input.CLICK_RIGHT, true);
            }
        }
        if (ticksWithoutPlacement > 10) {
            state.setInput(Input.MOVE_BACK, true);
        }
        return state;
    }
    MovementHelper.moveTowards(ctx, state, dest);
    
    // 处理岩浆块潜行
    state.setInput(Input.SNEAK, Baritone.settings().allowWalkOnMagmaBlocks.value && jumpingOnto.is(Blocks.MAGMA_BLOCK));
    
    // 台阶方块跳跃逻辑
    if (MovementHelper.isBottomSlab(jumpingOnto) && !MovementHelper.isBottomSlab(BlockStateInterface.get(ctx, src.below()))) {
        return state;
    }
    
    // 跳跃时机判断
    if (Baritone.settings().assumeStep.value || ctx.playerFeet().equals(src.above())) {
        return state;
    }
    
    // 距离判断与跳跃执行
    int xAxis = Math.abs(src.getX() - dest.getX());
    int zAxis = Math.abs(src.getZ() - dest.getZ());
    double flatDistToNext = xAxis * Math.abs((dest.getX() + 0.5D) - ctx.player().position().x) + 
                           zAxis * Math.abs((dest.getZ() + 0.5D) - ctx.player().position().z);
    double sideDist = zAxis * Math.abs((dest.getX() + 0.5D) - ctx.player().position().x) + 
                      xAxis * Math.abs((dest.getZ() + 0.5D) - ctx.player().position().z);
    
    if (flatDistToNext > 1.2 || sideDist > 0.2) {
        return state;
    }
    
    return state.setInput(Input.JUMP, true);
}

状态机管理流程:

  1. 位置检查:验证玩家是否处于有效起始位置
  2. 目标判断:检查是否到达目标位置
  3. 方块放置:如需放置方块辅助攀爬,执行放置逻辑
  4. 移动控制:调用MovementHelper.moveTowards实现基本移动
  5. 特殊方块处理:对岩浆块等特殊方块应用潜行状态
  6. 跳跃时机:根据距离判断决定最佳跳跃时机

头部碰撞检测

为避免攀爬过程中头部碰撞方块,headBonkClear方法实现了精确的碰撞检测:

public boolean headBonkClear() {
    BetterBlockPos startUp = src.above(2);
    for (int i = 0; i < 4; i++) {
        BetterBlockPos check = startUp.relative(Direction.from2DDataValue(i));
        if (!MovementHelper.canWalkThrough(ctx, check)) {
            return false;
        }
    }
    return true;
}

该方法检查玩家头部上方四个方向的方块状态,确保攀爬路径通畅,有效避免了"撞头"导致的攀爬失败。

实际应用场景

MovementAscend在多种游戏场景中发挥关键作用:

  1. 自然攀爬:自动识别方块并进行攀爬动作
  2. 垂直建筑导航:在建筑过程中实现精确的垂直移动
  3. 洞穴探索:辅助玩家在复杂洞穴系统中上下移动
  4. 紧急逃生:在危险情况下快速向上移动脱离危险区域

通过结合Baritone的路径规划系统,MovementAscend实现了智能的垂直移动决策,大大提升了自动化导航的流畅性和效率。

总结与扩展

MovementAscend类通过精妙的设计实现了Minecraft中的垂直移动功能,其核心价值在于:

  • 精确的成本模型:综合考虑多种游戏因素,实现最优路径选择
  • 鲁棒的状态管理:完整覆盖移动生命周期,确保可靠执行
  • 模块化设计:继承自Movement基类,便于扩展和维护
  • 游戏逻辑适配:准确模拟玩家操作,避免被服务器检测

开发者可通过调整成本计算参数或扩展状态处理逻辑,进一步优化攀爬行为,以适应不同的游戏环境和需求。

完整实现请参考:MovementAscend.java,更多路径规划相关功能请查阅项目官方文档:USAGE.md

【免费下载链接】baritone cabaletta/baritone: 是一个用于 Minecraft 的开源 Java 客户端,具有多样的游戏模式和游戏修改功能,可以用于 Minecraft 游戏的自定义和修改。 【免费下载链接】baritone 项目地址: https://gitcode.com/gh_mirrors/ba/baritone

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐