📋 表概述

character_instance 表记录了角色与副本实例的绑定关系,即某个角色当前绑定到哪些副本实例中。当玩家进入副本后,系统在此表中创建关联记录,用于副本进度保存和副本锁定机制。

联合主键 (guid, instance),一个角色可绑定多个副本实例。通过 instance 索引快速查找某副本中的所有角色。

📊 表结构

字段名类型默认值说明
guidint UNSIGNED0角色全局唯一ID(characters.guid)
instanceint UNSIGNED0副本实例ID(instance.id)
permanenttinyint UNSIGNED0是否永久绑定(0=可解绑,1=永久绑定)
extendedtinyint UNSIGNEDNOT NULL是否已延长副本锁定时间

🔍 重要字段详解

🔗 guid / instance - 绑定关系

详细说明:联合主键确定角色与特定副本实例的唯一绑定。
  • guid - 角色GUID,关联 characters 表
  • instance - 副本实例ID,关联 instance 表
  • 删除此表中的记录 = 解除角色与副本的绑定
  • 角色离开副本后,绑定关系可能保留(由 permanent 控制)

🔒 permanent - 永久绑定

详细说明:控制角色是否永久绑定到该副本实例。
  • 0 = 临时绑定(角色离开副本后可解绑)
  • 1 = 永久绑定(直到副本重置,角色被锁定到此副本ID)
  • 团队副本通常设为 permanent=1,5人本通常设 permanent=0
  • 永久绑定后,角色在整个副本周期内只能进入该特定实例

⏱️ extended - 延长锁定

详细说明:标记角色是否扩展了该副本的锁定时间。
  • 玩家可以主动延长已锁定的副本ID有效期
  • 用于团队副本进度延续(例如:本周日没打完,延长到下周)
  • extended 标记为1时,即使到达 resettime,角色仍绑定到该副本

💡 SQL示例

示例1:查询角色当前绑定的所有副本

SELECT ci.guid, c.name AS char_name, ci.instance, i.map, i.difficulty, ci.permanent, ci.extended, FROM_UNIXTIME(i.resettime) AS reset_time FROM character_instance ci JOIN characters c ON c.guid = ci.guid JOIN instance i ON i.id = ci.instance WHERE ci.guid = 100;

示例2:解除角色的所有副本绑定

DELETE FROM character_instance WHERE guid = 100;

示例3:查询某副本实例中的角色列表

SELECT ci.guid, c.name, c.level, c.race, c.class FROM character_instance ci JOIN characters c ON c.guid = ci.guid WHERE ci.instance = 42 ORDER BY c.level DESC;

❓ 常见问题

Q1: 角色无法进入副本,提示"已锁定",怎么解决?
删除 character_instance 表中对应角色的副本绑定记录:DELETE FROM character_instance WHERE guid = X; 然后重启服务器或重置 instance 表的相关记录。
Q2: permanent 和 extended 有何区别?
permanent 表示副本绑定是否永久(副本重置前不解绑),extended 表示玩家是否主动延长了绑定时间(用于跨周保留进度)。extended 通常在 permanent=1 的情况下才有效。