客户端指令

基本信息

属性 值
注册入口 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_PERMISSIONS Mixin 只作用于 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。

CommandPrintItem.processCommand()(command/client/CommandPrintItem.java:25-49):

  1. 发送者不是 EntityPlayer 直接 return
  2. player.getHeldItem() 为 null 直接 return
  3. 把 stack.getDisplayName() 与 NBTUtils.getColoredNBTString(stack.writeToNBT(...)) 拼成一条聊天消息
  4. 给消息挂 ClickEvent(SUGGEST_COMMAND, <NBT>),点击即可把 NBT 填进命令行
  5. 参数中含 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 不存在。

相关条目