Minecraft模组命令物品使用时崩溃问题求助
问题描述
我在开发Minecraft模组时添加了一个简单物品,该物品作用于实体时会执行其名称对应的命令,代码如下:
public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) { if(user.getItemCooldownManager().getCooldownProgress(this, 0) == 0){ //user.getWorld().getServer().getCommandManager().executeWithPrefix(user.getServer().getCommandSource(), stack.getName().toString()); user.getWorld().getServer().getCommandManager().execute(user.getWorld().getServer().getCommandManager().getDispatcher().parse(stack.getName().toString(), user.getServer().getCommandSource()), stack.getName().toString()); //user.sendMessage(stack.getName()); user.getItemCooldownManager().set(this, 40); } return super.useOnEntity(stack, user, entity, hand); }
使用该物品作用于生物时游戏崩溃,最初错误提示:
Execution failed for task ':runClient'.
Process 'command 'C:\Program Files\Zulu\zulu-17\bin\java.exe'' finished with non-zero exit value -1
这个提示看似客户端无法启动,但实际客户端已正常运行,仅在使用物品时触发崩溃。
更新:
按照建议切换到“Minecraft Client”配置后,错误变为:
Cannot invoke "net.minecraft.server.MinecraftServer.getCommandManager()" because the return value of "net.minecraft.world.World.getServer()" is null
问题出在调用user.getWorld().getServer()上。改为调用user.getServer()后,错误提示变为:
..."net.minecraft.entity.player.PlayerEntity.getServer()" is null
当前核心疑问:既然user.getServer()和world.getServer()都无法获取到服务器实例,应该用什么方法来获取?
解决方法
核心问题是单人游戏的客户端环境中,直接调用服务端API会返回null——单人模式下客户端与服务器逻辑分离,必须先判断环境并通过正确途径获取命令执行上下文:
先判断环境,避免客户端执行服务端逻辑
在执行命令前,先检查当前世界是否为服务端世界,客户端世界不存在服务器实例:if (!user.getWorld().isClient()) { // 此处编写服务端相关逻辑 }通过服务端玩家获取合法命令源
无需直接获取MinecraftServer实例,可通过ServerPlayerEntity获取合法的CommandSource:if (user instanceof ServerPlayerEntity serverPlayer) { CommandSource commandSource = serverPlayer.getCommandSource(); // 执行命令 serverPlayer.getServer().getCommandManager().executeWithPrefix(commandSource, stack.getName().getString()); }完整修正后的代码示例
public ActionResult useOnEntity(ItemStack stack, PlayerEntity user, LivingEntity entity, Hand hand) { if (user.getItemCooldownManager().getCooldownProgress(this, 0) == 0 && !user.getWorld().isClient()) { if (user instanceof ServerPlayerEntity serverPlayer) { MinecraftServer server = serverPlayer.getServer(); if (server != null) { String command = stack.getName().getString(); server.getCommandManager().executeWithPrefix(serverPlayer.getCommandSource(), command); user.getItemCooldownManager().set(this, 40); } } } return super.useOnEntity(stack, user, entity, hand); }额外注意事项
- 必须用
!world.isClient()判断环境,禁止在客户端线程执行服务端命令逻辑 stack.getName()返回的是Text组件,需用.getString()提取纯文本命令内容,避免格式字符导致命令解析失败- 添加空值判断(如
server != null),防止极端场景下的崩溃
- 必须用
内容的提问来源于stack exchange,提问作者Email User
相关产品推荐
相关产品推荐

