ItemBagFamily.dbc
背包家族定义表,定义了游戏中所有类型的容器(背包)的分类。每种背包类型有唯一的名称标识,用于限制特定物品只能放入特定类型的背包中。
文件概述
ItemBagFamily.dbc 定义了所有容器(背包/袋子)的类型分类。每种背包类型使用位掩码标识 (BagFamily),物品通过 item_template.BagFamily 字段设置可以放入的背包类型。这是一个使用位运算的多选系统,一个物品可以同时放入多种背包。
数据库对应表:world.itembagfamily_dbc。
关联关系:itembagfamily_dbc.ID → item_template.BagFamily (位运算) → 限制物品只能放入特定背包。
列结构
| 序号 | 字段名 | 类型 | 说明 |
|---|---|---|---|
| 1 | ID | int | 背包家族唯一ID (主键)。0=无 1=箭袋 2=弹药袋 3=灵魂袋 4=皮革箭袋 5=附魔材料袋 6=草药包 7=附魔包(附魔包) 8=工程学材料包 9=钥匙袋 10=珠宝袋 11=矿石包 12=灵魂袋 13=药水包 14=附魔材料袋 等等 |
| 2-17 | Name_Lang_* | varchar(100) | 背包族类名称多语言文本(16种语言) |
| 18 | Name_Lang_Mask | int | 名称语言掩码 |
重要字段详解
常见背包家族类型
| ID | 名称 | 用途 | 位值 (1 << ID) |
|---|---|---|---|
| 0 | 无/通用 | 通用背包,无限制 | 0 |
| 1 | 箭袋 | 存放箭矢 | 2 |
| 2 | 弹药袋 | 存放子弹 | 4 |
| 3 | 灵魂袋 | 存放灵魂碎片 | 8 |
| 5 | 附魔材料袋 | 存放附魔材料 | 32 |
| 6 | 草药包 | 存放草药 | 64 |
| 8 | 工程学材料包 | 存放工程学材料 | 256 |
| 9 | 钥匙袋 | 存放钥匙 | 512 |
| 10 | 珠宝袋 | 存放宝石 | 1024 |
| 11 | 矿石包 | 存放矿石 | 2048 |
| 13 | 药水包 | 存放药水 | 8192 |
BagFamily 位运算原理
item_template.BagFamily 使用位掩码来指定物品可放入哪些背包:
item_template.BagFamily 使用位掩码来指定物品可放入哪些背包:
- 每个背包族类的位值 = 2^ID(如:箭袋ID=1,位值=2;弹药袋ID=2,位值=4;灵魂袋ID=3,位值=8)
- 要允许物品放入多个背包:将各位值相加。如 2+4=6 表示可放入箭袋和弹药袋
- 要允许放入所有专业背包:32+64+256+1024+2048+8192 = 11616
- 设为0:物品不限制背包类型,可放入普通背包
- 在SQL中使用位运算:
SELECT * FROM item_template WHERE (BagFamily & 4) = 4;查可放入弹药袋的物品
专业背包与普通背包
- 专业背包:有特定的 BagFamily 限制(如附魔材料袋只能放附魔材料)
- 普通背包:BagFamily=0,可以放入任何类型的物品
- 背包本身也是物品(item_template.class=1),通过 BagFamily 定义可放入的内容类型
- 容器(背包)的 BagFamily 定义其类型,物品的 BagFamily 定义其可放入的背包类型
使用技巧
查询所有可放入箭袋的物品:
SELECT it.entry, it.name, it.BagFamily
FROM item_template it
WHERE (it.BagFamily & 2) = 2; -- 2 = 箭袋位值 (1 << 1)
创建一个新的矿石专用背包:
-- 矿石包的 BagFamily 位值为 2048 (1 << 11)
-- 创建背包物品,设置 BagFamily=2048
INSERT INTO item_template (entry, class, subclass, name, BagFamily, ...)
VALUES (99999, 1, 0, '大矿石包', 2048, ...);
-- 矿石物品的 BagFamily 会包含位值 2048
- 自定义背包族类:在 itembagfamily_dbc 新增行定义新族类,然后为物品设置对应的 BagFamily 位值
- 复合背包:可以通过位运算组合多个族类值,使背包能存放多种类型物品
- 调试技巧:使用
SELECT entry, name, BagFamily, BIN(BagFamily)查看物品的 BagFamily 二进制表示 - 注意:修改 BagFamily 后,已存在的物品在背包中的位置可能会改变