aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-02-21 16:58:09 +0100
committerShauren <shauren.trinity@gmail.com>2015-02-21 16:58:09 +0100
commitea9eccae8596d440c372b0d9709d4def4b46e648 (patch)
treef240e8bd8e6ff0857b215d46c130e8859e481270
parentd2396fb897a4a2f21a4b43f8c37f3a87c4285f2c (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.cpp2
-rw-r--r--src/server/game/DataStores/DBCStores.h2
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h1
-rw-r--r--src/server/game/Entities/Player/Player.cpp28
-rw-r--r--src/server/game/Spells/Spell.cpp20
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