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];
}
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
+2 -2
View File
@@ -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)
+20 -11
View File
@@ -1234,20 +1234,29 @@ 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);
SpellInfo findMatchingAuraEffectIn(AuraType type)
{
foreach (AuraEffect auraEffect in GetAuraEffectsByType(type))
{
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;
}
}
foreach (AuraEffect auraEffect in swaps)
{
if (auraEffect.GetMiscValue() == spellInfo.Id || auraEffect.IsAffectingSpell(spellInfo))
{
SpellInfo newInfo = Global.SpellMgr.GetSpellInfo((uint)auraEffect.GetAmount());
return null;
}
SpellInfo newInfo = findMatchingAuraEffectIn(AuraType.OverrideActionbarSpells);
if (newInfo != null)
return newInfo;
newInfo = findMatchingAuraEffectIn(AuraType.OverrideActionbarSpellsTriggered);
if (newInfo != null)
return newInfo;
}
}
return spellInfo;
}
+9 -2
View File
@@ -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,6 +127,8 @@ namespace Game
return;
}
if (selectedEssences != null)
{
// need to remove selected essence from another slot if selected
int removeEssenceFromSlot = -1;
for (int slot = 0; slot < SharedConst.MaxAzeriteEssenceSlot; ++slot)
@@ -150,6 +152,7 @@ namespace Game
}
}
if (removeEssenceFromSlot != -1)
{
_player.ApplyAzeriteEssence(azeriteItem, selectedEssences.AzeriteEssenceID[removeEssenceFromSlot], SharedConst.MaxAzeriteEssenceRank,
@@ -162,11 +165,15 @@ namespace Game
_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);
}
}