void MotionMaster::UpdateMotion(uint32 diff) { if( i_owner->hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED) ) return; assert( !empty() ); m_cleanFlag |= MMCF_UPDATE; if (!top()->Update(*i_owner, diff)) { m_cleanFlag &= ~MMCF_UPDATE; MovementExpired(); } else m_cleanFlag &= ~MMCF_UPDATE; if (m_expList) { for (int i = 0; i < m_expList->size(); ++i) { MovementGenerator* mg = (*m_expList)[i]; DirectDelete(mg); } delete m_expList; m_expList = NULL; if(empty()) Initialize(); else if(needInitTop()) InitTop(); else if (m_cleanFlag & MMCF_RESET) top()->Reset(*i_owner); m_cleanFlag &= ~MMCF_RESET; } }
void MotionMaster::UpdateMotion(uint32 diff) { if (i_owner->HasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED)) // what about UNIT_STAT_DISTRACTED? Why is this not included? return; ASSERT(!empty()); m_cleanFlag |= MMCF_UPDATE; if (!top()->Update(*i_owner, diff)) { m_cleanFlag &= ~MMCF_UPDATE; MovementExpired(); } else m_cleanFlag &= ~MMCF_UPDATE; if (m_expList) { for (size_t i = 0; i < m_expList->size(); ++i) { MovementGenerator* mg = (*m_expList)[i]; DirectDelete(mg); } delete m_expList; m_expList = NULL; if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (m_cleanFlag & MMCF_RESET) top()->Reset(*i_owner); m_cleanFlag &= ~MMCF_RESET; } }