*Fix the bug that sheep attacks people.
--HG-- branch : trunk
This commit is contained in:
+35
-15
@@ -55,10 +55,13 @@ MotionMaster::Initialize()
|
|||||||
{
|
{
|
||||||
MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner);
|
MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner);
|
||||||
push( movement == NULL ? &si_idleMovement : movement );
|
push( movement == NULL ? &si_idleMovement : movement );
|
||||||
top()->Initialize(*i_owner);
|
InitTop();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
push(&si_idleMovement);
|
push(&si_idleMovement);
|
||||||
|
needInit[MOTION_SLOT_IDLE] = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionMaster::~MotionMaster()
|
MotionMaster::~MotionMaster()
|
||||||
@@ -100,33 +103,35 @@ MotionMaster::UpdateMotion(uint32 diff)
|
|||||||
|
|
||||||
if(empty())
|
if(empty())
|
||||||
Initialize();
|
Initialize();
|
||||||
|
else if(needInitTop())
|
||||||
if (m_cleanFlag & MMCF_RESET)
|
InitTop();
|
||||||
{
|
else if (m_cleanFlag & MMCF_RESET)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
|
|
||||||
m_cleanFlag &= ~MMCF_RESET;
|
m_cleanFlag &= ~MMCF_RESET;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DirectClean(bool reset)
|
MotionMaster::DirectClean(bool reset)
|
||||||
{
|
{
|
||||||
while( !empty() && size() > 1 )
|
while(size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
if(curr) DirectDelete(curr);
|
if(curr) DirectDelete(curr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(reset)
|
if(needInitTop())
|
||||||
|
InitTop();
|
||||||
|
else if(reset)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DelayedClean()
|
MotionMaster::DelayedClean()
|
||||||
{
|
{
|
||||||
while( !empty() && size() > 1 )
|
while(size() > 1)
|
||||||
{
|
{
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
@@ -137,31 +142,33 @@ MotionMaster::DelayedClean()
|
|||||||
void
|
void
|
||||||
MotionMaster::DirectExpire(bool reset)
|
MotionMaster::DirectExpire(bool reset)
|
||||||
{
|
{
|
||||||
if( empty() || size() == 1 )
|
if(size() > 1 )
|
||||||
return;
|
{
|
||||||
|
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
DirectDelete(curr);
|
DirectDelete(curr);
|
||||||
|
}
|
||||||
|
|
||||||
while(!top())
|
while(!top())
|
||||||
--i_top;
|
--i_top;
|
||||||
|
|
||||||
if(empty())
|
if(empty())
|
||||||
Initialize();
|
Initialize();
|
||||||
if(reset)
|
else if(needInitTop())
|
||||||
|
InitTop();
|
||||||
|
else if(reset)
|
||||||
top()->Reset(*i_owner);
|
top()->Reset(*i_owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MotionMaster::DelayedExpire()
|
MotionMaster::DelayedExpire()
|
||||||
{
|
{
|
||||||
if( empty() || size() == 1 )
|
if(size() > 1 )
|
||||||
return;
|
{
|
||||||
|
|
||||||
MovementGenerator *curr = top();
|
MovementGenerator *curr = top();
|
||||||
pop();
|
pop();
|
||||||
DelayedDelete(curr);
|
DelayedDelete(curr);
|
||||||
|
}
|
||||||
|
|
||||||
while(!top())
|
while(!top())
|
||||||
--i_top;
|
--i_top;
|
||||||
@@ -396,7 +403,14 @@ void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot)
|
|||||||
{
|
{
|
||||||
i_top = slot;
|
i_top = slot;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(i_top > slot)
|
||||||
|
needInit[slot] = true;
|
||||||
|
else
|
||||||
|
{
|
||||||
m->Initialize(*i_owner);
|
m->Initialize(*i_owner);
|
||||||
|
needInit[slot] = false;
|
||||||
|
}
|
||||||
Impl[slot] = m;
|
Impl[slot] = m;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,6 +460,12 @@ MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const
|
|||||||
return top()->GetMovementGeneratorType();
|
return top()->GetMovementGeneratorType();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MotionMaster::InitTop()
|
||||||
|
{
|
||||||
|
top()->Initialize(*i_owner);
|
||||||
|
needInit[i_top] = false;
|
||||||
|
}
|
||||||
|
|
||||||
void MotionMaster::DirectDelete(_Ty curr)
|
void MotionMaster::DirectDelete(_Ty curr)
|
||||||
{
|
{
|
||||||
if(isStatic(curr))
|
if(isStatic(curr))
|
||||||
|
|||||||
@@ -68,18 +68,25 @@ class TRINITY_DLL_SPEC MotionMaster //: private std::stack<MovementGenerator *>
|
|||||||
//typedef std::stack<MovementGenerator *> Impl;
|
//typedef std::stack<MovementGenerator *> Impl;
|
||||||
typedef MovementGenerator* _Ty;
|
typedef MovementGenerator* _Ty;
|
||||||
_Ty Impl[MAX_MOTION_SLOT];
|
_Ty Impl[MAX_MOTION_SLOT];
|
||||||
|
bool needInit[MAX_MOTION_SLOT];
|
||||||
typedef std::vector<_Ty> ExpireList;
|
typedef std::vector<_Ty> ExpireList;
|
||||||
int i_top;
|
int i_top;
|
||||||
|
|
||||||
bool empty() const { return i_top < 0; }
|
bool empty() const { return i_top < 0; }
|
||||||
void pop() { Impl[i_top] = NULL; --i_top; }
|
void pop() { Impl[i_top] = NULL; --i_top; }
|
||||||
void push(_Ty _Val) { ++i_top; Impl[i_top] = _Val; }
|
void push(_Ty _Val) { ++i_top; Impl[i_top] = _Val; }
|
||||||
|
|
||||||
|
bool needInitTop() const { return needInit[i_top]; }
|
||||||
|
void InitTop();
|
||||||
public:
|
public:
|
||||||
|
|
||||||
explicit MotionMaster(Unit *unit) : i_owner(unit), m_expList(NULL), m_cleanFlag(MMCF_NONE), i_top(-1)
|
explicit MotionMaster(Unit *unit) : i_owner(unit), m_expList(NULL), m_cleanFlag(MMCF_NONE), i_top(-1)
|
||||||
{
|
{
|
||||||
for(int i = 0; i < MAX_MOTION_SLOT; ++i)
|
for(int i = 0; i < MAX_MOTION_SLOT; ++i)
|
||||||
|
{
|
||||||
Impl[i] = NULL;
|
Impl[i] = NULL;
|
||||||
|
needInit[i] = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
~MotionMaster();
|
~MotionMaster();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user