aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement/MotionMaster.cpp
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2021-06-06 17:51:00 +0200
committerShauren <shauren.trinity@gmail.com>2022-03-10 23:57:14 +0100
commit8111f50d035c1915165cb8ecd4938ba97820ed10 (patch)
tree95f9879c1a3214209886e7d5006fedf53c01dbf4 /src/server/game/Movement/MotionMaster.cpp
parent89ea13ed46744414f74686cf2126dc637188180d (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.cpp24
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);
}