diff options
author | megamage <none@none> | 2009-03-04 10:16:15 -0600 |
---|---|---|
committer | megamage <none@none> | 2009-03-04 10:16:15 -0600 |
commit | 0bba1e0551ecd6266c5844677208a55633c47b62 (patch) | |
tree | fdcc2c3fcbbae33cea5d5bbe0f91027915d16f05 /src | |
parent | 3ca5db7ebc5e1f5149cb7140f75eaac7ab9c038e (diff) |
*Fix the bug that sheep attacks people.
--HG--
branch : trunk
Diffstat (limited to 'src')
-rw-r--r-- | src/game/MotionMaster.cpp | 68 | ||||
-rw-r--r-- | src/game/MotionMaster.h | 7 |
2 files changed, 51 insertions, 24 deletions
diff --git a/src/game/MotionMaster.cpp b/src/game/MotionMaster.cpp index 7bfae33c079..b64c17b6342 100644 --- a/src/game/MotionMaster.cpp +++ b/src/game/MotionMaster.cpp @@ -55,10 +55,13 @@ MotionMaster::Initialize() { MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner); push( movement == NULL ? &si_idleMovement : movement ); - top()->Initialize(*i_owner); + InitTop(); } else + { push(&si_idleMovement); + needInit[MOTION_SLOT_IDLE] = false; + } } MotionMaster::~MotionMaster() @@ -98,35 +101,37 @@ MotionMaster::UpdateMotion(uint32 diff) delete m_expList; m_expList = NULL; - if (empty()) + if(empty()) Initialize(); - - if (m_cleanFlag & MMCF_RESET) - { + else if(needInitTop()) + InitTop(); + else if (m_cleanFlag & MMCF_RESET) top()->Reset(*i_owner); - m_cleanFlag &= ~MMCF_RESET; - } + + m_cleanFlag &= ~MMCF_RESET; } } void MotionMaster::DirectClean(bool reset) { - while( !empty() && size() > 1 ) + while(size() > 1) { MovementGenerator *curr = top(); pop(); if(curr) DirectDelete(curr); } - if(reset) + if(needInitTop()) + InitTop(); + else if(reset) top()->Reset(*i_owner); } void MotionMaster::DelayedClean() { - while( !empty() && size() > 1 ) + while(size() > 1) { MovementGenerator *curr = top(); pop(); @@ -137,31 +142,33 @@ MotionMaster::DelayedClean() void MotionMaster::DirectExpire(bool reset) { - if( empty() || size() == 1 ) - return; - - MovementGenerator *curr = top(); - pop(); - DirectDelete(curr); + if(size() > 1 ) + { + MovementGenerator *curr = top(); + pop(); + DirectDelete(curr); + } while(!top()) --i_top; if(empty()) Initialize(); - if(reset) + else if(needInitTop()) + InitTop(); + else if(reset) top()->Reset(*i_owner); } void MotionMaster::DelayedExpire() { - if( empty() || size() == 1 ) - return; - - MovementGenerator *curr = top(); - pop(); - DelayedDelete(curr); + if(size() > 1 ) + { + MovementGenerator *curr = top(); + pop(); + DelayedDelete(curr); + } while(!top()) --i_top; @@ -396,7 +403,14 @@ void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { i_top = slot; } - m->Initialize(*i_owner); + + if(i_top > slot) + needInit[slot] = true; + else + { + m->Initialize(*i_owner); + needInit[slot] = false; + } Impl[slot] = m; } @@ -446,6 +460,12 @@ MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const return top()->GetMovementGeneratorType(); } +void MotionMaster::InitTop() +{ + top()->Initialize(*i_owner); + needInit[i_top] = false; +} + void MotionMaster::DirectDelete(_Ty curr) { if(isStatic(curr)) diff --git a/src/game/MotionMaster.h b/src/game/MotionMaster.h index d362e6574f0..bf3560da321 100644 --- a/src/game/MotionMaster.h +++ b/src/game/MotionMaster.h @@ -68,18 +68,25 @@ class TRINITY_DLL_SPEC MotionMaster //: private std::stack<MovementGenerator *> //typedef std::stack<MovementGenerator *> Impl; typedef MovementGenerator* _Ty; _Ty Impl[MAX_MOTION_SLOT]; + bool needInit[MAX_MOTION_SLOT]; typedef std::vector<_Ty> ExpireList; int i_top; bool empty() const { return i_top < 0; } void pop() { Impl[i_top] = NULL; --i_top; } void push(_Ty _Val) { ++i_top; Impl[i_top] = _Val; } + + bool needInitTop() const { return needInit[i_top]; } + void InitTop(); public: 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) + { Impl[i] = NULL; + needInit[i] = true; + } } ~MotionMaster(); |