/****************** * AddWPForSpawn - Used by the #wpadd command - for a given spawn, this will add a new waypoint to whatever grid that spawn is assigned to. * If there is currently no grid assigned to the spawn, a new grid will be created using the next available Grid ID number for the zone * the spawn is in. * Returns 0 if the function didn't have to create a new grid. If the function had to create a new grid for the spawn, then the ID of * the created grid is returned. */ uint32 ZoneDatabase::AddWPForSpawn(Client *client, uint32 spawn2id, const glm::vec4& position, uint32 pause, int type1, int type2, uint16 zoneid) { uint32 grid_num; // The grid number the spawn is assigned to (if spawn has no grid, will be the grid number we end up creating) uint32 next_wp_num; // The waypoint number we should be assigning to the new waypoint bool createdNewGrid; // Did we create a new grid in this function? // See what grid number our spawn is assigned std::string query = StringFormat("SELECT pathgrid FROM spawn2 WHERE id = %i", spawn2id); auto results = QueryDatabase(query); if (!results.Success()) { // Query error return 0; } if (results.RowCount() == 0) return 0; auto row = results.begin(); grid_num = atoi(row[0]); if (grid_num == 0) { // Our spawn doesn't have a grid assigned to it -- we need to create a new grid and assign it to the spawn createdNewGrid = true; grid_num = GetFreeGrid(zoneid); if(grid_num == 0) // There are no grids for the current zone -- create Grid #1 grid_num = 1; query = StringFormat("INSERT INTO grid SET id = '%i', zoneid = %i, type ='%i', type2 = '%i'", grid_num, zoneid, type1, type2); QueryDatabase(query); query = StringFormat("UPDATE spawn2 SET pathgrid = '%i' WHERE id = '%i'", grid_num, spawn2id); QueryDatabase(query); } else // NPC had a grid assigned to it createdNewGrid = false; // Find out what the next waypoint is for this grid query = StringFormat("SELECT max(`number`) FROM grid_entries WHERE zoneid = '%i' AND gridid = '%i'", zoneid, grid_num); results = QueryDatabase(query); if(!results.Success()) { // Query error return 0; } row = results.begin(); if(row[0] != 0) next_wp_num = atoi(row[0]) + 1; else // No waypoints in this grid yet next_wp_num = 1; query = StringFormat("INSERT INTO grid_entries(gridid, zoneid, `number`, x, y, z, pause, heading) " "VALUES (%i, %i, %i, %f, %f, %f, %i, %f)", grid_num, zoneid, next_wp_num, position.x, position.y, position.z, pause, position.w); results = QueryDatabase(query); return createdNewGrid? grid_num: 0; }
/****************** * AddWPForSpawn - Used by the #wpadd command - for a given spawn, this will add a new waypoint to whatever grid that spawn is assigned to. * If there is currently no grid assigned to the spawn, a new grid will be created using the next available Grid ID number for the zone * the spawn is in. * Returns 0 if the function didn't have to create a new grid. If the function had to create a new grid for the spawn, then the ID of * the created grid is returned. */ uint32 ZoneDatabase::AddWPForSpawn(Client *client, uint32 spawn2id, float xpos, float ypos, float zpos, uint32 pause, int type1, int type2, uint16 zoneid, float heading) { uint32 grid_num; // The grid number the spawn is assigned to (if spawn has no grid, will be the grid number we end up creating) uint32 next_wp_num; // The waypoint number we should be assigning to the new waypoint bool createdNewGrid; // Did we create a new grid in this function? // See what grid number our spawn is assigned std::string query = StringFormat("SELECT pathgrid FROM spawn2 WHERE id = %i", spawn2id); auto results = QueryDatabase(query); if (!results.Success()) { // Query error LogFile->write(EQEMuLog::Error, "Error setting pathgrid '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); return 0; } if (results.RowCount() == 0) return 0; auto row = results.begin(); grid_num = atoi(row[0]); if (grid_num == 0) { // Our spawn doesn't have a grid assigned to it -- we need to create a new grid and assign it to the spawn createdNewGrid = true; grid_num = GetFreeGrid(zoneid); if(grid_num == 0) // There are no grids for the current zone -- create Grid #1 grid_num = 1; query = StringFormat("INSERT INTO grid SET id = '%i', zoneid = %i, type ='%i', type2 = '%i'", grid_num, zoneid, type1, type2); results = QueryDatabase(query); if(!results.Success()) LogFile->write(EQEMuLog::Error, "Error adding grid '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); else if(client) client->LogSQL(query.c_str()); query = StringFormat("UPDATE spawn2 SET pathgrid = '%i' WHERE id = '%i'", grid_num, spawn2id); results = QueryDatabase(query); if(!results.Success()) LogFile->write(EQEMuLog::Error, "Error updating spawn2 pathing '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); else if(client) client->LogSQL(query.c_str()); } else // NPC had a grid assigned to it createdNewGrid = false; // Find out what the next waypoint is for this grid query = StringFormat("SELECT max(`number`) FROM grid_entries WHERE zoneid = '%i' AND gridid = '%i'", zoneid, grid_num); results = QueryDatabase(query); if(!results.Success()) { // Query error LogFile->write(EQEMuLog::Error, "Error getting next waypoint id '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); return 0; } row = results.begin(); if(row[0] != 0) next_wp_num = atoi(row[0]) + 1; else // No waypoints in this grid yet next_wp_num = 1; query = StringFormat("INSERT INTO grid_entries(gridid, zoneid, `number`, x, y, z, pause, heading) " "VALUES (%i, %i, %i, %f, %f, %f, %i, %f)", grid_num, zoneid, next_wp_num, xpos, ypos, zpos, pause, heading); results = QueryDatabase(query); if(!results.Success()) LogFile->write(EQEMuLog::Error, "Error adding grid entry '%s': '%s'", query.c_str(), results.ErrorMessage().c_str()); else if(client) client->LogSQL(query.c_str()); return createdNewGrid? grid_num: 0; }