aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthenecromancer <none@none>2009-05-20 22:39:52 +0200
committerthenecromancer <none@none>2009-05-20 22:39:52 +0200
commit6ebfe2f5803cb95bc8f2710892548a60ebe6f63d (patch)
tree6e1dc2c87d62dc5f091ffbdfd97b70c50b55b9f5
parent883cd02304924f04e36306497cf0d36ab373d957 (diff)
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
-rw-r--r--src/game/Spell.cpp6
-rw-r--r--src/game/SpellEffects.cpp13
-rw-r--r--src/game/Unit.cpp24
3 files changed, 18 insertions, 25 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index 49b957c05bf..9c4681d2f1c 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2728,6 +2728,10 @@ void Spell::finish(bool ok)
if (m_caster->GetTypeId() == TYPEID_PLAYER)
((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
if (m_healthLeech)
{
@@ -2989,7 +2993,7 @@ void Spell::SendLogExecute()
data.append(unit->GetPackGUID());
else
data << uint8(0);
- data << uint32(0); // count?
+ data << uint32(m_caster->m_extraAttacks);
break;
case SPELL_EFFECT_INTERRUPT_CAST:
if(Unit *unit = m_targets.getUnitTarget())
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index a1cf876fc6c..89b92ccdc61 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -5441,7 +5441,20 @@ void Spell::EffectAddExtraAttacks(uint32 /*i*/)
if( unitTarget->m_extraAttacks )
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;
+ // Need to send log before attack is made
+ SendLogExecute();
+ m_needSpellLog = false;
+
+ unitTarget->AttackerStateUpdate(victim, BASE_ATTACK, true);
}
void Spell::EffectParry(uint32 /*i*/)
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index ceade1af235..38e2519fe47 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -2378,24 +2378,10 @@ void Unit::AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType, bool ex
else
return; // ignore ranged case
- uint32 extraAttacks = m_extraAttacks;
-
// melee attack spell casted at main hand attack only
if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL])
{
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;
}
@@ -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.",
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;
- }
- }
}
/*