void WaypointManager::_clearPath(WaypointPath &path) { for(WaypointPath::const_iterator itr = path.begin(); itr != path.end(); ++itr) if(itr->behavior) delete itr->behavior; path.clear(); }
HAAStarResult RoutePlanner::findWaypointPath(Unit *unit, const Vec2i &dest, WaypointPath &waypoints) { SECTION_TIMER(PATHFINDER_HIERARCHICAL); TIME_FUNCTION(); _PROFILE_PATHFINDER(); TransitionGoal goal; HAAStarResult setupResult = setupHierarchicalSearch(unit, dest, goal); nsgSearchEngine->getNeighbourFunc().setSearchSpace(SearchSpace::CELLMAP); if (setupResult == HAAStarResult::FAILURE) { return HAAStarResult::FAILURE; } TransitionCost cost(unit->getCurrField(), unit->getSize()); TransitionHeuristic heuristic(dest); AStarResult res = tSearchEngine->aStar(goal,cost,heuristic); if (res == AStarResult::COMPLETE) { WaypointPath &wpPath = *unit->getWaypointPath(); wpPath.clear(); waypoints.push(dest); const Transition *t = tSearchEngine->getGoalPos(); while (t) { waypoints.push(t->nwPos); t = tSearchEngine->getPreviousPos(t); } return setupResult; } return HAAStarResult::FAILURE; }
void WaypointManager::SetNodePosition(uint32 entry, uint32 dbGuid, uint32 point, uint32 pathId, WaypointPathOrigin wpOrigin, float x, float y, float z) { // Support only normal movement tables if (wpOrigin == PATH_FROM_EXTERNAL) return; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return; char const* const table = waypointOriginTables[wpOrigin]; char const* const key_field = waypointKeyColumn[wpOrigin]; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; if (wpOrigin == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("UPDATE %s SET position_x=%f, position_y=%f, position_z=%f WHERE %s=%u AND point=%u AND pathId=%u", table, x, y, z, key_field, key, point, pathId); else WorldDatabase.PExecuteLog("UPDATE %s SET position_x=%f, position_y=%f, position_z=%f WHERE %s=%u AND point=%u", table, x, y, z, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) { find->second.x = x; find->second.y = y; find->second.z = z; } }
/// return true if a valid scriptId is provided bool WaypointManager::SetNodeScriptId(uint32 entry, uint32 dbGuid, uint32 point, int32 pathId, WaypointPathOrigin wpOrigin, uint32 scriptId) { // Support only normal movement tables if (wpOrigin != PATH_FROM_GUID && wpOrigin != PATH_FROM_ENTRY) return false; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return false; char const* const table = wpOrigin == PATH_FROM_GUID ? "creature_movement" : "creature_movement_template"; char const* const key_field = wpOrigin == PATH_FROM_GUID ? "id" : "entry"; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; WorldDatabase.PExecuteLog("UPDATE %s SET script_id=%u WHERE %s=%u AND point=%u", table, scriptId, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) find->second.script_id = scriptId; ScriptChainMap const* scm = sScriptMgr.GetScriptChainMap(DBS_ON_CREATURE_MOVEMENT); if (!scm) return false; return scm->find(scriptId) != scm->end(); }
void WaypointManager::DeleteNode(uint32 entry, uint32 dbGuid, uint32 point, int32 pathId, WaypointPathOrigin wpOrigin) { // Support only normal movement tables if (wpOrigin != PATH_FROM_GUID && wpOrigin != PATH_FROM_ENTRY) return; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return; char const* const table = wpOrigin == PATH_FROM_GUID ? "creature_movement" : "creature_movement_template"; char const* const key_field = wpOrigin == PATH_FROM_GUID ? "id" : "entry"; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; WorldDatabase.PExecuteLog("DELETE FROM %s WHERE %s=%u AND point=%u", table, key_field, key, point); path->erase(point); }
void WaypointManager::SetNodeOrientation(uint32 entry, uint32 dbGuid, uint32 point, int32 pathId, WaypointPathOrigin wpOrigin, float orientation) { // Support only normal movement tables if (wpOrigin != PATH_FROM_GUID && wpOrigin != PATH_FROM_ENTRY) return; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return; char const* const table = wpOrigin == PATH_FROM_GUID ? "creature_movement" : "creature_movement_template"; char const* const key_field = wpOrigin == PATH_FROM_GUID ? "id" : "entry"; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; WorldDatabase.PExecuteLog("UPDATE %s SET orientation=%f WHERE %s=%u AND point=%u", table, orientation, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) find->second.orientation = orientation; }
void WaypointManager::DeleteNode(uint32 entry, uint32 dbGuid, uint32 point, uint32 pathId, WaypointPathOrigin wpOrigin) { // Support only normal movement tables if (wpOrigin == PATH_FROM_EXTERNAL) return; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return; char const* const table = waypointOriginTables[wpOrigin]; char const* const key_field = waypointKeyColumn[wpOrigin]; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; if (wpOrigin == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("DELETE FROM %s WHERE %s=%u AND point=%u AND pathId=%u", table, key_field, key, point, pathId); else WorldDatabase.PExecuteLog("DELETE FROM %s WHERE %s=%u AND point=%u", table, key_field, key, point); path->erase(point); }
void WaypointManager::SetNodeWaittime(uint32 entry, uint32 dbGuid, uint32 point, uint32 pathId, WaypointPathOrigin wpOrigin, uint32 waittime) { // Support only normal movement tables if (wpOrigin == PATH_FROM_EXTERNAL) return; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return; char const* const table = waypointOriginTables[wpOrigin]; char const* const key_field = waypointKeyColumn[wpOrigin]; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; if (wpOrigin == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("UPDATE %s SET waittime=%u WHERE %s=%u AND point=%u AND pathId=%u", table, waittime, key_field, key, point, pathId); else WorldDatabase.PExecuteLog("UPDATE %s SET waittime=%u WHERE %s=%u AND point=%u", table, waittime, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) find->second.delay = waittime; }
void WaypointManager::SetNodePosition(uint32 entry, uint32 dbGuid, uint32 point, int32 pathId, WaypointPathOrigin wpOrigin, float x, float y, float z) { // Support only normal movement tables if (wpOrigin != PATH_FROM_GUID && wpOrigin != PATH_FROM_ENTRY) { return; } WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) { return; } char const* const table = wpOrigin == PATH_FROM_GUID ? "creature_movement" : "creature_movement_template"; char const* const key_field = wpOrigin == PATH_FROM_GUID ? "id" : "entry"; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : entry; WorldDatabase.PExecuteLog("UPDATE %s SET position_x=%f, position_y=%f, position_z=%f WHERE %s=%u AND point=%u", table, x, y, z, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) { find->second.x = x; find->second.y = y; find->second.z = z; } }
/// return true if a valid scriptId is provided bool WaypointManager::SetNodeScriptId(uint32 entry, uint32 dbGuid, uint32 point, uint32 pathId, WaypointPathOrigin wpOrigin, uint32 scriptId) { // Support only normal movement tables if (wpOrigin == PATH_FROM_EXTERNAL) return false; WaypointPath* path = GetPathFromOrigin(entry, dbGuid, pathId, wpOrigin); if (!path) return false; char const* const table = waypointOriginTables[wpOrigin]; char const* const key_field = waypointKeyColumn[wpOrigin]; uint32 const key = wpOrigin == PATH_FROM_GUID ? dbGuid : ((entry << 8) + pathId); if (wpOrigin == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("UPDATE %s SET script_id=%u WHERE %s=%u AND point=%u AND pathId=%u", table, scriptId, key_field, key, point, pathId); else WorldDatabase.PExecuteLog("UPDATE %s SET script_id=%u WHERE %s=%u AND point=%u", table, scriptId, key_field, key, point); WaypointPath::iterator find = path->find(point); if (find != path->end()) find->second.script_id = scriptId; return sCreatureMovementScripts.second.find(scriptId) != sCreatureMovementScripts.second.end(); }