aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp15
-rw-r--r--src/server/game/Movement/MotionMaster.cpp24
-rw-r--r--src/server/game/Movement/MotionMaster.h1
-rwxr-xr-xsrc/server/game/Movement/MovementGenerator.h1
4 files changed, 28 insertions, 13 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index b11af5f555f..5ad1a1b6d19 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -8259,19 +8259,8 @@ void Unit::setDeathState(DeathState s)
// Don't clear the movement if the Unit was on a vehicle as we are exiting now
if (!isOnVehicle)
{
- if (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
- GetMotionMaster()->Clear();
- GetMotionMaster()->MoveIdle();
- }
-
- StopMoving();
- DisableSpline();
+ if (GetMotionMaster()->StopOnDeath())
+ DisableSpline();
}
// without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
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);
}
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index b86e643f588..1b558df44d5 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -150,6 +150,7 @@ class TC_GAME_API MotionMaster
void Clear(MovementGeneratorPriority priority);
void PropagateSpeedChange();
bool GetDestination(float &x, float &y, float &z);
+ bool StopOnDeath();
void MoveIdle();
void MoveTargetedHome();
diff --git a/src/server/game/Movement/MovementGenerator.h b/src/server/game/Movement/MovementGenerator.h
index 24585c4e77f..9c51fecf9dd 100755
--- a/src/server/game/Movement/MovementGenerator.h
+++ b/src/server/game/Movement/MovementGenerator.h
@@ -39,6 +39,7 @@ enum MovementGeneratorFlags : uint16
MOVEMENTGENERATOR_FLAG_DEACTIVATED = 0x040,
MOVEMENTGENERATOR_FLAG_INFORM_ENABLED = 0x080,
MOVEMENTGENERATOR_FLAG_FINALIZED = 0x100,
+ MOVEMENTGENERATOR_FLAG_PERSIST_ON_DEATH = 0x200,
MOVEMENTGENERATOR_FLAG_TRANSITORY = MOVEMENTGENERATOR_FLAG_SPEED_UPDATE_PENDING | MOVEMENTGENERATOR_FLAG_INTERRUPTED
};