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
相关产品推荐
相关产品推荐

