Core/Spells: explicitly disable non proccing auras when generating default procs
Port From (https://github.com/TrinityCore/TrinityCore/commit/0ae1ebedfee41662df5ec49ae2b40670aaea9665)
This commit is contained in:
@@ -1423,6 +1423,10 @@ namespace Game.Entities
|
|||||||
Log.outError(LogFilter.Sql, "`spell_proc` table entry for spellId {0} has wrong `HitMask` set: {1}", spellInfo.Id, procEntry.HitMask);
|
Log.outError(LogFilter.Sql, "`spell_proc` table entry for spellId {0} has wrong `HitMask` set: {1}", spellInfo.Id, procEntry.HitMask);
|
||||||
if (procEntry.HitMask != 0 && !(Convert.ToBoolean(procEntry.ProcFlags & ProcFlags.TakenHitMask) || (Convert.ToBoolean(procEntry.ProcFlags & ProcFlags.DoneHitMask) && (procEntry.SpellPhaseMask == 0 || Convert.ToBoolean(procEntry.SpellPhaseMask & (ProcFlagsSpellPhase.Hit | ProcFlagsSpellPhase.Finish))))))
|
if (procEntry.HitMask != 0 && !(Convert.ToBoolean(procEntry.ProcFlags & ProcFlags.TakenHitMask) || (Convert.ToBoolean(procEntry.ProcFlags & ProcFlags.DoneHitMask) && (procEntry.SpellPhaseMask == 0 || Convert.ToBoolean(procEntry.SpellPhaseMask & (ProcFlagsSpellPhase.Hit | ProcFlagsSpellPhase.Finish))))))
|
||||||
Log.outError(LogFilter.Sql, "`spell_proc` table entry for spellId {0} has `HitMask` value defined, but it won't be used for defined `ProcFlags` and `SpellPhaseMask` values", spellInfo.Id);
|
Log.outError(LogFilter.Sql, "`spell_proc` table entry for spellId {0} has `HitMask` value defined, but it won't be used for defined `ProcFlags` and `SpellPhaseMask` values", spellInfo.Id);
|
||||||
|
for (uint i = 0; i < SpellConst.MaxEffects; ++i)
|
||||||
|
if ((procEntry.DisableEffectsMask & (1u << (int)i)) != 0 && (!spellInfo.HasEffect((SpellEffectName)i) || !spellInfo.GetEffect(i).IsAura()))
|
||||||
|
Log.outError(LogFilter.Sql, $"The `spell_proc` table entry for spellId {spellInfo.Id} has DisableEffectsMask with effect {i}, but effect {i} is not an aura effect");
|
||||||
|
|
||||||
if (procEntry.AttributesMask.HasFlag(ProcAttributes.ReqSpellmod))
|
if (procEntry.AttributesMask.HasFlag(ProcAttributes.ReqSpellmod))
|
||||||
{
|
{
|
||||||
bool found = false;
|
bool found = false;
|
||||||
@@ -1474,6 +1478,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
bool addTriggerFlag = false;
|
bool addTriggerFlag = false;
|
||||||
ProcFlagsSpellType procSpellTypeMask = ProcFlagsSpellType.None;
|
ProcFlagsSpellType procSpellTypeMask = ProcFlagsSpellType.None;
|
||||||
|
uint nonProcMask = 0;
|
||||||
foreach (SpellEffectInfo effect in spellInfo.GetEffects())
|
foreach (SpellEffectInfo effect in spellInfo.GetEffects())
|
||||||
{
|
{
|
||||||
if (effect == null || !effect.IsEffect())
|
if (effect == null || !effect.IsEffect())
|
||||||
@@ -1484,7 +1489,11 @@ namespace Game.Entities
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!IsTriggerAura(auraName))
|
if (!IsTriggerAura(auraName))
|
||||||
|
{
|
||||||
|
// explicitly disable non proccing auras to avoid losing charges on self proc
|
||||||
|
nonProcMask |= 1u << (int)effect.EffectIndex;
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
procSpellTypeMask |= GetSpellTypeMask(auraName);
|
procSpellTypeMask |= GetSpellTypeMask(auraName);
|
||||||
if (IsAlwaysTriggeredAura(auraName))
|
if (IsAlwaysTriggeredAura(auraName))
|
||||||
@@ -1504,7 +1513,6 @@ namespace Game.Entities
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (procSpellTypeMask == 0)
|
if (procSpellTypeMask == 0)
|
||||||
@@ -1563,7 +1571,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
|
|
||||||
procEntry.AttributesMask = 0;
|
procEntry.AttributesMask = 0;
|
||||||
procEntry.DisableEffectsMask = 0;
|
procEntry.DisableEffectsMask = nonProcMask;
|
||||||
if (spellInfo.ProcFlags.HasAnyFlag(ProcFlags.Kill))
|
if (spellInfo.ProcFlags.HasAnyFlag(ProcFlags.Kill))
|
||||||
procEntry.AttributesMask |= ProcAttributes.ReqExpOrHonor;
|
procEntry.AttributesMask |= ProcAttributes.ReqExpOrHonor;
|
||||||
if (addTriggerFlag)
|
if (addTriggerFlag)
|
||||||
|
|||||||
Reference in New Issue
Block a user