调试模式与 /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 分别在哪个类