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

Forge 1.16.5自定义指令单人可用服务器失效修复需求

问题原因与修复方案

核心问题

你的代码直接调用了客户端专属API,导致服务器环境下无法正常运行:

  • Minecraft.getInstance().player是客户端独有的实例,服务器端不存在该对象
  • ClientPlayerEntity仅在客户端环境加载,服务器运行时会触发类加载异常或空指针,导致指令执行失败

修复步骤

1. 替换客户端专属逻辑,改用跨端兼容的API

服务器端指令执行依赖CommandSource获取玩家,不能直接调用客户端Minecraft实例。修改执行逻辑,确保兼容服务端与客户端。

2. 确保指令权限配置正确

添加权限校验,保证所有合法用户(包括玩家和控制台)都能执行指令。

完整修复代码

private static LiteralArgumentBuilder<CommandSource> cLiteral(String test) {
    return LiteralArgumentBuilder.literal(test);
}

@SubscribeEvent
public static void onRegisterCommandEvent(RegisterCommandsEvent event){
    cRegister(event.getDispatcher());
}

private static void cRegister(CommandDispatcher<CommandSource> dispatcher) {
    dispatcher.register(
        cLiteral("test")
            // 设置权限等级0,允许所有玩家和控制台执行
            .requires(source -> source.hasPermissionLevel(0))
            .executes(context -> {
                CommandSource source = context.getSource();
                // 判断指令来源是否为玩家,兼容控制台执行场景
                if (source.getEntity() instanceof PlayerEntity) {
                    PlayerEntity player = (PlayerEntity) source.getEntity();
                    // 跨端兼容的消息发送方法,替代客户端chat接口
                    player.sendMessage(new StringTextComponent("123"), Util.NIL_UUID);
                } else {
                    // 控制台执行时输出提示
                    source.sendSuccess(new StringTextComponent("指令在控制台执行"), false);
                }
                return 1;
            })
    );
}

关键修改说明

  • 用CommandSource获取玩家实体,替代客户端Minecraft.getInstance().player
  • 使用跨端基类PlayerEntity替代客户端专属的ClientPlayerEntity
  • 用sendMessage方法替代客户端chat方法,服务端调用该方法会同步消息到所有客户端
  • 添加requires配置权限,确保指令能被正确访问

内容的提问来源于stack exchange,提问作者max vavrik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:58:19