bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc,bool isTitanium) { // SoF doesn't send the player_choice field in character creation, it now sends the real zoneID instead. // // For SoF, search for an entry in start_zones with a matching zone_id, class, race and deity. // // For now, if no row matching row is found, send them to Crescent Reach, as that is probably the most likely // reason for no match being found. // if(!in_pp || !in_cc) return false; in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0; in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = in_pp->binds[0].instance_id = 0; // see if we have an entry for start_zone. We can support both titanium & SOF+ by having two entries per class/race/deity combo with different zone_ids std::string query = StringFormat("SELECT x, y, z, heading, start_zone, bind_id FROM start_zones WHERE zone_id = %i " "AND player_class = %i AND player_deity = %i AND player_race = %i", in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race); auto results = QueryDatabase(query); if(!results.Success()) { return false; } Log.Out(Logs::General, Logs::Status, "SoF Start zone query: %s\n", query.c_str()); if (results.RowCount() == 0) { printf("No start_zones entry in database, using defaults\n"); isTitanium ? SetTitaniumDefaultStartZone(in_pp, in_cc) : SetSoFDefaultStartZone(in_pp, in_cc); } else { Log.Out(Logs::General, Logs::Status, "Found starting location in start_zones"); auto row = results.begin(); in_pp->x = atof(row[0]); in_pp->y = atof(row[1]); in_pp->z = atof(row[2]); in_pp->heading = atof(row[3]); in_pp->zone_id = atoi(row[4]); in_pp->binds[0].zoneId = atoi(row[5]); } if(in_pp->x == 0 && in_pp->y == 0 && in_pp->z == 0) database.GetSafePoints(in_pp->zone_id, 0, &in_pp->x, &in_pp->y, &in_pp->z); if(in_pp->binds[0].x == 0 && in_pp->binds[0].y == 0 && in_pp->binds[0].z == 0) database.GetSafePoints(in_pp->binds[0].zoneId, 0, &in_pp->binds[0].x, &in_pp->binds[0].y, &in_pp->binds[0].z); return true; }
bool WorldDatabase::GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc) { // SoF doesn't send the player_choice field in character creation, it now sends the real zoneID instead. // // For SoF, search for an entry in start_zones with a matching zone_id, class, race and deity. // // For now, if no row matching row is found, send them to Crescent Reach, as that is probably the most likely // reason for no match being found. // char errbuf[MYSQL_ERRMSG_SIZE]; char *query = 0; MYSQL_RES *result; MYSQL_ROW row = 0; int rows; if(!in_pp || !in_cc) return false; in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0; in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = 0; if(!RunQuery(query, MakeAnyLenString(&query, "SELECT x,y,z,heading,bind_id FROM start_zones WHERE zone_id=%i AND player_class=%i " "AND player_deity=%i AND player_race=%i", in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race), errbuf, &result)) { LogFile->write(EQEMuLog::Status, "SoF Start zone query failed: %s : %s\n", query, errbuf); safe_delete_array(query); return false; } LogFile->write(EQEMuLog::Status, "SoF Start zone query: %s\n", query); safe_delete_array(query); if((rows = mysql_num_rows(result)) > 0) row = mysql_fetch_row(result); if(row) { LogFile->write(EQEMuLog::Status, "Found starting location in start_zones"); in_pp->x = atof(row[0]); in_pp->y = atof(row[1]); in_pp->z = atof(row[2]); in_pp->heading = atof(row[3]); in_pp->zone_id = in_cc->start_zone; in_pp->binds[0].zoneId = atoi(row[4]); } else { printf("No start_zones entry in database, using defaults\n"); if(in_cc->start_zone == RuleI(World, TutorialZoneID)) in_pp->zone_id = in_cc->start_zone; else { in_pp->x = in_pp->binds[0].x = -51; in_pp->y = in_pp->binds[0].y = -20; in_pp->z = in_pp->binds[0].z = 0.79; in_pp->zone_id = in_pp->binds[0].zoneId = 394; // Crescent Reach. } } if(in_pp->x == 0 && in_pp->y == 0 && in_pp->z == 0) database.GetSafePoints(in_pp->zone_id, 0, &in_pp->x, &in_pp->y, &in_pp->z); if(in_pp->binds[0].x == 0 && in_pp->binds[0].y == 0 && in_pp->binds[0].z == 0) database.GetSafePoints(in_pp->binds[0].zoneId, 0, &in_pp->binds[0].x, &in_pp->binds[0].y, &in_pp->binds[0].z); if(result) mysql_free_result(result); return true; }
bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* in_cc) { char errbuf[MYSQL_ERRMSG_SIZE]; char *query = 0; MYSQL_RES *result; MYSQL_ROW row = 0; int rows; if(!in_pp || !in_cc) return false; in_pp->x = in_pp->y = in_pp->z = in_pp->heading = in_pp->zone_id = 0; in_pp->binds[0].x = in_pp->binds[0].y = in_pp->binds[0].z = in_pp->binds[0].zoneId = 0; if(!RunQuery(query, MakeAnyLenString(&query, "SELECT x,y,z,heading,zone_id,bind_id FROM start_zones WHERE player_choice=%i AND player_class=%i " "AND player_deity=%i AND player_race=%i", in_cc->start_zone, in_cc->class_, in_cc->deity, in_cc->race), errbuf, &result)) { LogFile->write(EQEMuLog::Error, "Start zone query failed: %s : %s\n", query, errbuf); safe_delete_array(query); return false; } LogFile->write(EQEMuLog::Status, "Start zone query: %s\n", query); safe_delete_array(query); if((rows = mysql_num_rows(result)) > 0) row = mysql_fetch_row(result); if(row) { LogFile->write(EQEMuLog::Status, "Found starting location in start_zones"); in_pp->x = atof(row[0]); in_pp->y = atof(row[1]); in_pp->z = atof(row[2]); in_pp->heading = atof(row[3]); in_pp->zone_id = atoi(row[4]); in_pp->binds[0].zoneId = atoi(row[5]); } else { printf("No start_zones entry in database, using defaults\n"); switch(in_cc->start_zone) { case 0: { in_pp->zone_id = 24; // erudnext in_pp->binds[0].zoneId = 38; // tox break; } case 1: { in_pp->zone_id =2; // qeynos2 in_pp->binds[0].zoneId = 2; // qeynos2 break; } case 2: { in_pp->zone_id =29; // halas in_pp->binds[0].zoneId = 30; // everfrost break; } case 3: { in_pp->zone_id =19; // rivervale in_pp->binds[0].zoneId = 20; // kithicor break; } case 4: { in_pp->zone_id =9; // freportw in_pp->binds[0].zoneId = 9; // freportw break; } case 5: { in_pp->zone_id =40; // neriaka in_pp->binds[0].zoneId = 25; // nektulos break; } case 6: { in_pp->zone_id =52; // gukta in_pp->binds[0].zoneId = 46; // innothule break; } case 7: { in_pp->zone_id =49; // oggok in_pp->binds[0].zoneId = 47; // feerrott break; } case 8: { in_pp->zone_id =60; // kaladima in_pp->binds[0].zoneId = 68; // butcher break; } case 9: { in_pp->zone_id =54; // gfaydark in_pp->binds[0].zoneId = 54; // gfaydark break; } case 10: { in_pp->zone_id =61; // felwithea in_pp->binds[0].zoneId = 54; // gfaydark break; } case 11: { in_pp->zone_id =55; // akanon in_pp->binds[0].zoneId = 56; // steamfont break; } case 12: { in_pp->zone_id =82; // cabwest in_pp->binds[0].zoneId = 78; // fieldofbone break; } case 13: { in_pp->zone_id =155; // sharvahl in_pp->binds[0].zoneId = 155; // sharvahl break; } } } if(in_pp->x == 0 && in_pp->y == 0 && in_pp->z == 0) database.GetSafePoints(in_pp->zone_id, 0, &in_pp->x, &in_pp->y, &in_pp->z); if(in_pp->binds[0].x == 0 && in_pp->binds[0].y == 0 && in_pp->binds[0].z == 0) database.GetSafePoints(in_pp->binds[0].zoneId, 0, &in_pp->binds[0].x, &in_pp->binds[0].y, &in_pp->binds[0].z); if(result) mysql_free_result(result); return true; }