aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellMgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellMgr.cpp')
-rwxr-xr-xsrc/server/game/Spells/SpellMgr.cpp298
1 files changed, 160 insertions, 138 deletions
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index ab8a805d4e8..9c96411e2ec 100755
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -768,6 +768,8 @@ bool SpellMgr::_isPositiveEffect(uint32 spellId, uint32 effIndex, bool deep) con
switch (spellId)
{
case 34700: // Allergic Reaction
+ case 61716: // Rabbit Costume
+ case 61734: // Noblegarden Bunny
case 61987: // Avenging Wrath Marker
case 61988: // Divine Shield exclude aura
case 62532: // Conservator's Grip
@@ -2800,86 +2802,123 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
if (IsPositiveSpell(spellproto->Id))
return DIMINISHING_NONE;
+ for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
+ {
+ if (spellproto->EffectApplyAuraName[i] == SPELL_AURA_MOD_TAUNT)
+ return DIMINISHING_TAUNT;
+ }
+
// Explicit Diminishing Groups
switch (spellproto->SpellFamilyName)
{
// Event spells
case SPELLFAMILY_UNK1:
return DIMINISHING_NONE;
- case SPELLFAMILY_GENERIC:
- // some generic arena related spells have by some strange reason MECHANIC_TURN
- if (spellproto->Mechanic == MECHANIC_TURN)
- return DIMINISHING_NONE;
- switch (spellproto->Id)
- {
- // Noblegarden Bunny transforms
- case 61716:
- case 61734:
- return DIMINISHING_NONE;
- default:
- break;
- }
+ case SPELLFAMILY_DEATHKNIGHT:
+ {
+ // Hungering Cold (no flags)
+ if (spellproto->SpellIconID == 2797)
+ return DIMINISHING_DISORIENT;
+ // Mark of Blood
+ else if ((spellproto->SpellFamilyFlags[0] & 0x10000000) && spellproto->SpellIconID == 2285)
+ return DIMINISHING_LIMITONLY;
break;
- case SPELLFAMILY_MAGE:
+ }
+ case SPELLFAMILY_DRUID:
{
- // Frostbite
- if (spellproto->SpellFamilyFlags[1] & 0x80000000)
- return DIMINISHING_TRIGGER_ROOT;
- //Shattered Barrier: only flag SpellFamilyFlags[0] = 0x00080000 shared
- //by most frost spells, using id instead
- if (spellproto->Id == 55080)
- return DIMINISHING_TRIGGER_ROOT;
- // Frost Nova / Freeze (Water Elemental)
- if (spellproto->SpellIconID == 193)
- return DIMINISHING_CONTROL_ROOT;
+ // Pounce
+ if (spellproto->SpellFamilyFlags[0] & 0x20000)
+ return DIMINISHING_OPENING_STUN;
+ // Cyclone
+ else if (spellproto->SpellFamilyFlags[1] & 0x20)
+ return DIMINISHING_CYCLONE;
+ // Entangling Roots
+ // Nature's Grasp
+ else if (spellproto->SpellFamilyFlags[0] & 0x00000200)
+ return DIMINISHING_CONTROLLED_ROOT;
+ // Faerie Fire
+ else if (spellproto->SpellFamilyFlags[0] & 0x400)
+ return DIMINISHING_LIMITONLY;
+ break;
+ }
+ case SPELLFAMILY_HUNTER:
+ {
+ // Hunter's mark
+ if ((spellproto->SpellFamilyFlags[0] & 0x400) && spellproto->SpellIconID == 538)
+ return DIMINISHING_LIMITONLY;
+ // Scatter Shot (own diminishing)
+ else if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
+ return DIMINISHING_SCATTER_SHOT;
+ // Entrapment (own diminishing)
+ else if ((spellproto->SpellVisual[0] == 7484) && spellproto->SpellIconID == 20)
+ return DIMINISHING_ENTRAPMENT;
+ // Wyvern Sting mechanic is MECHANIC_SLEEP but the diminishing is DIMINISHING_DISORIENT
+ else if ((spellproto->SpellFamilyFlags[1] & 0x1000) && spellproto->SpellIconID == 1721)
+ return DIMINISHING_DISORIENT;
+ // Freezing Arrow
+ else if (spellproto->SpellFamilyFlags[0] & 0x8)
+ return DIMINISHING_DISORIENT;
+ break;
+ }
+ case SPELLFAMILY_PALADIN:
+ {
+ // Turn Evil
+ if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309)
+ return DIMINISHING_FEAR;
+ }
+ case SPELLFAMILY_PRIEST:
+ {
+ // Psychic Horror
+ if (spellproto->SpellFamilyFlags[2] & 0x2000)
+ return DIMINISHING_HORROR;
break;
}
case SPELLFAMILY_ROGUE:
{
- // Sap 0x80 Gouge 0x8
- if (spellproto->SpellFamilyFlags[0] & 0x88)
- return DIMINISHING_POLYMORPH;
+ // Gouge
+ if (spellproto->SpellFamilyFlags[0] & 0x8)
+ return DIMINISHING_DISORIENT;
// Blind
else if (spellproto->SpellFamilyFlags[0] & 0x1000000)
- return DIMINISHING_FEAR_BLIND;
+ return DIMINISHING_FEAR;
// Cheap Shot
else if (spellproto->SpellFamilyFlags[0] & 0x400)
- return DIMINISHING_CHEAPSHOT_POUNCE;
+ return DIMINISHING_OPENING_STUN;
// Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags)
else if (spellproto->SpellIconID == 163)
return DIMINISHING_LIMITONLY;
break;
}
+ case SPELLFAMILY_MAGE:
+ {
+ // Frostbite
+ if (spellproto->SpellFamilyFlags[1] & 0x80000000)
+ return DIMINISHING_ROOT;
+ // Shattered Barrier
+ else if (spellproto->SpellVisual[0] == 12297)
+ return DIMINISHING_ROOT;
+ // Deep Freeze
+ else if (spellproto->SpellIconID == 2939 && spellproto->SpellVisual[0] == 9963)
+ return DIMINISHING_CONTROLLED_STUN;
+ // Frost Nova / Freeze (Water Elemental)
+ else if (spellproto->SpellIconID == 193)
+ return DIMINISHING_CONTROLLED_ROOT;
+ // Dragon's Breath
+ else if (spellproto->SpellFamilyFlags[0] & 0x800000)
+ return DIMINISHING_DISORIENT;
+ break;
+ }
case SPELLFAMILY_WARLOCK:
{
// Death Coil
if (spellproto->SpellFamilyFlags[0] & 0x80000)
- return DIMINISHING_DEATHCOIL;
+ return DIMINISHING_HORROR;
// Curses/etc
else if (spellproto->SpellFamilyFlags[0] & 0x80000000)
return DIMINISHING_LIMITONLY;
- // Howl of Terror
- else if (spellproto->SpellFamilyFlags[1] & 0x8)
- return DIMINISHING_FEAR_BLIND;
// Seduction
else if (spellproto->SpellFamilyFlags[1] & 0x10000000)
- return DIMINISHING_FEAR_BLIND;
- break;
- }
- case SPELLFAMILY_DRUID:
- {
- // Pounce
- if (spellproto->SpellFamilyFlags[0] & 0x20000)
- return DIMINISHING_CHEAPSHOT_POUNCE;
- // Cyclone
- else if (spellproto->SpellFamilyFlags[1] & 0x20)
- return DIMINISHING_CYCLONE;
- // Entangling Roots: to force natures grasp proc to be control root
- else if (spellproto->SpellFamilyFlags[0] & 0x00000200)
- return DIMINISHING_CONTROL_ROOT;
- // Faerie Fire
- else if (spellproto->SpellFamilyFlags[0] & 0x400)
- return DIMINISHING_LIMITONLY;
+ return DIMINISHING_FEAR;
break;
}
case SPELLFAMILY_WARRIOR:
@@ -2887,72 +2926,52 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
// Hamstring - limit duration to 10s in PvP
if (spellproto->SpellFamilyFlags[0] & 0x2)
return DIMINISHING_LIMITONLY;
- // Intimidating Shout
- else if (spellproto->SpellFamilyFlags[0] & 0x40000)
- return DIMINISHING_FEAR_BLIND;
- // Charge Stun
+ // Improved Hamstring
+ else if (spellproto->AttributesEx3 & 0x80000 && spellproto->SpellIconID == 23)
+ return DIMINISHING_ROOT;
+ // Charge Stun (own diminishing)
else if (spellproto->SpellFamilyFlags[0] & 0x01000000)
- return DIMINISHING_NONE;
+ return DIMINISHING_CHARGE;
break;
}
- case SPELLFAMILY_PALADIN:
- {
- // Repentance
- if (spellproto->SpellFamilyFlags[0] & 0x4)
- return DIMINISHING_POLYMORPH;
- break;
- }
- case SPELLFAMILY_DEATHKNIGHT:
- {
- // Hungering Cold (no flags)
- if (spellproto->SpellIconID == 2797)
- return DIMINISHING_POLYMORPH;
- // Mark of Blood
- else if ((spellproto->SpellFamilyFlags[0] & 0x10000000)
- && spellproto->SpellIconID == 2285)
- return DIMINISHING_LIMITONLY;
- break;
- }
- case SPELLFAMILY_HUNTER:
+ // Must be below SPELLFAMILY_WARRIOR for Charge to work
+ case SPELLFAMILY_GENERIC:
{
- // Hunter's mark
- if ((spellproto->SpellFamilyFlags[0] & 0x400) && spellproto->SpellIconID == 538)
- return DIMINISHING_LIMITONLY;
- // Scatter Shot
- if ((spellproto->SpellFamilyFlags[0] & 0x40000) && spellproto->SpellIconID == 132)
- return DIMINISHING_NONE;
- break;
+ // Pet charge effects (Infernal Awakening, Demon Charge)
+ if (spellproto->SpellVisual[0] == 2816 && spellproto->SpellIconID == 15)
+ return DIMINISHING_CONTROLLED_STUN;
+ // Gnaw
+ else if (spellproto->Id == 47481)
+ return DIMINISHING_CONTROLLED_STUN;
}
default:
break;
}
- // Get by mechanic
+ // Lastly - Set diminishing depending on mechanic
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
- if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
- if (mechanic & ((1<<MECHANIC_STUN) |
- (1<<MECHANIC_SHACKLE))) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
- if (mechanic & ((1<<MECHANIC_SLEEP) |
- (1<<MECHANIC_FREEZE))) return DIMINISHING_FREEZE_SLEEP;
- if (mechanic & (1<<MECHANIC_POLYMORPH)) return DIMINISHING_POLYMORPH;
- if (mechanic & (1<<MECHANIC_ROOT)) return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
- if (mechanic & ((1<<MECHANIC_FEAR) |
- (1<<MECHANIC_TURN))) return DIMINISHING_FEAR_BLIND;
- if (mechanic & (1<<MECHANIC_CHARM)) return DIMINISHING_CHARM;
- if (mechanic & (1<<MECHANIC_SILENCE)) return DIMINISHING_SILENCE;
- if (mechanic & (1<<MECHANIC_DISARM)) return DIMINISHING_DISARM;
- if (mechanic & (1<<MECHANIC_FREEZE)) return DIMINISHING_FREEZE_SLEEP;
- if (mechanic & ((1<<MECHANIC_KNOCKOUT) |
- (1<<MECHANIC_SAPPED))) return DIMINISHING_KNOCKOUT;
- if (mechanic & (1<<MECHANIC_BANISH)) return DIMINISHING_BANISH;
- if (mechanic & (1<<MECHANIC_HORROR)) return DIMINISHING_DEATHCOIL;
-
- // Get by effect
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
- if (spellproto->EffectApplyAuraName[i] == SPELL_AURA_MOD_TAUNT)
- return DIMINISHING_TAUNT;
- }
+ if (mechanic & (1 << MECHANIC_CHARM))
+ return DIMINISHING_MIND_CONTROL;
+ if (mechanic & (1 << MECHANIC_SILENCE))
+ return DIMINISHING_SILENCE;
+ if (mechanic & (1 << MECHANIC_SLEEP))
+ return DIMINISHING_SLEEP;
+ if (mechanic & ((1 << MECHANIC_SAPPED) | (1 << MECHANIC_POLYMORPH) | (1 << MECHANIC_SHACKLE)))
+ return DIMINISHING_DISORIENT;
+ // Mechanic Knockout, except Blast Wave
+ if (mechanic & (1 << MECHANIC_KNOCKOUT) && spellproto->SpellIconID != 292)
+ return DIMINISHING_DISORIENT;
+ if (mechanic & (1 << MECHANIC_DISARM))
+ return DIMINISHING_DISARM;
+ if (mechanic & (1 << MECHANIC_FEAR))
+ return DIMINISHING_FEAR;
+ if (mechanic & (1 << MECHANIC_STUN))
+ return triggered ? DIMINISHING_STUN : DIMINISHING_CONTROLLED_STUN;
+ if (mechanic & (1 << MECHANIC_BANISH))
+ return DIMINISHING_BANISH;
+ if (mechanic & (1 << MECHANIC_ROOT))
+ return triggered ? DIMINISHING_ROOT : DIMINISHING_CONTROLLED_ROOT;
+
return DIMINISHING_NONE;
}
@@ -2962,8 +2981,15 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry cons
return 0;
// Explicit diminishing duration
- switch(spellproto->SpellFamilyName)
+ switch (spellproto->SpellFamilyName)
{
+ case SPELLFAMILY_DRUID:
+ {
+ // Faerie Fire - limit to 40 seconds in PvP (3.1)
+ if (spellproto->SpellFamilyFlags[0] & 0x400)
+ return 40 * IN_MILLISECONDS;
+ break;
+ }
case SPELLFAMILY_HUNTER:
{
// Wyvern Sting
@@ -2988,13 +3014,6 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry cons
return 6 * IN_MILLISECONDS;
break;
}
- case SPELLFAMILY_DRUID:
- {
- // Faerie Fire - limit to 40 seconds in PvP (3.1)
- if (spellproto->SpellFamilyFlags[0] & 0x400)
- return 40 * IN_MILLISECONDS;
- break;
- }
default:
break;
}
@@ -3004,21 +3023,22 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry cons
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
{
- switch(group)
+ switch (group)
{
- case DIMINISHING_CONTROL_STUN:
- case DIMINISHING_TRIGGER_STUN:
- case DIMINISHING_FREEZE_SLEEP:
- case DIMINISHING_CONTROL_ROOT:
- case DIMINISHING_TRIGGER_ROOT:
- case DIMINISHING_FEAR_BLIND:
- case DIMINISHING_CHARM:
- case DIMINISHING_POLYMORPH:
- case DIMINISHING_KNOCKOUT:
+ case DIMINISHING_CONTROLLED_STUN:
+ case DIMINISHING_STUN:
+ case DIMINISHING_ENTRAPMENT:
+ case DIMINISHING_CONTROLLED_ROOT:
+ case DIMINISHING_ROOT:
+ case DIMINISHING_FEAR:
+ case DIMINISHING_MIND_CONTROL:
+ case DIMINISHING_DISORIENT:
case DIMINISHING_CYCLONE:
case DIMINISHING_BANISH:
case DIMINISHING_LIMITONLY:
- case DIMINISHING_CHEAPSHOT_POUNCE:
+ case DIMINISHING_OPENING_STUN:
+ case DIMINISHING_HORROR:
+ case DIMINISHING_SLEEP:
return true;
default:
return false;
@@ -3027,7 +3047,7 @@ bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
{
- switch(group)
+ switch (group)
{
case DIMINISHING_TAUNT:
return DIMINISHING_LEVEL_TAUNT_IMMUNE;
@@ -3038,25 +3058,27 @@ DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
{
- switch(group)
+ switch (group)
{
case DIMINISHING_TAUNT:
- case DIMINISHING_CONTROL_STUN:
- case DIMINISHING_TRIGGER_STUN:
- case DIMINISHING_CHEAPSHOT_POUNCE:
+ case DIMINISHING_CONTROLLED_STUN:
+ case DIMINISHING_STUN:
+ case DIMINISHING_OPENING_STUN:
case DIMINISHING_CYCLONE:
+ case DIMINISHING_CHARGE:
return DRTYPE_ALL;
- case DIMINISHING_FEAR_BLIND:
- case DIMINISHING_CONTROL_ROOT:
- case DIMINISHING_TRIGGER_ROOT:
- case DIMINISHING_CHARM:
- case DIMINISHING_POLYMORPH:
+ case DIMINISHING_FEAR:
+ case DIMINISHING_CONTROLLED_ROOT:
+ case DIMINISHING_ROOT:
+ case DIMINISHING_MIND_CONTROL:
+ case DIMINISHING_DISORIENT:
+ case DIMINISHING_ENTRAPMENT:
case DIMINISHING_SILENCE:
case DIMINISHING_DISARM:
- case DIMINISHING_DEATHCOIL:
- case DIMINISHING_FREEZE_SLEEP:
case DIMINISHING_BANISH:
- case DIMINISHING_KNOCKOUT:
+ case DIMINISHING_SCATTER_SHOT:
+ case DIMINISHING_HORROR:
+ case DIMINISHING_SLEEP:
return DRTYPE_PLAYER;
default:
break;