From e24c69dd8922c24a0cb344955f7fe682b29cc305 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 2 Dec 2019 14:15:23 -0500 Subject: [PATCH] Core/Items: Fixed crash in selecting azerite essences Port From (https://github.com/TrinityCore/TrinityCore/commit/bec4ed0f16d100f74c76e4aca06ed9ea42e21ec4) --- Source/Game/Entities/Item/AzeriteItem.cs | 20 ++++---- Source/Game/Entities/Item/Item.cs | 4 +- Source/Game/Entities/Unit/Unit.Spells.cs | 29 +++++++---- Source/Game/Handlers/AzeriteHandler.cs | 65 +++++++++++++----------- 4 files changed, 67 insertions(+), 51 deletions(-) diff --git a/Source/Game/Entities/Item/AzeriteItem.cs b/Source/Game/Entities/Item/AzeriteItem.cs index f8685dc6a..0bd24b7cd 100644 --- a/Source/Game/Entities/Item/AzeriteItem.cs +++ b/Source/Game/Entities/Item/AzeriteItem.cs @@ -167,14 +167,14 @@ namespace Game.Entities selectedEssences.ModifyValue(selectedEssences.AzeriteEssenceID, i) = selectedEssenceData.AzeriteEssenceId[i]; } - if (owner.GetPrimarySpecialization() == selectedEssenceData.SpecializationId) + if (owner != null && owner.GetPrimarySpecialization() == selectedEssenceData.SpecializationId) selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1); AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences); } // add selected essences for current spec - if (GetSelectedAzeriteEssences() == null) + if (owner != null && GetSelectedAzeriteEssences() == null) CreateSelectedAzeriteEssences(owner.GetPrimarySpecialization()); if (needSave) @@ -372,6 +372,14 @@ namespace Game.Entities return null; } + public void CreateSelectedAzeriteEssences(uint specializationId) + { + SelectedAzeriteEssences selectedEssences = new SelectedAzeriteEssences(); + selectedEssences.ModifyValue(selectedEssences.SpecializationID).SetValue(specializationId); + selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1); + AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences); + } + public void SetSelectedAzeriteEssences(uint specializationId) { int index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences => { return essences.Enabled == 1; }); @@ -487,14 +495,6 @@ namespace Game.Entities hasPreviousMilestone = false; } } - - void CreateSelectedAzeriteEssences(uint specializationId) - { - var selectedEssences = new SelectedAzeriteEssences(); - selectedEssences.ModifyValue(selectedEssences.SpecializationID).SetValue(specializationId); - selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1); - AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences); - } } public class AzeriteItemSelectedEssencesData diff --git a/Source/Game/Entities/Item/Item.cs b/Source/Game/Entities/Item/Item.cs index 5af27f6bb..3208414b9 100644 --- a/Source/Game/Entities/Item/Item.cs +++ b/Source/Game/Entities/Item/Item.cs @@ -570,7 +570,7 @@ namespace Game.Entities if (artifactPowerPicker != null) { PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(artifactPowerPicker.PlayerConditionID); - if (playerCondition == null || ConditionManager.IsPlayerMeetingCondition(owner, playerCondition)) + if (playerCondition == null || (owner != null && ConditionManager.IsPlayerMeetingCondition(owner, playerCondition))) if (artifactPower.Label == _bonusData.GemRelicType[e - EnchantmentSlot.Sock1]) power.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i]; } @@ -595,7 +595,7 @@ namespace Game.Entities SetArtifactPower((ushort)power.ArtifactPowerId, power.PurchasedRank, (byte)(totalPurchasedRanks + 1)); } - CheckArtifactRelicSlotUnlock(owner != null ? owner : GetOwner()); + CheckArtifactRelicSlotUnlock(owner); } public void CheckArtifactRelicSlotUnlock(Player owner) diff --git a/Source/Game/Entities/Unit/Unit.Spells.cs b/Source/Game/Entities/Unit/Unit.Spells.cs index dac5ac97e..c94f944f1 100644 --- a/Source/Game/Entities/Unit/Unit.Spells.cs +++ b/Source/Game/Entities/Unit/Unit.Spells.cs @@ -1234,21 +1234,30 @@ namespace Game.Entities public virtual SpellInfo GetCastSpellInfo(SpellInfo spellInfo) { - var swaps = GetAuraEffectsByType(AuraType.OverrideActionbarSpells); - var swaps2 = GetAuraEffectsByType(AuraType.OverrideActionbarSpellsTriggered); - if (!swaps2.Empty()) - swaps.AddRange(swaps2); - - foreach (AuraEffect auraEffect in swaps) + SpellInfo findMatchingAuraEffectIn(AuraType type) { - if (auraEffect.GetMiscValue() == spellInfo.Id || auraEffect.IsAffectingSpell(spellInfo)) + foreach (AuraEffect auraEffect in GetAuraEffectsByType(type)) { - SpellInfo newInfo = Global.SpellMgr.GetSpellInfo((uint)auraEffect.GetAmount()); - if (newInfo != null) - return newInfo; + bool matches = auraEffect.GetMiscValue() != 0 ? auraEffect.GetMiscValue() == spellInfo.Id : auraEffect.IsAffectingSpell(spellInfo); + if (matches) + { + SpellInfo info = Global.SpellMgr.GetSpellInfo((uint)auraEffect.GetAmount()); + if (info != null) + return info; + } } + + return null; } + SpellInfo newInfo = findMatchingAuraEffectIn(AuraType.OverrideActionbarSpells); + if (newInfo != null) + return newInfo; + + newInfo = findMatchingAuraEffectIn(AuraType.OverrideActionbarSpellsTriggered); + if (newInfo != null) + return newInfo; + return spellInfo; } diff --git a/Source/Game/Handlers/AzeriteHandler.cs b/Source/Game/Handlers/AzeriteHandler.cs index f9a42fa2c..a6a1aa067 100644 --- a/Source/Game/Handlers/AzeriteHandler.cs +++ b/Source/Game/Handlers/AzeriteHandler.cs @@ -91,7 +91,7 @@ namespace Game SelectedAzeriteEssences selectedEssences = azeriteItem.GetSelectedAzeriteEssences(); // essence is already in that slot, nothing to do - if (selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) + if (selectedEssences != null && selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) return; uint rank = azeriteItem.GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID); @@ -127,46 +127,53 @@ namespace Game return; } - // need to remove selected essence from another slot if selected - int removeEssenceFromSlot = -1; - for (int slot = 0; slot < SharedConst.MaxAzeriteEssenceSlot; ++slot) - if (azeriteEssenceActivateEssence.Slot != slot && selectedEssences.AzeriteEssenceID[slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) - removeEssenceFromSlot = slot; - - // check cooldown of major essence slot - if (selectedEssences.AzeriteEssenceID[0] != 0 && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) + if (selectedEssences != null) { - for (uint essenceRank = 1; essenceRank <= rank; ++essenceRank) + // need to remove selected essence from another slot if selected + int removeEssenceFromSlot = -1; + for (int slot = 0; slot < SharedConst.MaxAzeriteEssenceSlot; ++slot) + if (azeriteEssenceActivateEssence.Slot != slot && selectedEssences.AzeriteEssenceID[slot] == azeriteEssenceActivateEssence.AzeriteEssenceID) + removeEssenceFromSlot = slot; + + // check cooldown of major essence slot + if (selectedEssences.AzeriteEssenceID[0] != 0 && (azeriteEssenceActivateEssence.Slot == 0 || removeEssenceFromSlot == 0)) { - AzeriteEssencePowerRecord azeriteEssencePower = Global.DB2Mgr.GetAzeriteEssencePower(selectedEssences.AzeriteEssenceID[0], essenceRank); - if (_player.GetSpellHistory().HasCooldown(azeriteEssencePower.MajorPowerDescription)) + for (uint essenceRank = 1; essenceRank <= rank; ++essenceRank) { - activateEssenceResult.Reason = AzeriteEssenceActivateResult.CantRemoveEssence; - activateEssenceResult.Arg = azeriteEssencePower.MajorPowerDescription; - activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; - SendPacket(activateEssenceResult); - return; + AzeriteEssencePowerRecord azeriteEssencePower = Global.DB2Mgr.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); + return; + } } } - } - if (removeEssenceFromSlot != -1) - { - _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[removeEssenceFromSlot], SharedConst.MaxAzeriteEssenceRank, - (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(removeEssenceFromSlot).Type == AzeriteItemMilestoneType.MajorEssence, false); - azeriteItem.SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); - } - if (selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] != 0) - { - _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], SharedConst.MaxAzeriteEssenceRank, - (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, false); + if (removeEssenceFromSlot != -1) + { + _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[removeEssenceFromSlot], SharedConst.MaxAzeriteEssenceRank, + (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(removeEssenceFromSlot).Type == AzeriteItemMilestoneType.MajorEssence, false); + azeriteItem.SetSelectedAzeriteEssence(removeEssenceFromSlot, 0); + } + + if (selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot] != 0) + { + _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], SharedConst.MaxAzeriteEssenceRank, + (AzeriteItemMilestoneType)Global.DB2Mgr.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)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, true); - azeriteItem.SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID); azeriteItem.SetState(ItemUpdateState.Changed, _player); } }