/// - Insert without checking for collision void WaypointManager::_addNode(uint32 id, uint32 point, float x, float y, float z, float o, uint32 delay, uint32 wpGuid) { WorldDatabase.PExecuteLog("INSERT INTO creature_movement (id,point,position_x,position_y,position_z,orientation,wpguid,waittime) " "VALUES (%u,%u, %f,%f,%f,%f, %u,%u)", id, point, x, y, z, o, wpGuid, delay); m_pathMap[id][point] = WaypointNode(x, y, z, o, delay, 0, NULL); }
/// - Insert at a certain point, if pointId == 0 insert last. In this case pointId will be changed to the id to which the node was added WaypointNode const* WaypointManager::AddNode(uint32 entry, uint32 dbGuid, uint32 pathId, uint32& pointId, WaypointPathOrigin wpDest, float x, float y, float z, float orientation) { // Support only normal movement tables if (wpDest != PATH_FROM_GUID && wpDest != PATH_FROM_ENTRY) return nullptr; // Prepare information char const* const table = waypointOriginTables[wpDest]; char const* const key_field = waypointKeyColumn[wpDest]; WaypointPathMap* wpMap = getMapForPathType(wpDest); WaypointPath& path = (*wpMap)[wpDest == PATH_FROM_GUID ? dbGuid : ((entry << 8) + pathId)]; if (pointId == 0 && !path.empty()) // Start with highest waypoint pointId = path.rbegin()->first + 1; else if (pointId == 0) pointId = 1; uint32 nextPoint = pointId; WaypointNode temp = WaypointNode(x, y, z, 100, 0, 0); WaypointPath::iterator find = path.find(nextPoint); if (find != path.end()) // Point already exists { do // Move points along until a free spot is found { std::swap(temp, find->second); ++find; ++nextPoint; } while (find != path.end() && find->first == nextPoint); // After this, we have: // pointId, pointId+1, ..., nextPoint [ Can be == path.end ]] } // Insert new or remaining path[nextPoint] = temp; uint32 key = wpDest == PATH_FROM_GUID ? dbGuid : entry; // Update original waypoints for (WaypointPath::reverse_iterator rItr = path.rbegin(); rItr != path.rend() && rItr->first > pointId; ++rItr) { if (rItr->first <= nextPoint) { if (wpDest == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("UPDATE %s SET point=point+1 WHERE %s=%u AND point=%u AND pathId=%u", table, key_field, key, rItr->first - 1, pathId); else WorldDatabase.PExecuteLog("UPDATE %s SET point=point+1 WHERE %s=%u AND point=%u", table, key_field, key, rItr->first - 1); } } // Insert new Point to database if (wpDest == PATH_FROM_ENTRY) WorldDatabase.PExecuteLog("INSERT INTO %s (%s,pathId,point,position_x,position_y,position_z,orientation) VALUES (%u,%u,%u, %f,%f,%f, %f)", table, key_field, pathId, key, pointId, x, y, z, orientation); else WorldDatabase.PExecuteLog("INSERT INTO %s (%s,point,position_x,position_y,position_z,orientation) VALUES (%u,%u, %f,%f,%f, %f)", table, key_field, key, pointId, x, y, z, orientation); return &path[pointId]; }
/// - Insert without checking for collision void WaypointManager::_addNode(uint32 id, uint32 point, float x, float y, float z, float o, uint32 delay, uint32 wpGuid) { if(point == 0) return; // counted from 1 in the DB WorldDatabase.PExecuteLog("INSERT INTO creature_movement (id,point,position_x,position_y,position_z,orientation,wpguid,waittime) VALUES ('%u','%u','%f', '%f', '%f', '%f', '%d', '%d')", id, point, x, y, z, o, wpGuid, delay); WaypointPathMap::iterator itr = m_pathMap.find(id); if(itr == m_pathMap.end()) itr = m_pathMap.insert(WaypointPathMap::value_type(id, WaypointPath())).first; itr->second.insert(itr->second.begin() + (point - 1), WaypointNode(x, y, z, o, delay, 0, NULL)); }
/// Insert a node into the storage for external access bool WaypointManager::AddExternalNode(uint32 entry, int32 pathId, uint32 pointId, float x, float y, float z, float o, uint32 waittime) { if (pathId < 0 || pathId >= 0xFF) { sLog.outErrorScriptLib("WaypointManager::AddExternalNode: (Npc-Entry %u, PathId %i) Invalid pathId", entry, pathId); return false; } if (!MaNGOS::IsValidMapCoord(x, y, z, o)) { sLog.outErrorScriptLib("WaypointManager::AddExternalNode: (Npc-Entry %u, PathId %i) Invalid coordinates", entry, pathId); return false; } m_externalPathTemplateMap[(entry << 8) + pathId][pointId] = WaypointNode(x, y, z, o, waittime, 0); return true; }