如何获取Item
获取 Item 使用 Player.cpp 的两个方法:
Item* GetItemByPos(uint16 pos) const; // 方法一
Item* GetItemByPos(uint8 bag, uint8 slot) const; // 方法二
方法一调用的就是方法二,两者的区别很小,先只说方法二。
方法二传入两个参数,bag(指定哪个包包)和 slot(指定哪个格子)。
Item 的分类
这个方法可以取到所有的装备,这些装备分为几类:
- 身上的装备栏 EquipmentSlots
- 默认的包包 InventorySlots
- 身上的包包栏(装备包包的那4个格子) InventoryPackSlots
- 默认的银行 BankItemSlots
- 银行的包包栏 BankBagSlots
- 回购的装备 BuyBackSlots
- 钥匙包 KeyRingSlots
- 普通的包包
第 1 - 7 类 Item 的 bag 和 slot
除了普通包包的装备(第 8 类)以外,其他装备的 bag 参数都应指定为 INVENTORY_SLOT_BAG_0。
slot 参数则按照下面的顺序指定,从 0 到 97 一共 98 个装备。
如头:getItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_HEAD);
如出生包包的第一格:getItemByPos(INVENTORY_SLOT_BAG_0, INVENTORY_SLOT_ITEM_START);
如钥匙包第一格:getItemByPos(INVENTORY_SLOT_BAG_0, KEYRING_SLOT_START);
enum EquipmentSlots // 19 slots
{
EQUIPMENT_SLOT_START = 0,
EQUIPMENT_SLOT_HEAD = 0,
EQUIPMENT_SLOT_NECK = 1,
EQUIPMENT_SLOT_SHOULDERS = 2,
EQUIPMENT_SLOT_BODY = 3,
EQUIPMENT_SLOT_CHEST = 4,
EQUIPMENT_SLOT_WAIST = 5,
EQUIPMENT_SLOT_LEGS = 6,
EQUIPMENT_SLOT_FEET = 7,
EQUIPMENT_SLOT_WRISTS = 8,
EQUIPMENT_SLOT_HANDS = 9,
EQUIPMENT_SLOT_FINGER1 = 10,
EQUIPMENT_SLOT_FINGER2 = 11,
EQUIPMENT_SLOT_TRINKET1 = 12,
EQUIPMENT_SLOT_TRINKET2 = 13,
EQUIPMENT_SLOT_BACK = 14,
EQUIPMENT_SLOT_MAINHAND = 15,
EQUIPMENT_SLOT_OFFHAND = 16,
EQUIPMENT_SLOT_RANGED = 17,
EQUIPMENT_SLOT_TABARD = 18,
EQUIPMENT_SLOT_END = 19
};
enum InventorySlots // 4 slots
{
INVENTORY_SLOT_BAG_START = 19,
INVENTORY_SLOT_BAG_END = 23
};
enum InventoryPackSlots // 16 slots
{
INVENTORY_SLOT_ITEM_START = 23,
INVENTORY_SLOT_ITEM_END = 39
};
enum BankItemSlots // 28 slots
{
BANK_SLOT_ITEM_START = 39,
BANK_SLOT_ITEM_END = 63
};
enum BankBagSlots // 7 slots
{
BANK_SLOT_BAG_START = 63,
BANK_SLOT_BAG_END = 69
};
enum BuyBackSlots // 12 slots
{
// stored in m_buybackitems
BUYBACK_SLOT_START = 69,
BUYBACK_SLOT_END = 81
};
enum KeyRingSlots // 32 slots
{
KEYRING_SLOT_START = 81,
KEYRING_SLOT_END = 97
};
第 8 类 Item 的 bag 和 slot
普通包包的装备的 bag 参数,就是上面的第 3 类和第 5 类的 slot 值。
slot 参数则是包里的第几个格子。
如第一个包包(注意:第一个包包不是指出生的十六格包)的第一个格子:getItemByPos(INVENTORY_SLOT_BAG_START, 1);
如第二个包包的第二个格子:getItemByPos(INVENTORY_SLOT_BAG_START + 1, 2);
如第三个包包的第三个格子:getItemByPos(INVENTORY_SLOT_BAG_START + 2, 3);
如第四个包包的第四个格子:getItemByPos(INVENTORY_SLOT_BAG_END, 4);