You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minecraft模组开发:for循环getY()读取异常与遍历方向错误问题

Minecraft物品方块检测问题修复方案

问题1:positionClicked.getY()返回0

先确认pContext是ItemUseContext类型(右键物品触发的正确上下文),如果是其他上下文,getClickedPos()可能返回无效坐标。另外要过滤点击空气的情况——右键空气时getClickedPos()可能返回(0,0,0),所以加个判断:

if (!pContext.getLevel().getBlockState(pContext.getClickedPos()).isAir()) {
    // 把你的检测逻辑放到这里面
}

问题2:遍历方向错误(向上而非向下)

你搞混了below()方法的用法:positionClicked.below(n)是从当前位置向下移动n格,不是直接将Y坐标设为n。比如点击Y=70的方块,当循环变量i=64时,below(64)会跳到Y=70-64=6的位置,完全偏离了目标范围。

正确的写法有两种:

写法1:按偏移量遍历

BlockPos positionClicked = pContext.getClickedPos();
Player player = pContext.getPlayer();
boolean foundBlock = false;

// 遍历下方1到6格,每次向下1格
for (int offset = 1; offset <= 6; offset++) {
    BlockPos targetPos = positionClicked.below(offset);
    BlockState state = pContext.getLevel().getBlockState(targetPos);

    if (isDirtBlock(state)) {
        outputDirtBlockCoordinates(targetPos, player, state.getBlock());
        foundBlock = true;
        break;
    }
}

写法2:直接遍历Y坐标

这种更直观,适合习惯Lua逻辑的你:

BlockPos positionClicked = pContext.getClickedPos();
Player player = pContext.getPlayer();
boolean foundBlock = false;

// 从点击位置下方1格(Y-1)遍历到下方6格(Y-6)
for (int y = positionClicked.getY() - 1; y >= positionClicked.getY() - 6; y--) {
    BlockPos targetPos = new BlockPos(positionClicked.getX(), y, positionClicked.getZ());
    BlockState state = pContext.getLevel().getBlockState(targetPos);

    if (isDirtBlock(state)) {
        outputDirtBlockCoordinates(targetPos, player, state.getBlock());
        foundBlock = true;
        break;
    }
}

关键提醒

Java的循环逻辑和Lua不同,你之前把循环变量设为Y坐标值,和below()的偏移量参数混淆了,这是导致方向错误的核心原因。

内容的提问来源于stack exchange,提问作者AwesomeDudeFellaBro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 04:17:46