📋 表概述

corpse 表存储已死亡角色的尸体数据。当玩家角色死亡后,系统在此表中创建一条尸体记录,包含尸体的位置坐标、所在副本、外观显示ID、携带物品缓存等信息。尸体在玩家复活或被释放后会被清理。

主键为 guid(一个角色同一时间最多一具尸体)。该表属于 Death System 模块,配合 characters.death_expire_time 共同管理死亡系统。

📊 表结构

字段名类型默认值说明
guidint UNSIGNED0角色GUID(主键)
posXfloat0尸体X坐标
posYfloat0尸体Y坐标
posZfloat0尸体Z坐标
orientationfloat0尸体朝向角度
mapIdsmallint UNSIGNED0尸体所在地图ID
phaseMaskint UNSIGNED1位面掩码
displayIdint UNSIGNED0尸体外观模型ID
itemCachetextNOT NULL角色携带物品缓存(序列化)
bytes1int UNSIGNED0尸体状态数据1
bytes2int UNSIGNED0尸体状态数据2
guildIdint UNSIGNED0公会ID
flagstinyint UNSIGNED0尸体标记(如可被剥皮等)
dynFlagstinyint UNSIGNED0动态标记(拾取状态等)
timeint UNSIGNED0死亡时间(Unix时间戳)
corpseTypetinyint UNSIGNED0尸体类型
instanceIdint UNSIGNED0副本实例ID(0=世界地图)

🔍 重要字段详解

☠️ corpseType - 尸体类型

详细说明:TINYINT类型,区分尸体的不同类型。
  • 0 = 普通尸体(玩家死亡留下的)
  • 1 = 骨头(尸体被清理后留下的骸骨标记)
  • 跑尸复活时系统根据此类型处理逻辑

🎨 displayId / bytes1 / bytes2

详细说明:控制尸体在游戏中的视觉外观。
  • displayId - 尸体模型的显示ID
  • bytes1 - 包含种族、性别等编码信息
  • bytes2 - 包含面部特征、肤色等外观编码
  • 保证尸体的外观与角色死亡时一致

📦 itemCache - 物品缓存

详细说明:TEXT类型,存储角色死亡时携带的装备外观缓存。
  • 序列化格式,记录身上穿戴装备的视觉外观
  • 确保尸体显示正确的装备外观
  • 玩家复活后此数据继续用于角色外观渲染

💡 SQL示例

示例1:查询副本中的尸体位置

SELECT corp.guid, c.name, corp.mapId, corp.posX, corp.posY, corp.posZ, FROM_UNIXTIME(corp.time) AS death_time, corp.corpseType, corp.instanceId FROM corpse corp JOIN characters c ON c.guid = corp.guid WHERE corp.instanceId = 42;

示例2:清理过期尸体(>30分钟)

DELETE FROM corpse WHERE time < UNIX_TIMESTAMP() - 1800;

❓ 常见问题

Q1: 角色尸体卡在副本中无法跑尸怎么办?
删除该角色的尸体记录 DELETE FROM corpse WHERE guid = X; 然后使用GM命令复活或传送。
Q2: corpse 与 characters.death_expire_time 有什么关系?
characters.death_expire_time 记录"释放灵魂"倒计时,corpse 表记录尸体物理位置。当玩家释放灵魂后 corpse 升级为骨头(corpseType=1)。