Core/Items: Fixed crash in selecting azerite essences

Port From (https://github.com/TrinityCore/TrinityCore/commit/bec4ed0f16d100f74c76e4aca06ed9ea42e21ec4)
This commit is contained in:
hondacrx
2019-12-02 14:15:23 -05:00
parent cdb225a4b6
commit e24c69dd89
4 changed files with 67 additions and 51 deletions
+10 -10
View File
@@ -167,14 +167,14 @@ namespace Game.Entities
selectedEssences.ModifyValue(selectedEssences.AzeriteEssenceID, i) = selectedEssenceData.AzeriteEssenceId[i]; 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); selectedEssences.ModifyValue(selectedEssences.Enabled).SetValue(1);
AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences); AddDynamicUpdateFieldValue(m_values.ModifyValue(m_azeriteItemData).ModifyValue(m_azeriteItemData.SelectedEssences), selectedEssences);
} }
// add selected essences for current spec // add selected essences for current spec
if (GetSelectedAzeriteEssences() == null) if (owner != null && GetSelectedAzeriteEssences() == null)
CreateSelectedAzeriteEssences(owner.GetPrimarySpecialization()); CreateSelectedAzeriteEssences(owner.GetPrimarySpecialization());
if (needSave) if (needSave)
@@ -372,6 +372,14 @@ namespace Game.Entities
return null; 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) public void SetSelectedAzeriteEssences(uint specializationId)
{ {
int index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences => { return essences.Enabled == 1; }); int index = m_azeriteItemData.SelectedEssences.FindIndexIf(essences => { return essences.Enabled == 1; });
@@ -487,14 +495,6 @@ namespace Game.Entities
hasPreviousMilestone = false; 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 public class AzeriteItemSelectedEssencesData
+2 -2
View File
@@ -570,7 +570,7 @@ namespace Game.Entities
if (artifactPowerPicker != null) if (artifactPowerPicker != null)
{ {
PlayerConditionRecord playerCondition = CliDB.PlayerConditionStorage.LookupByKey(artifactPowerPicker.PlayerConditionID); 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]) if (artifactPower.Label == _bonusData.GemRelicType[e - EnchantmentSlot.Sock1])
power.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i]; power.CurrentRankWithBonus += (byte)enchant.EffectPointsMin[i];
} }
@@ -595,7 +595,7 @@ namespace Game.Entities
SetArtifactPower((ushort)power.ArtifactPowerId, power.PurchasedRank, (byte)(totalPurchasedRanks + 1)); SetArtifactPower((ushort)power.ArtifactPowerId, power.PurchasedRank, (byte)(totalPurchasedRanks + 1));
} }
CheckArtifactRelicSlotUnlock(owner != null ? owner : GetOwner()); CheckArtifactRelicSlotUnlock(owner);
} }
public void CheckArtifactRelicSlotUnlock(Player owner) public void CheckArtifactRelicSlotUnlock(Player owner)
+19 -10
View File
@@ -1234,21 +1234,30 @@ namespace Game.Entities
public virtual SpellInfo GetCastSpellInfo(SpellInfo spellInfo) public virtual SpellInfo GetCastSpellInfo(SpellInfo spellInfo)
{ {
var swaps = GetAuraEffectsByType(AuraType.OverrideActionbarSpells); SpellInfo findMatchingAuraEffectIn(AuraType type)
var swaps2 = GetAuraEffectsByType(AuraType.OverrideActionbarSpellsTriggered);
if (!swaps2.Empty())
swaps.AddRange(swaps2);
foreach (AuraEffect auraEffect in swaps)
{ {
if (auraEffect.GetMiscValue() == spellInfo.Id || auraEffect.IsAffectingSpell(spellInfo)) foreach (AuraEffect auraEffect in GetAuraEffectsByType(type))
{ {
SpellInfo newInfo = Global.SpellMgr.GetSpellInfo((uint)auraEffect.GetAmount()); bool matches = auraEffect.GetMiscValue() != 0 ? auraEffect.GetMiscValue() == spellInfo.Id : auraEffect.IsAffectingSpell(spellInfo);
if (newInfo != null) if (matches)
return newInfo; {
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; return spellInfo;
} }
+36 -29
View File
@@ -91,7 +91,7 @@ namespace Game
SelectedAzeriteEssences selectedEssences = azeriteItem.GetSelectedAzeriteEssences(); SelectedAzeriteEssences selectedEssences = azeriteItem.GetSelectedAzeriteEssences();
// essence is already in that slot, nothing to do // 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; return;
uint rank = azeriteItem.GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID); uint rank = azeriteItem.GetEssenceRank(azeriteEssenceActivateEssence.AzeriteEssenceID);
@@ -127,46 +127,53 @@ namespace Game
return; return;
} }
// need to remove selected essence from another slot if selected if (selectedEssences != null)
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))
{ {
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); for (uint essenceRank = 1; essenceRank <= rank; ++essenceRank)
if (_player.GetSpellHistory().HasCooldown(azeriteEssencePower.MajorPowerDescription))
{ {
activateEssenceResult.Reason = AzeriteEssenceActivateResult.CantRemoveEssence; AzeriteEssencePowerRecord azeriteEssencePower = Global.DB2Mgr.GetAzeriteEssencePower(selectedEssences.AzeriteEssenceID[0], essenceRank);
activateEssenceResult.Arg = azeriteEssencePower.MajorPowerDescription; if (_player.GetSpellHistory().HasCooldown(azeriteEssencePower.MajorPowerDescription))
activateEssenceResult.Slot = azeriteEssenceActivateEssence.Slot; {
SendPacket(activateEssenceResult); activateEssenceResult.Reason = AzeriteEssenceActivateResult.CantRemoveEssence;
return; 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) if (removeEssenceFromSlot != -1)
{ {
_player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[azeriteEssenceActivateEssence.Slot], SharedConst.MaxAzeriteEssenceRank, _player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[removeEssenceFromSlot], SharedConst.MaxAzeriteEssenceRank,
(AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, false); (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, _player.ApplyAzeriteEssence(azeriteItem, azeriteEssenceActivateEssence.AzeriteEssenceID, rank,
(AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, true); (AzeriteItemMilestoneType)Global.DB2Mgr.GetAzeriteItemMilestonePower(azeriteEssenceActivateEssence.Slot).Type == AzeriteItemMilestoneType.MajorEssence, true);
azeriteItem.SetSelectedAzeriteEssence(azeriteEssenceActivateEssence.Slot, azeriteEssenceActivateEssence.AzeriteEssenceID);
azeriteItem.SetState(ItemUpdateState.Changed, _player); azeriteItem.SetState(ItemUpdateState.Changed, _player);
} }
} }