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 ff26027453

* 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 9fe9dc087b)
This commit is contained in:
Giacomo Pozzoni
2021-06-06 17:51:00 +02:00
committed by Shauren
parent 89ea13ed46
commit 8111f50d03
4 changed files with 28 additions and 13 deletions

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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();

View File

@@ -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
};