diff options
author | Shauren <shauren.trinity@gmail.com> | 2016-11-24 20:22:47 +0100 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2018-02-11 15:06:24 +0100 |
commit | 27cdd4b257d01005d9e342b39a4fdf76567d13cf (patch) | |
tree | 080534dcc700f632bd23afea9935c24568bac669 /src | |
parent | 052422d1659bb2f14ed8880bab12c64ca3c3d71c (diff) |
Core/Spells: Fixed logic related to movement while channeling
Closes #18289
(cherry picked from commit 90a58117017a93fa33864fe1892e7304e2f3bbf4)
Diffstat (limited to 'src')
5 files changed, 13 insertions, 9 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index f4242061c78..b31e46473ab 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3018,15 +3018,19 @@ int32 Unit::GetCurrentSpellCastTime(uint32 spell_id) const return 0; } -bool Unit::CanMoveDuringChannel() const +bool Unit::IsMovementPreventedByCasting() const { + // can always move when not casting + if (!HasUnitState(UNIT_STATE_CASTING)) + return false; + + // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute if (Spell* spell = m_currentSpells[CURRENT_CHANNELED_SPELL]) - { if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive()) - if (!spell->GetSpellInfo()->IsMoveAllowedChannel()) + if (spell->GetSpellInfo()->IsMoveAllowedChannel()) return false; - } + // prohibit movement for all other spell casts return true; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index db8bcfe6b2c..41a091c36e4 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1556,7 +1556,7 @@ class TC_GAME_API Unit : public WorldObject uint32 GetCastSpellXSpellVisualId(SpellInfo const* spellInfo) const; // Check if our current channel spell has attribute SPELL_ATTR5_CAN_CHANNEL_WHEN_MOVING - bool CanMoveDuringChannel() const; + bool IsMovementPreventedByCasting() const; SpellHistory* GetSpellHistory() { return _spellHistory; } SpellHistory const* GetSpellHistory() const { return _spellHistory; } diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp index 5ce4de989aa..05044c95523 100644 --- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp @@ -38,7 +38,7 @@ void FleeingMovementGenerator<T>::_setTargetLocation(T* owner) if (owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) return; - if (owner->HasUnitState(UNIT_STATE_CASTING) && !owner->CanMoveDuringChannel()) + if (owner->IsMovementPreventedByCasting()) { owner->CastStop(); return; diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp index 31fa5ba27c9..46443db4aa6 100644 --- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp @@ -30,7 +30,7 @@ template<> void RandomMovementGenerator<Creature>::_setRandomLocation(Creature* creature) { - if (creature->HasUnitState(UNIT_STATE_CASTING) && !creature->CanMoveDuringChannel()) + if (creature->IsMovementPreventedByCasting()) { creature->CastStop(); return; diff --git a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp index 9bc28b7a2ae..3676427d1ad 100755 --- a/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/TargetedMovementGenerator.cpp @@ -36,7 +36,7 @@ void TargetedMovementGeneratorMedium<T, D>::_setTargetLocation(T* owner, bool up if (owner->HasUnitState(UNIT_STATE_NOT_MOVE)) return; - if (owner->HasUnitState(UNIT_STATE_CASTING) && !owner->CanMoveDuringChannel()) + if (owner->IsMovementPreventedByCasting()) return; if (owner->GetTypeId() == TYPEID_UNIT && !i_target->isInAccessiblePlaceFor(owner->ToCreature())) @@ -149,7 +149,7 @@ bool TargetedMovementGeneratorMedium<T, D>::DoUpdate(T* owner, uint32 time_diff) } // prevent movement while casting spells with cast time or channel time - if (owner->HasUnitState(UNIT_STATE_CASTING) && !owner->CanMoveDuringChannel()) + if (owner->IsMovementPreventedByCasting()) { if (!owner->IsStopped()) owner->StopMoving(); |