*Fix the bug that sheep attacks people.

--HG--
branch : trunk
This commit is contained in:
megamage
2009-03-04 10:16:15 -06:00
parent 3ca5db7ebc
commit 0bba1e0551
2 changed files with 51 additions and 24 deletions
+35 -15
View File
@@ -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))
+7
View File
@@ -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();