mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 13:37:00 +00:00
Some work vs SPELL_AURA_PERIODIC_DUMMY aura
* Optimisation * Implement Warrior 61216 and ranks * Implement Druid 22842 * Implement Hunter 53301 and ranks, 53511 and ranks * Implement DK 45524 and related spells, 48978 and ranks * Some comments for future Signed-off-by: DiSlord <dislord@nomail.com>
This commit is contained in:
parent
4f55ef857a
commit
f7701b87a1
1 changed files with 292 additions and 89 deletions
|
|
@ -2320,6 +2320,8 @@ void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
|
||||||
if(!Real)
|
if(!Real)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Unit* caster = GetCaster();
|
||||||
|
|
||||||
SpellEntry const*spell = GetSpellProto();
|
SpellEntry const*spell = GetSpellProto();
|
||||||
switch( spell->SpellFamilyName)
|
switch( spell->SpellFamilyName)
|
||||||
{
|
{
|
||||||
|
|
@ -2343,6 +2345,16 @@ void Aura::HandleAuraPeriodicDummy(bool apply, bool Real)
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
((Player*)m_target)->UpdateManaRegen();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// Explosive Shot
|
||||||
|
if (spell->SpellFamilyFlags & 0x8000000000000000LL)
|
||||||
|
{
|
||||||
|
if (apply && caster)
|
||||||
|
{
|
||||||
|
int32 damage = m_modifier.m_amount + caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
|
||||||
|
caster->CastCustomSpell(m_target, 53352, &damage, 0, 0, true, 0, this);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -6092,114 +6104,136 @@ void Aura::PeriodicTick()
|
||||||
|
|
||||||
void Aura::PeriodicDummyTick()
|
void Aura::PeriodicDummyTick()
|
||||||
{
|
{
|
||||||
|
Unit *caster = GetCaster();
|
||||||
SpellEntry const* spell = GetSpellProto();
|
SpellEntry const* spell = GetSpellProto();
|
||||||
switch (spell->Id)
|
switch (spell->SpellFamilyName)
|
||||||
{
|
{
|
||||||
// Drink
|
case SPELLFAMILY_GENERIC:
|
||||||
case 430:
|
switch (spell->Id)
|
||||||
case 431:
|
|
||||||
case 432:
|
|
||||||
case 1133:
|
|
||||||
case 1135:
|
|
||||||
case 1137:
|
|
||||||
case 10250:
|
|
||||||
case 22734:
|
|
||||||
case 27089:
|
|
||||||
case 34291:
|
|
||||||
case 43706:
|
|
||||||
case 46755:
|
|
||||||
{
|
{
|
||||||
if (m_target->GetTypeId() != TYPEID_PLAYER)
|
// Drink
|
||||||
return;
|
case 430:
|
||||||
// Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
|
case 431:
|
||||||
Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
|
case 432:
|
||||||
for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
|
case 1133:
|
||||||
|
case 1135:
|
||||||
|
case 1137:
|
||||||
|
case 10250:
|
||||||
|
case 22734:
|
||||||
|
case 27089:
|
||||||
|
case 34291:
|
||||||
|
case 43706:
|
||||||
|
case 46755:
|
||||||
|
case 49472: // Drink Coffee
|
||||||
|
case 61830:
|
||||||
{
|
{
|
||||||
if ((*i)->GetId() == GetId())
|
if (m_target->GetTypeId() != TYPEID_PLAYER)
|
||||||
{
|
|
||||||
// Get tick number
|
|
||||||
int32 tick = (m_maxduration - m_duration) / m_modifier.periodictime;
|
|
||||||
// Default case (not on arenas)
|
|
||||||
if (tick == 0)
|
|
||||||
{
|
|
||||||
(*i)->GetModifier()->m_amount = m_modifier.m_amount;
|
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
|
||||||
// Disable continue
|
|
||||||
m_isPeriodic = false;
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
//**********************************************
|
// Search SPELL_AURA_MOD_POWER_REGEN aura for this spell and add bonus
|
||||||
// Code commended since arena patch not added
|
Unit::AuraList const& aura = m_target->GetAurasByType(SPELL_AURA_MOD_POWER_REGEN);
|
||||||
// This feature uses only in arenas
|
for(Unit::AuraList::const_iterator i = aura.begin(); i != aura.end(); ++i)
|
||||||
//**********************************************
|
{
|
||||||
// Here need increase mana regen per tick (6 second rule)
|
if ((*i)->GetId() == GetId())
|
||||||
// on 0 tick - 0 (handled in 2 second)
|
|
||||||
// on 1 tick - 166% (handled in 4 second)
|
|
||||||
// on 2 tick - 133% (handled in 6 second)
|
|
||||||
// Not need update after 3 tick
|
|
||||||
/*
|
|
||||||
if (tick > 3)
|
|
||||||
return;
|
|
||||||
// Apply bonus for 0 - 3 tick
|
|
||||||
switch (tick)
|
|
||||||
{
|
{
|
||||||
case 0: // 0%
|
// Get tick number
|
||||||
(*i)->GetModifier()->m_amount = m_modifier.m_amount = 0;
|
int32 tick = (m_maxduration - m_duration) / m_modifier.periodictime;
|
||||||
break;
|
// Default case (not on arenas)
|
||||||
case 1: // 166%
|
if (tick == 0)
|
||||||
(*i)->GetModifier()->m_amount = m_modifier.m_amount * 5 / 3;
|
{
|
||||||
break;
|
|
||||||
case 2: // 133%
|
|
||||||
(*i)->GetModifier()->m_amount = m_modifier.m_amount * 4 / 3;
|
|
||||||
break;
|
|
||||||
default: // 100% - normal regen
|
|
||||||
(*i)->GetModifier()->m_amount = m_modifier.m_amount;
|
(*i)->GetModifier()->m_amount = m_modifier.m_amount;
|
||||||
break;
|
((Player*)m_target)->UpdateManaRegen();
|
||||||
|
// Disable continue
|
||||||
|
m_isPeriodic = false;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
//**********************************************
|
||||||
|
// Code commended since arena patch not added
|
||||||
|
// This feature uses only in arenas
|
||||||
|
//**********************************************
|
||||||
|
// Here need increase mana regen per tick (6 second rule)
|
||||||
|
// on 0 tick - 0 (handled in 2 second)
|
||||||
|
// on 1 tick - 166% (handled in 4 second)
|
||||||
|
// on 2 tick - 133% (handled in 6 second)
|
||||||
|
// Not need update after 3 tick
|
||||||
|
/*
|
||||||
|
if (tick > 3)
|
||||||
|
return;
|
||||||
|
// Apply bonus for 0 - 3 tick
|
||||||
|
switch (tick)
|
||||||
|
{
|
||||||
|
case 0: // 0%
|
||||||
|
(*i)->GetModifier()->m_amount = m_modifier.m_amount = 0;
|
||||||
|
break;
|
||||||
|
case 1: // 166%
|
||||||
|
(*i)->GetModifier()->m_amount = m_modifier.m_amount * 5 / 3;
|
||||||
|
break;
|
||||||
|
case 2: // 133%
|
||||||
|
(*i)->GetModifier()->m_amount = m_modifier.m_amount * 4 / 3;
|
||||||
|
break;
|
||||||
|
default: // 100% - normal regen
|
||||||
|
(*i)->GetModifier()->m_amount = m_modifier.m_amount;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
((Player*)m_target)->UpdateManaRegen();
|
||||||
|
return;*/
|
||||||
}
|
}
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
|
||||||
return;*/
|
|
||||||
}
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Forsaken Skills
|
||||||
|
case 7054:
|
||||||
|
{
|
||||||
|
// Possibly need cast one of them (but
|
||||||
|
// 7038 Forsaken Skill: Swords
|
||||||
|
// 7039 Forsaken Skill: Axes
|
||||||
|
// 7040 Forsaken Skill: Daggers
|
||||||
|
// 7041 Forsaken Skill: Maces
|
||||||
|
// 7042 Forsaken Skill: Staves
|
||||||
|
// 7043 Forsaken Skill: Bows
|
||||||
|
// 7044 Forsaken Skill: Guns
|
||||||
|
// 7045 Forsaken Skill: 2H Axes
|
||||||
|
// 7046 Forsaken Skill: 2H Maces
|
||||||
|
// 7047 Forsaken Skill: 2H Swords
|
||||||
|
// 7048 Forsaken Skill: Defense
|
||||||
|
// 7049 Forsaken Skill: Fire
|
||||||
|
// 7050 Forsaken Skill: Frost
|
||||||
|
// 7051 Forsaken Skill: Holy
|
||||||
|
// 7053 Forsaken Skill: Shadow
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
// // Panda
|
// // Panda
|
||||||
// case 19230: break;
|
// case 19230: break;
|
||||||
// // Master of Subtlety
|
|
||||||
// case 31666: break;
|
|
||||||
// // Gossip NPC Periodic - Talk
|
// // Gossip NPC Periodic - Talk
|
||||||
// case 33208: break;
|
// case 33208: break;
|
||||||
// // Gossip NPC Periodic - Despawn
|
// // Gossip NPC Periodic - Despawn
|
||||||
// case 33209: break;
|
// case 33209: break;
|
||||||
// // Force of Nature
|
|
||||||
// case 33831: break;
|
// TODO: now its not periodic dummy - need move out from here
|
||||||
// Aspect of the Viper
|
// Aspect of the Viper
|
||||||
case 34074:
|
case 34074:
|
||||||
{
|
{
|
||||||
if (m_target->GetTypeId() != TYPEID_PLAYER)
|
if (m_target->GetTypeId() != TYPEID_PLAYER)
|
||||||
|
return;
|
||||||
|
// Should be manauser
|
||||||
|
if (m_target->getPowerType()!=POWER_MANA)
|
||||||
|
return;
|
||||||
|
if (!caster)
|
||||||
|
return;
|
||||||
|
// Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
|
||||||
|
int mana = m_target->GetPower(POWER_MANA);
|
||||||
|
int max_mana = m_target->GetMaxPower(POWER_MANA);
|
||||||
|
int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
|
||||||
|
float regen_pct = 1.20f - 1.1f * mana / max_mana;
|
||||||
|
if (regen_pct > 1.0f) regen_pct = 1.0f;
|
||||||
|
else if (regen_pct < 0.2f) regen_pct = 0.2f;
|
||||||
|
m_modifier.m_amount = int32 (base_regen * regen_pct);
|
||||||
|
((Player*)m_target)->UpdateManaRegen();
|
||||||
return;
|
return;
|
||||||
// Should be manauser
|
}
|
||||||
if (m_target->getPowerType()!=POWER_MANA)
|
|
||||||
return;
|
|
||||||
Unit *caster = GetCaster();
|
|
||||||
if (!caster)
|
|
||||||
return;
|
|
||||||
// Regen amount is max (100% from spell) on 21% or less mana and min on 92.5% or greater mana (20% from spell)
|
|
||||||
int mana = m_target->GetPower(POWER_MANA);
|
|
||||||
int max_mana = m_target->GetMaxPower(POWER_MANA);
|
|
||||||
int32 base_regen = caster->CalculateSpellDamage(m_spellProto, m_effIndex, m_currentBasePoints, m_target);
|
|
||||||
float regen_pct = 1.20f - 1.1f * mana / max_mana;
|
|
||||||
if (regen_pct > 1.0f) regen_pct = 1.0f;
|
|
||||||
else if (regen_pct < 0.2f) regen_pct = 0.2f;
|
|
||||||
m_modifier.m_amount = int32 (base_regen * regen_pct);
|
|
||||||
((Player*)m_target)->UpdateManaRegen();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// // Steal Weapon
|
// // Steal Weapon
|
||||||
// case 36207: break;
|
// case 36207: break;
|
||||||
// // Simon Game START timer, (DND)
|
// // Simon Game START timer, (DND)
|
||||||
// case 39993: break;
|
// case 39993: break;
|
||||||
// // Harpooner's Mark
|
|
||||||
// case 40084: break;
|
|
||||||
// // Knockdown Fel Cannon: break; The Aggro Burst
|
// // Knockdown Fel Cannon: break; The Aggro Burst
|
||||||
// case 40119: break;
|
// case 40119: break;
|
||||||
// // Old Mount Spell
|
// // Old Mount Spell
|
||||||
|
|
@ -6212,6 +6246,8 @@ void Aura::PeriodicDummyTick()
|
||||||
// case 40846: break;
|
// case 40846: break;
|
||||||
// // Copy Weapon
|
// // Copy Weapon
|
||||||
// case 41054: break;
|
// case 41054: break;
|
||||||
|
// // Dementia
|
||||||
|
// case 41404: break;
|
||||||
// // Ethereal Ring Visual, Lightning Aura
|
// // Ethereal Ring Visual, Lightning Aura
|
||||||
// case 41477: break;
|
// case 41477: break;
|
||||||
// // Ethereal Ring Visual, Lightning Aura (Fork)
|
// // Ethereal Ring Visual, Lightning Aura (Fork)
|
||||||
|
|
@ -6260,6 +6296,8 @@ void Aura::PeriodicDummyTick()
|
||||||
// case 43310: break;
|
// case 43310: break;
|
||||||
// // Headless Horseman - Maniacal Laugh, Maniacal, Delayed 17
|
// // Headless Horseman - Maniacal Laugh, Maniacal, Delayed 17
|
||||||
// case 43884: break;
|
// case 43884: break;
|
||||||
|
// // Wretched!
|
||||||
|
// case 43963: break;
|
||||||
// // Headless Horseman - Maniacal Laugh, Maniacal, other, Delayed 17
|
// // Headless Horseman - Maniacal Laugh, Maniacal, other, Delayed 17
|
||||||
// case 44000: break;
|
// case 44000: break;
|
||||||
// // Energy Feedback
|
// // Energy Feedback
|
||||||
|
|
@ -6326,14 +6364,179 @@ void Aura::PeriodicDummyTick()
|
||||||
// case 47407: break;
|
// case 47407: break;
|
||||||
// // Mole Machine Port Schedule
|
// // Mole Machine Port Schedule
|
||||||
// case 47489: break;
|
// case 47489: break;
|
||||||
|
// case 47941: break; // Crystal Spike
|
||||||
|
// case 48200: break; // Healer Aura
|
||||||
|
// case 48630: break; // Summon Gauntlet Mobs Periodic
|
||||||
|
// case 49313: break; // Proximity Mine Area Aura
|
||||||
// // Mole Machine Portal Schedule
|
// // Mole Machine Portal Schedule
|
||||||
// case 49466: break;
|
// case 49466: break;
|
||||||
// // Drink Coffee
|
// case 49555: break; // Corpse Explode
|
||||||
// case 49472: break;
|
// case 49592: break; // Temporal Rift
|
||||||
|
// case 49957: break; // Cutting Laser
|
||||||
|
// case 50085: break; // Slow Fall
|
||||||
// // Listening to Music
|
// // Listening to Music
|
||||||
// case 50493: break;
|
// case 50493: break;
|
||||||
// // Love Rocket Barrage
|
// // Love Rocket Barrage
|
||||||
// case 50530: break;
|
// case 50530: break;
|
||||||
|
// Exist more after, need add later
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SPELLFAMILY_MAGE:
|
||||||
|
{
|
||||||
|
// Mirror Image
|
||||||
|
// if (spell->Id == 55342)
|
||||||
|
// return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_WARRIOR:
|
||||||
|
{
|
||||||
|
// Armored to the Teeth
|
||||||
|
if (spell->SpellIconID == 3516)
|
||||||
|
{
|
||||||
|
// Increases your attack power by $s1 for every $s2 armor value you have.
|
||||||
|
// Calculate AP bonus (from 1 efect of this spell)
|
||||||
|
int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
|
||||||
|
m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_DRUID:
|
||||||
|
{
|
||||||
|
switch (spell->Id)
|
||||||
|
{
|
||||||
|
// Frenzied Regeneration
|
||||||
|
case 22842:
|
||||||
|
{
|
||||||
|
// Converts up to 10 rage per second into health for $d. Each point of rage is converted into ${$m2/10}.1% of max health.
|
||||||
|
// Should be manauser
|
||||||
|
if (m_target->getPowerType()!=POWER_RAGE)
|
||||||
|
return;
|
||||||
|
uint32 rage = m_target->GetPower(POWER_RAGE);
|
||||||
|
// Nothing todo
|
||||||
|
if (rage == 0)
|
||||||
|
return;
|
||||||
|
int32 mod = (rage < 100) ? rage : 100;
|
||||||
|
int32 points = m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
|
||||||
|
int32 regen = m_target->GetMaxHealth() * (mod * points / 10) / 1000;
|
||||||
|
m_target->CastCustomSpell(m_target, 22845, ®en, 0, 0, true, 0, this);
|
||||||
|
m_target->SetPower(POWER_RAGE, rage-mod);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Force of Nature
|
||||||
|
case 33831:
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_ROGUE:
|
||||||
|
{
|
||||||
|
// switch (spell->Id)
|
||||||
|
// {
|
||||||
|
// Master of Subtlety
|
||||||
|
// case 31666: break;
|
||||||
|
// Killing Spree
|
||||||
|
// case 51690: break;
|
||||||
|
// Overkill
|
||||||
|
// case 58428: break;
|
||||||
|
// default:
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_HUNTER:
|
||||||
|
{
|
||||||
|
// Explosive Shot
|
||||||
|
if (spell->SpellFamilyFlags & 0x8000000000000000LL)
|
||||||
|
{
|
||||||
|
if (!caster)
|
||||||
|
return;
|
||||||
|
// Skip 0 tick
|
||||||
|
if (m_duration < m_modifier.periodictime)
|
||||||
|
return;
|
||||||
|
int32 damage = caster->CalculateSpellDamage(spell, GetEffIndex(), GetBasePoints(), m_target);
|
||||||
|
damage+=caster->GetTotalAttackPowerValue(RANGED_ATTACK) * 8 / 100;
|
||||||
|
damage/=4;
|
||||||
|
caster->CastCustomSpell(m_target, 56298, &damage, 0, 0, true, 0, this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
switch (spell->Id)
|
||||||
|
{
|
||||||
|
// Harpooner's Mark
|
||||||
|
// case 40084:
|
||||||
|
// return;
|
||||||
|
// Feeding Frenzy Rank 1
|
||||||
|
case 53511:
|
||||||
|
if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
|
||||||
|
m_target->CastSpell(m_target, 60096, true, 0, this);
|
||||||
|
return;
|
||||||
|
// Feeding Frenzy Rank 2
|
||||||
|
case 53512:
|
||||||
|
if ( m_target->GetHealth() * 100 < m_target->GetMaxHealth() * 35 )
|
||||||
|
m_target->CastSpell(m_target, 60097, true, 0, this);
|
||||||
|
return;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_SHAMAN:
|
||||||
|
{
|
||||||
|
// Astral Shift
|
||||||
|
// if (spell->Id == 52179)
|
||||||
|
// return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case SPELLFAMILY_DEATHKNIGHT:
|
||||||
|
{
|
||||||
|
// Death and Decay
|
||||||
|
// if (spell->SpellFamilyFlags & 0x0000000000000020LL)
|
||||||
|
// return;
|
||||||
|
// Raise Dead
|
||||||
|
// if (spell->SpellFamilyFlags & 0x0000000000001000LL)
|
||||||
|
// return;
|
||||||
|
// Chains of Ice
|
||||||
|
if (spell->SpellFamilyFlags & 0x0000400000000000LL)
|
||||||
|
{
|
||||||
|
// Get 0 effect aura
|
||||||
|
Aura *slow = m_target->GetAura(GetId(), 0);
|
||||||
|
if (slow)
|
||||||
|
{
|
||||||
|
slow->ApplyModifier(false, true);
|
||||||
|
Modifier *mod = slow->GetModifier();
|
||||||
|
mod->m_amount+= m_modifier.m_amount;
|
||||||
|
if (mod->m_amount > 0) mod->m_amount = 0;
|
||||||
|
slow->ApplyModifier(true, true);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Summon Gargoyle
|
||||||
|
// if (spell->SpellFamilyFlags & 0x0000008000000000LL)
|
||||||
|
// return;
|
||||||
|
// Death Rune Mastery
|
||||||
|
// if (spell->SpellFamilyFlags & 0x0000000000004000LL)
|
||||||
|
// return;
|
||||||
|
// Bladed Armor
|
||||||
|
if (spell->SpellIconID == 2653)
|
||||||
|
{
|
||||||
|
// Increases your attack power by $s1 for every $s2 armor value you have.
|
||||||
|
// Calculate AP bonus (from 1 efect of this spell)
|
||||||
|
int32 apBonus = m_modifier.m_amount * m_target->GetArmor() / m_target->CalculateSpellDamage(spell, 1, spell->EffectBasePoints[1], m_target);
|
||||||
|
m_target->CastCustomSpell(m_target, 61217, &apBonus, &apBonus, 0, true, 0, this);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Reaping
|
||||||
|
// if (spell->SpellIconID == 22)
|
||||||
|
// return;
|
||||||
|
// Blood of the North
|
||||||
|
// if (spell->SpellIconID == 30412)
|
||||||
|
// return;
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue