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:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user