为什么我的Minecraft location_check谓词无法正常运行?
位置类谓词不生效的核心原因与可运行方案
你当前写法的所有错误点
- 选择器逻辑错位:
as @a仅会把命令的执行者替换为目标玩家,完全不会修改命令的执行坐标位置。你之前的测试命令全程没有加at @s把执行位置对齐到玩家的真实坐标,所有位置类检测都是拿函数的默认执行位置(全局出生点固定坐标)做比对,根本没有读取玩家站在(0,0,0)的实际位置,自然完全不生效。你之前写的is_sprinting谓词能正常工作,恰恰是因为它属于实体状态检测,完全不依赖执行坐标的位置对齐,所以没暴露这个命令结构的问题。 - 字段逻辑认知错误:
entity_properties结构内的distance字段,检测的是「被检测实体和当前执行源的距离」,不是和世界坐标原点的距离。你在玩家自身作为执行源的上下文里写这个字段,检测的是玩家到自己的距离,这个值永远为0,没有任何参考原点的绑定,完全达不到范围检测的效果。 - 生成器结构适配错误:很多在线谓词生成器默认导出的是execute内联条件结构,如果你直接把带顶级
condition字段的结构放到predicates目录下,旧版本游戏会因为识别不到匹配的谓词键,直接返回匹配失败。你之前写的is_sprinting谓词能正常工作,是因为它的结构是嵌套在合法谓词对象层级内的,位置类谓词因为用了生成器导出的带冗余顶级键的结构,直接被判定为无效谓词。 - 位置字段语义错配:你之前写的
location.position: {x:0,y:0,z:0}是要求实体精准踩在单格(0,0,0)的坐标点上才匹配,不是覆盖100格的范围。
可直接抄用的正确实现
方案1:立方体范围检测(覆盖x/y/z ±100格的矩形区域)
- 新建谓词文件
data/test/predicates/homezone.json,内容:
{ "condition": "minecraft:location_check", "predicate": { "position": { "x": { "min": -100, "max": 100 }, "y": { "min": -100, "max": 100 }, "z": { "min": -100, "max": 100 } } } }
- 在mcfunction文件里的执行命令,必须补全
at @s对齐玩家坐标:
execute as @a at @s if predicate test:homezone run say hi
方案2:球形半径检测(以(0,0,0)为中心100格直线距离范围)
这种写法更符合常规“100格范围内”的语义,不需要单独拆谓词也能直接运行:
execute as @a at @s positioned 0 0 0 if entity @s[distance=..100] run say hi
如果要封装为test:homezone谓词,可将谓词文件内容改为:
{ "condition": "minecraft:location_check", "predicate": { "distance": { "absolute": { "max": 100 } } } }
对应执行命令需先将参考位置锚定到原点:
execute as @a at @s positioned 0 0 0 if predicate test:homezone run say hi
补充说明
你之前遇到的VSCode自动补全指向旧项目的问题,是Minecraft Development插件缓存了旧的datapack根路径关联,和谓词实际生效逻辑无关,不需要特意排查。
内容的提问来源于stack exchange,提问作者Gorm
相关产品推荐
相关产品推荐

