diff options
author | Shauren <shauren.trinity@gmail.com> | 2019-12-01 00:13:51 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2019-12-01 00:13:51 +0100 |
commit | bec4ed0f16d100f74c76e4aca06ed9ea42e21ec4 (patch) | |
tree | 106e8ea0a527eb89fa343e9e66ae3f42d38b9486 /src/server/game/Handlers/AzeriteHandler.cpp | |
parent | 123858331211db6fe6745f0886c1499f8e598443 (diff) |
Core/Items: Fixed crash in selecting azerite essences
* Also fixed OVERRIDE_SPELLS auras for SPELLFAMILY_GENERIC
Diffstat (limited to 'src/server/game/Handlers/AzeriteHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/AzeriteHandler.cpp | 64 |
1 files changed, 35 insertions, 29 deletions
diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp index 200e4aa4d2a..463511de039 100644 --- a/src/server/game/Handlers/AzeriteHandler.cpp +++ b/src/server/game/Handlers/AzeriteHandler.cpp @@ -84,7 +84,7 @@ void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::Az UF::SelectedAzeriteEssences const* selectedEssences = azeriteItem->GetSelectedAzeriteEssences(); // essence is already in that slot, nothing to do - if (selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) + if (selectedEssences && selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) return; uint32 rank = azeriteItem->GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID); @@ -120,45 +120,51 @@ void WorldSession::HandleAzeriteEssenceActivateEssence(WorldPackets::Azerite::Az return; } - // need to remove selected essence from another slot if selected - int32 removeEssenceFromSlot = -1; - for (int32 slot = 0; slot < MAX_AZERITE_ESSENCE_SLOT; ++slot) - if (azeriteEssenceActivateEssence.Slot != uint8(slot) && selectedEssences->AzeriteEssenceID[slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) - removeEssenceFromSlot = slot; - - // check cooldown of major essence slot - if (selectedEssences->AzeriteEssenceID[0] && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) + if (selectedEssences) { - for (uint32 essenceRank = 1; essenceRank <= rank; ++essenceRank) + // need to remove selected essence from another slot if selected + int32 removeEssenceFromSlot = -1; + for (int32 slot = 0; slot < MAX_AZERITE_ESSENCE_SLOT; ++slot) + if (azeriteEssenceActivateEssence.Slot != uint8(slot) && selectedEssences->AzeriteEssenceID[slot] == uint32(azeriteEssenceActivateEssence.AzeriteEssenceID)) + removeEssenceFromSlot = slot; + + // check cooldown of major essence slot + if (selectedEssences->AzeriteEssenceID[0] && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) { - AzeriteEssencePowerEntry const* azeriteEssencePower = ASSERT_NOTNULL(sDB2Manager.GetAzeriteEssencePower(selectedEssences->AzeriteEssenceID[0], essenceRank)); - if (_player->GetSpellHistory()->HasCooldown(azeriteEssencePower->MajorPowerDescription)) + for (uint32 essenceRank = 1; essenceRank <= rank; ++essenceRank) { - activateEssenceResult.Reason = AzeriteEssenceActivateResult::CantRemoveEssence; - activateEssenceResult.Arg = azeriteEssencePower->MajorPowerDescription; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult.Write()); - return; + AzeriteEssencePowerEntry const* azeriteEssencePower = ASSERT_NOTNULL(sDB2Manager.GetAzeriteEssencePower(selectedEssences->AzeriteEssenceID[0], essenceRank)); + if (_player->GetSpellHistory()->HasCooldown(azeriteEssencePower->MajorPowerDescription)) + { + activateEssenceResult.Reason = AzeriteEssenceActivateResult::CantRemoveEssence; + activateEssenceResult.Arg = azeriteEssencePower->MajorPowerDescription; + activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; + SendPacket(activateEssenceResult.Write()); + return; + } } } - } - if (removeEssenceFromSlot != -1) - { - _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[removeEssenceFromSlot], MAX_AZERITE_ESSENCE_RANK, - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(removeEssenceFromSlot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); - azeriteItem->SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); - } + if (removeEssenceFromSlot != -1) + { + _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[removeEssenceFromSlot], MAX_AZERITE_ESSENCE_RANK, + AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(removeEssenceFromSlot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); + azeriteItem->SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); + } - if (selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot]) - { - _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], MAX_AZERITE_ESSENCE_RANK, - AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); + if (selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot]) + { + _player->ApplyAzeriteEssence(azeriteItem, selectedEssences->AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], MAX_AZERITE_ESSENCE_RANK, + AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot)->Type) == AzeriteItemMilestoneType::MajorEssence, false); + } } + else + azeriteItem->CreateSelectedAzeriteEssences(_player->GetPrimarySpecialization()); + + azeriteItem->SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID); _player->ApplyAzeriteEssence(azeriteItem, azeriteEssenceActivateEssence.AzeriteEssenceID, rank, AzeriteItemMilestoneType(sDB2Manager.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot)->Type) == AzeriteItemMilestoneType::MajorEssence, true); - azeriteItem->SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID); azeriteItem->SetState(ITEM_CHANGED, _player); } |