void MotionMaster::MoveChase(Unit* target, float dist, float angle) { if (GetCurrentMovementGeneratorType() == ASSISTANCE_MOTION_TYPE || GetCurrentMovementGeneratorType() == FLEEING_MOTION_TYPE || GetCurrentMovementGeneratorType() == TIMED_FLEEING_MOTION_TYPE) return; // ignore movement request if target not exist if (!target || target == _owner || _owner->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_DISABLE_MOVE)) return; //_owner->ClearUnitState(UNIT_STATE_FOLLOW); if (_owner->GetTypeId() == TYPEID_PLAYER) { TC_LOG_DEBUG("misc", "Player (GUID: %u) chase to %s (GUID: %u)", _owner->GetGUIDLow(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : target->ToCreature()->GetDBTableGUIDLow()); Mutate(new ChaseMovementGenerator<Player>(target, dist, angle), MOTION_SLOT_ACTIVE); } else { TC_LOG_DEBUG("misc", "Creature (Entry: %u GUID: %u) chase to %s (GUID: %u)", _owner->GetEntry(), _owner->GetGUIDLow(), target->GetTypeId() == TYPEID_PLAYER ? "player" : "creature", target->GetTypeId() == TYPEID_PLAYER ? target->GetGUIDLow() : target->ToCreature()->GetDBTableGUIDLow()); Mutate(new ChaseMovementGenerator<Creature>(target, dist, angle), MOTION_SLOT_ACTIVE); } }
void MotionMaster::MoveChase(Unit* target, float dist, float angle, bool moveFurther) { // ignore movement request if target not exist if (!target) return; if (GetCurrentMovementGeneratorType() == CHASE_MOTION_TYPE) { if (m_owner->GetTypeId() == TYPEID_PLAYER) { auto gen = (ChaseMovementGenerator<Player>*)top(); gen->SetMovementParameters(dist, angle, moveFurther); gen->SetNewTarget(*target); } else { auto gen = (ChaseMovementGenerator<Creature>*)top(); gen->SetMovementParameters(dist, angle, moveFurther); gen->SetNewTarget(*target); } top()->Reset(*m_owner); return; } DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s chase to %s", m_owner->GetGuidStr().c_str(), target->GetGuidStr().c_str()); if (m_owner->GetTypeId() == TYPEID_PLAYER) Mutate(new ChaseMovementGenerator<Player>(*target, dist, angle, moveFurther)); else Mutate(new ChaseMovementGenerator<Creature>(*target, dist, angle, moveFurther)); }
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::MoveCharge(float x, float y, float z, float speed /*= BASE_CHARGE_SPEED*/, uint32 id /*= EVENT_CHARGE*/, bool generatePath /*= false*/) { if (GetCurrentMovementGeneratorType() != DISTRACT_MOTION_TYPE) return; if (m_owner->GetTypeId() == TYPEID_PLAYER) { DEBUG_LOG("misc", "Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", m_owner->GetGUIDLow(), x, y, z); Mutate(new PointMovementGenerator<Player>(id, x, y, z, generatePath, speed)); } else { DEBUG_LOG("misc", "Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)", m_owner->GetEntry(), m_owner->GetGUIDLow(), x, y, z); Mutate(new PointMovementGenerator<Creature>(id, x, y, z, generatePath, speed)); } }
void MotionMaster::MoveCharge(float x, float y, float z, float speed, uint32 id) { if (GetCurrentMovementGeneratorType() != DISTRACT_MOTION_TYPE) return; i_owner->addUnitState(UNIT_STAT_FLEEING_MOVE); if (i_owner->GetTypeId() == TYPEID_PLAYER) { //sLog->outStaticDebug("Player (GUID: %u) charge point (X: %f Y: %f Z: %f)", i_owner->GetGUIDLow(), x, y, z); Mutate(new PointMovementGenerator<Player>(id,x,y,z)); } else { /*sLog->outStaticDebug("Creature (Entry: %u GUID: %u) charge point (X: %f Y: %f Z: %f)", i_owner->GetEntry(), i_owner->GetGUIDLow(), x, y, z);*/ Mutate(new PointMovementGenerator<Creature>(id,x,y,z)); } }
void MotionMaster::MoveWaypoint() { if (m_owner->GetTypeId() == TYPEID_UNIT) { if (GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { sLog.outError("Creature %s (Entry %u) attempt to MoveWaypoint() but creature is already using waypoint", m_owner->GetGuidStr().c_str(), m_owner->GetEntry()); return; } Creature* creature = (Creature*)m_owner; DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "Creature %s (Entry %u) start MoveWaypoint()", m_owner->GetGuidStr().c_str(), m_owner->GetEntry()); Mutate(new WaypointMovementGenerator<Creature>(*creature)); } else { sLog.outError("Non-creature %s attempt to MoveWaypoint()", m_owner->GetGuidStr().c_str()); } }
void MotionMaster::MoveWaypoint(int32 id /*=0*/, uint32 source /*=0==PATH_NO_PATH*/, uint32 initialDelay /*=0*/, uint32 overwriteEntry /*=0*/) { if (m_owner->GetTypeId() == TYPEID_UNIT) { if (GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE) { sLog.outError("%s attempt to MoveWaypoint() but is already using waypoint", m_owner->GetGuidStr().c_str()); return; } Creature* creature = (Creature*)m_owner; DEBUG_FILTER_LOG(LOG_FILTER_AI_AND_MOVEGENSS, "%s start MoveWaypoint()", m_owner->GetGuidStr().c_str()); WaypointMovementGenerator<Creature>* newWPMMgen = new WaypointMovementGenerator<Creature>(*creature); Mutate(newWPMMgen); newWPMMgen->InitializeWaypointPath(*creature, id, (WaypointPathOrigin)source, initialDelay, overwriteEntry); } else { sLog.outError("Non-creature %s attempt to MoveWaypoint()", m_owner->GetGuidStr().c_str()); } }