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 | |
parent | 123858331211db6fe6745f0886c1499f8e598443 (diff) |
Core/Items: Fixed crash in selecting azerite essences
* Also fixed OVERRIDE_SPELLS auras for SPELLFAMILY_GENERIC
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp | 20 | ||||
-rw-r--r-- | src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/Item/Item.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Handlers/AzeriteHandler.cpp | 64 |
6 files changed, 68 insertions, 55 deletions
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp index 60b4770365c..3d8fd01134c 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.cpp @@ -99,7 +99,7 @@ void AzeriteItem::SaveToDB(CharacterDatabaseTransaction& trans) } } -void AzeriteItem::LoadAzeriteItemData(Player* owner, AzeriteItemData& azeriteItemData) +void AzeriteItem::LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItemData) { bool needSave = false; @@ -159,12 +159,12 @@ void AzeriteItem::LoadAzeriteItemData(Player* owner, AzeriteItemData& azeriteIte selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::AzeriteEssenceID, i).SetValue(selectedEssenceData.AzeriteEssenceId[i]); } - if (owner->GetPrimarySpecialization() == selectedEssenceData.SpecializationId) + if (owner && owner->GetPrimarySpecialization() == selectedEssenceData.SpecializationId) selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(1); } // add selected essences for current spec - if (!GetSelectedAzeriteEssences()) + if (owner && !GetSelectedAzeriteEssences()) CreateSelectedAzeriteEssences(owner->GetPrimarySpecialization()); if (needSave) @@ -359,6 +359,13 @@ void AzeriteItem::SetSelectedAzeriteEssences(uint32 specializationId) CreateSelectedAzeriteEssences(specializationId); } +void AzeriteItem::CreateSelectedAzeriteEssences(uint32 specializationId) +{ + auto selectedEssences = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences)); + selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId); + selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(1); +} + void AzeriteItem::SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId) { ASSERT(slot < MAX_AZERITE_ESSENCE_SLOT); @@ -449,10 +456,3 @@ void AzeriteItem::UnlockDefaultMilestones() hasPreviousMilestone = false; } } - -void AzeriteItem::CreateSelectedAzeriteEssences(uint32 specializationId) -{ - auto selectedEssences = AddDynamicUpdateFieldValue(m_values.ModifyValue(&AzeriteItem::m_azeriteItemData).ModifyValue(&UF::AzeriteItemData::SelectedEssences)); - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::SpecializationID).SetValue(specializationId); - selectedEssences.ModifyValue(&UF::SelectedAzeriteEssences::Enabled).SetValue(1); -} diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h index 124e5fa9b11..9e69debf38d 100644 --- a/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h +++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteItem.h @@ -34,7 +34,7 @@ public: bool Create(ObjectGuid::LowType guidlow, uint32 itemId, ItemContext context, Player const* owner) override; void SaveToDB(CharacterDatabaseTransaction& trans) override; - void LoadAzeriteItemData(Player* owner, AzeriteItemData& azeriteItem); + void LoadAzeriteItemData(Player const* owner, AzeriteItemData& azeriteItem); void DeleteFromDB(CharacterDatabaseTransaction& trans) override; uint32 GetLevel() const { return m_azeriteItemData->Level; } @@ -69,6 +69,7 @@ public: UF::SelectedAzeriteEssences const* GetSelectedAzeriteEssences() const; void SetSelectedAzeriteEssences(uint32 specializationId); + void CreateSelectedAzeriteEssences(uint32 specializationId); void SetSelectedAzeriteEssence(uint8 slot, uint32 azeriteEssenceId); void BuildValuesCreate(ByteBuffer* data, Player const* target) const override; @@ -80,7 +81,6 @@ public: private: void UnlockDefaultMilestones(); - void CreateSelectedAzeriteEssences(uint32 specializationId); }; #endif // AzeriteItem_h__ diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 13554e90ccf..1dd190053d8 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -900,7 +900,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fie return true; } -void Item::LoadArtifactData(Player* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers) +void Item::LoadArtifactData(Player const* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers) { for (uint8 i = 0; i <= artifactTier; ++i) InitArtifactPowers(GetTemplate()->GetArtifactID(), i); @@ -941,7 +941,7 @@ void Item::LoadArtifactData(Player* owner, uint64 xp, uint32 artifactAppearanceI if (ArtifactPowerPickerEntry const* artifactPowerPicker = sArtifactPowerPickerStore.LookupEntry(enchant->EffectArg[i])) { PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(artifactPowerPicker->PlayerConditionID); - if (!playerCondition || sConditionMgr->IsPlayerMeetingCondition(owner, playerCondition)) + if (!playerCondition || (owner && sConditionMgr->IsPlayerMeetingCondition(owner, playerCondition))) if (artifactPower->Label == _bonusData.GemRelicType[e - SOCK_ENCHANTMENT_SLOT]) power.CurrentRankWithBonus += enchant->EffectPointsMin[i]; } @@ -966,7 +966,7 @@ void Item::LoadArtifactData(Player* owner, uint64 xp, uint32 artifactAppearanceI SetArtifactPower(power.ArtifactPowerId, power.PurchasedRank, totalPurchasedRanks + 1); } - CheckArtifactRelicSlotUnlock(owner ? owner : GetOwner()); + CheckArtifactRelicSlotUnlock(owner); } void Item::CheckArtifactRelicSlotUnlock(Player const* owner) diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h index c7b6fd648a9..3d55219ca83 100644 --- a/src/server/game/Entities/Item/Item.h +++ b/src/server/game/Entities/Item/Item.h @@ -208,7 +208,7 @@ class TC_GAME_API Item : public Object bool IsBoundByEnchant() const; virtual void SaveToDB(CharacterDatabaseTransaction& trans); virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid ownerGuid, Field* fields, uint32 entry); - void LoadArtifactData(Player* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers); // must be called after LoadFromDB to have gems (relics) initialized + void LoadArtifactData(Player const* owner, uint64 xp, uint32 artifactAppearanceId, uint32 artifactTier, std::vector<ArtifactPowerData>& powers); // must be called after LoadFromDB to have gems (relics) initialized void CheckArtifactRelicSlotUnlock(Player const* owner); void AddBonuses(uint32 bonusListID); diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 2d6146da676..994ef60685b 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -14304,17 +14304,24 @@ void Unit::Whisper(uint32 textId, Player* target, bool isBossWhisper /*= false*/ SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo) const { - Unit::AuraEffectList swaps = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS); - Unit::AuraEffectList const& swaps2 = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED); - if (!swaps2.empty()) - swaps.insert(swaps.end(), swaps2.begin(), swaps2.end()); - - for (AuraEffect const* auraEffect : swaps) + auto findMatchingAuraEffectIn = [this, spellInfo](AuraType type) -> SpellInfo const* { - if (uint32(auraEffect->GetMiscValue()) == spellInfo->Id || auraEffect->IsAffectingSpell(spellInfo)) - if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(auraEffect->GetAmount())) - return newInfo; - } + for (AuraEffect const* auraEffect : GetAuraEffectsByType(type)) + { + bool matches = auraEffect->GetMiscValue() ? uint32(auraEffect->GetMiscValue()) == spellInfo->Id : auraEffect->IsAffectingSpell(spellInfo); + if (matches) + if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(auraEffect->GetAmount())) + return newInfo; + } + + return nullptr; + }; + + if (SpellInfo const* newInfo = findMatchingAuraEffectIn(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS)) + return newInfo; + + if (SpellInfo const* newInfo = findMatchingAuraEffectIn(SPELL_AURA_OVERRIDE_ACTIONBAR_SPELLS_TRIGGERED)) + return newInfo; return spellInfo; } 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); } |