aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2019-11-29 00:10:29 +0100
committerShauren <shauren.trinity@gmail.com>2019-11-29 00:10:29 +0100
commit96575e33bb6992e6906e02427f20c58af674bdaa (patch)
tree235209678ac2445c9d6e13af752276c8b230fc98 /src/server/game/Entities
parent235ec18143a23602c8e96573b2f3e2dcec4801c9 (diff)
Core/Items: Add location filters to Player::GetItemByEntry
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp76
-rw-r--r--src/server/game/Entities/Player/Player.h13
3 files changed, 66 insertions, 25 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 7266be71202..cc8b878b39a 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2006,7 +2006,7 @@ void GameObject::Use(Unit* user)
}
case 2: // Heart Forge
{
- Item const* item = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH);
+ Item const* item = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE);
if (!item)
return;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index c7fdce1facf..b6c3384295e 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -6780,7 +6780,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo
if (id == CURRENCY_TYPE_AZERITE)
{
if (count > 0)
- if (Item* heartOfAzeroth = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH))
+ if (Item* heartOfAzeroth = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE))
heartOfAzeroth->ToAzeriteItem()->GiveXP(uint64(count));
return;
}
@@ -12910,31 +12910,61 @@ void Player::DestroyConjuredItems(bool update)
DestroyItem(INVENTORY_SLOT_BAG_0, i, update);
}
-Item* Player::GetItemByEntry(uint32 entry) const
+Item* Player::GetItemByEntry(uint32 entry, ItemSearchLocation where /*= ITEM_SEARCH_DEFAULT*/) const
{
- // in inventory
- uint8 inventoryEnd = INVENTORY_SLOT_ITEM_START + GetInventorySlotCount();
- for (uint8 i = INVENTORY_SLOT_ITEM_START; i < inventoryEnd; ++i)
- if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
- if (pItem->GetEntry() == entry)
- return pItem;
+ if (where & ITEM_SEARCH_IN_EQUIPMENT)
+ {
+ for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (pItem->GetEntry() == entry)
+ return pItem;
- for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
- if (Bag* pBag = GetBagByPos(i))
- for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
- if (Item* pItem = pBag->GetItemByPos(j))
- if (pItem->GetEntry() == entry)
- return pItem;
+ }
- for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_BAG_END; ++i)
- if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
- if (pItem->GetEntry() == entry)
- return pItem;
+ if (where & ITEM_SEARCH_IN_INVENTORY)
+ {
+ // in inventory
+ uint8 inventoryEnd = INVENTORY_SLOT_ITEM_START + GetInventorySlotCount();
+ for (uint8 i = INVENTORY_SLOT_ITEM_START; i < inventoryEnd; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (pItem->GetEntry() == entry)
+ return pItem;
- for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
- if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
- if (pItem->GetEntry() == entry)
- return pItem;
+ for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i)
+ if (Bag* pBag = GetBagByPos(i))
+ for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
+ if (Item* pItem = pBag->GetItemByPos(j))
+ if (pItem->GetEntry() == entry)
+ return pItem;
+
+ for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (pItem->GetEntry() == entry)
+ return pItem;
+ }
+
+ if (where & ITEM_SEARCH_IN_BANK)
+ {
+ for (uint8 i = BANK_SLOT_ITEM_START; i < BANK_SLOT_ITEM_END; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (pItem->GetEntry() == entry)
+ return pItem;
+
+ for (uint8 i = BANK_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
+ if (Bag* pBag = GetBagByPos(i))
+ for (uint32 j = 0; j < pBag->GetBagSize(); ++j)
+ if (Item* pItem = pBag->GetItemByPos(j))
+ if (pItem->GetEntry() == entry)
+ return pItem;
+ }
+
+ if (where & ITEM_SEARCH_IN_REAGENT_BANK)
+ {
+ for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (pItem->GetEntry() == entry)
+ return pItem;
+ }
return nullptr;
}
@@ -27180,7 +27210,7 @@ void Player::ActivateTalentGroup(ChrSpecializationEntry const* spec)
activeGlyphs.IsFullUpdate = true;
SendDirectMessage(activeGlyphs.Write());
- if (Item* item = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH))
+ if (Item* item = GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE))
{
if (AzeriteItem* azeriteItem = item->ToAzeriteItem())
{
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 68bcf733a25..68802a620d3 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -650,6 +650,17 @@ struct ItemPosCount
};
typedef std::vector<ItemPosCount> ItemPosCountVec;
+enum ItemSearchLocation
+{
+ ITEM_SEARCH_IN_EQUIPMENT = 0x01,
+ ITEM_SEARCH_IN_INVENTORY = 0x02,
+ ITEM_SEARCH_IN_BANK = 0x04,
+ ITEM_SEARCH_IN_REAGENT_BANK = 0x08,
+
+ ITEM_SEARCH_DEFAULT = ITEM_SEARCH_IN_EQUIPMENT | ITEM_SEARCH_IN_INVENTORY,
+ ITEM_SEARCH_EVERYWHERE = ITEM_SEARCH_IN_EQUIPMENT | ITEM_SEARCH_IN_INVENTORY | ITEM_SEARCH_IN_BANK | ITEM_SEARCH_IN_REAGENT_BANK
+};
+
enum TransferAbortReason
{
TRANSFER_ABORT_NONE = 0,
@@ -1107,7 +1118,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint32 GetItemCount(uint32 item, bool inBankAlso = false, Item* skipItem = nullptr) const;
uint32 GetItemCountWithLimitCategory(uint32 limitCategory, Item* skipItem = nullptr) const;
Item* GetItemByGuid(ObjectGuid guid) const;
- Item* GetItemByEntry(uint32 entry) const;
+ Item* GetItemByEntry(uint32 entry, ItemSearchLocation where = ITEM_SEARCH_DEFAULT) const;
std::vector<Item*> GetItemListByEntry(uint32 entry, bool inBankAlso = false) const;
Item* GetItemByPos(uint16 pos) const;
Item* GetItemByPos(uint8 bag, uint8 slot) const;