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

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——单人模式下客户端与服务器逻辑分离,必须先判断环境并通过正确途径获取命令执行上下文:

  1. 先判断环境,避免客户端执行服务端逻辑
    在执行命令前,先检查当前世界是否为服务端世界,客户端世界不存在服务器实例:

    if (!user.getWorld().isClient()) {
        // 此处编写服务端相关逻辑
    }
    
  2. 通过服务端玩家获取合法命令源
    无需直接获取MinecraftServer实例,可通过ServerPlayerEntity获取合法的CommandSource:

    if (user instanceof ServerPlayerEntity serverPlayer) {
        CommandSource commandSource = serverPlayer.getCommandSource();
        // 执行命令
        serverPlayer.getServer().getCommandManager().executeWithPrefix(commandSource, stack.getName().getString());
    }
    
  3. 完整修正后的代码示例

    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);
    }
    
  4. 额外注意事项

    • 必须用!world.isClient()判断环境,禁止在客户端线程执行服务端命令逻辑
    • stack.getName()返回的是Text组件,需用.getString()提取纯文本命令内容,避免格式字符导致命令解析失败
    • 添加空值判断(如server != null),防止极端场景下的崩溃

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 17:35:34