如何在Minecraft 1.20.1中用Fabric模组向服务器发送命令
在Minecraft 1.20.1 Fabric模组中向服务器发送命令的实现方法
核心思路
Fabric 1.20.1版本中,发送服务器命令需基于ServerCommandSource类,通过服务器命令管理器直接执行构造好的命令字符串,替代了旧版本已废弃的ICommandSender等类。以下分两种场景给出实现代码:
代码实现示例
1. 基于玩家上下文发送命令
若你的逻辑绑定在玩家操作(如事件触发、玩家指令)上,可通过玩家对象获取命令源:
import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.server.network.ServerPlayerEntity; // 参数:触发命令的玩家对象、消息目标玩家名、消息内容 public void sendMsgCommand(ServerPlayerEntity senderPlayer, String targetName, String message) { MinecraftServer server = senderPlayer.getServer(); if (server == null) return; // 构造完整命令字符串 String command = String.format("msg %s %s", targetName, message); // 获取玩家的命令源(自动继承玩家权限) ServerCommandSource commandSource = senderPlayer.getCommandSource(); // 执行命令 server.getCommandManager().executeWithPrefix(commandSource, command); }
2. 无玩家上下文(服务器后台发送)
若需模组后台主动发送(如定时通知、事件触发),可手动构造服务器级命令源:
import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; import net.minecraft.text.Text; import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.Vec3d; // 参数:服务器实例、消息目标玩家名、消息内容 public void sendMsgFromServer(MinecraftServer server, String targetName, String message) { if (server == null) return; // 构造无玩家的命令源,权限等级设为4(管理员权限) ServerCommandSource commandSource = new ServerCommandSource( server, Vec3d.ZERO, Vec2f.ZERO, null, 4, "ModBackend", Text.literal("ModBackend"), server, null ); String command = String.format("msg %s %s", targetName, message); server.getCommandManager().executeWithPrefix(commandSource, command); }
关键说明
ServerCommandSource:1.20.1版本中负责命令执行的核心类,所有命令都需通过该类的实例触发。executeWithPrefix:服务器命令管理器的执行方法,会自动处理命令前缀(如/),构造命令时带不带前缀都可正常执行。- 权限配置:无玩家上下文的命令源需手动指定权限等级,确保命令拥有足够权限被服务器执行。
内容的提问来源于stack exchange,提问作者Scrapmine
相关产品推荐
相关产品推荐

