aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOvah <dreadkiller@gmx.de>2019-08-17 14:56:22 +0200
committerShauren <shauren.trinity@gmail.com>2019-08-17 14:56:22 +0200
commit9bd8d907281ea060f87987d448e91b1134311fa6 (patch)
treeb3f7694641b4fbb3cf6c8f8ec57805c9998f8bde /src
parentb054a3f526c7649f318c03e37074d40513c9e7b0 (diff)
Core/Spells: implement SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL (#23467)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp57
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp2
3 files changed, 49 insertions, 12 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index f683730009f..e0ce67c75f6 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -2040,19 +2040,56 @@ void Unit::AttackerStateUpdate(Unit* victim, WeaponAttackType attType, bool extr
// attack can be redirected to another target
victim = GetMeleeHitRedirectTarget(victim);
- CalcDamageInfo damageInfo;
- CalculateMeleeDamage(victim, 0, &damageInfo, attType);
- // Send log damage message to client
- DealDamageMods(victim, damageInfo.damage, &damageInfo.absorb);
- SendAttackStateUpdate(&damageInfo);
+ AuraEffectList const& meleeAttackOverrides = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL);
+ AuraEffect const* meleeAttackAuraEffect = nullptr;
+ uint32 meleeAttackSpellId = 0;
+ if (attType == BASE_ATTACK)
+ {
+ if (!meleeAttackOverrides.empty())
+ {
+ meleeAttackAuraEffect = meleeAttackOverrides.front();
+ meleeAttackSpellId = meleeAttackAuraEffect->GetSpellEffectInfo()->TriggerSpell;
+ }
+ }
+ else
+ {
+ auto itr = std::find_if(meleeAttackOverrides.begin(), meleeAttackOverrides.end(), [&](AuraEffect const* aurEff)
+ {
+ return aurEff->GetSpellEffectInfo()->MiscValue != 0;
+ });
+ if (itr != meleeAttackOverrides.end())
+ {
+ meleeAttackAuraEffect = *itr;
+ meleeAttackSpellId = meleeAttackAuraEffect->GetSpellEffectInfo()->MiscValue;
+ }
+ }
+
+ if (!meleeAttackAuraEffect)
+ {
+ CalcDamageInfo damageInfo;
+ CalculateMeleeDamage(victim, 0, &damageInfo, attType);
+ // Send log damage message to client
+ DealDamageMods(victim, damageInfo.damage, &damageInfo.absorb);
+ SendAttackStateUpdate(&damageInfo);
- DealMeleeDamage(&damageInfo, true);
+ DealMeleeDamage(&damageInfo, true);
- DamageInfo dmgInfo(damageInfo);
- ProcSkillsAndAuras(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, PROC_SPELL_TYPE_NONE, PROC_SPELL_PHASE_NONE, dmgInfo.GetHitMask(), nullptr, &dmgInfo, nullptr);
+ DamageInfo dmgInfo(damageInfo);
+ ProcSkillsAndAuras(damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, PROC_SPELL_TYPE_NONE, PROC_SPELL_PHASE_NONE, dmgInfo.GetHitMask(), nullptr, &dmgInfo, nullptr);
- TC_LOG_DEBUG("entities.unit", "AttackerStateUpdate: %s attacked %s for %u dmg, absorbed %u, blocked %u, resisted %u.",
- GetGUID().ToString().c_str(), victim->GetGUID().ToString().c_str(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist);
+ TC_LOG_DEBUG("entities.unit", "AttackerStateUpdate: %s attacked %s for %u dmg, absorbed %u, blocked %u, resisted %u.",
+ GetGUID().ToString().c_str(), victim->GetGUID().ToString().c_str(), damageInfo.damage, damageInfo.absorb, damageInfo.blocked_amount, damageInfo.resist);
+ }
+ else
+ {
+ CastSpell(victim, meleeAttackSpellId, true, nullptr, meleeAttackAuraEffect);
+
+ uint32 hitInfo = HITINFO_AFFECTS_VICTIM | HITINFO_NO_ANIMATION;
+ if (attType == OFF_ATTACK)
+ hitInfo |= HITINFO_OFFHAND;
+
+ SendAttackStateUpdate(hitInfo, victim, 0, GetMeleeDamageSchoolMask(), 0, 0, 0, VICTIMSTATE_HIT, 0);
+ }
}
}
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 23c7f211616..8d83c108304 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -431,7 +431,7 @@ enum AuraType : uint32
SPELL_AURA_WORGEN_ALTERED_FORM = 358,
SPELL_AURA_359 = 359,
SPELL_AURA_PROC_TRIGGER_SPELL_COPY = 360, // Procs the same spell that caused this proc (Dragonwrath, Tarecgosa's Rest)
- SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL = 361, // NYI
+ SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL = 361,
SPELL_AURA_362 = 362, // Not used in 4.3.4
SPELL_AURA_MOD_NEXT_SPELL = 363, // Used by 101601 Throw Totem - causes the client to initialize spell cast with specified spell
SPELL_AURA_364 = 364, // Not used in 4.3.4
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index c74da190086..9e01cf29d63 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -427,7 +427,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNULL, //358 SPELL_AURA_358
&AuraEffect::HandleNULL, //359 SPELL_AURA_359
&AuraEffect::HandleNULL, //360 SPELL_AURA_PROC_TRIGGER_SPELL_COPY
- &AuraEffect::HandleNULL, //361 SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL
+ &AuraEffect::HandleNoImmediateEffect, //361 SPELL_AURA_OVERRIDE_AUTOATTACK_WITH_MELEE_SPELL implemented in Unit::AttackerStateUpdate
&AuraEffect::HandleUnused, //362 unused (4.3.4)
&AuraEffect::HandleNULL, //363 SPELL_AURA_MOD_NEXT_SPELL
&AuraEffect::HandleUnused, //364 unused (4.3.4)