compute aura diminishing return info at startup and cache it

some changes in default proc generation. Fix an issue of stealth breaking with positive and/or healing spells
This commit is contained in:
hondacrx
2017-10-04 18:13:04 -04:00
parent 7bd260c2df
commit cc5263099c
4 changed files with 42 additions and 25 deletions
+10 -10
View File
@@ -2677,10 +2677,10 @@ namespace Game.Entities
return diminish.HitCount; return diminish.HitCount;
} }
public void IncrDiminishing(SpellInfo auraSpellInfo, bool triggered) public void IncrDiminishing(SpellInfo auraSpellInfo)
{ {
DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell(triggered); DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell();
DiminishingLevels maxLevel = auraSpellInfo.GetDiminishingReturnsMaxLevel(triggered); DiminishingLevels maxLevel = auraSpellInfo.GetDiminishingReturnsMaxLevel();
// Checking for existing in the table // Checking for existing in the table
DiminishingReturn diminish = m_Diminishing[(int)group]; DiminishingReturn diminish = m_Diminishing[(int)group];
@@ -2688,13 +2688,13 @@ namespace Game.Entities
++diminish.HitCount; ++diminish.HitCount;
} }
public float ApplyDiminishingToDuration(SpellInfo auraSpellInfo, bool triggered, ref int duration, Unit caster, DiminishingLevels previousLevel) public float ApplyDiminishingToDuration(SpellInfo auraSpellInfo, ref int duration, Unit caster, DiminishingLevels previousLevel)
{ {
DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell(triggered); DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell();
if (duration == -1 || group == DiminishingGroup.None) if (duration == -1 || group == DiminishingGroup.None)
return 1.0f; return 1.0f;
int limitDuration = auraSpellInfo.GetDiminishingReturnsLimitDuration(triggered); int limitDuration = auraSpellInfo.GetDiminishingReturnsLimitDuration();
// test pet/charm masters instead pets/charmeds // test pet/charm masters instead pets/charmeds
Unit targetOwner = GetCharmerOrOwner(); Unit targetOwner = GetCharmerOrOwner();
@@ -2740,9 +2740,9 @@ namespace Game.Entities
} }
break; break;
case DiminishingGroup.AOEKnockback: case DiminishingGroup.AOEKnockback:
if ((auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.Player && (((targetOwner ? targetOwner : this).ToPlayer()) if ((auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.Player && (((targetOwner ? targetOwner : this).ToPlayer())
|| IsCreature() && ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish))) || IsCreature() && ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish)))
|| auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.All) || auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.All)
{ {
DiminishingLevels diminish = previousLevel; DiminishingLevels diminish = previousLevel;
switch (diminish) switch (diminish)
@@ -2758,9 +2758,9 @@ namespace Game.Entities
} }
break; break;
default: default:
if ((auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.Player && (((targetOwner ? targetOwner : this).ToPlayer()) if ((auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.Player && (((targetOwner ? targetOwner : this).ToPlayer())
|| IsCreature() && ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish))) || IsCreature() && ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish)))
|| auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.All) || auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.All)
{ {
DiminishingLevels diminish = previousLevel; DiminishingLevels diminish = previousLevel;
switch (diminish) switch (diminish)
+4 -5
View File
@@ -2111,19 +2111,18 @@ namespace Game.Spells
aura_effmask |= (1u << (int)effect.EffectIndex); aura_effmask |= (1u << (int)effect.EffectIndex);
// Get Data Needed for Diminishing Returns, some effects may have multiple auras, so this must be done on spell hit, not aura add // Get Data Needed for Diminishing Returns, some effects may have multiple auras, so this must be done on spell hit, not aura add
bool triggered = m_triggeredByAuraSpell != null; DiminishingGroup diminishGroup = m_spellInfo.GetDiminishingReturnsGroupForSpell();
DiminishingGroup diminishGroup = m_spellInfo.GetDiminishingReturnsGroupForSpell(triggered);
DiminishingLevels diminishLevel = DiminishingLevels.Level1; DiminishingLevels diminishLevel = DiminishingLevels.Level1;
if (diminishGroup != 0 && aura_effmask != 0) if (diminishGroup != 0 && aura_effmask != 0)
{ {
diminishLevel = unit.GetDiminishing(diminishGroup); diminishLevel = unit.GetDiminishing(diminishGroup);
DiminishingReturnsType type = m_spellInfo.GetDiminishingReturnsGroupType(triggered); DiminishingReturnsType type = m_spellInfo.GetDiminishingReturnsGroupType();
// Increase Diminishing on unit, current informations for actually casts will use values above // Increase Diminishing on unit, current informations for actually casts will use values above
if ((type == DiminishingReturnsType.Player && (unit.GetCharmerOrOwnerPlayerOrPlayerItself() if ((type == DiminishingReturnsType.Player && (unit.GetCharmerOrOwnerPlayerOrPlayerItself()
|| (unit.IsCreature() && unit.ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish)))) || (unit.IsCreature() && unit.ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish))))
|| type == DiminishingReturnsType.All) || type == DiminishingReturnsType.All)
unit.IncrDiminishing(m_spellInfo, triggered); unit.IncrDiminishing(m_spellInfo);
} }
if (aura_effmask != 0) if (aura_effmask != 0)
@@ -2170,7 +2169,7 @@ namespace Game.Spells
// Now Reduce spell duration using data received at spell hit // Now Reduce spell duration using data received at spell hit
int duration = m_spellAura.GetMaxDuration(); int duration = m_spellAura.GetMaxDuration();
float diminishMod = unit.ApplyDiminishingToDuration(aurSpellInfo, triggered, ref duration, m_originalCaster, diminishLevel); float diminishMod = unit.ApplyDiminishingToDuration(aurSpellInfo, ref duration, m_originalCaster, diminishLevel);
// unit is immune to aura if it was diminished to 0 duration // unit is immune to aura if it was diminished to 0 duration
if (diminishMod == 0.0f) if (diminishMod == 0.0f)
+2 -2
View File
@@ -1558,12 +1558,12 @@ namespace Game.Spells
return _diminishInfo.DiminishReturnType; return _diminishInfo.DiminishReturnType;
} }
public DiminishingLevels GetDiminishingReturnsMaxLevel(bool triggered) public DiminishingLevels GetDiminishingReturnsMaxLevel()
{ {
return _diminishInfo.DiminishMaxLevel; return _diminishInfo.DiminishMaxLevel;
} }
public int GetDiminishingReturnsLimitDuration(bool triggered) public int GetDiminishingReturnsLimitDuration()
{ {
return _diminishInfo.DiminishDurationLimit; return _diminishInfo.DiminishDurationLimit;
} }
+26 -8
View File
@@ -1280,7 +1280,8 @@ namespace Game.Entities
if (mSpellProcMap.ContainsKey(spellInfo.Id)) if (mSpellProcMap.ContainsKey(spellInfo.Id))
continue; continue;
bool found = false, addTriggerFlag = false; bool addTriggerFlag = false;
ProcFlagsSpellType procSpellTypeMask = ProcFlagsSpellType.None;
foreach (SpellEffectInfo effect in spellInfo.GetEffectsForDifficulty(Difficulty.None)) foreach (SpellEffectInfo effect in spellInfo.GetEffectsForDifficulty(Difficulty.None))
{ {
if (effect == null || !effect.IsEffect()) if (effect == null || !effect.IsEffect())
@@ -1293,14 +1294,13 @@ namespace Game.Entities
if (!isTriggerAura(auraName)) if (!isTriggerAura(auraName))
continue; continue;
found = true; procSpellTypeMask |= getSpellTypeMask(auraName);
if (isAlwaysTriggeredAura(auraName))
if (!addTriggerFlag && isAlwaysTriggeredAura(auraName))
addTriggerFlag = true; addTriggerFlag = true;
break; break;
} }
if (!found) if (procSpellTypeMask == 0)
continue; continue;
if (spellInfo.ProcFlags == 0) if (spellInfo.ProcFlags == 0)
@@ -1317,7 +1317,7 @@ namespace Game.Entities
if (procEntry.SpellFamilyMask) if (procEntry.SpellFamilyMask)
procEntry.SpellFamilyName = spellInfo.SpellFamilyName; procEntry.SpellFamilyName = spellInfo.SpellFamilyName;
procEntry.SpellTypeMask = ProcFlagsSpellType.MaskAll; procEntry.SpellTypeMask = procSpellTypeMask;
procEntry.SpellPhaseMask = ProcFlagsSpellPhase.Hit; procEntry.SpellPhaseMask = ProcFlagsSpellPhase.Hit;
procEntry.HitMask = ProcFlagsHit.None; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent procEntry.HitMask = ProcFlagsHit.None; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent
@@ -2790,7 +2790,7 @@ namespace Game.Entities
} }
#endregion #endregion
public bool isTriggerAura(AuraType type) bool isTriggerAura(AuraType type)
{ {
switch (type) switch (type)
{ {
@@ -2834,7 +2834,7 @@ namespace Game.Entities
} }
return false; return false;
} }
public bool isAlwaysTriggeredAura(AuraType type) bool isAlwaysTriggeredAura(AuraType type)
{ {
switch (type) switch (type)
{ {
@@ -2851,6 +2851,24 @@ namespace Game.Entities
} }
return false; return false;
} }
ProcFlagsSpellType getSpellTypeMask(AuraType type)
{
switch (type)
{
case AuraType.ModStealth:
return ProcFlagsSpellType.Damage | ProcFlagsSpellType.NoDmgHeal;
case AuraType.ModConfuse:
case AuraType.ModFear:
case AuraType.ModRoot:
case AuraType.ModRoot2:
case AuraType.ModStun:
case AuraType.Transform:
return ProcFlagsSpellType.Damage;
default:
return ProcFlagsSpellType.MaskAll;
}
}
// SpellInfo object management // SpellInfo object management
public SpellInfo GetSpellInfo(uint spellId) public SpellInfo GetSpellInfo(uint spellId)