客户端指令
基本信息
| 属性 | 值 |
|---|---|
| 注册入口 | ServerUtilitiesClient.postInit(FMLPostInitializationEvent) |
| 注册源码 | src/main/java/serverutils/client/ServerUtilitiesClient.java:73-79 |
| 注册机制 | ClientCommandHandler.instance.registerCommand(...)(net.minecraftforge.client.ClientCommandHandler) |
| 固定注册数 | 5 条 |
| 动态注册数 | 3 条(CommandKaomoji,按 KAOMOJIS 条目数循环) |
| 权限 | 全部 Level.ALL(requiredPermissionLevel = 0) |
客户端指令不需要服务端安装本模组即可使用,只在客户端本地执行、不发往服务端。因此它们的权限等级全部是 ALL —— 原版 OP 判定对纯客户端指令没有意义。
[!WARNING] 客户端指令不经过
ranks.command_permissions的 Mixin 覆写。COMMAND_PERMISSIONSMixin 只作用于MixinCommandBase/MixinCommandHandler/MixinICommand,即服务端指令分发路径(mixin/Mixins.java)。
指令表
| 指令 | 类 | 注册方式 | 作用 |
|---|---|---|---|
/client_config |
CommandClientConfig |
固定 | 打开客户端配置 GUI |
/print_item |
CommandPrintItem |
固定 | 打印手持物品的 NBT |
/print_block_state |
CommandPrintState |
固定 | 打印方块状态 |
/serverutilities_simulate_button |
CommandSimulateButton |
固定 | 模拟点击侧边栏按钮 |
/ping |
CommandPing |
固定 | 测量到目标服务器延迟 |
/shrug |
CommandKaomoji |
动态 | 输出 ¯\_(ツ)_/¯ |
/tableflip |
CommandKaomoji |
动态 | 输出 (╯°□°)╯︵ ┻━┻ |
/unflip |
CommandKaomoji |
动态 | 输出 ┬─┬ノ( º _ ºノ) |
CommandKaomoji 的注册是一个循环(ServerUtilitiesClient.java:72-74):
for (Map.Entry<String, String> entry : ServerUtilitiesCommon.KAOMOJIS.entrySet()) {
ClientCommandHandler.instance.registerCommand(new CommandKaomoji(entry.getKey(), entry.getValue()));
}
KAOMOJIS 在 ServerUtilitiesCommon.java:99-101 用 3 次 put 填入 3 个条目(shrug、tableflip、unflip),因此实际生成 3 条指令。CommandKaomoji 本身继承 CmdBase,指令名是构造参数 n(command/client/CommandKaomoji.java:15),权限固定 Level.ALL。
/print_item
CommandPrintItem.processCommand()(command/client/CommandPrintItem.java:25-49):
- 发送者不是
EntityPlayer直接return player.getHeldItem()为 null 直接return- 把
stack.getDisplayName()与NBTUtils.getColoredNBTString(stack.writeToNBT(...))拼成一条聊天消息 - 给消息挂
ClickEvent(SUGGEST_COMMAND, <NBT>),点击即可把 NBT 填进命令行 - 参数中含
copy时额外调GuiScreen.setClipboardString(<NBT>)复制到剪贴板
它是 登录初始物品配置 中 login.starting_items 的配套工具 —— 该配置的注释明确写着「Use /print_item to get NBT of item in your hand」(ServerUtilitiesConfig.java:384)。
/ping
CommandPing(command/client/CommandPing.java:28-...)是纯客户端延迟测量:
- 静态
ExecutorService EXECUTOR = Executors.newScheduledThreadPool(1)(:31) - 若
mc.getIntegratedServer() != null(单人游戏)直接回报commands.ping.integrated_server并返回(:38-41) - 否则读
mc.func_147104_D()拿当前服务器地址,用NetworkManager.provideLanClient(...)单独建一条连接 - 收到
S00PacketServerInfo后记录sendAt = Minecraft.getSystemTime()并回发C01PacketPing(sendAt),由S01PacketPong计算往返延迟
这条指令不使用模组自己的同步通道,而是模拟原版服务器列表 ping 协议。
死代码
command/client/CommandListAchievements.java 声明为 public class CommandListAchievements extends CmdBase(:9),但全仓只有它自身的 2 行引用(grep -rn "CommandListAchievements" src/),不在 ServerUtilitiesClient.java:73-79 的注册列表中。/list_achievements 不存在。