From 885255604e3cc7055410f0c030b85a5777dc969a Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Sun, 10 Aug 2025 12:56:29 -0400 Subject: [PATCH] Core/Spells: Fixed SPELL_EFFECT_CHARGE trigggering arrival effects too early Port From (https://github.com/TrinityCore/TrinityCore/commit/a97775ba26bdce1dc6ae57a2c588dab53bade016) --- Source/Game/Spells/Spell.cs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Source/Game/Spells/Spell.cs b/Source/Game/Spells/Spell.cs index 6b0f8b467..62aadd071 100644 --- a/Source/Game/Spells/Spell.cs +++ b/Source/Game/Spells/Spell.cs @@ -2224,7 +2224,7 @@ namespace Game.Spells return SpellMissInfo.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 != 0 && unit.IsImmunedToSpell(m_spellInfo, m_caster)) return SpellMissInfo.Immune; CallScriptBeforeHitHandlers(hitInfo.MissCondition); @@ -2244,7 +2244,7 @@ namespace Game.Spells if (m_caster != unit) { // Recheck UNIT_FLAG_NON_ATTACKABLE for delayed spells - if (m_spellInfo.HasHitDelay() && unit.HasUnitFlag(UnitFlags.NonAttackable) && unit.GetCharmerOrOwnerGUID() != m_caster.GetGUID()) + if (hitInfo.TimeDelay != 0 && unit.HasUnitFlag(UnitFlags.NonAttackable) && unit.GetCharmerOrOwnerGUID() != m_caster.GetGUID()) return SpellMissInfo.Evade; if (m_caster.IsValidAttackTarget(unit, m_spellInfo)) @@ -2252,7 +2252,7 @@ namespace Game.Spells else if (m_caster.IsFriendlyTo(unit)) { // for delayed spells ignore negative spells (after duel end) for friendly targets - if (m_spellInfo.HasHitDelay() && unit.IsPlayer() && !IsPositive() && !m_caster.IsValidAssistTarget(unit, m_spellInfo)) + if (hitInfo.TimeDelay != 0 && unit.IsPlayer() && !IsPositive() && !m_caster.IsValidAssistTarget(unit, m_spellInfo)) return SpellMissInfo.Evade; // assisting case, healing and resurrection @@ -3046,7 +3046,7 @@ namespace Game.Spells 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 != 0 && !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 @@ -7582,9 +7582,12 @@ namespace Game.Spells bool IsNeedSendToClient() { - return m_SpellVisual.SpellXSpellVisualID != 0 || m_SpellVisual.ScriptVisualID != 0 || m_spellInfo.IsChanneled() || - (m_spellInfo.HasAttribute(SpellAttr8.AuraPointsOnClient)) || m_spellInfo.HasHitDelay() || (m_triggeredByAuraSpell == null && !IsTriggered()) || - m_spellInfo.HasAttribute(SpellAttr7.AlwaysCastLog); + return m_SpellVisual.SpellXSpellVisualID != 0 || m_SpellVisual.ScriptVisualID != 0 + || m_spellInfo.IsChanneled() + || m_spellInfo.HasAttribute(SpellAttr8.AuraPointsOnClient) + || m_spellInfo.HasHitDelay() || m_delayMoment != 0 + || (m_triggeredByAuraSpell == null && !IsTriggered()) + || m_spellInfo.HasAttribute(SpellAttr7.AlwaysCastLog); } public Unit GetUnitCasterForEffectHandlers()