diff --git a/Source/Game/Spells/SpellInfo.cs b/Source/Game/Spells/SpellInfo.cs index c1cfd40f0..daacff3ca 100644 --- a/Source/Game/Spells/SpellInfo.cs +++ b/Source/Game/Spells/SpellInfo.cs @@ -2265,35 +2265,48 @@ namespace Game.Spells } } - void _LoadSqrtTargetLimit(int maxTargets, int numNonDiminishedTargets, uint? maxTargetsEffectValueHolder, uint? numNonDiminishedTargetsEffectValueHolder) + public void _LoadSqrtTargetLimit(int maxTargets, int numNonDiminishedTargets, uint? maxTargetsValueHolderSpell, uint? maxTargetsValueHolderEffect, + uint? numNonDiminishedTargetsValueHolderSpell, uint? numNonDiminishedTargetsValueHolderEffect) { SqrtDamageAndHealingDiminishing.MaxTargets = maxTargets; SqrtDamageAndHealingDiminishing.NumNonDiminishedTargets = numNonDiminishedTargets; - if (maxTargetsEffectValueHolder.HasValue) + if (maxTargetsValueHolderEffect.HasValue) { - if (maxTargetsEffectValueHolder < GetEffects().Count) + SpellInfo maxTargetValueHolder = this; + if (maxTargetsValueHolderSpell.HasValue) + maxTargetValueHolder = Global.SpellMgr.GetSpellInfo(maxTargetsValueHolderSpell.Value, Difficulty); + + if (maxTargetValueHolder == null) + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {maxTargetsValueHolderSpell} does not exist"); + else if (maxTargetsValueHolderEffect >= maxTargetValueHolder.GetEffects().Count) + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {maxTargetValueHolder.Id} does not have effect {maxTargetsValueHolderEffect.Value}"); + else { - SpellEffectInfo valueHolder = GetEffect(maxTargetsEffectValueHolder.Value); + SpellEffectInfo valueHolder = maxTargetValueHolder.GetEffect(maxTargetsValueHolderEffect.Value); int expectedValue = valueHolder.CalcBaseValue(null, null, 0, -1); if (maxTargets != expectedValue) - Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {Id} has different value in effect {maxTargetsEffectValueHolder.Value} than expected, recheck target caps (expected {maxTargets}, got {expectedValue})"); + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {maxTargetValueHolder.Id} has different value in effect {maxTargetsValueHolderEffect.Value} than expected, recheck target caps (expected {maxTargets}, got {expectedValue})"); } - else - Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(maxTargets): Spell {Id} does not have effect {maxTargetsEffectValueHolder.Value}"); } - if (numNonDiminishedTargetsEffectValueHolder.HasValue) + if (numNonDiminishedTargetsValueHolderEffect.HasValue) { - if (numNonDiminishedTargetsEffectValueHolder < GetEffects().Count) + SpellInfo numNonDiminishedTargetsValueHolder = this; + if (numNonDiminishedTargetsValueHolderSpell.HasValue) + numNonDiminishedTargetsValueHolder = Global.SpellMgr.GetSpellInfo(numNonDiminishedTargetsValueHolderSpell.Value, Difficulty); + + if (numNonDiminishedTargetsValueHolder == null) + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {maxTargetsValueHolderSpell} does not exist"); + else if (numNonDiminishedTargetsValueHolderEffect >= numNonDiminishedTargetsValueHolder.GetEffects().Count) + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {numNonDiminishedTargetsValueHolder.Id} does not have effect {maxTargetsValueHolderEffect.Value}"); + else { - SpellEffectInfo valueHolder = GetEffect(numNonDiminishedTargetsEffectValueHolder.Value); + SpellEffectInfo valueHolder = numNonDiminishedTargetsValueHolder.GetEffect(numNonDiminishedTargetsValueHolderEffect.Value); int expectedValue = valueHolder.CalcBaseValue(null, null, 0, -1); if (numNonDiminishedTargets != expectedValue) - Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {Id} has different value in effect {numNonDiminishedTargetsEffectValueHolder.Value} than expected, recheck target caps (expected {numNonDiminishedTargets}, got {expectedValue})"); + Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {numNonDiminishedTargetsValueHolder.Id} has different value in effect {numNonDiminishedTargetsValueHolderEffect.Value} than expected, recheck target caps (expected {numNonDiminishedTargets}, got {expectedValue})"); } - else - Log.outError(LogFilter.Spells, $"SpellInfo::_LoadSqrtTargetLimit(numNonDiminishedTargets): Spell {Id} does not have effect {numNonDiminishedTargetsEffectValueHolder.Value}"); } } diff --git a/Source/Game/Spells/SpellManager.cs b/Source/Game/Spells/SpellManager.cs index 1c8365b4f..48cd9a660 100644 --- a/Source/Game/Spells/SpellManager.cs +++ b/Source/Game/Spells/SpellManager.cs @@ -4460,7 +4460,7 @@ namespace Game.Entities }); // TODO: temporary, remove with dragonriding - ApplySpellFix( [404468], spellInfo => + ApplySpellFix([404468], spellInfo => { spellInfo.AttributesCu |= SpellCustomAttributes.AuraCannotBeSaved; }); @@ -4627,7 +4627,26 @@ namespace Game.Entities spellInfo._LoadImmunityInfo(); } - Log.outInfo(LogFilter.ServerLoading, "Loaded SpellInfo immunity infos in {0} ms", Time.GetMSTimeDiffToNow(oldMSTime)); + Log.outInfo(LogFilter.ServerLoading, $"Loaded SpellInfo immunity infos in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); + } + + public void LoadSpellInfoTargetCaps() + { + uint oldMSTime = Time.GetMSTime(); + + // Eye Beam + ApplySpellFix([198030], spellInfo => + { + spellInfo._LoadSqrtTargetLimit(5, 0, 198013, 4, null, null); + }); + + // Volatile Agony + ApplySpellFix([453035], spellInfo => + { + spellInfo._LoadSqrtTargetLimit(8, 0, 453034, 1, null, null); + }); + + Log.outInfo(LogFilter.ServerLoading, $"Loaded SpellInfo target caps in {Time.GetMSTimeDiffToNow(oldMSTime)} ms"); } public void LoadPetFamilySpellsStore() diff --git a/Source/Game/World/WorldManager.cs b/Source/Game/World/WorldManager.cs index 1d912de40..edf037b3e 100644 --- a/Source/Game/World/WorldManager.cs +++ b/Source/Game/World/WorldManager.cs @@ -492,6 +492,9 @@ namespace Game Log.outInfo(LogFilter.ServerLoading, "Loading SpellInfo immunity infos..."); Global.SpellMgr.LoadSpellInfoImmunities(); + Log.outInfo(LogFilter.ServerLoading, "Loading SpellInfo target caps..."); + Global.SpellMgr.LoadSpellInfoTargetCaps(); + Log.outInfo(LogFilter.ServerLoading, "Loading PetFamilySpellsStore Data..."); Global.SpellMgr.LoadPetFamilySpellsStore();