Minecraft 1.16.5 Fabric环境下代码执行游戏命令报错如何解决?
问题核心原因
- 你自行实例化了空白的
CommandDispatcher,该实例未注册任何Minecraft内置命令,无法识别所有输入的指令 - 传入执行的命令带了前缀
/,Brigadier框架的execute方法不需要额外添加斜杠前缀 - 未做服务端环境判断,
inventoryTick会在客户端、服务端同时触发,客户端侧没有完整的命令注册列表,执行命令本身无效
正确实现代码
@Override public void inventoryTick(ItemStack stack, World world, Entity entity, int slot, boolean selected) { // 仅在服务端侧执行,排除客户端逻辑 if (world.isClient || !(entity instanceof PlayerEntity player)) { return; } if (player.getEquippedStack(EquipmentSlot.CHEST) == stack) { MinecraftServer server = world.getServer(); // 命令无需加/前缀 final String command = "time set 0"; try { // 用服务器自带的已完成所有命令注册的命令管理器执行 // 若需要以玩家自身权限执行,将server.getCommandSource()替换为player.getCommandSource()即可 server.getCommandManager().execute(server.getCommandSource(), command); } catch (CommandSyntaxException e) { e.printStackTrace(); } } }
额外注意事项
- 当前逻辑每游戏刻(每秒20次)都会触发,如果你只需要穿戴时执行一次,建议给物品添加NBT标记做冷却判断,避免重复执行命令
- 用
server.getCommandSource()执行默认拥有OP等级2的权限,可以执行所有作弊类命令,如果需要限制为玩家自身权限,替换为玩家的命令源即可
内容的提问来源于stack exchange,提问作者IAFEnvoy
相关产品推荐
相关产品推荐

