Hotfixes数据库工作原理、机制和应用流程
工作原理
Hotfixes数据库是TrinityCore中用于存储游戏数据热修复信息的专用数据库。它包含三个主要表:
hotfix_data
- 存储热修复记录的基本信息hotfix_blob
- 存储二进制格式的热修复数据hotfix_optional_data
- 存储可选的热修复附加数据
工作机制
1. 热修复数据结构
Hotfix系统通过以下关键结构来管理热修复数据:
HotfixRecord
: 表示单个热修复记录,包含表哈希、记录ID、状态等信息HotfixPush
: 表示一组热修复推送,可以包含多个记录HotfixId
: 热修复标识符,包含推送ID和唯一ID
2. 数据加载流程
- 服务器启动时,通过
DB2Manager::LoadHotfixData()
加载hotfix_data
表中的热修复信息 - 使用
DB2Manager::LoadHotfixBlob()
加载hotfix_blob
表中的二进制数据 - 使用
DB2Manager::LoadHotfixOptionalData()
加载可选数据
3. 客户端交互
- 客户端连接时,服务器通过 SendAvailableHotfixes() 发送可用的热修复列表
- 客户端请求具体热修复时,通过 HandleHotfixRequest() 处理请求
- 对于批量数据查询,使用 HandleDBQueryBulk() 处理
应用流程
1. 添加新的热修复
可以通过以下方式添加热修复:
- 在
hotfix_data
表中插入记录,指定表哈希、记录ID和状态 - 如果需要二进制数据,在
hotfix_blob
表中添加相应数据 - 如果需要可选数据,在
hotfix_optional_data
表中添加
2. 代码中的热修复应用
在代码中可以通过DB2HotfixGenerator
类应用热修复:
// 示例:应用热修复到特定记录
DB2HotfixGenerator<ItemSparseEntry> hotfixGenerator(sItemSparseStore);
hotfixGenerator.ApplyHotfix(recordId, [](ItemSparseEntry* entry) {// 修改记录数据entry->BuyPrice = newPrice;
}, true); // 第三个参数表示是否通知客户端
注意事项
-
数据一致性: 热修复数据应与DB2文件中的原始数据保持一致性,避免冲突
-
性能考虑: 热修复数据在服务器启动时全部加载到内存中,应注意数据量控制
-
客户端兼容性: 确保热修复数据与客户端版本兼容
-
语言支持: 热修复支持多语言,需要为每种语言提供相应的数据
-
状态管理: 热修复有多种状态(有效、已移除、无效等),需要正确设置
-
表结构:
hotfix_data
表中的表哈希必须与 DB2 文件对应,可通过sItemSparseStore.GetTableHash()
等方式获取