📋 表概述

gameobject_respawn 表记录副本实例中游戏对象(GameObject)的重生倒计时。当宝箱被打开、矿点被采集或可交互对象被使用后,其重生时间记录在此表中。此表与 creature_respawn 结构相同,属于Grid加载系统。

联合主键 (guid, instanceId),同一游戏对象在不同副本实例中独立计算重生时间。属于 Grid Loading System。

📊 表结构

字段名类型默认值说明
guidint UNSIGNED0游戏对象GUID(gameobject.guid,主键1)
respawnTimeint UNSIGNED0重生时间(Unix时间戳)
mapIdsmallint UNSIGNED0所在地图ID
instanceIdint UNSIGNED0副本实例ID(主键2)

🔍 重要字段详解

🎯 guid - 游戏对象标识

详细说明:对应 world 库 gameobject 表中的游戏对象GUID。
  • 包括宝箱、矿点、草药、门、控制台等可交互对象
  • 采集/使用/打开后记录重生时间
  • 副本重置时自动清除副本中的GO重生记录

⏱️ respawnTime - 重生时间

详细说明:记录游戏对象下次可用的Unix时间戳。
  • 宝箱被打开后需等待 respawnTime 后才能再次打开
  • 矿点/草药采集后按配置时间重生
  • 副本中某些特殊GO(如奥妮克希亚宝箱)每周重置一次
💡 立即刷新某宝箱:DELETE FROM gameobject_respawn WHERE guid = X AND instanceId = Y;

🗺️ mapId / instanceId - 地点区分

详细说明:精确标识GO所在位置。
  • instanceId=0 → 世界地图上的GO(如野外矿点)
  • instanceId>0 → 副本实例中的GO
  • mapId 辅助标识地图区域

💡 SQL示例

示例1:查询某副本实例中的GO重生状态

SELECT guid, mapId, instanceId, FROM_UNIXTIME(respawnTime) AS respawn_at, TIMESTAMPDIFF(SECOND, NOW(), FROM_UNIXTIME(respawnTime)) AS sec_remaining FROM gameobject_respawn WHERE instanceId = 42 ORDER BY respawnTime;

示例2:立即刷新所有已采集的矿点

DELETE FROM gameobject_respawn WHERE instanceId = 0 AND respawnTime > UNIX_TIMESTAMP();

❓ 常见问题

Q1: 宝箱被打开后没有重生怎么办?
首先在 gameobject_respawn 表中检查该 guid 的记录。如果 respawnTime 异常大,可删除该记录强制重生。团队副本的宝箱在副本重置时自动刷新。
Q2: gameobject_respawn 和 creature_respawn 结构一样,为什么不合并?
虽然结构相同,但两种对象类型(生物/GO)的重生逻辑和管理策略不同,分开存储便于模块化管理和性能优化。