/gravehelp 命令
基本信息
| 属性 | 值 |
|---|---|
| 命令名 | gravehelp |
| 别名 | gravehelp(重复——构造时直接加入同名别名) |
| 启用开关 | AMDIConfig.EnableGraveHelpCommand(默认 false) |
| 注册时机 | FMLServerStartingEvent |
| 权限要求 | 任何玩家均可使用(canCommandSenderUseCommand 永远返回 true) |
| 命令参数 | 必须正好 1 个 |
子命令
| 子命令 | 行为 |
|---|---|
request |
生成 10 字符 UUID 后缀作为 access code,插入 MySQL mcdata.lookupcodes 表,告知玩家 Your Code is: %s It is valid for 10 Minutes。 |
| 其他 / 缺省 | 显示帮助:Type /gravehelp request to get a lookup token。 |
行为细节
request 子命令
-
调用
UUID.randomUUID().toString().substring(26)取 UUID 字符串的尾段(UUID 形如xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,从第 26 位起的 12 字符即为最后一段,去掉连字符后剩 12 位十六进制字符)。源码注释「It is valid for 10 Minutes」——过期逻辑不在 mod 内实现,由服务端定期清理脚本负责。 -
通过
AMDIForge.instance.getConnection()获取数据库连接。 -
预编译语句:
INSERT INTO `mcdata`.`lookupcodes` (`code`, `targetUID`, `targetName`) VALUES (?,?,?);
参数:
(accessCode, playerUUID.toString(), playerDisplayName)。 -
成功 → 玩家收到带 code 的提示。失败 → We’re sorry, but something bad has happened on our side. Please contact a Staff Member, thank you!。
在线校验
InGame():仅当 ICommandSender instanceof EntityPlayer 才执行(控制台直接拒绝),与 /graveadmin 行为一致。
数据表结构(mcdata.lookupcodes)
| 列 | 类型 | 来源 |
|---|---|---|
code |
VARCHAR(推断 12+ 字符) | UUID.randomUUID().toString().substring(26) |
targetUID |
VARCHAR(UUID 字符串) | EntityPlayer.getUniqueID().toString() |
targetName |
VARCHAR | EntityPlayer.getDisplayName() |
⚠️ 表结构在 mod 内未定义,依赖服务端预先建表(迁移脚本由运维提供)。
数据库连接
通过 AMDIForge.getConnection() 获取 Connection,调用链路:
AMDIForge.instance.getConnection()
→ MySQL.checkConnection() / openConnection()
→ DriverManager.getConnection("jdbc:mysql://" + MySQL_Server + ":3306[/MySQL_DB]", user, password)
如果 AMDIConfig.UseMySQL = false → mSQL == null → getConnection() 抛 NPE;本命令前提是启用 MySQL。
第三方 mod 集成
- MySQL:通过
com.mysql.jdbc.Driver直接连接,无连接池。 - YAMCore:
PlayerChatHelper文本工具。 - AMDI Web 平台:本命令生成的 code 在外部 AMDI 系统中用于关联玩家身份——mod 自身不验证或消费该 code。
已知问题
- 启用开关
EnableGraveHelpCommand = false(默认)会让命令彻底不可用,但UseMySQL仍可能为true——服务器运维必须同时开启两项才能让玩家实际请求 code。 - 代码有效时长「10 分钟」仅在提示文案中说明,无 mod 内强制过期逻辑,依赖外部清理。