MotionMaster::~MotionMaster() { // clear ALL movement generators (including default) while (!empty()) { MovementGenerator *curr = top(); pop(); if (curr) DirectDelete(curr); } }
MotionMaster::~MotionMaster() { // clear ALL movement generators (including default) while(!empty()) { MovementGenerator* pCurrentPosition = top(); pop(); if(pCurrentPosition) DirectDelete(pCurrentPosition); } }
void MotionMaster::Initialize() { // clear ALL movement generators (including default) while (!empty()) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); if (curr) DirectDelete(curr); } InitDefault(); }
void MotionMaster::DirectClean(bool reset) { while (size() > 1) { MovementGenerator *curr = top(); pop(); if (curr) DirectDelete(curr); } if (needInitTop()) InitTop(); else if (reset) top()->Reset(*_owner); }
void MotionMaster::ClearExpireList() { for (auto itr : _expireList) DirectDelete(itr); _expireList.clear(); if (empty()) Initialize(); else if (NeedInitTop()) InitTop(); else if (_cleanFlag & MOTIONMMASTER_CLEANFLAG_RESET) top()->Reset(_owner); _cleanFlag &= ~MOTIONMMASTER_CLEANFLAG_RESET; }
void MotionMaster::DirectClean(MovementSlot slot) { if (MovementGenerator* motion = GetMotionSlot(slot)) { _slot[slot] = nullptr; DirectDelete(motion); } while (!empty() && !top()) --_top; if (empty()) Initialize(); else if (NeedInitTop()) InitTop(); }
void MotionMaster::UpdateMotion(uint32 diff) { if (!_owner) return; // zhang hong chao add flee condition if (_owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED) && GetCurrentMovementGeneratorType() != ASSISTANCE_MOTION_TYPE && GetCurrentMovementGeneratorType() != TIMED_FLEEING_MOTION_TYPE && GetCurrentMovementGeneratorType() != FLEEING_MOTION_TYPE) { // what about UNIT_STATE_DISTRACTED? Why is this not included? return; } ASSERT(!empty()); _cleanFlag |= MMCF_UPDATE; if (!top()->Update(_owner, diff)) { _cleanFlag &= ~MMCF_UPDATE; MovementExpired(); } else _cleanFlag &= ~MMCF_UPDATE; if (_expList) { for (size_t i = 0; i < _expList->size(); ++i) { MovementGenerator* mg = (*_expList)[i]; DirectDelete(mg); } delete _expList; _expList = NULL; if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (_cleanFlag & MMCF_RESET) top()->Reset(_owner); _cleanFlag &= ~MMCF_RESET; } // probably not the best place to pu this but im not really sure where else to put it. _owner->UpdateUnderwaterState(_owner->GetMap(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); }
void MotionMaster::DirectExpire(bool reset) { if (size() > 1) { MovementGenerator *curr = top(); pop(); removeEmptyTops(); DirectDelete(curr); } while (!top()) --i_top; if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (reset) top()->Reset(*i_owner); }
void MotionMaster::ClearExpireList() { for (size_t i = 0; i < _expireList->size(); ++i) { MovementGenerator* mg = (*_expireList)[i]; DirectDelete(mg); } delete _expireList; _expireList = nullptr; if (empty()) Initialize(); else if (NeedInitTop()) InitTop(); else if (_cleanFlag & MMCF_RESET) top()->Reset(_owner); _cleanFlag &= ~MMCF_RESET; }
void MotionMaster::UpdateMotion(uint32 diff) { if (!_owner) return; if (_owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) // what about UNIT_STATE_DISTRACTED? Why is this not included? return; ASSERT(!empty()); _cleanFlag |= MMCF_UPDATE; if (!top()->Update(_owner, diff)) { _cleanFlag &= ~MMCF_UPDATE; MovementExpired(); } else _cleanFlag &= ~MMCF_UPDATE; if (!_expList.empty()) { for (ExpireList::iterator i = _expList.begin(); i != _expList.end(); ++i) DirectDelete(*i); _expList.clear(); if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (_cleanFlag & MMCF_RESET) top()->Reset(_owner); _cleanFlag &= ~MMCF_RESET; } #if 0 // probably not the best place to pu this but im not really sure where else to put it. _owner->UpdateUnderwaterState(_owner->GetMap(), _owner->GetPositionX(), _owner->GetPositionY(), _owner->GetPositionZ()); #endif }
void MotionMaster::UpdateMotion(uint32 diff) { if (!_owner) return; if (_owner->HasUnitState(UNIT_STATE_ROOT | UNIT_STATE_STUNNED)) // what about UNIT_STATE_DISTRACTED? Why is this not included? return; ASSERT(!empty()); _cleanFlag |= MMCF_UPDATE; if (!top()->Update(*_owner, diff)) { _cleanFlag &= ~MMCF_UPDATE; MovementExpired(); } else _cleanFlag &= ~MMCF_UPDATE; if (_expList) { for (size_t i = 0; i < _expList->size(); ++i) { MovementGenerator* mg = (*_expList)[i]; DirectDelete(mg); } delete _expList; _expList = NULL; if (empty()) Initialize(); else if (needInitTop()) InitTop(); else if (_cleanFlag & MMCF_RESET) top()->Reset(*_owner); _cleanFlag &= ~MMCF_RESET; } }
void MotionMaster::UpdateMotion(uint32 diff) { if(!i_owner) return; 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(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; } }
void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { if (MovementGenerator *curr = Impl[slot]) { Impl[slot] = NULL; // in case a new one is generated in this slot during direct delete if (_top == slot && (_cleanFlag & MMCF_UPDATE)) DelayedDelete(curr); else DirectDelete(curr); } else if (_top < slot) _top = slot; Impl[slot] = m; if (_top > slot) _needInit[slot] = true; else { _needInit[slot] = false; m->Initialize(*_owner); } }
void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { if(MovementGenerator *curr = Impl[slot]) { if(i_top == slot && (m_cleanFlag & MMCF_UPDATE)) DelayedDelete(curr); else DirectDelete(curr); } else if(i_top < slot) { i_top = slot; } if(i_top > slot) needInit[slot] = true; else { m->Initialize(*i_owner); needInit[slot] = false; } Impl[slot] = m; }
void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { if (MovementGenerator* curr = _slot[slot]) { _slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete if (_top == slot && (_cleanFlag & MOTIONMMASTER_CLEANFLAG_UPDATE)) DelayedDelete(curr); else DirectDelete(curr); } else if (_top < slot) { _top = slot; } _slot[slot] = m; if (_top > slot) _initialize[slot] = true; else { _initialize[slot] = false; m->Initialize(_owner); } }
void MotionMaster::Initialize() { // clear ALL movement generators (including default) while(!empty()) { MovementGenerator *curr = top(); pop(); if(curr) DirectDelete(curr); } // set new default movement generator if(i_owner->GetTypeId() == TYPEID_UNIT) { MovementGenerator* movement = FactorySelector::selectMovementGenerator((Creature*)i_owner); push( movement == NULL ? &si_idleMovement : movement ); InitTop(); } else { push(&si_idleMovement); needInit[MOTION_SLOT_IDLE] = false; } }