Core/Movement: ee2d7c1d53 followup

(cherry picked from commit 4f43f4d72f)
This commit is contained in:
ccrs
2017-08-08 20:29:30 +02:00
committed by Shauren
parent b521bf1d3a
commit 6209ceddb9
2 changed files with 49 additions and 30 deletions

View File

@@ -117,6 +117,17 @@ void MotionMaster::Clear(bool reset /*= true*/)
DirectClean(reset);
}
void MotionMaster::Clear(MovementSlot slot)
{
if (empty() || slot >= MAX_MOTION_SLOT)
return;
if (_cleanFlag & MMCF_UPDATE)
DelayedClean(slot);
else
DirectClean(slot);
}
void MotionMaster::MovementExpired(bool reset /*= true*/)
{
if (_cleanFlag & MMCF_UPDATE)
@@ -131,29 +142,6 @@ void MotionMaster::MovementExpired(bool reset /*= true*/)
DirectExpire(reset);
}
void MotionMaster::ExpireMovement(MovementSlot slot)
{
if (empty() || slot >= MAX_MOTION_SLOT)
return;
if (MovementGenerator* motion = GetMotionSlot(slot))
{
DirectDelete(motion);
_slot[slot] = nullptr;
}
if (!top())
{
while (!empty() && !top())
--_top;
if (empty())
Initialize();
else if (NeedInitTop())
InitTop();
}
}
MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const
{
if (empty())
@@ -754,7 +742,7 @@ void MotionMaster::InitTop()
void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot)
{
if (MovementGenerator *curr = _slot[slot])
if (MovementGenerator* curr = _slot[slot])
{
_slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete
if (_top == slot && (_cleanFlag & MMCF_UPDATE))
@@ -781,7 +769,7 @@ void MotionMaster::DirectClean(bool reset)
{
while (size() > 1)
{
MovementGenerator *curr = top();
MovementGenerator* curr = top();
pop();
if (curr)
DirectDelete(curr);
@@ -800,18 +788,47 @@ void MotionMaster::DelayedClean()
{
while (size() > 1)
{
MovementGenerator *curr = top();
MovementGenerator* curr = top();
pop();
if (curr)
DelayedDelete(curr);
}
}
void MotionMaster::DirectClean(MovementSlot slot)
{
if (MovementGenerator* motion = GetMotionSlot(slot))
{
_slot[slot] = nullptr;
DirectDelete(motion);
}
while (!empty() && !top())
--_top;
if (empty())
Initialize();
else if (NeedInitTop())
InitTop();
}
void MotionMaster::DelayedClean(MovementSlot slot)
{
if (MovementGenerator* motion = GetMotionSlot(slot))
{
_slot[slot] = nullptr;
DelayedDelete(motion);
}
while (!empty() && !top())
--_top;
}
void MotionMaster::DirectExpire(bool reset)
{
if (size() > 1)
{
MovementGenerator *curr = top();
MovementGenerator* curr = top();
pop();
DirectDelete(curr);
}
@@ -831,7 +848,7 @@ void MotionMaster::DelayedExpire()
{
if (size() > 1)
{
MovementGenerator *curr = top();
MovementGenerator* curr = top();
pop();
DelayedDelete(curr);
}

View File

@@ -120,8 +120,8 @@ class TC_GAME_API MotionMaster
void UpdateMotion(uint32 diff);
void Clear(bool reset = true);
void Clear(MovementSlot slot);
void MovementExpired(bool reset = true);
void ExpireMovement(MovementSlot slot);
MovementGeneratorType GetCurrentMovementGeneratorType() const;
MovementGeneratorType GetMotionSlotType(int slot) const;
@@ -188,10 +188,12 @@ class TC_GAME_API MotionMaster
bool NeedInitTop() const;
void InitTop();
void Mutate(MovementGenerator *m, MovementSlot slot);
void Mutate(MovementGenerator* m, MovementSlot slot);
void DirectClean(bool reset);
void DelayedClean();
void DirectClean(MovementSlot slot);
void DelayedClean(MovementSlot slot);
void DirectExpire(bool reset);
void DelayedExpire();
void DirectDelete(MovementGenerator* curr);