diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2016-10-17 01:52:40 -0300 |
|---|---|---|
| committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-10-03 20:53:49 +0200 |
| commit | 2d75d8071bb6d85987bdc5d88ed2271822fcbcfd (patch) | |
| tree | 01389c522f87cdff0be720bf66f9d0ca804beb90 /src/server/game/Spells/SpellInfo.cpp | |
| parent | 4d5eacd3af8406e41f6f335355b1f860f2323ee1 (diff) | |
Core/Globals: compute aura diminishing return info at startup and cache it
Core/Entities: Save diminish return on an array instead of a linked list
(cherry picked from commit 9b0fa51022fba3d5ece96dd0ac8399be01ea5b0f)
Diffstat (limited to 'src/server/game/Spells/SpellInfo.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 416 |
1 files changed, 416 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index bb2f497313a..27049feb3b5 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -2467,6 +2467,422 @@ void SpellInfo::_LoadSpellSpecific() }(); } +void SpellInfo::_LoadSpellDiminishInfo() +{ + auto diminishingGroupCompute = [this](bool triggered) -> DiminishingGroup + { + if (IsPositive()) + return DIMINISHING_NONE; + + if (HasAura(DIFFICULTY_NONE, SPELL_AURA_MOD_TAUNT)) + return DIMINISHING_TAUNT; + + switch (Id) + { + case 64803: // Entrapment + case 135373: // Entrapment + return DIMINISHING_ROOT; + case 24394: // Intimidation + return DIMINISHING_STUN; + case 118345: // Pulverize (Primal Earth Elemental) + return DIMINISHING_STUN; + case 118905: // Static Charge (Capacitor Totem) + return DIMINISHING_STUN; + case 108199: // Gorefiend's Grasp + return DIMINISHING_AOE_KNOCKBACK; + default: + break; + } + + // Explicit Diminishing Groups + switch (SpellFamilyName) + { + case SPELLFAMILY_GENERIC: + break; + case SPELLFAMILY_MAGE: + { + // Frostjaw -- 102051 + if (SpellFamilyFlags[2] & 0x40000) + return DIMINISHING_SILENCE; + + // Frost Nova -- 122 + if (SpellFamilyFlags[0] & 0x40) + return DIMINISHING_ROOT; + // Ice Ward -- 111340 + if (SpellFamilyFlags[0] & 0x80000 && SpellFamilyFlags[2] & 0x2000) + return DIMINISHING_ROOT; + // Freeze (Water Elemental) -- 33395 + if (SpellFamilyFlags[2] & 0x200) + return DIMINISHING_ROOT; + + // Deep Freeze -- 44572 + if (SpellFamilyFlags[1] & 0x100000) + return DIMINISHING_STUN; + + // Dragon's Breath -- 31661 + if (SpellFamilyFlags[0] & 0x800000) + return DIMINISHING_INCAPACITATE; + // Polymorph -- 118 + if (SpellFamilyFlags[0] & 0x1000000) + return DIMINISHING_INCAPACITATE; + // Ring of Frost -- 82691 + if (SpellFamilyFlags[2] & 0x40) + return DIMINISHING_INCAPACITATE; + // Ice Nova -- 157997 + if (SpellFamilyFlags[2] & 0x800000) + return DIMINISHING_INCAPACITATE; + break; + } + case SPELLFAMILY_WARRIOR: + { + // Shockwave -- 132168 + if (SpellFamilyFlags[1] & 0x8000) + return DIMINISHING_STUN; + // Storm Bolt -- 132169 + if (SpellFamilyFlags[2] & 0x1000) + return DIMINISHING_STUN; + + // Intimidating Shout -- 5246 + if (SpellFamilyFlags[0] & 0x40000) + return DIMINISHING_DISORIENT; + + // Hamstring -- 1715, 8 seconds in PvP (6.0) + if (SpellFamilyFlags[0] & 0x2) + return DIMINISHING_LIMITONLY; + break; + } + case SPELLFAMILY_WARLOCK: + { + // Mortal Coil -- 6789 + if (SpellFamilyFlags[0] & 0x80000) + return DIMINISHING_INCAPACITATE; + // Banish -- 710 + if (SpellFamilyFlags[1] & 0x8000000) + return DIMINISHING_INCAPACITATE; + + // Fear -- 118699 + if (SpellFamilyFlags[1] & 0x400) + return DIMINISHING_DISORIENT; + // Howl of Terror -- 5484 + if (SpellFamilyFlags[1] & 0x8) + return DIMINISHING_DISORIENT; + + // Shadowfury -- 30283 + if (SpellFamilyFlags[1] & 0x1000) + return DIMINISHING_STUN; + // Summon Infernal -- 22703 + if (SpellFamilyFlags[0] & 0x1000) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_WARLOCK_PET: + { + // Fellash -- 115770 + // Whiplash -- 6360 + if (SpellFamilyFlags[0] & 0x8000000) + return DIMINISHING_AOE_KNOCKBACK; + + // Mesmerize (Shivarra pet) -- 115268 + // Seduction (Succubus pet) -- 6358 + if (SpellFamilyFlags[0] & 0x2000000) + return DIMINISHING_DISORIENT; + + // Axe Toss (Felguard pet) -- 89766 + if (SpellFamilyFlags[1] & 0x4) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_DRUID: + { + // Maim -- 22570 + if (SpellFamilyFlags[1] & 0x80) + return DIMINISHING_STUN; + // Mighty Bash -- 5211 + if (SpellFamilyFlags[0] & 0x2000) + return DIMINISHING_STUN; + // Rake -- 163505 -- no flags on the stun + if (Id == 163505) + return DIMINISHING_STUN; + + // Incapacitating Roar -- 99, no flags on the stun, 14 + if (SpellFamilyFlags[1] & 0x1) + return DIMINISHING_INCAPACITATE; + + // Cyclone -- 33786 + if (SpellFamilyFlags[1] & 0x20) + return DIMINISHING_DISORIENT; + + // Typhoon -- 61391 + if (SpellFamilyFlags[1] & 0x1000000) + return DIMINISHING_AOE_KNOCKBACK; + // Ursol's Vortex -- 118283, no family flags + if (Id == 118283) + return DIMINISHING_AOE_KNOCKBACK; + + // Entangling Roots -- 339 + if (SpellFamilyFlags[0] & 0x200) + return DIMINISHING_ROOT; + // Mass Entanglement -- 102359 + if (SpellFamilyFlags[2] & 0x4) + return DIMINISHING_ROOT; + + // Faerie Fire -- 770, 20 seconds in PvP (6.0) + if (SpellFamilyFlags[0] & 0x400) + return DIMINISHING_LIMITONLY; + break; + } + case SPELLFAMILY_ROGUE: + { + // Cheap Shot -- 1833 + if (SpellFamilyFlags[0] & 0x400) + return DIMINISHING_STUN; + // Kidney Shot -- 408 + if (SpellFamilyFlags[0] & 0x200000) + return DIMINISHING_STUN; + + // Gouge -- 1776 + if (SpellFamilyFlags[0] & 0x8) + return DIMINISHING_INCAPACITATE; + // Sap -- 6770 + if (SpellFamilyFlags[0] & 0x80) + return DIMINISHING_INCAPACITATE; + + // Blind -- 2094 + if (SpellFamilyFlags[0] & 0x1000000) + return DIMINISHING_DISORIENT; + + // Garrote -- 1330 + if (SpellFamilyFlags[1] & 0x20000000) + return DIMINISHING_SILENCE; + break; + } + case SPELLFAMILY_HUNTER: + { + // Charge (Tenacity pet) -- 53148, no flags + if (Id == 53148) + return DIMINISHING_ROOT; + // Narrow Escape -- 136634, no flags + if (Id == 136634) + return DIMINISHING_ROOT; + + // Binding Shot -- 117526, no flags + if (Id == 117526) + return DIMINISHING_STUN; + + // Freezing Trap -- 3355 + if (SpellFamilyFlags[0] & 0x8) + return DIMINISHING_INCAPACITATE; + // Wyvern Sting -- 19386 + if (SpellFamilyFlags[1] & 0x1000) + return DIMINISHING_INCAPACITATE; + break; + } + case SPELLFAMILY_PALADIN: + { + // Repentance -- 20066 + if (SpellFamilyFlags[0] & 0x4) + return DIMINISHING_INCAPACITATE; + + // Turn Evil -- 10326 + if (SpellFamilyFlags[1] & 0x800000) + return DIMINISHING_DISORIENT; + + // Avenger's Shield -- 31935 + if (SpellFamilyFlags[0] & 0x4000) + return DIMINISHING_SILENCE; + + // Fist of Justice -- 105593 + // Hammer of Justice -- 853 + if (SpellFamilyFlags[0] & 0x800) + return DIMINISHING_STUN; + // Holy Wrath -- 119072 + if (SpellFamilyFlags[1] & 0x200000) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_SHAMAN: + { + // Hex -- 51514 + if (SpellFamilyFlags[1] & 0x8000) + return DIMINISHING_INCAPACITATE; + + // Thunderstorm -- 51490 + if (SpellFamilyFlags[1] & 0x2000) + return DIMINISHING_AOE_KNOCKBACK; + + // Earthgrab Totem -- 64695 + if (SpellFamilyFlags[2] & 0x4000) + return DIMINISHING_ROOT; + break; + } + case SPELLFAMILY_DEATHKNIGHT: + { + // Strangulate -- 47476 + if (SpellFamilyFlags[0] & 0x200) + return DIMINISHING_SILENCE; + + // Asphyxiate -- 108194 + if (SpellFamilyFlags[2] & 0x100000) + return DIMINISHING_STUN; + // Gnaw (Ghoul) -- 91800, no flags + if (Id == 91800) + return DIMINISHING_STUN; + // Monstrous Blow (Ghoul w/ Dark Transformation active) -- 91797 + if (Id == 91797) + return DIMINISHING_STUN; + break; + } + case SPELLFAMILY_PRIEST: + { + // Dominate Mind -- 605 + if (SpellFamilyFlags[0] & 0x20000 && GetSpellVisual() == 39068) + return DIMINISHING_INCAPACITATE; + // Holy Word: Chastise -- 88625 + if (SpellFamilyFlags[2] & 0x20) + return DIMINISHING_INCAPACITATE; + // Psychic Horror -- 64044 + if (SpellFamilyFlags[2] & 0x2000) + return DIMINISHING_INCAPACITATE; + + // Psychic Scream -- 8122 + if (SpellFamilyFlags[0] & 0x10000) + return DIMINISHING_DISORIENT; + + // Silence -- 15487 + if (SpellFamilyFlags[1] & 0x200000 && SchoolMask == SPELL_SCHOOL_MASK_SHADOW) + return DIMINISHING_SILENCE; + break; + } + case SPELLFAMILY_MONK: + { + // Disable -- 116706, no flags + if (Id == 116706) + return DIMINISHING_ROOT; + + // Charging Ox Wave -- 119392 + if (SpellFamilyFlags[1] & 0x10000) + return DIMINISHING_STUN; + // Fists of Fury -- 120086 + if (SpellFamilyFlags[1] & 0x800000 && !(SpellFamilyFlags[2] & 0x8)) + return DIMINISHING_STUN; + // Leg Sweep -- 119381 + if (SpellFamilyFlags[1] & 0x200) + return DIMINISHING_STUN; + + // Incendiary Breath (honor talent) -- 202274, no flags + if (Id == 202274) + return DIMINISHING_INCAPACITATE; + // Paralysis -- 115078 + if (SpellFamilyFlags[2] & 0x800000) + return DIMINISHING_INCAPACITATE; + break; + } + default: + break; + } + + return DIMINISHING_NONE; + }; + + auto diminishingTypeCompute = [](DiminishingGroup group) -> DiminishingReturnsType + { + switch (group) + { + case DIMINISHING_TAUNT: + case DIMINISHING_STUN: + return DRTYPE_ALL; + case DIMINISHING_LIMITONLY: + case DIMINISHING_NONE: + return DRTYPE_NONE; + default: + return DRTYPE_PLAYER; + } + }; + + auto diminishingMaxLevelCompute = [](DiminishingGroup group) -> DiminishingLevels + { + switch (group) + { + case DIMINISHING_TAUNT: + return DIMINISHING_LEVEL_TAUNT_IMMUNE; + case DIMINISHING_AOE_KNOCKBACK: + return DIMINISHING_LEVEL_2; + default: + return DIMINISHING_LEVEL_IMMUNE; + } + }; + + auto diminishingLimitDurationCompute = [this](DiminishingGroup group) -> int32 + { + // Explicit diminishing duration + switch (SpellFamilyName) + { + case SPELLFAMILY_DRUID: + { + // Faerie Fire - 20 seconds in PvP (6.0) + if (SpellFamilyFlags[0] & 0x400) + return 20 * IN_MILLISECONDS; + break; + } + case SPELLFAMILY_HUNTER: + { + // Binding Shot - 3 seconds in PvP (6.0) + if (Id == 117526) + return 3 * IN_MILLISECONDS; + // Wyvern Sting - 6 seconds in PvP (6.0) + if (SpellFamilyFlags[1] & 0x1000) + return 6 * IN_MILLISECONDS; + break; + } + case SPELLFAMILY_MONK: + { + // Paralysis - 4 seconds in PvP regardless of if they are facing you (6.0) + if (SpellFamilyFlags[2] & 0x800000) + return 4 * IN_MILLISECONDS; + break; + } + default: + break; + } + + return 8 * IN_MILLISECONDS; + }; + + SpellDiminishInfo triggeredInfo, normalInfo; + triggeredInfo.DiminishGroup = diminishingGroupCompute(true); + triggeredInfo.DiminishReturnType = diminishingTypeCompute(triggeredInfo.DiminishGroup); + triggeredInfo.DiminishMaxLevel = diminishingMaxLevelCompute(triggeredInfo.DiminishGroup); + triggeredInfo.DiminishDurationLimit = diminishingLimitDurationCompute(triggeredInfo.DiminishGroup); + + normalInfo.DiminishGroup = diminishingGroupCompute(false); + normalInfo.DiminishReturnType = diminishingTypeCompute(normalInfo.DiminishGroup); + normalInfo.DiminishMaxLevel = diminishingMaxLevelCompute(normalInfo.DiminishGroup); + normalInfo.DiminishDurationLimit = diminishingLimitDurationCompute(normalInfo.DiminishGroup); + + _diminishInfoTriggered = triggeredInfo; + _diminishInfoNonTriggered = normalInfo; +} + +DiminishingGroup SpellInfo::GetDiminishingReturnsGroupForSpell(bool triggered) const +{ + return triggered ? _diminishInfoTriggered.DiminishGroup : _diminishInfoNonTriggered.DiminishGroup; +} + +DiminishingReturnsType SpellInfo::GetDiminishingReturnsGroupType(bool triggered) const +{ + return triggered ? _diminishInfoTriggered.DiminishReturnType : _diminishInfoNonTriggered.DiminishReturnType; +} + +DiminishingLevels SpellInfo::GetDiminishingReturnsMaxLevel(bool triggered) const +{ + return triggered ? _diminishInfoTriggered.DiminishMaxLevel : _diminishInfoNonTriggered.DiminishMaxLevel; +} + +int32 SpellInfo::GetDiminishingReturnsLimitDuration(bool triggered) const +{ + return triggered ? _diminishInfoTriggered.DiminishDurationLimit : _diminishInfoNonTriggered.DiminishDurationLimit; +} + float SpellInfo::GetMinRange(bool positive) const { if (!RangeEntry) |
