aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-04-11 11:26:32 +0200
committerOvahlord <dreadkiller@gmx.de>2025-04-12 14:04:47 +0200
commita08088b1c52abf468644e6ec148b889738fa3c58 (patch)
tree37961cdcd1d1bd458dff1b75906c42d83f4ed787
parent160ed4abe34702f3933863cb7b7916149af780b2 (diff)
Core/Spells: Fixed SPELL_EFFECT_CHARGE trigggering arrival effects too early
(cherry picked from commit a97775ba26bdce1dc6ae57a2c588dab53bade016) # Conflicts: # src/server/game/Spells/Spell.cpp
-rw-r--r--src/server/game/Spells/Spell.cpp17
1 files changed, 10 insertions, 7 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index a41f2a7a268..8e7f2e6d6cf 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -3108,7 +3108,7 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, TargetInfo& hitInfo)
return SPELL_MISS_EVADE;
// For delayed spells immunity may be applied between missile launch and hit - check immunity for that case
- if (m_spellInfo->HasHitDelay() && unit->IsImmunedToSpell(m_spellInfo, m_caster))
+ if (hitInfo.TimeDelay && unit->IsImmunedToSpell(m_spellInfo, m_caster))
return SPELL_MISS_IMMUNE;
CallScriptBeforeHitHandlers(hitInfo.MissCondition);
@@ -3126,7 +3126,7 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, TargetInfo& hitInfo)
if (m_caster != unit)
{
// Recheck UNIT_FLAG_NON_ATTACKABLE for delayed spells
- if (m_spellInfo->HasHitDelay() && unit->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) && unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
+ if (hitInfo.TimeDelay && unit->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE) && unit->GetCharmerOrOwnerGUID() != m_caster->GetGUID())
return SPELL_MISS_EVADE;
if (m_caster->IsValidAttackTarget(unit, m_spellInfo))
@@ -3134,7 +3134,7 @@ SpellMissInfo Spell::PreprocessSpellHit(Unit* unit, TargetInfo& hitInfo)
else if (m_caster->IsFriendlyTo(unit))
{
// for delayed spells ignore negative spells (after duel end) for friendly targets
- if (m_spellInfo->HasHitDelay() && unit->GetTypeId() == TYPEID_PLAYER && !IsPositive() && !m_caster->IsValidAssistTarget(unit, m_spellInfo))
+ if (hitInfo.TimeDelay && unit->GetTypeId() == TYPEID_PLAYER && !IsPositive() && !m_caster->IsValidAssistTarget(unit, m_spellInfo))
return SPELL_MISS_EVADE;
// assisting case, healing and resurrection
@@ -3880,7 +3880,7 @@ void Spell::_cast(bool skipCheck)
creatureCaster->ReleaseSpellFocus(this);
// Okay, everything is prepared. Now we need to distinguish between immediate and evented delayed spells
- if (m_spellInfo->HasHitDelay() && !m_spellInfo->IsChanneled())
+ if (m_delayMoment && !m_spellInfo->IsChanneled())
{
// Remove used for cast item if need (it can be already NULL after TakeReagents call
// in case delayed spell remove item at cast delay start
@@ -8123,9 +8123,12 @@ bool Spell::IsPositive() const
bool Spell::IsNeedSendToClient() const
{
- return m_SpellVisual.SpellXSpellVisualID || m_spellInfo->IsChanneled() ||
- (m_spellInfo->HasAttribute(SPELL_ATTR8_AURA_POINTS_ON_CLIENT)) || m_spellInfo->HasHitDelay() || (!m_triggeredByAuraSpell && !IsTriggered()) ||
- m_spellInfo->HasAttribute(SPELL_ATTR7_ALWAYS_CAST_LOG);
+ return m_SpellVisual.SpellXSpellVisualID
+ || m_spellInfo->IsChanneled()
+ || m_spellInfo->HasAttribute(SPELL_ATTR8_AURA_POINTS_ON_CLIENT)
+ || m_spellInfo->HasHitDelay() || m_delayMoment
+ || (!m_triggeredByAuraSpell && !IsTriggered())
+ || m_spellInfo->HasAttribute(SPELL_ATTR7_ALWAYS_CAST_LOG);
}
Unit* Spell::GetUnitCasterForEffectHandlers() const