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;
}
public void IncrDiminishing(SpellInfo auraSpellInfo, bool triggered)
public void IncrDiminishing(SpellInfo auraSpellInfo)
{
DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell(triggered);
DiminishingLevels maxLevel = auraSpellInfo.GetDiminishingReturnsMaxLevel(triggered);
DiminishingGroup group = auraSpellInfo.GetDiminishingReturnsGroupForSpell();
DiminishingLevels maxLevel = auraSpellInfo.GetDiminishingReturnsMaxLevel();
// Checking for existing in the table
DiminishingReturn diminish = m_Diminishing[(int)group];
@@ -2688,13 +2688,13 @@ namespace Game.Entities
++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)
return 1.0f;
int limitDuration = auraSpellInfo.GetDiminishingReturnsLimitDuration(triggered);
int limitDuration = auraSpellInfo.GetDiminishingReturnsLimitDuration();
// test pet/charm masters instead pets/charmeds
Unit targetOwner = GetCharmerOrOwner();
@@ -2740,9 +2740,9 @@ namespace Game.Entities
}
break;
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)))
|| auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.All)
|| auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.All)
{
DiminishingLevels diminish = previousLevel;
switch (diminish)
@@ -2758,9 +2758,9 @@ namespace Game.Entities
}
break;
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)))
|| auraSpellInfo.GetDiminishingReturnsGroupType(triggered) == DiminishingReturnsType.All)
|| auraSpellInfo.GetDiminishingReturnsGroupType() == DiminishingReturnsType.All)
{
DiminishingLevels diminish = previousLevel;
switch (diminish)
+4 -5
View File
@@ -2111,19 +2111,18 @@ namespace Game.Spells
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
bool triggered = m_triggeredByAuraSpell != null;
DiminishingGroup diminishGroup = m_spellInfo.GetDiminishingReturnsGroupForSpell(triggered);
DiminishingGroup diminishGroup = m_spellInfo.GetDiminishingReturnsGroupForSpell();
DiminishingLevels diminishLevel = DiminishingLevels.Level1;
if (diminishGroup != 0 && aura_effmask != 0)
{
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
if ((type == DiminishingReturnsType.Player && (unit.GetCharmerOrOwnerPlayerOrPlayerItself()
|| (unit.IsCreature() && unit.ToCreature().GetCreatureTemplate().FlagsExtra.HasAnyFlag(CreatureFlagsExtra.AllDiminish))))
|| type == DiminishingReturnsType.All)
unit.IncrDiminishing(m_spellInfo, triggered);
unit.IncrDiminishing(m_spellInfo);
}
if (aura_effmask != 0)
@@ -2170,7 +2169,7 @@ namespace Game.Spells
// Now Reduce spell duration using data received at spell hit
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
if (diminishMod == 0.0f)
+2 -2
View File
@@ -1558,12 +1558,12 @@ namespace Game.Spells
return _diminishInfo.DiminishReturnType;
}
public DiminishingLevels GetDiminishingReturnsMaxLevel(bool triggered)
public DiminishingLevels GetDiminishingReturnsMaxLevel()
{
return _diminishInfo.DiminishMaxLevel;
}
public int GetDiminishingReturnsLimitDuration(bool triggered)
public int GetDiminishingReturnsLimitDuration()
{
return _diminishInfo.DiminishDurationLimit;
}
+26 -8
View File
@@ -1280,7 +1280,8 @@ namespace Game.Entities
if (mSpellProcMap.ContainsKey(spellInfo.Id))
continue;
bool found = false, addTriggerFlag = false;
bool addTriggerFlag = false;
ProcFlagsSpellType procSpellTypeMask = ProcFlagsSpellType.None;
foreach (SpellEffectInfo effect in spellInfo.GetEffectsForDifficulty(Difficulty.None))
{
if (effect == null || !effect.IsEffect())
@@ -1293,14 +1294,13 @@ namespace Game.Entities
if (!isTriggerAura(auraName))
continue;
found = true;
if (!addTriggerFlag && isAlwaysTriggeredAura(auraName))
procSpellTypeMask |= getSpellTypeMask(auraName);
if (isAlwaysTriggeredAura(auraName))
addTriggerFlag = true;
break;
}
if (!found)
if (procSpellTypeMask == 0)
continue;
if (spellInfo.ProcFlags == 0)
@@ -1317,7 +1317,7 @@ namespace Game.Entities
if (procEntry.SpellFamilyMask)
procEntry.SpellFamilyName = spellInfo.SpellFamilyName;
procEntry.SpellTypeMask = ProcFlagsSpellType.MaskAll;
procEntry.SpellTypeMask = procSpellTypeMask;
procEntry.SpellPhaseMask = ProcFlagsSpellPhase.Hit;
procEntry.HitMask = ProcFlagsHit.None; // uses default proc @see SpellMgr::CanSpellTriggerProcOnEvent
@@ -2790,7 +2790,7 @@ namespace Game.Entities
}
#endregion
public bool isTriggerAura(AuraType type)
bool isTriggerAura(AuraType type)
{
switch (type)
{
@@ -2834,7 +2834,7 @@ namespace Game.Entities
}
return false;
}
public bool isAlwaysTriggeredAura(AuraType type)
bool isAlwaysTriggeredAura(AuraType type)
{
switch (type)
{
@@ -2851,6 +2851,24 @@ namespace Game.Entities
}
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
public SpellInfo GetSpellInfo(uint spellId)