diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 81 | ||||
-rw-r--r-- | src/server/game/Miscellaneous/SharedDefines.h | 34 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 472 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 5 |
5 files changed, 360 insertions, 236 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f9ed7acb3eb..85c3744b63f 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -10912,8 +10912,8 @@ DiminishingLevels Unit::GetDiminishing(DiminishingGroup group) if (!i->hitTime) return DIMINISHING_LEVEL_1; - // If last spell was cast more than 15 seconds ago - reset the count. - if (i->stack == 0 && getMSTimeDiff(i->hitTime, getMSTime()) > 15000) + // If last spell was cast more than 18 seconds ago - reset the count. + if (i->stack == 0 && getMSTimeDiff(i->hitTime, getMSTime()) > 18 * IN_MILLISECONDS) { i->hitCount = DIMINISHING_LEVEL_1; return DIMINISHING_LEVEL_1; @@ -10945,53 +10945,74 @@ float Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration, return 1.0f; // test pet/charm masters instead pets/charmeds - Unit const* tarGetOwner = GetCharmerOrOwner(); + Unit const* targetOwner = GetCharmerOrOwner(); Unit const* casterOwner = caster->GetCharmerOrOwner(); - // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0) if (limitduration > 0 && duration > limitduration) { - Unit const* target = tarGetOwner ? tarGetOwner : this; + Unit const* target = targetOwner ? targetOwner : this; Unit const* source = casterOwner ? casterOwner : caster; if ((target->GetTypeId() == TYPEID_PLAYER - || target->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH) + || (target->ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)) && source->GetTypeId() == TYPEID_PLAYER) duration = limitduration; } float mod = 1.0f; - if (group == DIMINISHING_TAUNT) + switch (group) { - if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_TAUNT_DIMINISH)) + case DIMINISHING_TAUNT: { - DiminishingLevels diminish = Level; - switch (diminish) + if (GetTypeId() == TYPEID_UNIT && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_TAUNT_DIMINISH)) { - case DIMINISHING_LEVEL_1: break; - case DIMINISHING_LEVEL_2: mod = 0.65f; break; - case DIMINISHING_LEVEL_3: mod = 0.4225f; break; - case DIMINISHING_LEVEL_4: mod = 0.274625f; break; - case DIMINISHING_LEVEL_TAUNT_IMMUNE: mod = 0.0f; break; - default: break; + DiminishingLevels diminish = Level; + switch (diminish) + { + case DIMINISHING_LEVEL_1: break; + case DIMINISHING_LEVEL_2: mod = 0.65f; break; + case DIMINISHING_LEVEL_3: mod = 0.4225f; break; + case DIMINISHING_LEVEL_4: mod = 0.274625f; break; + case DIMINISHING_LEVEL_TAUNT_IMMUNE: mod = 0.0f; break; + default: break; + } } + break; } - } - // Some diminishings applies to mobs too (for example, Stun) - else if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER - && ((tarGetOwner ? (tarGetOwner->GetTypeId() == TYPEID_PLAYER) : (GetTypeId() == TYPEID_PLAYER)) - || (GetTypeId() == TYPEID_UNIT && ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH))) - || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) - { - DiminishingLevels diminish = Level; - switch (diminish) + case DIMINISHING_AOE_KNOCKBACK: + { + if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && (((targetOwner ? targetOwner : this)->ToPlayer()) + || (ToCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))) + || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) + { + DiminishingLevels diminish = Level; + switch (diminish) + { + case DIMINISHING_LEVEL_1: break; + case DIMINISHING_LEVEL_2: mod = 0.0f; break; + default: break; + } + } + break; + } + default: { - case DIMINISHING_LEVEL_1: break; - case DIMINISHING_LEVEL_2: mod = 0.5f; break; - case DIMINISHING_LEVEL_3: mod = 0.25f; break; - case DIMINISHING_LEVEL_IMMUNE: mod = 0.0f; break; - default: break; + if ((GetDiminishingReturnsGroupType(group) == DRTYPE_PLAYER && (((targetOwner ? targetOwner : this)->ToPlayer()) + || (ToCreature() && (ToCreature()->GetCreatureTemplate()->flags_extra & CREATURE_FLAG_EXTRA_ALL_DIMINISH)))) + || GetDiminishingReturnsGroupType(group) == DRTYPE_ALL) + { + DiminishingLevels diminish = Level; + switch (diminish) + { + case DIMINISHING_LEVEL_1: break; + case DIMINISHING_LEVEL_2: mod = 0.5f; break; + case DIMINISHING_LEVEL_3: mod = 0.25f; break; + case DIMINISHING_LEVEL_IMMUNE: mod = 0.0f; break; + default: break; + } + } + break; } } diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index d20fb320592..dc1b403bb2e 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -4313,7 +4313,7 @@ enum AiReaction // Diminishing Returns Types enum DiminishingReturnsType { - DRTYPE_NONE = 0, // this spell is not diminished, but may have limited it's duration to 10s + DRTYPE_NONE = 0, // this spell is not diminished, but may have its duration limited DRTYPE_PLAYER = 1, // this spell is diminished only when applied on players DRTYPE_ALL = 2 // this spell is diminished in every case }; @@ -4321,27 +4321,15 @@ enum DiminishingReturnsType // Diminishing Return Groups enum DiminishingGroup { - DIMINISHING_NONE = 0, - DIMINISHING_BANISH = 1, - DIMINISHING_CHARGE = 2, - DIMINISHING_OPENING_STUN = 3, // Cheap Shot and Pounce - DIMINISHING_CONTROLLED_STUN = 4, - DIMINISHING_CONTROLLED_ROOT = 5, - DIMINISHING_CYCLONE = 6, - DIMINISHING_DISARM = 7, - DIMINISHING_DISORIENT = 8, // Several spells where name cant be generalized. - DIMINISHING_ENTRAPMENT = 9, - DIMINISHING_FEAR = 10, - DIMINISHING_HORROR = 11, - DIMINISHING_MIND_CONTROL = 12, - DIMINISHING_ROOT = 13, - DIMINISHING_STUN = 14, - DIMINISHING_SCATTER_SHOT = 15, - DIMINISHING_SILENCE = 16, - DIMINISHING_SLEEP = 17, - DIMINISHING_TAUNT = 18, - DIMINISHING_LIMITONLY = 19, - DIMINISHING_DRAGONS_BREATH = 20 + DIMINISHING_NONE = 0, + DIMINISHING_ROOT = 1, + DIMINISHING_STUN = 2, + DIMINISHING_INCAPACITATE = 3, + DIMINISHING_DISORIENT = 4, + DIMINISHING_SILENCE = 5, + DIMINISHING_AOE_KNOCKBACK = 6, + DIMINISHING_TAUNT = 7, + DIMINISHING_LIMITONLY = 8, }; enum SummonCategory @@ -4626,6 +4614,8 @@ enum SpellFamilyNames // 16 - unused SPELLFAMILY_PET = 17, SPELLFAMILY_UNK3 = 50, + SPELLFAMILY_MONK = 53, + SPELLFAMILY_WARLOCK_PET = 57, }; enum TradeStatus diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f2793cd0933..d7b2af5d1d1 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2632,7 +2632,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA aura_effmask |= 1 << 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 - m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo, m_triggeredByAuraSpell != nullptr); + m_diminishGroup = GetDiminishingReturnsGroupForSpell(m_spellInfo); if (m_diminishGroup && aura_effmask) { m_diminishLevel = unit->GetDiminishing(m_diminishGroup); @@ -2686,7 +2686,7 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA // Now Reduce spell duration using data received at spell hit int32 duration = m_spellAura->GetMaxDuration(); - int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup, aurSpellInfo); + int32 limitduration = m_diminishGroup ? GetDiminishingReturnsLimitDuration(aurSpellInfo) : 0; float diminishMod = unit->ApplyDiminishingToDuration(m_diminishGroup, duration, m_originalCaster, m_diminishLevel, limitduration); // unit is immune to aura if it was diminished to 0 duration diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index bf036b4294d..02d3e2e2ea1 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -54,7 +54,7 @@ bool IsPartOfSkillLine(uint32 skillId, uint32 spellId) return false; } -DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, bool triggered) +DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) { if (spellproto->IsPositive()) return DIMINISHING_NONE; @@ -70,180 +70,336 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, { case SPELLFAMILY_GENERIC: { - // Pet charge effects (Infernal Awakening, Demon Charge) - if (spellproto->SpellVisual[0] == 2816 && spellproto->SpellIconID == 15) - return DIMINISHING_CONTROLLED_STUN; - // Frost Tomb - else if (spellproto->Id == 48400) - return DIMINISHING_NONE; - // Gnaw - else if (spellproto->Id == 47481) - return DIMINISHING_CONTROLLED_STUN; - // ToC Icehowl Arctic Breath - else if (spellproto->SpellVisual[0] == 14153) - return DIMINISHING_NONE; - // Black Plague - else if (spellproto->Id == 64155) - return DIMINISHING_NONE; - // Screams of the Dead (King Ymiron) - else if (spellproto->Id == 51750) - return DIMINISHING_NONE; + // Entrapment -- 135373 + if (spellproto->SpellIconID == 20 && spellproto->SpellVisual[0] == 39588) + return DIMINISHING_ROOT; + + // Intimidation -- 24394 + if (spellproto->SpellIconID == 166 && spellproto->SpellVisual[0] == 2816) + return DIMINISHING_STUN; + // Pulverize (Primal Earth Elemental) -- 118345 + if (spellproto->SpellIconID == 4507 && spellproto->SpellVisual[0] == 39877) + return DIMINISHING_STUN; + // Static Charge (Capacitor Totem) -- 118905 + if (spellproto->SpellIconID == 54 && spellproto->SpellVisual[0] == 24442) + return DIMINISHING_STUN; + // Remorseless Winter -- 115001 + if (spellproto->SpellIconID == 5744 && spellproto->SpellVisual[0] == 23514) + return DIMINISHING_STUN; + + // Gorefiend's Grasp -- 108199 + if (spellproto->SpellIconID == 5743 && spellproto->SpellVisual[0] == 28937) + return DIMINISHING_AOE_KNOCKBACK; break; } - // Event spells - case SPELLFAMILY_UNK1: - return DIMINISHING_NONE; case SPELLFAMILY_MAGE: { - // Frostbite - if (spellproto->SpellFamilyFlags[1] & 0x80000000) + // Frostjaw -- 102051 + if (spellproto->SpellFamilyFlags[2] & 0x40000) + return DIMINISHING_SILENCE; + + // Frost Nova -- 122 + if (spellproto->SpellFamilyFlags[0] & 0x40) return DIMINISHING_ROOT; - // Shattered Barrier - else if (spellproto->SpellVisual[0] == 12297) + // Ice Ward -- 111340 + if (spellproto->SpellFamilyFlags[0] & 0x80000 && spellproto->SpellFamilyFlags[2] & 0x2000) 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_DRAGONS_BREATH; + // Freeze (Water Elemental) -- 33395 + if (spellproto->SpellFamilyFlags[2] & 0x200) + return DIMINISHING_ROOT; + + // Deep Freeze -- 44572 + if (spellproto->SpellFamilyFlags[1] & 0x100000) + return DIMINISHING_STUN; + + // Dragon's Breath -- 31661 + if (spellproto->SpellFamilyFlags[0] & 0x800000) + return DIMINISHING_INCAPACITATE; + // Polymorph -- 118 + if (spellproto->SpellFamilyFlags[0] & 0x1000000) + return DIMINISHING_INCAPACITATE; + // Ring of Frost -- 82691 + if (spellproto->SpellFamilyFlags[2] & 0x40) + return DIMINISHING_INCAPACITATE; + // Ice Nova -- 157997 + if (spellproto->SpellFamilyFlags[2] & 0x800000) + return DIMINISHING_INCAPACITATE; break; } case SPELLFAMILY_WARRIOR: { - // Hamstring - limit duration to 10s in PvP + // Shockwave -- 132168 + if (spellproto->SpellFamilyFlags[1] & 0x8000) + return DIMINISHING_STUN; + // Storm Bolt -- 132169 + if (spellproto->SpellFamilyFlags[2] & 0x1000) + return DIMINISHING_STUN; + + // Intimidating Shout -- 5246 + if (spellproto->SpellFamilyFlags[0] & 0x40000) + return DIMINISHING_DISORIENT; + + // Hamstring -- 1715, 8 seconds in PvP (6.0) if (spellproto->SpellFamilyFlags[0] & 0x2) return DIMINISHING_LIMITONLY; - // Charge Stun (own diminishing) - else if (spellproto->SpellFamilyFlags[0] & 0x01000000) - return DIMINISHING_CHARGE; break; } case SPELLFAMILY_WARLOCK: { - // Curses/etc - if ((spellproto->SpellFamilyFlags[0] & 0x80000000) || (spellproto->SpellFamilyFlags[1] & 0x200)) - return DIMINISHING_LIMITONLY; - // Seduction - else if (spellproto->SpellFamilyFlags[1] & 0x10000000) - return DIMINISHING_FEAR; - // Sin and Punishment (Priest spell, don't ask) - else if (spellproto->SpellIconID == 1869) - return DIMINISHING_NONE; + // Mortal Coil -- 6789 + if (spellproto->SpellFamilyFlags[0] & 0x80000) + return DIMINISHING_INCAPACITATE; + // Banish -- 710 + if (spellproto->SpellFamilyFlags[1] & 0x8000000) + return DIMINISHING_INCAPACITATE; + // Blood Horror -- 137143, no flags (17986) + if (spellproto->SpellIconID == 6447 && spellproto->SpellVisual[0] == 26758) + return DIMINISHING_INCAPACITATE; + + // Fear -- 118699 + if (spellproto->SpellFamilyFlags[1] & 0x400) + return DIMINISHING_DISORIENT; + // Howl of Terror -- 5484 + if (spellproto->SpellFamilyFlags[1] & 0x8) + return DIMINISHING_DISORIENT; + + // Shadowfury -- 30283 + if (spellproto->SpellFamilyFlags[1] & 0x1000) + return DIMINISHING_STUN; + // Summon Infernal -- 22703 + if (spellproto->SpellFamilyFlags[0] & 0x1000) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_WARLOCK_PET: + { + // Fellash -- 115770 + // Whiplash -- 6360 + if (spellproto->SpellFamilyFlags[0] & 0x8000000) + return DIMINISHING_AOE_KNOCKBACK; + + // Mesmerize (Shivarra pet) -- 115268 + // Seduction (Succubus pet) -- 6358 + if (spellproto->SpellFamilyFlags[0] & 0x2000000) + return DIMINISHING_DISORIENT; + + // Axe Toss (Felguard pet) -- 89766 + if (spellproto->SpellFamilyFlags[1] & 0x4) + return DIMINISHING_STUN; break; } case SPELLFAMILY_DRUID: { - // 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) + // Maim -- 22570 + if (spellproto->SpellFamilyFlags[1] & 0x80) + return DIMINISHING_STUN; + // Mighty Bash -- 5211 + if (spellproto->SpellFamilyFlags[0] & 0x2000) + return DIMINISHING_STUN; + // Rake -- 163505 -- no flags on the stun, 20490 + if (spellproto->SpellIconID == 494 && spellproto->SpellVisual[0] == 38283) + return DIMINISHING_STUN; + + // Incapacitating Roar -- 99, no flags on the stun, 14 + if (spellproto->SpellIconID == 960 && spellproto->SpellVisual[0] == 38528) + return DIMINISHING_INCAPACITATE; + + // Cyclone -- 33786 + if (spellproto->SpellFamilyFlags[1] & 0x20) + return DIMINISHING_DISORIENT; + + // Glyph of Fae Silence -- 114238, no flags on the silence, 15035 + if (spellproto->SpellIconID == 957 && spellproto->SchoolMask == 8) + return DIMINISHING_SILENCE; + + // Typhoon -- 61391 + if (spellproto->SpellFamilyFlags[1] & 0x1000000) + return DIMINISHING_AOE_KNOCKBACK; + // Ursol's Vortex -- 127797, no flags on the effect, 16921 + if (spellproto->SpellIconID == 5784 && spellproto->SchoolMask == 8) + return DIMINISHING_AOE_KNOCKBACK; + + // Entangling Roots -- 339 + if (spellproto->SpellFamilyFlags[0] & 0x200) + return DIMINISHING_ROOT; + // Mass Entanglement -- 102359, no flags on the root, 13535 + if (spellproto->SpellIconID == 5782 && spellproto->SpellVisual[0] == 38269) + return DIMINISHING_ROOT; + + // Faerie Fire -- 770, 20 seconds in PvP (6.0) + if (spellproto->SpellFamilyFlags[0] & 0x400) return DIMINISHING_LIMITONLY; break; } case SPELLFAMILY_ROGUE: { - // Gouge + // Cheap Shot -- 1833 + if (spellproto->SpellFamilyFlags[0] & 0x400) + return DIMINISHING_STUN; + // Kidney Shot -- 408 + if (spellproto->SpellFamilyFlags[0] & 0x200000) + return DIMINISHING_STUN; + + // Gouge -- 1776 if (spellproto->SpellFamilyFlags[0] & 0x8) + return DIMINISHING_INCAPACITATE; + // Sap -- 6770 + if (spellproto->SpellFamilyFlags[0] & 0x80) + return DIMINISHING_INCAPACITATE; + + // Blind -- 2094 + if (spellproto->SpellFamilyFlags[0] & 0x1000000) return DIMINISHING_DISORIENT; - // Blind - else if (spellproto->SpellFamilyFlags[0] & 0x1000000) - return DIMINISHING_FEAR; - // Cheap Shot - else if (spellproto->SpellFamilyFlags[0] & 0x400) - return DIMINISHING_OPENING_STUN; - // Crippling poison - Limit to 10 seconds in PvP (No SpellFamilyFlags) - else if (spellproto->SpellIconID == 163) - return DIMINISHING_LIMITONLY; + + // Garrote -- 1330 + if (spellproto->SpellFamilyFlags[1] & 0x20000000) + return DIMINISHING_SILENCE; 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; + // Glyph of Explosive Trap -- 149575 maybe? @todo + // return DIMINISHING_AOE_KNOCKBACK; + + // Charge (Tenacity pet) -- 53148, no flags (5526) + if (spellproto->SpellIconID == 1559 && spellproto->SpellVisual[0] == 39480) + return DIMINISHING_ROOT; + // Narrow Escape -- 136634, no flags (17964) + if (spellproto->SpellIconID == 3342 && spellproto->SchoolMask == 8) + return DIMINISHING_ROOT; + + // Binding Shot -- 117526, no flags (15581) + if (spellproto->SpellIconID == 4612 && spellproto->SpellVisual[0] == 6859) + return DIMINISHING_STUN; + + // Freezing Trap -- 3355 + if (spellproto->SpellFamilyFlags[0] & 0x8) + return DIMINISHING_INCAPACITATE; + // Wyvern Sting -- 19386 + if (spellproto->SpellFamilyFlags[1] & 0x1000) + return DIMINISHING_INCAPACITATE; break; } case SPELLFAMILY_PALADIN: { - // Judgement of Justice - limit duration to 10s in PvP - if (spellproto->SpellFamilyFlags[0] & 0x100000) - return DIMINISHING_LIMITONLY; - // Turn Evil - else if ((spellproto->SpellFamilyFlags[1] & 0x804000) && spellproto->SpellIconID == 309) - return DIMINISHING_FEAR; + // Repentance -- 20066 + if (spellproto->SpellFamilyFlags[0] & 0x4) + return DIMINISHING_INCAPACITATE; + + // Turn Evil -- 10326 + if (spellproto->SpellFamilyFlags[1] & 0x800000) + return DIMINISHING_DISORIENT; + + // Avenger's Shield -- 31935 + if (spellproto->SpellFamilyFlags[0] & 0x4000) + return DIMINISHING_SILENCE; + + // Fist of Justice -- 105593 + // Hammer of Justice -- 853 + if (spellproto->SpellFamilyFlags[0] & 0x800) + return DIMINISHING_STUN; + // Holy Wrath -- 119072 + if (spellproto->SpellFamilyFlags[1] & 0x200000) + return DIMINISHING_STUN; break; } case SPELLFAMILY_SHAMAN: { - // Storm, Earth and Fire - Earthgrab + // Hex -- 51514 + if (spellproto->SpellFamilyFlags[1] & 0x8000) + return DIMINISHING_INCAPACITATE; + + // Thunderstorm -- 51490 + if (spellproto->SpellFamilyFlags[1] & 0x2000) + return DIMINISHING_AOE_KNOCKBACK; + // Earthgrab Totem -- 64695 if (spellproto->SpellFamilyFlags[2] & 0x4000) - return DIMINISHING_NONE; + return DIMINISHING_ROOT; + // Frost Shock (with Frozen Power) -- 63685, no flags (6918) + if (spellproto->SpellIconID == 193 && spellproto->SpellVisual[0] == 39876) + return DIMINISHING_ROOT; break; } case SPELLFAMILY_DEATHKNIGHT: { - // Hungering Cold (no flags) - if (spellproto->SpellIconID == 2797) + // Strangulate -- 47476 + if (spellproto->SpellFamilyFlags[0] & 0x200) + return DIMINISHING_SILENCE; + + // Chains of Ice (with Chilblains) -- 96294, no flags (13020) + if (spellproto->SpellIconID == 180 && spellproto->SpellVisual[0] == 20135) + return DIMINISHING_ROOT; + + // Asphyxiate -- 108194 + if (spellproto->SpellFamilyFlags[2] & 0x100000) + return DIMINISHING_STUN; + // Gnaw (Ghoul) -- 91800, no flags (12511) + if (spellproto->SpellIconID == 3010 && spellproto->SpellVisual[0] == 38760) + return DIMINISHING_STUN; + // Monstrous Blow (Ghoul w/ Dark Transformation active) -- 91797, no flags (12510) + if (spellproto->SpellIconID == 15 && spellproto->SpellVisual[0] == 38761) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_PRIEST: + { + // Glyph of Mind Blast -- 87194, no flags (10092) + if (spellproto->SpellIconID == 2114 && spellproto->SpellVisual[0] == 38927) + return DIMINISHING_ROOT; + // Void Tendrils -- 114404, no flags (15067) + if (spellproto->SpellIconID == 5816 && spellproto->SpellVisual[0] == 25199) + return DIMINISHING_ROOT; + + // Dominate Mind -- 605 + if (spellproto->SpellFamilyFlags[0] & 0x20000 && spellproto->SpellVisual[0] == 39068) + return DIMINISHING_INCAPACITATE; + // Holy Word: Chastise -- 88625 + if (spellproto->SpellFamilyFlags[2] & 0x20) + return DIMINISHING_INCAPACITATE; + // Psychic Horror -- 64044 + if (spellproto->SpellFamilyFlags[2] & 0x2000) + return DIMINISHING_INCAPACITATE; + + // Psychic Scream -- 8122 + if (spellproto->SpellFamilyFlags[0] & 0x10000) return DIMINISHING_DISORIENT; - // Mark of Blood - else if ((spellproto->SpellFamilyFlags[0] & 0x10000000) && spellproto->SpellIconID == 2285) - return DIMINISHING_LIMITONLY; + + // Silence -- 15487 + if (spellproto->SpellFamilyFlags[1] & 0x200000 && spellproto->SchoolMask == 32) + return DIMINISHING_SILENCE; + break; + } + case SPELLFAMILY_MONK: + { + // Disable -- 116706, no flags (15483) + if (spellproto->SpellIconID == 23 && spellproto->SpellVisual[0] == 39984) + return DIMINISHING_ROOT; + + // Charging Ox Wave -- 119392 + if (spellproto->SpellFamilyFlags[1] & 0x10000) + return DIMINISHING_STUN; + // Fists of Fury -- 120086 + if (spellproto->SpellFamilyFlags[1] & 0x800000 && !(spellproto->SpellFamilyFlags[2] & 0x8)) + return DIMINISHING_STUN; + // Leg Sweep -- 119381 + if (spellproto->SpellFamilyFlags[1] & 0x200) + return DIMINISHING_STUN; + + // Glyph of Breath of Fire -- 123393, no flags (16504) + if (spellproto->SpellIconID == 15 && spellproto->SpellVisual[0] == 25408) + return DIMINISHING_INCAPACITATE; + // Paralysis -- 115078 + if (spellproto->SpellFamilyFlags[2] & 0x800000) + return DIMINISHING_INCAPACITATE; + // Ring of Peace -- 137460, no flags (18006) + if (spellproto->SpellIconID == 7195 && spellproto->SpellVisual[0] == 39999) + return DIMINISHING_INCAPACITATE; break; } default: break; } - // Lastly - Set diminishing depending on mechanic - uint32 mechanic = spellproto->GetAllEffectsMechanicMask(); - 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; - if (mechanic & (1 << MECHANIC_HORROR)) - return DIMINISHING_HORROR; - return DIMINISHING_NONE; } @@ -252,11 +408,7 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group) switch (group) { case DIMINISHING_TAUNT: - case DIMINISHING_CONTROLLED_STUN: case DIMINISHING_STUN: - case DIMINISHING_OPENING_STUN: - case DIMINISHING_CYCLONE: - case DIMINISHING_CHARGE: return DRTYPE_ALL; case DIMINISHING_LIMITONLY: case DIMINISHING_NONE: @@ -272,54 +424,40 @@ DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group) { case DIMINISHING_TAUNT: return DIMINISHING_LEVEL_TAUNT_IMMUNE; + case DIMINISHING_AOE_KNOCKBACK: + return DIMINISHING_LEVEL_2; default: return DIMINISHING_LEVEL_IMMUNE; } } -int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellInfo const* spellproto) +int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto) { - if (!IsDiminishingReturnsGroupDurationLimited(group)) - return 0; - // Explicit diminishing duration switch (spellproto->SpellFamilyName) { case SPELLFAMILY_DRUID: { - // Faerie Fire - limit to 40 seconds in PvP (3.1) + // Faerie Fire - 20 seconds in PvP (6.0) if (spellproto->SpellFamilyFlags[0] & 0x400) - return 40 * IN_MILLISECONDS; + return 20 * IN_MILLISECONDS; break; } case SPELLFAMILY_HUNTER: { - // Wyvern Sting + // Binding Shot - 3 seconds in PvP (6.0) + if (spellproto->SpellIconID == 4612 && spellproto->SpellVisual[0] == 6859) + return 3 * IN_MILLISECONDS; + // Wyvern Sting - 6 seconds in PvP (6.0) if (spellproto->SpellFamilyFlags[1] & 0x1000) return 6 * IN_MILLISECONDS; - // Hunter's Mark - if (spellproto->SpellFamilyFlags[0] & 0x400) - return 30 * IN_MILLISECONDS; - break; - } - case SPELLFAMILY_PALADIN: - { - // Repentance - limit to 6 seconds in PvP - if (spellproto->SpellFamilyFlags[0] & 0x4) - return 6 * IN_MILLISECONDS; break; } - case SPELLFAMILY_WARLOCK: + case SPELLFAMILY_MONK: { - // Banish - limit to 6 seconds in PvP - if (spellproto->SpellFamilyFlags[1] & 0x8000000) - return 6 * IN_MILLISECONDS; - // Curse of Tongues - limit to 12 seconds in PvP - else if (spellproto->SpellFamilyFlags[2] & 0x800) - return 12 * IN_MILLISECONDS; - // Curse of Elements - limit to 120 seconds in PvP - else if (spellproto->SpellFamilyFlags[1] & 0x200) - return 120 * IN_MILLISECONDS; + // Paralysis - 4 seconds in PvP regardless of if they are facing you (6.0) + if (spellproto->SpellFamilyFlags[2] & 0x800000) + return 4 * IN_MILLISECONDS; break; } default: @@ -329,30 +467,6 @@ int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellInfo const return 8 * IN_MILLISECONDS; } -bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group) -{ - switch (group) - { - case DIMINISHING_BANISH: - case DIMINISHING_CONTROLLED_STUN: - case DIMINISHING_CONTROLLED_ROOT: - case DIMINISHING_CYCLONE: - case DIMINISHING_DISORIENT: - case DIMINISHING_ENTRAPMENT: - case DIMINISHING_FEAR: - case DIMINISHING_HORROR: - case DIMINISHING_MIND_CONTROL: - case DIMINISHING_OPENING_STUN: - case DIMINISHING_ROOT: - case DIMINISHING_STUN: - case DIMINISHING_SLEEP: - case DIMINISHING_LIMITONLY: - return true; - default: - return false; - } -} - SpellMgr::SpellMgr() { } SpellMgr::~SpellMgr() diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index a828b979ac9..74423f6e4f3 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -583,11 +583,10 @@ inline bool IsProfessionOrRidingSkill(uint32 skill) bool IsPartOfSkillLine(uint32 skillId, uint32 spellId); // spell diminishing returns -DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto, bool triggered); +DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto); DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group); DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group); -int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellInfo const* spellproto); -bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group); +int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto); class SpellMgr { |