mirror of
https://github.com/mangosfour/server.git
synced 2025-12-21 19:37:02 +00:00
[7499] Implement post effect for DoT spell 41917
Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
5a2c08ed7f
commit
ebd292a226
2 changed files with 136 additions and 126 deletions
|
|
@ -4244,142 +4244,152 @@ void Aura::HandlePeriodicDamage(bool apply, bool Real)
|
||||||
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
|
bool loading = (m_target->GetTypeId() == TYPEID_PLAYER && ((Player*)m_target)->GetSession()->PlayerLoading());
|
||||||
|
|
||||||
// Custom damage calculation after
|
// Custom damage calculation after
|
||||||
if (!apply || loading)
|
if (apply)
|
||||||
return;
|
|
||||||
|
|
||||||
Unit *caster = GetCaster();
|
|
||||||
if (!caster)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch (m_spellProto->SpellFamilyName)
|
|
||||||
{
|
{
|
||||||
case SPELLFAMILY_GENERIC:
|
if(loading)
|
||||||
{
|
return;
|
||||||
// Pounce Bleed
|
|
||||||
if ( m_spellProto->SpellIconID == 147 && m_spellProto->SpellVisual[0] == 0 )
|
|
||||||
{
|
|
||||||
// $AP*0.18/6 bonus per tick
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SPELLFAMILY_WARRIOR:
|
|
||||||
{
|
|
||||||
// Rend
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000000020LL)
|
|
||||||
{
|
|
||||||
// $0.2*(($MWB+$mwb)/2+$AP/14*$MWS) bonus per tick
|
|
||||||
float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
|
||||||
int32 mws = caster->GetAttackTime(BASE_ATTACK);
|
|
||||||
float mwb_min = caster->GetWeaponDamageRange(BASE_ATTACK,MINDAMAGE);
|
|
||||||
float mwb_max = caster->GetWeaponDamageRange(BASE_ATTACK,MAXDAMAGE);
|
|
||||||
m_modifier.m_amount+=int32(((mwb_min+mwb_max)/2+ap*mws/14000)*0.2f);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SPELLFAMILY_DRUID:
|
|
||||||
{
|
|
||||||
// Rake
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000001000LL)
|
|
||||||
{
|
|
||||||
// $AP*0.06 bonus per tick
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 6 / 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Lacerate
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x000000010000000000LL)
|
|
||||||
{
|
|
||||||
// $AP*0.05/5 bonus per tick
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Rip
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x000000000000800000LL)
|
|
||||||
{
|
|
||||||
// 0.01*$AP*cp
|
|
||||||
if (caster->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
uint8 cp = ((Player*)caster)->GetComboPoints();
|
Unit *caster = GetCaster();
|
||||||
|
if (!caster)
|
||||||
|
return;
|
||||||
|
|
||||||
// Idol of Feral Shadows. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs
|
switch (m_spellProto->SpellFamilyName)
|
||||||
Unit::AuraList const& dummyAuras = caster->GetAurasByType(SPELL_AURA_DUMMY);
|
{
|
||||||
for(Unit::AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
|
case SPELLFAMILY_GENERIC:
|
||||||
|
{
|
||||||
|
// Pounce Bleed
|
||||||
|
if ( m_spellProto->SpellIconID == 147 && m_spellProto->SpellVisual[0] == 0 )
|
||||||
{
|
{
|
||||||
if((*itr)->GetId()==34241)
|
// $AP*0.18/6 bonus per tick
|
||||||
{
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 3 / 100);
|
||||||
m_modifier.m_amount += cp * (*itr)->GetModifier()->m_amount;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Lock Jaw
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x1000000000000000LL)
|
|
||||||
{
|
|
||||||
// 0.15*$AP
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 15 / 100);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case SPELLFAMILY_ROGUE:
|
|
||||||
{
|
|
||||||
// Rupture
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x000000000000100000LL)
|
|
||||||
{
|
|
||||||
if (caster->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
return;
|
||||||
//1 point : ${($m1+$b1*1+0.015*$AP)*4} damage over 8 secs
|
}
|
||||||
//2 points: ${($m1+$b1*2+0.024*$AP)*5} damage over 10 secs
|
break;
|
||||||
//3 points: ${($m1+$b1*3+0.03*$AP)*6} damage over 12 secs
|
|
||||||
//4 points: ${($m1+$b1*4+0.03428571*$AP)*7} damage over 14 secs
|
|
||||||
//5 points: ${($m1+$b1*5+0.0375*$AP)*8} damage over 16 secs
|
|
||||||
float AP_per_combo[] = {0, 0.015f, 0.024, 0.03, 0.03428571, 0.0375};
|
|
||||||
uint8 cp = ((Player*)caster)->GetComboPoints();
|
|
||||||
if (cp > 5) cp = 5;
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * AP_per_combo[cp]);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
// Garrote
|
case SPELLFAMILY_WARRIOR:
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x000000000000000100LL)
|
|
||||||
{
|
{
|
||||||
// $AP*0.07 bonus per tick
|
// Rend
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 7 / 100);
|
if (m_spellProto->SpellFamilyFlags & 0x0000000000000020LL)
|
||||||
return;
|
{
|
||||||
|
// $0.2*(($MWB+$mwb)/2+$AP/14*$MWS) bonus per tick
|
||||||
|
float ap = caster->GetTotalAttackPowerValue(BASE_ATTACK);
|
||||||
|
int32 mws = caster->GetAttackTime(BASE_ATTACK);
|
||||||
|
float mwb_min = caster->GetWeaponDamageRange(BASE_ATTACK,MINDAMAGE);
|
||||||
|
float mwb_max = caster->GetWeaponDamageRange(BASE_ATTACK,MAXDAMAGE);
|
||||||
|
m_modifier.m_amount+=int32(((mwb_min+mwb_max)/2+ap*mws/14000)*0.2f);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// Deadly Poison
|
case SPELLFAMILY_DRUID:
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000010000)
|
|
||||||
{
|
{
|
||||||
// 0.08*$AP / 4 * amount of stack
|
// Rake
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 2 * GetStackAmount() / 100);
|
if (m_spellProto->SpellFamilyFlags & 0x0000000000001000LL)
|
||||||
return;
|
{
|
||||||
|
// $AP*0.06 bonus per tick
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 6 / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Lacerate
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x000000010000000000LL)
|
||||||
|
{
|
||||||
|
// $AP*0.05/5 bonus per tick
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Rip
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x000000000000800000LL)
|
||||||
|
{
|
||||||
|
// 0.01*$AP*cp
|
||||||
|
if (caster->GetTypeId() != TYPEID_PLAYER)
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint8 cp = ((Player*)caster)->GetComboPoints();
|
||||||
|
|
||||||
|
// Idol of Feral Shadows. Cant be handled as SpellMod in SpellAura:Dummy due its dependency from CPs
|
||||||
|
Unit::AuraList const& dummyAuras = caster->GetAurasByType(SPELL_AURA_DUMMY);
|
||||||
|
for(Unit::AuraList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr)
|
||||||
|
{
|
||||||
|
if((*itr)->GetId()==34241)
|
||||||
|
{
|
||||||
|
m_modifier.m_amount += cp * (*itr)->GetModifier()->m_amount;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * cp / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Lock Jaw
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x1000000000000000LL)
|
||||||
|
{
|
||||||
|
// 0.15*$AP
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 15 / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
case SPELLFAMILY_ROGUE:
|
||||||
|
{
|
||||||
|
// Rupture
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x000000000000100000LL)
|
||||||
|
{
|
||||||
|
if (caster->GetTypeId() != TYPEID_PLAYER)
|
||||||
|
return;
|
||||||
|
//1 point : ${($m1+$b1*1+0.015*$AP)*4} damage over 8 secs
|
||||||
|
//2 points: ${($m1+$b1*2+0.024*$AP)*5} damage over 10 secs
|
||||||
|
//3 points: ${($m1+$b1*3+0.03*$AP)*6} damage over 12 secs
|
||||||
|
//4 points: ${($m1+$b1*4+0.03428571*$AP)*7} damage over 14 secs
|
||||||
|
//5 points: ${($m1+$b1*5+0.0375*$AP)*8} damage over 16 secs
|
||||||
|
float AP_per_combo[] = {0, 0.015f, 0.024, 0.03, 0.03428571, 0.0375};
|
||||||
|
uint8 cp = ((Player*)caster)->GetComboPoints();
|
||||||
|
if (cp > 5) cp = 5;
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * AP_per_combo[cp]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Garrote
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x000000000000000100LL)
|
||||||
|
{
|
||||||
|
// $AP*0.07 bonus per tick
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 7 / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Deadly Poison
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x0000000000010000)
|
||||||
|
{
|
||||||
|
// 0.08*$AP / 4 * amount of stack
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(BASE_ATTACK) * 2 * GetStackAmount() / 100);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_HUNTER:
|
||||||
|
{
|
||||||
|
// Serpent Sting
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x0000000000004000LL)
|
||||||
|
{
|
||||||
|
// $RAP*0.1/5 bonus per tick
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Immolation Trap
|
||||||
|
if (m_spellProto->SpellFamilyFlags & 0x0000000000000004LL && m_spellProto->SpellIconID == 678)
|
||||||
|
{
|
||||||
|
// $RAP*0.1/5 bonus per tick
|
||||||
|
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
case SPELLFAMILY_HUNTER:
|
}
|
||||||
{
|
// remove time effects
|
||||||
// Serpent Sting
|
else
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000004000LL)
|
{
|
||||||
{
|
// Parasitic Shadowfiend - handle summoning of two Shadowfiends on DoT expire
|
||||||
// $RAP*0.1/5 bonus per tick
|
if(m_spellProto->Id == 41917)
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
|
m_target->CastSpell(m_target, 41915, true);
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Immolation Trap
|
|
||||||
if (m_spellProto->SpellFamilyFlags & 0x0000000000000004LL && m_spellProto->SpellIconID == 678)
|
|
||||||
{
|
|
||||||
// $RAP*0.1/5 bonus per tick
|
|
||||||
m_modifier.m_amount += int32(caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 10 / 500);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7498"
|
#define REVISION_NR "7499"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue