mirror of
https://github.com/mangosfour/server.git
synced 2025-12-13 22:37:03 +00:00
[8082] Update Diminishing Returns.
Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
1b085414ab
commit
df064ebd9f
7 changed files with 86 additions and 55 deletions
|
|
@ -2321,24 +2321,20 @@ enum DiminishingGroup
|
||||||
DIMINISHING_NONE,
|
DIMINISHING_NONE,
|
||||||
DIMINISHING_CONTROL_STUN, // Player Controlled stuns
|
DIMINISHING_CONTROL_STUN, // Player Controlled stuns
|
||||||
DIMINISHING_TRIGGER_STUN, // By aura proced stuns, usualy chance on hit talents
|
DIMINISHING_TRIGGER_STUN, // By aura proced stuns, usualy chance on hit talents
|
||||||
DIMINISHING_SLEEP,
|
|
||||||
DIMINISHING_CONTROL_ROOT, // Immobilizing effects from casted spells
|
DIMINISHING_CONTROL_ROOT, // Immobilizing effects from casted spells
|
||||||
DIMINISHING_TRIGGER_ROOT, // Immobilizing effects from triggered spells like Frostbite
|
DIMINISHING_TRIGGER_ROOT, // Immobilizing effects from triggered spells like Frostbite
|
||||||
DIMINISHING_FEAR, // Non-warlock fears
|
DIMINISHING_FEAR_BLIND, // Fears & blind
|
||||||
DIMINISHING_CHARM,
|
DIMINISHING_CHARM,
|
||||||
// Mage Specific
|
DIMINISHING_POLYMORPH_GOUGE_SAP,
|
||||||
DIMINISHING_POLYMORPH,
|
|
||||||
// Rogue Specific
|
|
||||||
DIMINISHING_KIDNEYSHOT, // Kidney Shot is not diminished with Cheap Shot
|
|
||||||
// Warlock Specific
|
// Warlock Specific
|
||||||
DIMINISHING_DEATHCOIL, // Death Coil Diminish only with another Death Coil
|
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
|
// Shared Class Specific
|
||||||
DIMINISHING_BLIND_CYCLONE, // From 2.3.0
|
DIMINISHING_CHEAPSHOT_POUNCE,
|
||||||
DIMINISHING_DISARM, // From 2.3.0
|
DIMINISHING_DISARM, // From 2.3.0
|
||||||
DIMINISHING_SILENCE, // From 2.3.0
|
DIMINISHING_SILENCE, // From 2.3.0
|
||||||
DIMINISHING_FREEZE, // Hunter's Freezing Trap
|
DIMINISHING_FREEZE_SLEEP, // Hunter's Freezing Trap
|
||||||
DIMINISHING_KNOCKOUT, // Also with Sap, all Knockout mechanics are here
|
|
||||||
DIMINISHING_BANISH,
|
DIMINISHING_BANISH,
|
||||||
// Other
|
// Other
|
||||||
// Don't Diminish, but limit duration to 10s
|
// Don't Diminish, but limit duration to 10s
|
||||||
|
|
|
||||||
|
|
@ -2280,7 +2280,8 @@ void Spell::EffectApplyAura(uint32 i)
|
||||||
|
|
||||||
// Now Reduce spell duration using data received at spell hit
|
// Now Reduce spell duration using data received at spell hit
|
||||||
int32 duration = Aur->GetAuraMaxDuration();
|
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);
|
Aur->setDiminishGroup(m_diminishGroup);
|
||||||
|
|
||||||
// if Aura removed and deleted, do not continue.
|
// if Aura removed and deleted, do not continue.
|
||||||
|
|
|
||||||
|
|
@ -2717,36 +2717,32 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
|
||||||
{
|
{
|
||||||
case SPELLFAMILY_ROGUE:
|
case SPELLFAMILY_ROGUE:
|
||||||
{
|
{
|
||||||
// Kidney Shot
|
|
||||||
if (spellproto->SpellFamilyFlags & UI64LIT(0x00000200000))
|
|
||||||
return DIMINISHING_KIDNEYSHOT;
|
|
||||||
// Blind
|
// Blind
|
||||||
else if (spellproto->SpellFamilyFlags & UI64LIT(0x00001000000))
|
if (spellproto->SpellFamilyFlags & UI64LIT(0x00001000000))
|
||||||
return DIMINISHING_BLIND_CYCLONE;
|
return DIMINISHING_FEAR_BLIND;
|
||||||
break;
|
// Cheap Shot
|
||||||
}
|
else if (spellproto->SpellFamilyFlags & UI64LIT(0x00000000400))
|
||||||
case SPELLFAMILY_HUNTER:
|
return DIMINISHING_CHEAPSHOT_POUNCE;
|
||||||
{
|
|
||||||
// Freezing trap
|
|
||||||
if (spellproto->SpellFamilyFlags & UI64LIT(0x00000000008))
|
|
||||||
return DIMINISHING_FREEZE;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_WARLOCK:
|
case SPELLFAMILY_WARLOCK:
|
||||||
{
|
{
|
||||||
// Fear
|
|
||||||
if (spellproto->SpellFamilyFlags & UI64LIT(0x40840000000))
|
|
||||||
return DIMINISHING_WARLOCK_FEAR;
|
|
||||||
// Curses/etc
|
// Curses/etc
|
||||||
else if (spellproto->SpellFamilyFlags & UI64LIT(0x00080000000))
|
if (spellproto->SpellFamilyFlags & UI64LIT(0x00080000000))
|
||||||
return DIMINISHING_LIMITONLY;
|
return DIMINISHING_LIMITONLY;
|
||||||
|
// Seduction
|
||||||
|
else if (spellproto->SpellFamilyFlags & UI64LIT(0x00040000000))
|
||||||
|
return DIMINISHING_CHARM;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_DRUID:
|
case SPELLFAMILY_DRUID:
|
||||||
{
|
{
|
||||||
// Cyclone
|
// Cyclone
|
||||||
if (spellproto->SpellFamilyFlags & UI64LIT(0x02000000000))
|
if (spellproto->SpellFamilyFlags & UI64LIT(0x02000000000))
|
||||||
return DIMINISHING_BLIND_CYCLONE;
|
return DIMINISHING_CYCLONE;
|
||||||
|
// Pounce
|
||||||
|
else if (spellproto->SpellFamilyFlags & UI64LIT(0x00000020000))
|
||||||
|
return DIMINISHING_CHEAPSHOT_POUNCE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_WARRIOR:
|
case SPELLFAMILY_WARRIOR:
|
||||||
|
|
@ -2756,6 +2752,20 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
|
||||||
return DIMINISHING_LIMITONLY;
|
return DIMINISHING_LIMITONLY;
|
||||||
break;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -2764,15 +2774,15 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
|
||||||
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
|
uint32 mechanic = GetAllSpellMechanicMask(spellproto);
|
||||||
if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
|
if (mechanic == MECHANIC_NONE) return DIMINISHING_NONE;
|
||||||
if (mechanic & (1<<MECHANIC_STUN)) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
|
if (mechanic & (1<<MECHANIC_STUN)) return triggered ? DIMINISHING_TRIGGER_STUN : DIMINISHING_CONTROL_STUN;
|
||||||
if (mechanic & (1<<MECHANIC_SLEEP)) return DIMINISHING_SLEEP;
|
if (mechanic & (1<<MECHANIC_SLEEP)) return DIMINISHING_FREEZE_SLEEP;
|
||||||
if (mechanic & (1<<MECHANIC_POLYMORPH)) return DIMINISHING_POLYMORPH;
|
if (mechanic & (1<<MECHANIC_POLYMORPH)) return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
||||||
if (mechanic & (1<<MECHANIC_ROOT)) return triggered ? DIMINISHING_TRIGGER_ROOT : DIMINISHING_CONTROL_ROOT;
|
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_CHARM)) return DIMINISHING_CHARM;
|
||||||
if (mechanic & (1<<MECHANIC_SILENCE)) return DIMINISHING_SILENCE;
|
if (mechanic & (1<<MECHANIC_SILENCE)) return DIMINISHING_SILENCE;
|
||||||
if (mechanic & (1<<DIMINISHING_DISARM)) return DIMINISHING_DISARM;
|
if (mechanic & (1<<DIMINISHING_DISARM)) return DIMINISHING_DISARM;
|
||||||
if (mechanic & (1<<MECHANIC_FREEZE)) return DIMINISHING_FREEZE;
|
if (mechanic & (1<<MECHANIC_FREEZE)) return DIMINISHING_FREEZE_SLEEP;
|
||||||
if (mechanic & ((1<<MECHANIC_KNOCKOUT) | (1<<MECHANIC_SAPPED))) return DIMINISHING_KNOCKOUT;
|
if (mechanic & ((1<<MECHANIC_KNOCKOUT) | (1<<MECHANIC_SAPPED))) return DIMINISHING_POLYMORPH_GOUGE_SAP;
|
||||||
if (mechanic & (1<<MECHANIC_BANISH)) return DIMINISHING_BANISH;
|
if (mechanic & (1<<MECHANIC_BANISH)) return DIMINISHING_BANISH;
|
||||||
if (mechanic & (1<<MECHANIC_HORROR)) return DIMINISHING_DEATHCOIL;
|
if (mechanic & (1<<MECHANIC_HORROR)) return DIMINISHING_DEATHCOIL;
|
||||||
|
|
||||||
|
|
@ -2780,23 +2790,49 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto
|
||||||
return DIMINISHING_NONE;
|
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 & 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)
|
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group)
|
||||||
{
|
{
|
||||||
switch(group)
|
switch(group)
|
||||||
{
|
{
|
||||||
case DIMINISHING_CONTROL_STUN:
|
case DIMINISHING_CONTROL_STUN:
|
||||||
case DIMINISHING_TRIGGER_STUN:
|
case DIMINISHING_TRIGGER_STUN:
|
||||||
case DIMINISHING_KIDNEYSHOT:
|
|
||||||
case DIMINISHING_SLEEP:
|
|
||||||
case DIMINISHING_CONTROL_ROOT:
|
case DIMINISHING_CONTROL_ROOT:
|
||||||
case DIMINISHING_TRIGGER_ROOT:
|
case DIMINISHING_TRIGGER_ROOT:
|
||||||
case DIMINISHING_FEAR:
|
case DIMINISHING_FEAR_BLIND:
|
||||||
case DIMINISHING_WARLOCK_FEAR:
|
|
||||||
case DIMINISHING_CHARM:
|
case DIMINISHING_CHARM:
|
||||||
case DIMINISHING_POLYMORPH:
|
case DIMINISHING_POLYMORPH_GOUGE_SAP:
|
||||||
case DIMINISHING_FREEZE:
|
case DIMINISHING_CHEAPSHOT_POUNCE:
|
||||||
case DIMINISHING_KNOCKOUT:
|
case DIMINISHING_FREEZE_SLEEP:
|
||||||
case DIMINISHING_BLIND_CYCLONE:
|
case DIMINISHING_CYCLONE:
|
||||||
case DIMINISHING_BANISH:
|
case DIMINISHING_BANISH:
|
||||||
case DIMINISHING_LIMITONLY:
|
case DIMINISHING_LIMITONLY:
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -2810,24 +2846,21 @@ DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
|
||||||
{
|
{
|
||||||
switch(group)
|
switch(group)
|
||||||
{
|
{
|
||||||
case DIMINISHING_BLIND_CYCLONE:
|
case DIMINISHING_CYCLONE:
|
||||||
case DIMINISHING_CONTROL_STUN:
|
|
||||||
case DIMINISHING_TRIGGER_STUN:
|
case DIMINISHING_TRIGGER_STUN:
|
||||||
case DIMINISHING_KIDNEYSHOT:
|
case DIMINISHING_CONTROL_STUN:
|
||||||
|
case DIMINISHING_CHEAPSHOT_POUNCE:
|
||||||
return DRTYPE_ALL;
|
return DRTYPE_ALL;
|
||||||
case DIMINISHING_SLEEP:
|
|
||||||
case DIMINISHING_CONTROL_ROOT:
|
case DIMINISHING_CONTROL_ROOT:
|
||||||
case DIMINISHING_TRIGGER_ROOT:
|
case DIMINISHING_TRIGGER_ROOT:
|
||||||
case DIMINISHING_FEAR:
|
case DIMINISHING_FEAR_BLIND:
|
||||||
case DIMINISHING_CHARM:
|
case DIMINISHING_CHARM:
|
||||||
case DIMINISHING_POLYMORPH:
|
case DIMINISHING_POLYMORPH_GOUGE_SAP:
|
||||||
case DIMINISHING_SILENCE:
|
case DIMINISHING_SILENCE:
|
||||||
case DIMINISHING_DISARM:
|
case DIMINISHING_DISARM:
|
||||||
case DIMINISHING_DEATHCOIL:
|
case DIMINISHING_DEATHCOIL:
|
||||||
case DIMINISHING_FREEZE:
|
case DIMINISHING_FREEZE_SLEEP:
|
||||||
case DIMINISHING_BANISH:
|
case DIMINISHING_BANISH:
|
||||||
case DIMINISHING_WARLOCK_FEAR:
|
|
||||||
case DIMINISHING_KNOCKOUT:
|
|
||||||
return DRTYPE_PLAYER;
|
return DRTYPE_PLAYER;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -333,6 +333,7 @@ inline uint32 GetDispellMask(DispelType dispel)
|
||||||
DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered);
|
DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellEntry const* spellproto, bool triggered);
|
||||||
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
|
bool IsDiminishingReturnsGroupDurationLimited(DiminishingGroup group);
|
||||||
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
|
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group);
|
||||||
|
int32 GetDiminishingReturnsLimitDuration(DiminishingGroup group, SpellEntry const* spellproto);
|
||||||
|
|
||||||
// Spell affects related declarations (accessed using SpellMgr functions)
|
// Spell affects related declarations (accessed using SpellMgr functions)
|
||||||
struct SpellAffectEntry
|
struct SpellAffectEntry
|
||||||
|
|
|
||||||
|
|
@ -9847,13 +9847,13 @@ void Unit::IncrDiminishing(DiminishingGroup group)
|
||||||
m_Diminishing.push_back(DiminishingReturn(group,getMSTime(),DIMINISHING_LEVEL_2));
|
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) )
|
if(duration == -1 || group == DIMINISHING_NONE || caster->IsFriendlyTo(this) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
|
// 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
|
// test pet/charm masters instead pets/charmeds
|
||||||
Unit const* targetOwner = GetCharmerOrOwner();
|
Unit const* targetOwner = GetCharmerOrOwner();
|
||||||
|
|
@ -9863,7 +9863,7 @@ void Unit::ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Un
|
||||||
Unit const* source = casterOwner ? casterOwner : caster;
|
Unit const* source = casterOwner ? casterOwner : caster;
|
||||||
|
|
||||||
if(target->GetTypeId() == TYPEID_PLAYER && source->GetTypeId() == TYPEID_PLAYER)
|
if(target->GetTypeId() == TYPEID_PLAYER && source->GetTypeId() == TYPEID_PLAYER)
|
||||||
duration = 10000;
|
duration = limitduration;
|
||||||
}
|
}
|
||||||
|
|
||||||
float mod = 1.0f;
|
float mod = 1.0f;
|
||||||
|
|
|
||||||
|
|
@ -856,7 +856,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
|
|
||||||
DiminishingLevels GetDiminishing(DiminishingGroup group);
|
DiminishingLevels GetDiminishing(DiminishingGroup group);
|
||||||
void IncrDiminishing(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 ApplyDiminishingAura(DiminishingGroup group, bool apply);
|
||||||
void ClearDiminishings() { m_Diminishing.clear(); }
|
void ClearDiminishings() { m_Diminishing.clear(); }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8081"
|
#define REVISION_NR "8082"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue