/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 子命令

  1. 调用 UUID.randomUUID().toString().substring(26) 取 UUID 字符串的尾段(UUID 形如 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,从第 26 位起的 12 字符即为最后一段,去掉连字符后剩 12 位十六进制字符)。源码注释「It is valid for 10 Minutes」——过期逻辑不在 mod 内实现,由服务端定期清理脚本负责。

  2. 通过 AMDIForge.instance.getConnection() 获取数据库连接。

  3. 预编译语句:

    INSERT INTO `mcdata`.`lookupcodes` (`code`, `targetUID`, `targetName`) VALUES (?,?,?);
    

    参数:(accessCode, playerUUID.toString(), playerDisplayName)。

  4. 成功 → 玩家收到带 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 内强制过期逻辑,依赖外部清理。

相关条目