aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/AzeriteHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/AzeriteHandler.cpp')
-rw-r--r--src/server/game/Handlers/AzeriteHandler.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp
index 463511de039..fb3f3e01936 100644
--- a/src/server/game/Handlers/AzeriteHandler.cpp
+++ b/src/server/game/Handlers/AzeriteHandler.cpp
@@ -16,6 +16,7 @@
*/
#include "WorldSession.h"
+#include "AzeriteEmpoweredItem.h"
#include "AzeriteItem.h"
#include "AzeritePackets.h"
#include "DB2Stores.h"
@@ -168,3 +169,67 @@ void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::Az
azeriteItem->SetState(ITEM_CHANGED, _player);
}
+
+void WorldSession::HandleAzeriteEmpoweredItemViewed(WorldPackets::Azerite::AzeriteEmpoweredItemViewed& azeriteEmpoweredItemViewed)
+{
+ Item* item = _player->GetItemByGuid(azeriteEmpoweredItemViewed.ItemGUID);
+ if (!item || !item->IsAzeriteEmpoweredItem())
+ return;
+
+ item->AddItemFlag(ITEM_FIELD_FLAG_AZERITE_EMPOWERED_ITEM_VIEWED);
+ item->SetState(ITEM_CHANGED, _player);
+}
+
+void WorldSession::HandleAzeriteEmpoweredItemSelectPower(WorldPackets::Azerite::AzeriteEmpoweredItemSelectPower& azeriteEmpoweredItemSelectPower)
+{
+ Item* item = _player->GetItemByPos(azeriteEmpoweredItemSelectPower.ContainerSlot, azeriteEmpoweredItemSelectPower.Slot);
+ if (!item)
+ return;
+
+ AzeritePowerEntry const* azeritePower = sAzeritePowerStore.LookupEntry(azeriteEmpoweredItemSelectPower.AzeritePowerID);
+ if (!azeritePower)
+ return;
+
+ AzeriteEmpoweredItem* azeriteEmpoweredItem = item->ToAzeriteEmpoweredItem();
+ if (!azeriteEmpoweredItem)
+ return;
+
+ // Validate tier
+ int32 actualTier = azeriteEmpoweredItem->GetTierForAzeritePower(Classes(_player->getClass()), azeriteEmpoweredItemSelectPower.AzeritePowerID);
+ if (azeriteEmpoweredItemSelectPower.Tier > MAX_AZERITE_EMPOWERED_TIER || azeriteEmpoweredItemSelectPower.Tier != actualTier)
+ return;
+
+ uint32 azeriteLevel = 0;
+ Item const* heartOfAzeroth = _player->GetItemByEntry(ITEM_ID_HEART_OF_AZEROTH, ITEM_SEARCH_EVERYWHERE);
+ if (!heartOfAzeroth)
+ return;
+
+ if (AzeriteItem const* azeriteItem = heartOfAzeroth->ToAzeriteItem())
+ azeriteLevel = azeriteItem->GetEffectiveLevel();
+
+ // Check required heart of azeroth level
+ if (azeriteLevel < azeriteEmpoweredItem->GetRequiredAzeriteLevelForTier(uint32(actualTier)))
+ return;
+
+ // tiers are ordered backwards, you first select the highest one
+ for (int32 i = actualTier + 1; i < azeriteEmpoweredItem->GetMaxAzeritePowerTier(); ++i)
+ if (!azeriteEmpoweredItem->GetSelectedAzeritePower(i))
+ return;
+
+ bool activateAzeritePower = azeriteEmpoweredItem->IsEquipped() && heartOfAzeroth->IsEquipped();
+ if (azeritePower->ItemBonusListID && activateAzeritePower)
+ _player->_ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem->GetSlot(), false);
+
+ azeriteEmpoweredItem->SetSelectedAzeritePower(actualTier, azeriteEmpoweredItemSelectPower.AzeritePowerID);
+
+ if (activateAzeritePower)
+ {
+ // apply all item mods when azerite power grants a bonus, item level changes and that affects stats and auras that scale with item level
+ if (azeritePower->ItemBonusListID)
+ _player->_ApplyItemMods(azeriteEmpoweredItem, azeriteEmpoweredItem->GetSlot(), true);
+ else
+ _player->ApplyAzeritePower(azeriteEmpoweredItem, azeritePower, true);
+ }
+
+ azeriteEmpoweredItem->SetState(ITEM_CHANGED, _player);
+}