diff options
author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2021-06-06 17:51:00 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-10 23:57:14 +0100 |
commit | 8111f50d035c1915165cb8ecd4938ba97820ed10 (patch) | |
tree | 95f9879c1a3214209886e7d5006fedf53c01dbf4 /src/server/game/Movement/MotionMaster.cpp | |
parent | 89ea13ed46744414f74686cf2126dc637188180d (diff) |
Core/Movement: Add new flag MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH (#26549)
* Core/Movement: Add new flag MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH
Add new flag MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH to keep movement generators even after death.
Fixes #23095
Could replace ff26027453179448bb972d88a51e565d71e95f3f
* Core/Movement: reorder new method MotionMaster::StopOnDeath
* Core/Movement: reorder new method MotionMaster::StopOnDeath
* Keep MoveJump movement generator after death
Co-authored-by: ccrs <ccrs@users.noreply.github.com>
(cherry picked from commit 9fe9dc087b4dc52af7897942a83c1f880d3a4ef8)
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index d9df89b116f..b0a8aa1fa70 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -544,6 +544,28 @@ bool MotionMaster::GetDestination(float &x, float &y, float &z) return true; } +bool MotionMaster::StopOnDeath() +{ + if (MovementGenerator* movementGenerator = GetCurrentMovementGenerator()) + if (movementGenerator->HasFlag(MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH)) + return false; + + if (_owner->IsInWorld()) + { + // Only clear MotionMaster for entities that exists in world + // Avoids crashes in the following conditions : + // * Using 'call pet' on dead pets + // * Using 'call stabled pet' + // * Logging in with dead pets + Clear(); + MoveIdle(); + } + + _owner->StopMoving(); + + return true; +} + void MotionMaster::MoveIdle() { Add(GetIdleMovementGenerator(), MOTION_SLOT_DEFAULT); @@ -766,6 +788,7 @@ void MotionMaster::MoveKnockbackFrom(Position const& origin, float speedXY, floa GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, 0); movement->Priority = MOTION_PRIORITY_HIGHEST; + movement->AddFlag(MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH); Add(movement); } @@ -853,6 +876,7 @@ void MotionMaster::MoveJumpWithGravity(Position const& pos, float speedXY, float GenericMovementGenerator* movement = new GenericMovementGenerator(std::move(init), EFFECT_MOTION_TYPE, id, arrivalSpellId, arrivalSpellTargetGuid); movement->Priority = MOTION_PRIORITY_HIGHEST; movement->BaseUnitState = UNIT_STATE_JUMPING; + movement->AddFlag(MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH); Add(movement); } |