fix(Core/Spells): show Execute/Slam misses/dodges/parries in combat log (#7494)

- Closes #7428.
This commit is contained in:
UltraNix
2021-08-26 11:45:22 +02:00
committed by GitHub
parent 5c97632cc3
commit 45218224b4
13 changed files with 118 additions and 26 deletions

View File

@@ -2411,6 +2411,9 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target)
m_spellAura = nullptr; // Set aura to null for every target-make sure that pointer is not used for unit without aura applied
PrepareScriptHitHandlers();
CallScriptBeforeHitHandlers(missInfo);
//Spells with this flag cannot trigger if effect is casted on self
bool canEffectTrigger = !m_spellInfo->HasAttribute(SPELL_ATTR3_SUPRESS_CASTER_PROCS) && unitTarget->CanProc() && (CanExecuteTriggersOnHit(mask) || missInfo == SPELL_MISS_IMMUNE2);
bool reflectedSpell = missInfo == SPELL_MISS_REFLECT;
@@ -2738,9 +2741,6 @@ SpellMissInfo Spell::DoSpellHitOnUnit(Unit* unit, uint32 effectMask, bool scaleA
if (!effectMask)
return returnVal;
PrepareScriptHitHandlers();
CallScriptBeforeHitHandlers();
if (unit->GetTypeId() == TYPEID_PLAYER)
{
unit->ToPlayer()->StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_SPELL_TARGET, m_spellInfo->Id);
@@ -3034,7 +3034,7 @@ void Spell::DoAllEffectOnTarget(GOTargetInfo* target)
return;
PrepareScriptHitHandlers();
CallScriptBeforeHitHandlers();
CallScriptBeforeHitHandlers(SPELL_MISS_NONE);
for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber)
if (effectMask & (1 << effectNumber))
@@ -3055,7 +3055,7 @@ void Spell::DoAllEffectOnTarget(ItemTargetInfo* target)
return;
PrepareScriptHitHandlers();
CallScriptBeforeHitHandlers();
CallScriptBeforeHitHandlers(SPELL_MISS_NONE);
for (uint32 effectNumber = 0; effectNumber < MAX_SPELL_EFFECTS; ++effectNumber)
if (effectMask & (1 << effectNumber))
@@ -7968,14 +7968,14 @@ bool Spell::CallScriptEffectHandlers(SpellEffIndex effIndex, SpellEffectHandleMo
return preventDefault;
}
void Spell::CallScriptBeforeHitHandlers()
void Spell::CallScriptBeforeHitHandlers(SpellMissInfo missInfo)
{
for (std::list<SpellScript*>::iterator scritr = m_loadedScripts.begin(); scritr != m_loadedScripts.end(); ++scritr)
{
(*scritr)->_PrepareScriptCall(SPELL_SCRIPT_HOOK_BEFORE_HIT);
std::list<SpellScript::HitHandler>::iterator hookItrEnd = (*scritr)->BeforeHit.end(), hookItr = (*scritr)->BeforeHit.begin();
std::list<SpellScript::BeforeHitHandler>::iterator hookItrEnd = (*scritr)->BeforeHit.end(), hookItr = (*scritr)->BeforeHit.begin();
for (; hookItr != hookItrEnd; ++hookItr)
(*hookItr).Call(*scritr);
(*hookItr).Call(*scritr, missInfo);
(*scritr)->_FinishScriptCall();
}