aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp81
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h34
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/game/Spells/SpellMgr.cpp472
-rw-r--r--src/server/game/Spells/SpellMgr.h5
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
{