diff options
Diffstat (limited to 'src/server/game/Spells/SpellMgr.cpp')
-rwxr-xr-x | src/server/game/Spells/SpellMgr.cpp | 298 |
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; |