调试模式与 /yamcore 指令

YAMCore 在游戏内唯一可见的东西就是这条调试指令,而它默认不存在——需要玩家手动创建一个文件才能启用。

启用方式

无配置项、无指令开关。判定逻辑只有 3 行(YAMCore.java:46-49):

File tFile = new File(event.getModConfigurationDirectory() + "/YAMCoreDebug");
tDebugFilePresent = tFile.exists();
if (isDebug()) {
    _mLogger.info("YAMCore debug information ENABLED");
    _mLogger.setDebugOutput(true);
}

在 config/ 目录下创建一个名为 YAMCoreDebug 的空文件即可。 文件内容无关,只看存在性。删掉即恢复关闭。

生效时机是 preInit,即必须在启动前创建,游戏中创建无效。

指令

YAMCommand(command/YAMCommand.java),注册于 serverLoad(YAMCore.java:67-70):

@EventHandler
public void serverLoad(FMLServerStartingEvent pEvent) {
    if (isDebug()) pEvent.registerServerCommand(new YAMCommand());
}
属性 值
指令名 yamcore(YAMCommand.java:42)
别名 无(aliases 是空 ArrayList)
权限 任何玩家(canCommandSenderUseCommand 恒返回 true,:134-136 与 :162-164)
Tab 补全 无(addTabCompletionOptions 返回 null)
使用提示 "derp"(getCommandUsage,:47)
发送者名 YAMCoreDebug(:150)

参数行为

processCommand(:57-131)读 pArgs[0] 作为整数 tFunc,不检查数组长度——裸 /yamcore 会抛 ArrayIndexOutOfBoundsException。参数不是数字时 IntHelper.tryParse 失败,tFunc 保持默认 1。

参数 演示内容 调用的 API
1 “Simple message” 基础 JSON 消息
2 “Message with tooltip;” + HoverEvent.SimpleText("A simple text") JSONHoverEvent.SimpleText
3 “[Stone]” + 物品 hover JSONHoverEvent.Item(ItemDescriptor.fromString("minecraft:stone"))
4 “Suggest command” + ClickEvent.suggestCommand("/suicide") JSONClickEvent.suggestCommand
5 “Seed” + ClickEvent.runCommand("/suicide") JSONClickEvent.runCommand
6 “Woo, golden!” + EnumChatFormatting.GOLD 颜色
7 4 条原始 JSON(jct–jct4) PlayerChatHelper.SendJsonRaw
8 格式化 JSON "Json1: {0} {1}" PlayerChatHelper.SendJsonFormatted
9 显示玩家 UUID + 赞助状态 ⚠️ 发起外部 HTTP 请求,见下
其它 / 非数字 回落到 tFunc = 1 —

JSON 消息的 1.7.10 实现方式

jct.getConstructed() 生成的是 1.12+ 富文本 JSON,在 1.7.10 上通过 tellraw 指令实现(:128-129):

icommandmanager.executeCommand(this,
    "tellraw " + pCmdSender.getCommandSenderName() + " " + jct.getConstructed());

这是 auxiliary/classes/JSONChatText 存在的根本原因——用指令模拟 1.12 的聊天组件。

桶填充监听

BucketHandler(events/BucketHandler.java)在 preInit 无条件注册(YAMCore.java:56,与调试模式无关):

MinecraftForge.EVENT_BUS.register(BucketHandler.INSTANCE);

它监听 FillBucketEvent,用一个 public Map<Block, Item> buckets 查「某方块装成某物品」。本 mod 自己不往 map 里放任何条目,所以无外部注册时该监听器完全无效果。这是留给其它 mod 的注册点。

已知缺陷

  • /yamcore 9 发起明文 HTTP 外部请求。YAMCommand.java:110:

    DonorController dc = new DonorController(new URL("http://pastebin.com/raw/Zx4nNcuZ"));
    

    三个问题叠加:① 指向第三方个人 pastebin,内容不受本 mod 控制;② 是明文 HTTP 而非 HTTPS;③ 同步阻塞且无超时。服务器主线程会等待该请求返回,网络不通时可能长时间挂起。

  • getCommandUsage() 返回 "derp"。玩家执行 /yamcore(无参)看到的使用提示就是这两个字母,是明确的未完成占位符。

  • 无参数长度检查。:59 直接取 pArgs[0],裸指令必崩。

  • /yamcore 4 与 /yamcore 5 的演示目标是 /suicide。这两条只是演示点击事件 API,但若玩家真点了会执行 /suicide——调试指令里演示危险命令是明显的疏忽。

  • YAMCommand 的 ICommandSender 实现全是空壳。getEntityWorld() 与 getPlayerCoordinates() 返回 null(:166-175)。当前用法(把自己当发送者转发 tellraw)不会触发,但任何依赖世界上下文的命令框架代码会 NPE。

  • BucketHandler 沿用 BuildCraft 的 MMPL 版权头(BucketHandler.java:1-6),与仓库 README 声明的自由许可不一致。

相关条目

  • API 一览 - /yamcore 各参数演示的 API 分别在哪个类