diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-11-29 00:10:29 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-11-29 00:10:29 +0100 |
commit | 96575e33bb6992e6906e02427f20c58af674bdaa (patch) | |
tree | 235209678ac2445c9d6e13af752276c8b230fc98 /src | |
parent | 235ec18143a23602c8e96573b2f3e2dcec4801c9 (diff) |
Core/Items: Add location filters to Player::GetItemByEntry
Diffstat (limited to 'src')
-rw-r--r-- | src/common/DataStores/DB2Meta.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Achievements/CriteriaHandler.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 76 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 13 | ||||
-rw-r--r-- | src/server/game/Handlers/AzeriteHandler.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Handlers/InspectHandler.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.h | 1 |
9 files changed, 79 insertions, 37 deletions
diff --git a/src/common/DataStores/DB2Meta.cpp b/src/common/DataStores/DB2Meta.cpp index c8b6ae3490f..9f7d688d494 100644 --- a/src/common/DataStores/DB2Meta.cpp +++ b/src/common/DataStores/DB2Meta.cpp @@ -44,7 +44,7 @@ uint32 DB2Meta::GetRecordSize() const { for (uint8 j = 0; j < Fields[i].ArraySize; ++j) { - if (i >= FileFieldCount && i == ParentIndexField) + if (i >= FileFieldCount && int32(i) == ParentIndexField) { size += 4; continue; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index b0154ee5209..c8699681dd5 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -2610,7 +2610,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case CRITERIA_ADDITIONAL_CONDITION_AZERITE_ITEM_LEVEL: // 235 { - Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH); + Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE); if (!heartOfAzeroth || heartOfAzeroth->ToAzeriteItem()->GetLevel() < reqValue) return false; break; @@ -2659,7 +2659,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 break; case CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_LOWER: // 259 { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) if (essence.AzeriteEssenceID == reqValue && essence.Rank < secondaryAsset) @@ -2668,7 +2668,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_EQUAL: // 260 { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) if (essence.AzeriteEssenceID == reqValue && essence.Rank == secondaryAsset) @@ -2677,7 +2677,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 } case CRITERIA_ADDITIONAL_CONDITION_UNLOCKED_AZERITE_ESSENCE_RANK_GREATER: // 261 { - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) if (essence.AzeriteEssenceID == reqValue && essence.Rank > secondaryAsset) @@ -2700,7 +2700,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; case CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_LOWER: // 266 - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) @@ -2708,7 +2708,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return true; return false; case CRITERIA_ADDITIONAL_CONDITION_SELECTED_AZERITE_ESSENCE_RANK_GREATER: // 267 - if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = referencePlayer->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) if (UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences()) for (UF::UnlockedAzeriteEssence const& essence : azeriteItem->m_azeriteItemData->UnlockedEssences) 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; diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp index 77ee2549c67..200e4aa4d2a 100644 --- a/src/server/game/Handlers/AzeriteHandler.cpp +++ b/src/server/game/Handlers/AzeriteHandler.cpp @@ -27,7 +27,7 @@ void WorldSession::HandleAzeriteEssenceUnlockMilestone(WorldPackets::Azerite::Az if (!AzeriteItem::FindHeartForge(_player)) return; - Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH); + Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE); if (!item) return; @@ -58,8 +58,8 @@ void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::Az { WorldPackets::Azerite::AzeriteEssenceSelectionResult activateEssenceResult; activateEssenceResult.AzeriteEssenceID = azeriteEssenceActivateEssence.AzeriteEssenceID; - Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH); - if (!item || !item->IsEquipped()) + Item* item = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_IN_EQUIPMENT); + if (!item) { activateEssenceResult.Reason = AzeriteEssenceActivateResult::NotEquipped; activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index b05d4264f65..c84d2e8e63e 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -66,7 +66,7 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) inspectResult.GuildData->AchievementPoints = guild->GetAchievementMgr().GetAchievementPoints(); } - if (Item const* heartOfAzeroth = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH)) + if (Item const* heartOfAzeroth = player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE)) if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem()) inspectResult.AzeriteLevel = azeriteItem->GetEffectiveLevel(); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index db87708b12b..cadab4b460d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5830,7 +5830,7 @@ void Spell::EffectLearnAzeriteEssencePower(SpellEffIndex /*effIndex*/) if (!playerTarget) return; - Item* heartOfAzeroth = playerTarget->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH); + Item* heartOfAzeroth = playerTarget->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE); if (!heartOfAzeroth) return; diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h index 5c3de1da269..2125fab5fad 100644 --- a/src/server/game/Spells/SpellScript.h +++ b/src/server/game/Spells/SpellScript.h @@ -47,6 +47,7 @@ class WorldObject; struct SpellDestination; struct SpellModifier; struct SpellValue; +enum class ItemContext : uint8; #define SPELL_EFFECT_ANY (uint16)-1 #define SPELL_AURA_ANY (uint16)-1 |