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
相关产品推荐
相关产品推荐

