Correct behavior of Add Extra Attact spelleffect.
Correctly send attack gain in spell log. Attack right after processing effect Ignore effect if target not in melee range/angle --HG-- branch : trunk
This commit is contained in:
+5
-1
@@ -2728,6 +2728,10 @@ void Spell::finish(bool ok)
|
|||||||
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
if (m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||||
((Player*)m_caster)->RemoveSpellMods(this);
|
((Player*)m_caster)->RemoveSpellMods(this);
|
||||||
|
|
||||||
|
// Okay to remove extra attacks
|
||||||
|
if(IsSpellHaveEffect(m_spellInfo, SPELL_EFFECT_ADD_EXTRA_ATTACKS))
|
||||||
|
m_caster->m_extraAttacks = 0;
|
||||||
|
|
||||||
// Heal caster for all health leech from all targets
|
// Heal caster for all health leech from all targets
|
||||||
if (m_healthLeech)
|
if (m_healthLeech)
|
||||||
{
|
{
|
||||||
@@ -2989,7 +2993,7 @@ void Spell::SendLogExecute()
|
|||||||
data.append(unit->GetPackGUID());
|
data.append(unit->GetPackGUID());
|
||||||
else
|
else
|
||||||
data << uint8(0);
|
data << uint8(0);
|
||||||
data << uint32(0); // count?
|
data << uint32(m_caster->m_extraAttacks);
|
||||||
break;
|
break;
|
||||||
case SPELL_EFFECT_INTERRUPT_CAST:
|
case SPELL_EFFECT_INTERRUPT_CAST:
|
||||||
if(Unit *unit = m_targets.getUnitTarget())
|
if(Unit *unit = m_targets.getUnitTarget())
|
||||||
|
|||||||
@@ -5441,7 +5441,20 @@ void Spell::EffectAddExtraAttacks(uint32 /*i*/)
|
|||||||
if( unitTarget->m_extraAttacks )
|
if( unitTarget->m_extraAttacks )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Unit *victim = unitTarget->getVictim();
|
||||||
|
|
||||||
|
// attack prevented
|
||||||
|
// fixme, some attacks may not target current victim, this is right now not handled
|
||||||
|
if (!victim || !unitTarget->IsWithinMeleeRange(victim) || !unitTarget->HasInArc( 2*M_PI/3, victim ))
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Only for proc/log informations
|
||||||
unitTarget->m_extraAttacks = damage;
|
unitTarget->m_extraAttacks = damage;
|
||||||
|
// Need to send log before attack is made
|
||||||
|
SendLogExecute();
|
||||||
|
m_needSpellLog = false;
|
||||||
|
|
||||||
|
unitTarget->AttackerStateUpdate(victim, BASE_ATTACK, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Spell::EffectParry(uint32 /*i*/)
|
void Spell::EffectParry(uint32 /*i*/)
|
||||||
|
|||||||
@@ -2378,24 +2378,10 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
|
|||||||
else
|
else
|
||||||
return; // ignore ranged case
|
return; // ignore ranged case
|
||||||
|
|
||||||
uint32 extraAttacks = m_extraAttacks;
|
|
||||||
|
|
||||||
// melee attack spell casted at main hand attack only
|
// melee attack spell casted at main hand attack only
|
||||||
if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL])
|
if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL])
|
||||||
{
|
{
|
||||||
m_currentSpells[CURRENT_MELEE_SPELL]->cast();
|
m_currentSpells[CURRENT_MELEE_SPELL]->cast();
|
||||||
|
|
||||||
// not recent extra attack only at any non extra attack (melee spell case)
|
|
||||||
if(!extra && extraAttacks)
|
|
||||||
{
|
|
||||||
while(m_extraAttacks)
|
|
||||||
{
|
|
||||||
AttackerStateUpdate(pVictim, BASE_ATTACK, true);
|
|
||||||
if(m_extraAttacks > 0)
|
|
||||||
--m_extraAttacks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2413,16 +2399,6 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
|
|||||||
DEBUG_LOG("AttackerStateUpdate: (NPC) %u attacked %u (TypeId: %u) for %u dmg, absorbed %u, blocked %u, resisted %u.",
|
DEBUG_LOG("AttackerStateUpdate: (NPC) %u attacked %u (TypeId: %u) for %u dmg, absorbed %u, blocked %u, resisted %u.",
|
||||||
GetGUIDLow(), pVictim->GetGUIDLow(), pVictim->GetTypeId(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist);
|
GetGUIDLow(), pVictim->GetGUIDLow(), pVictim->GetTypeId(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist);
|
||||||
|
|
||||||
// extra attack only at any non extra attack (normal case)
|
|
||||||
if(!extra && extraAttacks)
|
|
||||||
{
|
|
||||||
while(m_extraAttacks)
|
|
||||||
{
|
|
||||||
AttackerStateUpdate(pVictim, BASE_ATTACK, true);
|
|
||||||
if(m_extraAttacks > 0)
|
|
||||||
--m_extraAttacks;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user