corpse - 角色尸体数据表
基于 AzerothCore Characters 数据库 · 死亡角色尸体信息存储表
📋 表概述
corpse 表存储已死亡角色的尸体数据。当玩家角色死亡后,系统在此表中创建一条尸体记录,包含尸体的位置坐标、所在副本、外观显示ID、携带物品缓存等信息。尸体在玩家复活或被释放后会被清理。
- 死亡尸体定位
- 跑尸复活机制
- 外观显示管理
- 物品掉落保护
主键为 guid(一个角色同一时间最多一具尸体)。该表属于 Death System 模块,配合 characters.death_expire_time 共同管理死亡系统。
📊 表结构
| 字段名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| guid | int UNSIGNED | 0 | 角色GUID(主键) |
| posX | float | 0 | 尸体X坐标 |
| posY | float | 0 | 尸体Y坐标 |
| posZ | float | 0 | 尸体Z坐标 |
| orientation | float | 0 | 尸体朝向角度 |
| mapId | smallint UNSIGNED | 0 | 尸体所在地图ID |
| phaseMask | int UNSIGNED | 1 | 位面掩码 |
| displayId | int UNSIGNED | 0 | 尸体外观模型ID |
| itemCache | text | NOT NULL | 角色携带物品缓存(序列化) |
| bytes1 | int UNSIGNED | 0 | 尸体状态数据1 |
| bytes2 | int UNSIGNED | 0 | 尸体状态数据2 |
| guildId | int UNSIGNED | 0 | 公会ID |
| flags | tinyint UNSIGNED | 0 | 尸体标记(如可被剥皮等) |
| dynFlags | tinyint UNSIGNED | 0 | 动态标记(拾取状态等) |
| time | int UNSIGNED | 0 | 死亡时间(Unix时间戳) |
| corpseType | tinyint UNSIGNED | 0 | 尸体类型 |
| instanceId | int UNSIGNED | 0 | 副本实例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)。