表概述

character_pet 表记录了每个角色拥有的所有宠物数据。包括猎人的野兽宠物、术士的恶魔、死亡骑士的食尸鬼、法师的水元素等战斗宠物,以及各种非战斗小宠物。

主键为 id(宠物唯一标识)。owner 字段关联 characters.guid 表示宠物所属角色。PetType 字段区分不同类型的宠物。

表结构

字段名类型默认值说明
idint UNSIGNED0宠物唯一ID(主键)
entryint UNSIGNED0宠物生物模板entry(关联creature_template)
ownerint UNSIGNED0所属角色GUID
modelidint UNSIGNED0宠物模型ID(NULL时使用默认模型)
CreatedBySpellint UNSIGNED0召唤/创造该宠物的法术ID
PetTypetinyint UNSIGNED0宠物类型(0=普通,1=猎人宠物,2=术士恶魔,3=其他)
levelsmallint UNSIGNED1宠物当前等级
expint UNSIGNED0宠物当前经验值
Reactstatetinyint UNSIGNED0宠物反应状态(0=被动,1=防御,2=主动攻击)
namevarchar(21)'Pet'宠物名称
renamedtinyint UNSIGNED0是否被重命名(0=否,1=是)
slottinyint UNSIGNED0宠物栏位编号(0-4,对应5个宠物栏)
curhealthint UNSIGNED1宠物当前生命值
curmanaint UNSIGNED0宠物当前法力值
curhappinessint UNSIGNED0宠物当前快乐值(猎人宠物专用,影响伤害加成)
savetimeint UNSIGNED0宠物保存时间(Unix时间戳)
abdatatextNULL宠物技能数据(序列化的技能信息)

实际案例

案例1:查询指定角色的所有宠物

SELECT cp.id, cp.name, cp.entry, cp.PetType, cp.level, cp.curhealth, cp.curmana, cp.Reactstate, cp.slot, CASE cp.PetType WHEN 0 THEN '普通宠物' WHEN 1 THEN '猎人宠物' WHEN 2 THEN '术士恶魔' ELSE '其他' END AS pet_type_name FROM character_pet cp WHERE cp.owner = 100 ORDER BY cp.slot;

案例2:查询所有满级猎人宠物

SELECT cp.id, cp.name, cp.level, cp.curhealth, c.name AS owner_name, c.guid FROM character_pet cp JOIN characters c ON c.guid = cp.owner WHERE cp.PetType = 1 AND cp.level = 80 ORDER BY cp.curhealth DESC;

案例3:统计各类宠物的快乐值分布

SELECT CASE WHEN cp.curhappiness >= 900000 THEN '快乐' WHEN cp.curhappiness >= 600000 THEN '满足' WHEN cp.curhappiness >= 300000 THEN '不高兴' ELSE '非常不高兴' END AS happiness_state, COUNT(*) AS pet_count FROM character_pet cp WHERE cp.PetType = 1 GROUP BY happiness_state ORDER BY MIN(cp.curhappiness) DESC;

常见问题

Q1: Reactstate 字段的取值含义是什么?
0=被动模式(宠物不会主动攻击),1=防御模式(主人被攻击时还击),2=主动攻击模式(宠物会主动攻击附近敌对目标)。
Q2: curhappiness(快乐值)有什么作用?
快乐值仅对猎人宠物有效。快乐值越高,宠物伤害加成越大。需要定期喂食宠物维持快乐值。最大值为1043336(约100万)。
Q3: abdata 字段存储什么数据?
abdata 是序列化的宠物技能数据,包含宠物已学习的技能ID、技能等级等信息。数据以二进制/编码格式存储,需要通过服务器代码解析。