Skip to content

Commit

Permalink
[9479] Use Clear call in MotionMaster::Initilize
Browse files Browse the repository at this point in the history
Function can be called from deep code in time MotionMaster::Update.
So need use safe way cleanup with possible delayed movegens deletion.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
  • Loading branch information
Quriq14 authored and VladimirMangos committed Feb 28, 2010
1 parent 31a3816 commit 64a8cbc
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 57 deletions.
71 changes: 34 additions & 37 deletions src/game/MotionMaster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,13 @@ void
MotionMaster::Initialize()
{
// clear ALL movement generators (including default)
while(!empty())
{
MovementGenerator *curr = top();
pop();
curr->Finalize(*i_owner);
if( !isStatic( curr ) )
delete curr;
}
Clear(false,true);

// set new default movement generator
if(i_owner->GetTypeId() == TYPEID_UNIT)
if (i_owner->GetTypeId() == TYPEID_UNIT)
{
MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner);
push( movement == NULL ? &si_idleMovement : movement );
push(movement == NULL ? &si_idleMovement : movement);
top()->Initialize(*i_owner);
}
else
Expand All @@ -63,14 +56,7 @@ MotionMaster::Initialize()
MotionMaster::~MotionMaster()
{
// clear ALL movement generators (including default)
while(!empty())
{
MovementGenerator *curr = top();
pop();
curr->Finalize(*i_owner);
if( !isStatic( curr ) )
delete curr;
}
DirectClean(false,true);
}

void
Expand Down Expand Up @@ -112,47 +98,52 @@ MotionMaster::UpdateMotion(uint32 diff)
}

void
MotionMaster::DirectClean(bool reset)
MotionMaster::DirectClean(bool reset, bool all)
{
while( !empty() && size() > 1 )
while( all ? !empty() : size() > 1 )
{
MovementGenerator *curr = top();
pop();
curr->Finalize(*i_owner);
if( !isStatic( curr ) )
if (!isStatic( curr ))
delete curr;
}

if (reset)
if (!all && reset)
{
assert( !empty() );
top()->Reset(*i_owner);
}
}

void
MotionMaster::DelayedClean()
MotionMaster::DelayedClean(bool reset, bool all)
{
if (empty() || size() == 1)
if(reset)
m_cleanFlag |= MMCF_RESET;
else
m_cleanFlag &= ~MMCF_RESET;

if (empty() || !all && size() == 1)
return;

if(!m_expList)
if (!m_expList)
m_expList = new ExpireList();

while( !empty() && size() > 1 )
while( all ? !empty() : size() > 1 )
{
MovementGenerator *curr = top();
pop();
curr->Finalize(*i_owner);
if( !isStatic( curr ) )
if (!isStatic( curr ))
m_expList->push_back(curr);
}
}

void
MotionMaster::DirectExpire(bool reset)
{
if( empty() || size() == 1 )
if (empty() || size() == 1)
return;

MovementGenerator *curr = top();
Expand All @@ -170,25 +161,31 @@ MotionMaster::DirectExpire(bool reset)
// it can add another motions instead
curr->Finalize(*i_owner);

if( !isStatic(curr) )
if (!isStatic(curr))
delete curr;

if( empty() )
if (empty())
Initialize();

if (reset) top()->Reset(*i_owner);
if (reset)
top()->Reset(*i_owner);
}

void
MotionMaster::DelayedExpire()
MotionMaster::DelayedExpire(bool reset)
{
if( empty() || size() == 1 )
if (reset)
m_cleanFlag |= MMCF_RESET;
else
m_cleanFlag &= ~MMCF_RESET;

if (empty() || size() == 1)
return;

MovementGenerator *curr = top();
pop();

if(!m_expList)
if (!m_expList)
m_expList = new ExpireList();

// also drop stored under top() targeted motions
Expand All @@ -202,14 +199,14 @@ MotionMaster::DelayedExpire()

curr->Finalize(*i_owner);

if( !isStatic(curr) )
if (!isStatic(curr))
m_expList->push_back(curr);
}

void MotionMaster::MoveIdle()
{
if( empty() || !isStatic( top() ) )
push( &si_idleMovement );
if (empty() || !isStatic(top()))
push(&si_idleMovement);
}

void
Expand Down
26 changes: 7 additions & 19 deletions src/game/MotionMaster.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,29 +79,17 @@ class MANGOS_DLL_SPEC MotionMaster : private std::stack<MovementGenerator *>
const_iterator end() const { return Impl::c.end(); }

void UpdateMotion(uint32 diff);
void Clear(bool reset = true)
void Clear(bool reset = true, bool all = false)
{
if (m_cleanFlag & MMCF_UPDATE)
{
if(reset)
m_cleanFlag |= MMCF_RESET;
else
m_cleanFlag &= ~MMCF_RESET;
DelayedClean();
}
DelayedClean(reset, all);
else
DirectClean(reset);
DirectClean(reset, all);
}
void MovementExpired(bool reset = true)
{
if (m_cleanFlag & MMCF_UPDATE)
{
if(reset)
m_cleanFlag |= MMCF_RESET;
else
m_cleanFlag &= ~MMCF_RESET;
DelayedExpire();
}
DelayedExpire(reset);
else
DirectExpire(reset);
}
Expand Down Expand Up @@ -129,11 +117,11 @@ class MANGOS_DLL_SPEC MotionMaster : private std::stack<MovementGenerator *>
private:
void Mutate(MovementGenerator *m); // use Move* functions instead

void DirectClean(bool reset);
void DelayedClean();
void DirectClean(bool reset, bool all);
void DelayedClean(bool reset, bool all);

void DirectExpire(bool reset);
void DelayedExpire();
void DelayedExpire(bool reset);

Unit *i_owner;
ExpireList *m_expList;
Expand Down
2 changes: 1 addition & 1 deletion src/shared/revision_nr.h
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "9478"
#define REVISION_NR "9479"
#endif // __REVISION_NR_H__

0 comments on commit 64a8cbc

Please sign in to comment.