aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormegamage <none@none>2009-06-27 18:24:40 -0500
committermegamage <none@none>2009-06-27 18:24:40 -0500
commitcf9c437d8ee96a91d9aba0dd51b8cb2ab070adfe (patch)
tree9f76cf744bbfcfbd50abaf2eed32df9cb41d1ddc /src
parent7d24efd16dac4899de7a51268cde255aed1d3d77 (diff)
[8082] Update Diminishing Returns. Author: Lightguard
--HG-- branch : trunk
Diffstat (limited to 'src')
-rw-r--r--src/game/SharedDefines.h23
-rw-r--r--src/game/Spell.cpp3
-rw-r--r--src/game/SpellMgr.cpp62
-rw-r--r--src/game/SpellMgr.h1
-rw-r--r--src/game/Unit.cpp6
-rw-r--r--src/game/Unit.h2
6 files changed, 68 insertions, 29 deletions
diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h
index e63f96e8875..35e16f9d6bf 100644
--- a/src/game/SharedDefines.h
+++ b/src/game/SharedDefines.h
@@ -2384,20 +2384,23 @@ enum DiminishingGroup
{
// Common Groups
DIMINISHING_NONE,
- DIMINISHING_CONTROL_STUN, // Player Controlled stuns
- DIMINISHING_TRIGGER_STUN, // By aura proced stuns, usualy chance on hit talents
- DIMINISHING_CONTROL_ROOT, // Immobilizing effects from casted spells
- DIMINISHING_TRIGGER_ROOT, // Immobilizing effects from triggered spells like Frostbite
+ DIMINISHING_CONTROL_STUN, // Player Controlled stuns
+ DIMINISHING_TRIGGER_STUN, // By aura proced stuns, usualy chance on hit talents
+ DIMINISHING_CONTROL_ROOT, // Immobilizing effects from casted spells
+ DIMINISHING_TRIGGER_ROOT, // Immobilizing effects from triggered spells like Frostbite
DIMINISHING_CHARM,
- DIMINISHING_SLEEP_FREEZE,
DIMINISHING_POLYMORPH, // Also: Gouge, Sap, Repentance, Hungering Cold
- DIMINISHING_CHEAPSHOT_POUNCE,
- DIMINISHING_DEATHCOIL, // Death Coil Diminish only with another Death Coil
- DIMINISHING_SILENCE,
DIMINISHING_KNOCKOUT, // Sap, Knockout mechanics
- DIMINISHING_DISARM,
DIMINISHING_FEAR_BLIND, // Intimidating Shout, Howl of Terror, Blind
- DIMINISHING_FEAR,
+ // Warlock Specific
+ DIMINISHING_DEATHCOIL, // Death Coil Diminish only with another Death Coil
+ // Druid Specific
+ DIMINISHING_CYCLONE, // From 2.3.0
+ // Shared Class Specific
+ DIMINISHING_CHEAPSHOT_POUNCE,
+ DIMINISHING_DISARM, // From 2.3.0
+ DIMINISHING_SILENCE, // From 2.3.0
+ DIMINISHING_FREEZE_SLEEP, // Hunter's Freezing Trap
DIMINISHING_BANISH,
DIMINISHING_TAUNT,
DIMINISHING_LIMITONLY // Don't Diminish, but limit duration to 10s
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 543c56770bd..bb4364f8acf 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1277,7 +1277,8 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
{
// Now Reduce spell duration using data received at spell hit
int32 duration = Aur->GetAuraMaxDuration();
- unit->ApplyDiminishingToDuration(m_diminishGroup,duration,caster,m_diminishLevel);
+ int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup,m_spellInfo);
+ unitTarget->ApplyDiminishingToDuration(m_diminishGroup, duration, m_caster, m_diminishLevel,limitduration);
Aur->setDiminishGroup(m_diminishGroup);
duration = caster->ModSpellDuration(m_spellInfo, unit, duration, Aur->IsPositive());
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 63aa32aa21c..c020f4f446a 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -2561,11 +2561,8 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
{
case SPELLFAMILY_ROGUE:
{
- // Sap
- if (spellproto->SpellFamilyFlags[0] & 0x80)
- return DIMINISHING_POLYMORPH;
- // Gouge
- else if (spellproto->SpellFamilyFlags[0] & 0x8)
+ // Sap 0x80 Gouge 0x8
+ if (spellproto->SpellFamilyFlags[0] & 0x88)
return DIMINISHING_POLYMORPH;
// Blind
else if (spellproto->SpellFamilyFlags[0] & 0x1000000)
@@ -2586,6 +2583,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
// Howl of Terror
else if (spellproto->SpellFamilyFlags[1] & 0x8)
return DIMINISHING_FEAR_BLIND;
+ // Seduction
+ else if (spellproto->SpellFamilyFlags[1] & 0x40000000)
+ return DIMINISHING_CHARM;
break;
}
case SPELLFAMILY_DRUID:
@@ -2593,7 +2593,9 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
// 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;
@@ -2624,11 +2626,14 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
// Repentance
if (spellproto->SpellFamilyFlags[0] & 0x4)
return DIMINISHING_POLYMORPH;
+ // Turn Evil
+ else if (spellproto->SpellFamilyFlags[1] & 0x8040)
+ return DIMINISHING_FEAR_BLIND;
break;
}
case SPELLFAMILY_DEATHKNIGHT:
{
- // Hungering Cold
+ // Hungering Cold (no flags)
if (spellproto->SpellIconID == 2797)
return DIMINISHING_POLYMORPH;
break;
@@ -2641,10 +2646,10 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
if (mechanic & (1<<MECHANIC_STUN)) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
- if (mechanic & ((1<<MECHANIC_SLEEP) | (1<<MECHANIC_FREEZE))) return DIMINISHING_SLEEP_FREEZE;
+ 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)) return DIMINISHING_FEAR;
+ if (mechanic & (1<<MECHANIC_FEAR)) 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;
@@ -2661,20 +2666,49 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
return DIMINISHING_NONE;
}
+int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry const* spellproto)
+{
+ if(!IsDiminishingReturnsGroupDurationLimited(group))
+ return 0;
+
+ // Explicit diminishing duration
+ switch(spellproto->SpellFamilyName)
+ {
+ case SPELLFAMILY_HUNTER:
+ {
+ // Wyvern Sting
+ if (spellproto->SpellFamilyFlags[1] & 0x1000)
+ return 6000;
+ break;
+ }
+ case SPELLFAMILY_PALADIN:
+ {
+ // Repentance - limit to 6 seconds in PvP
+ if (spellproto->SpellFamilyFlags[0] & 0x4)
+ return 6000;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return 10000;
+}
+
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
{
switch(group)
{
case DIMINISHING_CONTROL_STUN:
case DIMINISHING_TRIGGER_STUN:
- case DIMINISHING_SLEEP_FREEZE:
+ case DIMINISHING_FREEZE_SLEEP:
case DIMINISHING_CONTROL_ROOT:
case DIMINISHING_TRIGGER_ROOT:
- case DIMINISHING_FEAR:
case DIMINISHING_FEAR_BLIND:
case DIMINISHING_CHARM:
case DIMINISHING_POLYMORPH:
case DIMINISHING_KNOCKOUT:
+ case DIMINISHING_CYCLONE:
case DIMINISHING_BANISH:
case DIMINISHING_LIMITONLY:
case DIMINISHING_CHEAPSHOT_POUNCE:
@@ -2694,17 +2728,17 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
case DIMINISHING_TRIGGER_STUN:
case DIMINISHING_CHEAPSHOT_POUNCE:
case DIMINISHING_FEAR_BLIND:
+ case DIMINISHING_CYCLONE:
return DRTYPE_ALL;
- case DIMINISHING_BANISH:
case DIMINISHING_CONTROL_ROOT:
case DIMINISHING_TRIGGER_ROOT:
- case DIMINISHING_FEAR:
case DIMINISHING_CHARM:
case DIMINISHING_POLYMORPH:
case DIMINISHING_SILENCE:
case DIMINISHING_DISARM:
case DIMINISHING_DEATHCOIL:
- case DIMINISHING_SLEEP_FREEZE:
+ case DIMINISHING_FREEZE_SLEEP:
+ case DIMINISHING_BANISH:
case DIMINISHING_KNOCKOUT:
return DRTYPE_PLAYER;
default:
diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h
index 374b7c68420..afdf75a8399 100644
--- a/src/game/SpellMgr.h
+++ b/src/game/SpellMgr.h
@@ -380,6 +380,7 @@ inline uint32 GetDispellMask(DispelType dispel)
DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered);
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
+int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry const* spellproto);
// Spell affects related declarations (accessed using SpellMgr functions)
typedef UNORDERED_MAP<uint32, flag96> SpellAffectMap;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 06f2b4e2b93..9fc8a8496e5 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -11537,7 +11537,7 @@ void Unit::IncrDiminishing(DiminishingGroup group)
m_Diminishing.push_back(DiminishingReturn(group,getMSTime(),DIMINISHING_LEVEL_2));
}
-void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster,DiminishingLevels Level)
+void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster,DiminishingLevels Level, int32 limitduration)
{
if(duration == -1 || group == DIMINISHING_NONE || caster->IsFriendlyTo(this) )
return;
@@ -11547,13 +11547,13 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un
Unit const* casterOwner = caster->GetCharmerOrOwner();
// Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
- if(duration > 10000 && IsDiminishingReturnsGroupDurationLimited(group))
+ if(limitduration > 0 && duration > limitduration)
{
Unit const* target = targetOwner ? targetOwner : this;
Unit const* source = casterOwner ? casterOwner : caster;
if(target->GetTypeId() == TYPEID_PLAYER && source->GetTypeId() == TYPEID_PLAYER)
- duration = 10000;
+ duration = limitduration;
}
float mod = 1.0f;
diff --git a/src/game/Unit.h b/src/game/Unit.h
index d55b272e96f..e6dec8a5cc5 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1015,7 +1015,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
DiminishingLevels GetDiminishing(DiminishingGroup group);
void IncrDiminishing(DiminishingGroup group);
- void ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster, DiminishingLevels Level);
+ void ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster, DiminishingLevels Level, int32 limitduration);
void ApplyDiminishingAura(DiminishingGroup group, bool apply);
void ClearDiminishings() { m_Diminishing.clear(); }