From 78de91a48741706ab087f050e66fc9bdccb18b20 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 2 Aug 2025 12:37:52 +0200 Subject: [PATCH] Core/Spells: Rename confusing SpellState enum values * SPELL_STATE_CASTING -> SPELL_STATE_CHANNELING (was used for "channel in progress") * SPELL_STATE_DELAYED -> SPELL_STATE_LAUNCHED --- src/server/game/Entities/Player/Player.cpp | 4 +-- src/server/game/Entities/Unit/Unit.cpp | 25 ++++++++++--------- .../game/Spells/Auras/SpellAuraEffects.cpp | 2 +- src/server/game/Spells/Spell.cpp | 22 ++++++++-------- src/server/game/Spells/Spell.h | 18 ++++++------- src/server/game/Spells/SpellEffects.cpp | 2 +- .../Ulduar/Ulduar/boss_yogg_saron.cpp | 2 +- .../boss_leotheras_the_blind.cpp | 7 +----- 8 files changed, 39 insertions(+), 43 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4084c99b39..993285821c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24108,8 +24108,8 @@ void Player::RemoveItemDependentAurasAndCasts(Item* pItem) // currently cast spells can be dependent from item for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i) if (Spell* spell = GetCurrentSpell(CurrentSpellTypes(i))) - if (spell->getState() != SPELL_STATE_DELAYED && !HasItemFitToSpellRequirements(spell->m_spellInfo, pItem)) - InterruptSpell(CurrentSpellTypes(i)); + if (!HasItemFitToSpellRequirements(spell->m_spellInfo, pItem)) + InterruptSpell(CurrentSpellTypes(i), false); } uint32 Player::GetResurrectionSpellId() diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 3db316b72a..05a451f6cd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -695,7 +695,7 @@ void Unit::UpdateInterruptMask() if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL]) { - if (spell->getState() == SPELL_STATE_CASTING) + if (spell->getState() == SPELL_STATE_CHANNELING) { m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags; m_interruptMask2 |= spell->m_spellInfo->ChannelInterruptFlags2; @@ -978,7 +978,7 @@ bool Unit::HasBreakableByDamageCrowdControlAura(Unit* excludeCasterChannel) cons if (damage && victim->IsPlayer()) if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL]) - if (spell->getState() == SPELL_STATE_CASTING && spell->m_spellInfo->HasChannelInterruptFlag(SpellAuraInterruptFlags::DamageChannelDuration)) + if (spell->getState() == SPELL_STATE_CHANNELING && spell->m_spellInfo->HasChannelInterruptFlag(SpellAuraInterruptFlags::DamageChannelDuration)) spell->DelayedChannel(); } } @@ -2648,12 +2648,12 @@ void Unit::_UpdateSpells(uint32 time) _UpdateAutoRepeatSpell(); // remove finished spells from current pointers - for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i) + for (Spell*& spell : m_currentSpells) { - if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED) + if (spell && spell->getState() == SPELL_STATE_FINISHED) { - m_currentSpells[i]->SetReferencedFromCurrent(false); - m_currentSpells[i] = nullptr; // remove pointer + spell->SetReferencedFromCurrent(false); + spell = nullptr; // remove pointer } } @@ -2812,7 +2812,8 @@ void Unit::InterruptSpell(CurrentSpellTypes spellType, bool withDelayed, bool wi if (!spell) return; - if ((withDelayed || spell->getState() != SPELL_STATE_DELAYED) && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) + if ((withDelayed || spell->getState() != SPELL_STATE_LAUNCHED) && + (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CHANNELING)) { // for example, do not let self-stun aura interrupt itself if (!spell->IsInterruptable()) @@ -2856,7 +2857,7 @@ bool Unit::IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled, bool skipAu // generic spells are cast when they are not finished and not delayed if (m_currentSpells[CURRENT_GENERIC_SPELL] && (m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_FINISHED) && - (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED)) + (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_LAUNCHED)) { if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime()) { @@ -2895,9 +2896,9 @@ void Unit::InterruptNonMeleeSpells(bool withDelayed, uint32 spell_id, bool withI Spell* Unit::FindCurrentSpellBySpellId(uint32 spell_id) const { - for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++) - if (m_currentSpells[i] && m_currentSpells[i]->m_spellInfo->Id == spell_id) - return m_currentSpells[i]; + for (Spell* spell : m_currentSpells) + if (spell && spell->m_spellInfo->Id == spell_id) + return spell; return nullptr; } @@ -3872,7 +3873,7 @@ void Unit::RemoveAurasWithInterruptFlags(InterruptFlags flag, SpellInfo const* s // interrupt channeled spell if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL]) - if (spell->getState() == SPELL_STATE_CASTING + if (spell->getState() == SPELL_STATE_CHANNELING && spell->GetSpellInfo()->HasChannelInterruptFlag(flag) && (!source || spell->GetSpellInfo()->Id != source->Id) && !IsInterruptFlagIgnoredForSpell(flag, this, spell->GetSpellInfo(), source)) diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 57ce087dcf..c6df1a6172 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -2614,7 +2614,7 @@ void AuraEffect::HandleAuraModNoActions(AuraApplication const* aurApp, uint8 mod target->SetFlag(UNIT_FIELD_FLAGS_2, UNIT_FLAG2_NO_ACTIONS); // call functions which may have additional effects after chainging state of unit - // Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_SILENCE + // Stop cast only spells vs PreventionType & SPELL_PREVENTION_TYPE_NO_ACTIONS for (uint32 i = CURRENT_MELEE_SPELL; i < CURRENT_MAX_SPELL; ++i) if (Spell* spell = target->GetCurrentSpell(CurrentSpellTypes(i))) if (spell->m_spellInfo->PreventionType == SPELL_PREVENTION_TYPE_NO_ACTIONS) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b57f99e03c..459b5b9b93 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -2619,7 +2619,7 @@ void Spell::TargetInfo::DoTargetSpellHit(Spell* spell, uint8 effIndex) if (unit->IsAlive() != IsAlive) return; - if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR8_IGNORE_SANCTUARY) && spell->getState() == SPELL_STATE_DELAYED && !spell->IsPositive() && (GameTime::GetGameTimeMS() - TimeDelay) <= unit->m_lastSanctuaryTime) + if (!spell->m_spellInfo->HasAttribute(SPELL_ATTR8_IGNORE_SANCTUARY) && spell->getState() == SPELL_STATE_LAUNCHED && !spell->IsPositive() && (GameTime::GetGameTimeMS() - TimeDelay) <= unit->m_lastSanctuaryTime) return; // No missinfo in that case if (_spellHitTarget) @@ -3509,7 +3509,7 @@ void Spell::cancel() if (m_spellState == SPELL_STATE_FINISHED) return; - uint32 oldState = m_spellState; + SpellState oldState = m_spellState; m_spellState = SPELL_STATE_FINISHED; m_autoRepeat = false; @@ -3518,11 +3518,11 @@ void Spell::cancel() case SPELL_STATE_PREPARING: CancelGlobalCooldown(); [[fallthrough]]; - case SPELL_STATE_DELAYED: + case SPELL_STATE_LAUNCHED: SendInterrupted(0); SendCastResult(SPELL_FAILED_INTERRUPTED); break; - case SPELL_STATE_CASTING: + case SPELL_STATE_CHANNELING: for (TargetInfo const& targetInfo : m_UniqueTargetInfo) if (targetInfo.MissCondition == SPELL_MISS_NONE) if (Unit* unit = m_caster->GetGUID() == targetInfo.TargetGUID ? m_caster->ToUnit() : ObjectAccessor::GetUnit(*m_caster, targetInfo.TargetGUID)) @@ -3774,7 +3774,7 @@ void Spell::_cast(bool skipCheck) // Okay, maps created, now prepare flags m_immediateHandled = false; - m_spellState = SPELL_STATE_DELAYED; + m_spellState = SPELL_STATE_LAUNCHED; SetDelayStart(0); if (Unit* unitCaster = m_caster->ToUnit()) @@ -3889,7 +3889,7 @@ void Spell::handle_immediate() if (duration != 0) { - m_spellState = SPELL_STATE_CASTING; + m_spellState = SPELL_STATE_CHANNELING; // GameObjects shouldn't cast channeled spells ASSERT_NOTNULL(m_caster->ToUnit())->AddInterruptMask(m_spellInfo->ChannelInterruptFlags, m_spellInfo->ChannelInterruptFlags2); } @@ -3917,7 +3917,7 @@ void Spell::handle_immediate() // Remove used for cast item if need (it can be already nullptr after TakeReagents call TakeCastItem(); - if (m_spellState != SPELL_STATE_CASTING) + if (m_spellState != SPELL_STATE_CHANNELING) finish(true); // successfully finish spell cast (not last in case autorepeat or channel spell) } @@ -4166,7 +4166,7 @@ void Spell::update(uint32 difftime) cast(!m_casttime); break; } - case SPELL_STATE_CASTING: + case SPELL_STATE_CHANNELING: { if (m_timer) { @@ -6888,7 +6888,7 @@ SpellCastResult Spell::CheckMovement() const if (m_spellInfo->InterruptFlags.HasFlag(SpellInterruptFlags::Movement)) return SPELL_FAILED_MOVING; } - else if (getState() == SPELL_STATE_CASTING) + else if (getState() == SPELL_STATE_CHANNELING) if (!m_spellInfo->IsMoveAllowedChannel()) return SPELL_FAILED_MOVING; } @@ -7664,7 +7664,7 @@ void Spell::DelayedChannel() if (!playerCaster) return; - if (m_spellState != SPELL_STATE_CASTING) + if (m_spellState != SPELL_STATE_CHANNELING) return; if (IsDelayableNoMore()) // Spells may only be delayed twice @@ -7965,7 +7965,7 @@ bool SpellEvent::Execute(uint64 e_time, uint32 p_time) // event will be re-added automatically at the end of routine) break; } - case SPELL_STATE_DELAYED: + case SPELL_STATE_LAUNCHED: { // first, check, if we have just started if (m_Spell->GetDelayStart() != 0) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 51504ae06a..01c96e2ac1 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -259,12 +259,12 @@ struct SpellValue enum SpellState { - SPELL_STATE_NULL = 0, - SPELL_STATE_PREPARING = 1, - SPELL_STATE_CASTING = 2, - SPELL_STATE_FINISHED = 3, - SPELL_STATE_IDLE = 4, - SPELL_STATE_DELAYED = 5 + SPELL_STATE_NULL = 0, + SPELL_STATE_PREPARING = 1, + SPELL_STATE_LAUNCHED = 2, + SPELL_STATE_CHANNELING = 3, + SPELL_STATE_FINISHED = 4, + SPELL_STATE_IDLE = 5 }; enum SpellEffectHandleMode @@ -494,8 +494,8 @@ class TC_GAME_API Spell void Delayed(); void DelayedChannel(); - uint32 getState() const { return m_spellState; } - void setState(uint32 state) { m_spellState = state; } + SpellState getState() const { return m_spellState; } + void setState(SpellState state) { m_spellState = state; } void DoCreateItem(uint32 i, uint32 itemtype); @@ -822,7 +822,7 @@ class TC_GAME_API Spell SpellCastResult CanOpenLock(uint32 effIndex, uint32 lockid, SkillType& skillid, int32& reqSkillValue, int32& skillValue); // ------------------------------------------- - uint32 m_spellState; + SpellState m_spellState; int32 m_timer; SpellEvent* _spellEvent; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index fa3b0b4c23..a35e2e66f6 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2937,7 +2937,7 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex) { SpellInfo const* curSpellInfo = spell->m_spellInfo; // check if we can interrupt spell - if ((spell->getState() == SPELL_STATE_CASTING + if ((spell->getState() == SPELL_STATE_CHANNELING || (spell->getState() == SPELL_STATE_PREPARING && spell->GetCastTime() > 0.0f)) && curSpellInfo->CanBeInterrupted(unitTarget)) { diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 86bce1af1e..ce173b2f7f 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -2429,7 +2429,7 @@ class spell_yogg_saron_diminsh_power : public SpellScriptLoader // 64148 { PreventDefaultAction(); if (Spell* spell = GetTarget()->GetCurrentSpell(CURRENT_CHANNELED_SPELL)) - if (spell->getState() == SPELL_STATE_CASTING) + if (spell->getState() == SPELL_STATE_CHANNELING) GetTarget()->InterruptSpell(CURRENT_CHANNELED_SPELL); } diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index 5993969565..b7843b9131 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -792,12 +792,7 @@ public: { if (Player* i_pl = itr->GetSource()) { - bool isCasting = false; - for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i) - if (i_pl->GetCurrentSpell(i)) - isCasting = true; - - if (isCasting) + if (i_pl->IsNonMeleeSpellCast(false, false, true)) { DoCast(i_pl, SPELL_EARTHSHOCK); break;