diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-02-21 16:58:09 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-02-21 16:58:09 +0100 |
commit | ea9eccae8596d440c372b0d9709d4def4b46e648 (patch) | |
tree | f240e8bd8e6ff0857b215d46c130e8859e481270 | |
parent | d2396fb897a4a2f21a4b43f8c37f3a87c4285f2c (diff) |
Core/Spells: Restored totem category check
Revert "Core/Totems: In cata totem items are no longer needed"
This reverts commit 45e0cae7beedd84a6e71cf99d356e836476c1e4a
-rw-r--r-- | src/server/game/DataStores/DBCStores.cpp | 2 | ||||
-rw-r--r-- | src/server/game/DataStores/DBCStores.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Item/ItemTemplate.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 20 |
5 files changed, 51 insertions, 2 deletions
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index bd087be84dd..5ae83833cfc 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -828,7 +828,7 @@ uint32 GetExpansionForLevel(uint32 level) return CURRENT_EXPANSION; } -bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) +bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId) { if (requiredTotemCategoryId == 0) return true; diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index edbb5aa55bf..984f767cf91 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -61,7 +61,7 @@ uint32 GetExpansionForLevel(uint32 level); ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId); -bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); +bool IsTotemCategoryCompatibleWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId); void Zone2MapCoordinates(float &x, float &y, uint32 zone); void Map2ZoneCoordinates(float &x, float &y, uint32 zone); diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index abba96cf6dc..0824b0b3c29 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -631,6 +631,7 @@ struct ItemTemplate uint32 GetArea() const { return ExtendedData->Area; } uint32 GetMap() const { return ExtendedData->Map; } uint32 GetBagFamily() const { return ExtendedData->BagFamily; } + uint32 GetTotemCategory() const { return ExtendedData->TotemCategory; } SocketColor GetSocketColor(uint32 index) const { ASSERT(index < MAX_ITEM_PROTO_SOCKETS); return SocketColor(ExtendedData->SocketColor[index]); } uint32 GetSocketBonus() const { return ExtendedData->SocketBonus; } uint32 GetGemProperties() const { return ExtendedData->GemProperties; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c23e5311c9c..e5e95945c1c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -10211,6 +10211,34 @@ InventoryResult Player::CanStoreItem(uint8 bag, uint8 slot, ItemPosCountVec& des return CanStoreItem(bag, slot, dest, pItem->GetEntry(), count, pItem, swap, NULL); } +bool Player::HasItemTotemCategory(uint32 TotemCategory) const +{ + Item* item; + for (uint8 i = EQUIPMENT_SLOT_START; i < INVENTORY_SLOT_ITEM_END; ++i) + { + item = GetUseableItemByPos(INVENTORY_SLOT_BAG_0, i); + if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + return true; + } + + Bag* bag; + for (uint8 i = INVENTORY_SLOT_BAG_START; i < INVENTORY_SLOT_BAG_END; ++i) + { + bag = GetBagByPos(i); + if (bag) + { + for (uint32 j = 0; j < bag->GetBagSize(); ++j) + { + item = GetUseableItemByPos(i, j); + if (item && IsTotemCategoryCompatibleWith(item->GetTemplate()->GetTotemCategory(), TotemCategory)) + return true; + } + } + } + + return false; +} + InventoryResult Player::CanStoreItem_InSpecificSlot(uint8 bag, uint8 slot, ItemPosCountVec &dest, ItemTemplate const* pProto, uint32& count, bool swap, Item* pSrcItem) const { Item* pItem2 = GetItemByPos(bag, slot); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 61315062b10..ed7ba3b788c 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -6146,8 +6146,28 @@ SpellCastResult Spell::CheckItems() else totems -= 1; } + if (totems != 0) return SPELL_FAILED_TOTEMS; + + // Check items for TotemCategory (items presence in inventory) + uint32 totemCategory = 2; + for (uint8 i = 0; i < 2; ++i) + { + if (m_spellInfo->TotemCategory[i] != 0) + { + if (player->HasItemTotemCategory(m_spellInfo->TotemCategory[i])) + { + totemCategory -= 1; + continue; + } + } + else + totemCategory -= 1; + } + + if (totemCategory != 0) + return SPELL_FAILED_TOTEM_CATEGORY; } // special checks for spell effects |