void WaypointMovementGenerator<Creature>::Initialize(Creature& creature) { creature.addUnitState(UNIT_STAT_ROAMING); LoadPath(creature); if (!creature.isAlive() || creature.hasUnitState(UNIT_STAT_NOT_MOVE)) return; creature.addUnitState(UNIT_STAT_ROAMING_MOVE); StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::DoReset(Creature* owner) { if (!owner) return; if (!owner->isAlive()) return; owner->AddUnitState(UNIT_STATE_ROAMING | UNIT_STATE_ROAMING_MOVE); StartMoveNow(owner); }
void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) { if (!path_id) path_id = creature->GetWaypointPath(); i_path = sWaypointMgr->GetPath(path_id); if (!i_path) { // No movement found for entry sLog->outErrorDb("WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u) doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), path_id); return; } StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) { if (!path_id) path_id = creature->GetWaypointPath(); i_path = sWaypointMgr->GetPath(path_id); if (!i_path) { // No path id found for entry TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature %s (Entry: %u GUID: %u DB GUID: %u) doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetEntry(), creature->GetGUIDLow(), creature->GetDBTableGUIDLow(), path_id); return; } StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::LoadPath(Creature* creature) { if (!path_id) path_id = creature->GetWaypointPath(); i_path = sWaypointMgr->GetPath(path_id); if (!i_path) { // No path id found for entry TC_LOG_ERROR("sql.sql", "WaypointMovementGenerator::LoadPath: creature %s (%s DB GUID: " UI64FMTD ") doesn't have waypoint path id: %u", creature->GetName().c_str(), creature->GetGUID().ToString().c_str(), creature->GetSpawnId(), path_id); return; } StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::LoadPath(Creature* owner) { if (!owner) return; if (!path_id) path_id = owner->GetWaypointPath(); i_path = sWaypointMgr->GetPath(path_id); if (!i_path) { // No movement found for entry sLog->outError(LOG_FILTER_SQL, "WaypointMovementGenerator::LoadPath: Creature %s (Entry: %u GUID: %u) doesn't have waypoint path id: %u", owner->GetName(), owner->GetEntry(), owner->GetGUIDLow(), path_id); return; } if (!owner->isAlive()) return; StartMoveNow(owner); }
void WaypointMovementGenerator<Creature>::DoReset(Creature* creature) { creature->AddUnitState(UNIT_STATE_ROAMING|UNIT_STATE_ROAMING_MOVE); StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::Reset(Creature& creature) { creature.addUnitState(UNIT_STAT_ROAMING | UNIT_STAT_ROAMING_MOVE); StartMoveNow(creature); }
void WaypointMovementGenerator<Creature>::DoReset(Creature* creature) { if (!Stopped()) StartMoveNow(creature); }
bool WaypointMovementGenerator<Creature>::DoUpdate(Creature* creature, uint32 diff) { if (!creature || !creature->IsAlive()) return false; // Waypoint movement can be switched on/off // This is quite handy for escort quests and other stuff if (creature->HasUnitState(UNIT_STATE_NOT_MOVE)) { creature->ClearUnitState(UNIT_STATE_ROAMING_MOVE); return true; } // prevent a crash at empty waypoint path. if (!i_path || i_path->nodes.empty()) return false; if (Stopped()) { if (CanMove(diff)) return StartMoveNow(creature); } else { // Set home position at place on waypoint movement. if (!creature->GetTransGUID()) creature->SetHomePosition(creature->GetPosition()); if (creature->IsStopped()) Stop(LoadedFromDB ? sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER) : 2 * HOUR * IN_MILLISECONDS); else if (creature->movespline->Finalized()) { OnArrived(creature); IsArrivalDone = true; if (!Stopped()) { if (creature->IsStopped()) Stop(LoadedFromDB ? sWorld->getIntConfig(CONFIG_CREATURE_STOP_FOR_PLAYER) : 2 * HOUR * IN_MILLISECONDS); else return StartMove(creature); } } else { // speed changed during path execution, calculate remaining path and launch it once more if (i_recalculateSpeed) { i_recalculateSpeed = false; if (!Stopped()) return StartMove(creature); } else { uint32 pointId = uint32(creature->movespline->currentPathIdx()); if (pointId > i_currentNode) { OnArrived(creature); i_currentNode = pointId; FormationMove(creature); } } } } return true; }