From df064ebd9f5b6d3fd0aeacdd328ee010cf54deb3 Mon Sep 17 00:00:00 2001 From: Lightguard Date: Sat, 27 Jun 2009 11:31:22 +0400 Subject: [PATCH] [8082] Update Diminishing Returns. Signed-off-by: VladimirMangos --- src/game/SharedDefines.h | 16 +++--- src/game/SpellEffects.cpp | 3 +- src/game/SpellMgr.cpp | 111 ++++++++++++++++++++++++-------------- src/game/SpellMgr.h | 1 + src/game/Unit.cpp | 6 +-- src/game/Unit.h | 2 +- src/shared/revision_nr.h | 2 +- 7 files changed, 86 insertions(+), 55 deletions(-) diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index ffa61ecd5..d98938cf2 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2321,24 +2321,20 @@ enum DiminishingGroup DIMINISHING_NONE, DIMINISHING_CONTROL_STUN, // Player Controlled stuns DIMINISHING_TRIGGER_STUN, // By aura proced stuns, usualy chance on hit talents - DIMINISHING_SLEEP, DIMINISHING_CONTROL_ROOT, // Immobilizing effects from casted spells DIMINISHING_TRIGGER_ROOT, // Immobilizing effects from triggered spells like Frostbite - DIMINISHING_FEAR, // Non-warlock fears + DIMINISHING_FEAR_BLIND, // Fears & blind DIMINISHING_CHARM, - // Mage Specific - DIMINISHING_POLYMORPH, - // Rogue Specific - DIMINISHING_KIDNEYSHOT, // Kidney Shot is not diminished with Cheap Shot + DIMINISHING_POLYMORPH_GOUGE_SAP, // Warlock Specific DIMINISHING_DEATHCOIL, // Death Coil Diminish only with another Death Coil - DIMINISHING_WARLOCK_FEAR, // Also with Sedduction + // Druid Specific + DIMINISHING_CYCLONE, // From 2.3.0 // Shared Class Specific - DIMINISHING_BLIND_CYCLONE, // From 2.3.0 + DIMINISHING_CHEAPSHOT_POUNCE, DIMINISHING_DISARM, // From 2.3.0 DIMINISHING_SILENCE, // From 2.3.0 - DIMINISHING_FREEZE, // Hunter's Freezing Trap - DIMINISHING_KNOCKOUT, // Also with Sap, all Knockout mechanics are here + DIMINISHING_FREEZE_SLEEP, // Hunter's Freezing Trap DIMINISHING_BANISH, // Other // Don't Diminish, but limit duration to 10s diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp index 957c20506..23020ca16 100644 --- a/src/game/SpellEffects.cpp +++ b/src/game/SpellEffects.cpp @@ -2280,7 +2280,8 @@ void Spell::EffectApplyAura(uint32 i) // Now Reduce spell duration using data received at spell hit int32 duration = Aur->GetAuraMaxDuration(); - unitTarget->ApplyDiminishingToDuration(m_diminishGroup, duration, m_caster, m_diminishLevel); + int32 limitduration = GetDiminishingReturnsLimitDuration(m_diminishGroup,m_spellInfo); + unitTarget->ApplyDiminishingToDuration(m_diminishGroup, duration, m_caster, m_diminishLevel,limitduration); Aur->setDiminishGroup(m_diminishGroup); // if Aura removed and deleted, do not continue. diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index d40864c9c..ec21bb044 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2717,36 +2717,32 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto { case SPELLFAMILY_ROGUE: { - // Kidney Shot - if (spellproto->SpellFamilyFlags & UI64LIT(0x00000200000)) - return DIMINISHING_KIDNEYSHOT; // Blind - else if (spellproto->SpellFamilyFlags & UI64LIT(0x00001000000)) - return DIMINISHING_BLIND_CYCLONE; - break; - } - case SPELLFAMILY_HUNTER: - { - // Freezing trap - if (spellproto->SpellFamilyFlags & UI64LIT(0x00000000008)) - return DIMINISHING_FREEZE; + if (spellproto->SpellFamilyFlags & UI64LIT(0x00001000000)) + return DIMINISHING_FEAR_BLIND; + // Cheap Shot + else if (spellproto->SpellFamilyFlags & UI64LIT(0x00000000400)) + return DIMINISHING_CHEAPSHOT_POUNCE; break; } case SPELLFAMILY_WARLOCK: { - // Fear - if (spellproto->SpellFamilyFlags & UI64LIT(0x40840000000)) - return DIMINISHING_WARLOCK_FEAR; // Curses/etc - else if (spellproto->SpellFamilyFlags & UI64LIT(0x00080000000)) + if (spellproto->SpellFamilyFlags & UI64LIT(0x00080000000)) return DIMINISHING_LIMITONLY; + // Seduction + else if (spellproto->SpellFamilyFlags & UI64LIT(0x00040000000)) + return DIMINISHING_CHARM; break; } case SPELLFAMILY_DRUID: { // Cyclone if (spellproto->SpellFamilyFlags & UI64LIT(0x02000000000)) - return DIMINISHING_BLIND_CYCLONE; + return DIMINISHING_CYCLONE; + // Pounce + else if (spellproto->SpellFamilyFlags & UI64LIT(0x00000020000)) + return DIMINISHING_CHEAPSHOT_POUNCE; break; } case SPELLFAMILY_WARRIOR: @@ -2756,6 +2752,20 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto return DIMINISHING_LIMITONLY; break; } + case SPELLFAMILY_PALADIN: + { + // Turn Evil + if (spellproto->SpellFamilyFlags & UI64LIT(0x00804000000000)) + return DIMINISHING_FEAR_BLIND; + break; + } + case SPELLFAMILY_DEATHKNIGHT: + { + // Hungering Cold (no flags) + if (spellproto->SpellIconID == 2797) + return DIMINISHING_POLYMORPH_GOUGE_SAP; + break; + } default: break; } @@ -2764,15 +2774,15 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto uint32 mechanic = GetAllSpellMechanicMask(spellproto); if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE; if (mechanic & (1<SpellFamilyName) + { + case SPELLFAMILY_HUNTER: + { + // Wyvern Sting + if (spellproto->SpellFamilyFlags & UI64LIT(0x0000100000000000)) + return 6000; + break; + } + case SPELLFAMILY_PALADIN: + { + // Repentance - limit to 6 seconds in PvP + if (spellproto->SpellFamilyFlags & UI64LIT(0x00000000004)) + return 6000; + break; + } + default: + break; + } + + return 10000; +} + bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group) { switch(group) { case DIMINISHING_CONTROL_STUN: case DIMINISHING_TRIGGER_STUN: - case DIMINISHING_KIDNEYSHOT: - case DIMINISHING_SLEEP: case DIMINISHING_CONTROL_ROOT: case DIMINISHING_TRIGGER_ROOT: - case DIMINISHING_FEAR: - case DIMINISHING_WARLOCK_FEAR: + case DIMINISHING_FEAR_BLIND: case DIMINISHING_CHARM: - case DIMINISHING_POLYMORPH: - case DIMINISHING_FREEZE: - case DIMINISHING_KNOCKOUT: - case DIMINISHING_BLIND_CYCLONE: + case DIMINISHING_POLYMORPH_GOUGE_SAP: + case DIMINISHING_CHEAPSHOT_POUNCE: + case DIMINISHING_FREEZE_SLEEP: + case DIMINISHING_CYCLONE: case DIMINISHING_BANISH: case DIMINISHING_LIMITONLY: return true; @@ -2810,24 +2846,21 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group) { switch(group) { - case DIMINISHING_BLIND_CYCLONE: - case DIMINISHING_CONTROL_STUN: + case DIMINISHING_CYCLONE: case DIMINISHING_TRIGGER_STUN: - case DIMINISHING_KIDNEYSHOT: + case DIMINISHING_CONTROL_STUN: + case DIMINISHING_CHEAPSHOT_POUNCE: return DRTYPE_ALL; - case DIMINISHING_SLEEP: case DIMINISHING_CONTROL_ROOT: case DIMINISHING_TRIGGER_ROOT: - case DIMINISHING_FEAR: + case DIMINISHING_FEAR_BLIND: case DIMINISHING_CHARM: - case DIMINISHING_POLYMORPH: + case DIMINISHING_POLYMORPH_GOUGE_SAP: case DIMINISHING_SILENCE: case DIMINISHING_DISARM: case DIMINISHING_DEATHCOIL: - case DIMINISHING_FREEZE: + case DIMINISHING_FREEZE_SLEEP: case DIMINISHING_BANISH: - case DIMINISHING_WARLOCK_FEAR: - case DIMINISHING_KNOCKOUT: return DRTYPE_PLAYER; default: break; diff --git a/src/game/SpellMgr.h b/src/game/SpellMgr.h index 69ccc5485..71c8535ef 100644 --- a/src/game/SpellMgr.h +++ b/src/game/SpellMgr.h @@ -333,6 +333,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) struct SpellAffectEntry diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index d2ac9c314..5ddca82d2 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -9847,13 +9847,13 @@ 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; // 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) { // test pet/charm masters instead pets/charmeds Unit const* targetOwner = GetCharmerOrOwner(); @@ -9863,7 +9863,7 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un 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 4b4b27d34..b2b4704ae 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -856,7 +856,7 @@ class MANGOS_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(); } diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 213a1074d..62a8a35f7 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8081" + #define REVISION_NR "8082" #endif // __REVISION_NR_H__