diff options
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 34 | ||||
| -rw-r--r-- | src/server/game/Spells/Spell.h | 4 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 4 |
4 files changed, 40 insertions, 6 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index a3b8adf85d0..fb59366ac19 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -8499,6 +8499,10 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg if (cooldown && GetTypeId() == TYPEID_PLAYER && ToPlayer()->HasSpellCooldown(trigger_spell_id)) return false; + // extra attack should hit same target + if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + target = victim; + // try detect target manually if not set if (target == NULL) target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry && triggerEntry->IsPositive() ? this : victim; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 2289020ee38..311182291c5 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -111,8 +111,6 @@ SpellCastTargets::SpellCastTargets() : m_elevation(0), m_speed(0), m_strTarget() m_objectTarget = NULL; m_itemTarget = NULL; - m_objectTargetGUID.Clear(); - m_itemTargetGUID.Clear(); m_itemTargetEntry = 0; m_targetMask = 0; @@ -210,6 +208,28 @@ void SpellCastTargets::Write(ByteBuffer& data) data << m_strTarget; } +ObjectGuid SpellCastTargets::GetOrigUnitTargetGUID() const +{ + switch (m_origObjectTargetGUID.GetHigh()) + { + case HIGHGUID_PLAYER: + case HIGHGUID_VEHICLE: + case HIGHGUID_UNIT: + case HIGHGUID_PET: + return m_origObjectTargetGUID; + default: + return ObjectGuid(); + } +} + +void SpellCastTargets::SetOrigUnitTarget(Unit* target) +{ + if (!target) + return; + + m_origObjectTargetGUID = target->GetGUID(); +} + ObjectGuid SpellCastTargets::GetUnitTargetGUID() const { if (m_objectTargetGUID.IsUnit()) @@ -636,6 +656,7 @@ Spell::~Spell() void Spell::InitExplicitTargets(SpellCastTargets const& targets) { m_targets = targets; + m_targets.SetOrigUnitTarget(m_targets.GetUnitTarget()); // this function tries to correct spell explicit targets for spell // client doesn't send explicit targets correctly sometimes - we need to fix such spells serverside // this also makes sure that we correctly send explicit targets to client (removes redundant data) @@ -3399,8 +3420,13 @@ void Spell::_handle_finish_phase() m_caster->m_movedPlayer->GainSpellComboPoints(m_comboPointGain); } - if (m_caster->m_extraAttacks && GetSpellInfo()->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) - m_caster->HandleProcExtraAttackFor(m_caster->GetVictim()); + if (m_caster->m_extraAttacks && m_spellInfo->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS)) + { + if (Unit* victim = ObjectAccessor::FindUnit(m_targets.GetOrigUnitTargetGUID())) + m_caster->HandleProcExtraAttackFor(victim); + else + m_caster->m_extraAttacks = 0; + } /// @todo trigger proc phase finish here } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 372e7d239a2..6e0a5fc9d3e 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -109,6 +109,9 @@ class SpellCastTargets void SetTargetFlag(SpellCastTargetFlags flag) { m_targetMask |= flag; } + ObjectGuid GetOrigUnitTargetGUID() const; + void SetOrigUnitTarget(Unit* target); + ObjectGuid GetUnitTargetGUID() const; Unit* GetUnitTarget() const; void SetUnitTarget(Unit* target); @@ -174,6 +177,7 @@ class SpellCastTargets Item* m_itemTarget; // object GUID/etc, can be used always + ObjectGuid m_origObjectTargetGUID; ObjectGuid m_objectTargetGUID; ObjectGuid m_itemTargetGUID; uint32 m_itemTargetEntry; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index af1e3b6bfb9..2b5b65fd8f8 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -4557,7 +4557,7 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || !unitTarget->IsAlive() || !unitTarget->GetVictim()) + if (!unitTarget || !unitTarget->IsAlive()) return; if (unitTarget->m_extraAttacks) @@ -4565,7 +4565,7 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) unitTarget->m_extraAttacks = damage; - ExecuteLogEffectExtraAttacks(effIndex, unitTarget->GetVictim(), damage); + ExecuteLogEffectExtraAttacks(effIndex, unitTarget, damage); } void Spell::EffectParry(SpellEffIndex /*effIndex*/) |
