diff --git a/changelog.txt b/changelog.txt index 5481e663a..ec2dd3956 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,8 @@ EQEMu Changelog (Started on Sept 24, 2003 15:50) ------------------------------------------------------- +== 02/19/2013 == +Derision: World should no longer crash if the start_zone query fails at character creation. + == 02/18/2013 == Bad_Captain: Moved merc save to merc table, save merc buffs, added cure and rez spells to healer merc. JJ: Chat garbled for drunk characters. diff --git a/world/client.cpp b/world/client.cpp index e4a9c4e95..055126d10 100644 --- a/world/client.cpp +++ b/world/client.cpp @@ -1458,11 +1458,16 @@ bool Client::OPCharCreate(char *name, CharCreate_Struct *cc) clog(WORLD__CLIENT_ERR,"Error getting zone id for '%s'", startzone); } else // otherwise use normal starting zone logic - { + { + bool ValidStartZone = false; + if(ClientVersionBit & BIT_TitaniumAndEarlier) - database.GetStartZone(&pp, cc); + ValidStartZone = database.GetStartZone(&pp, cc); else - database.GetStartZoneSoF(&pp, cc); + ValidStartZone = database.GetStartZoneSoF(&pp, cc); + + if(!ValidStartZone) + return false; } } diff --git a/world/worlddb.cpp b/world/worlddb.cpp index 4de6b1e3c..08e585ca9 100644 --- a/world/worlddb.cpp +++ b/world/worlddb.cpp @@ -293,23 +293,18 @@ bool WorldDatabase::GetStartZone(PlayerProfile_Struct* in_pp, CharCreate_Struct* 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; - RunQuery - ( - query, - MakeAnyLenString - ( - &query, - "SELECT x,y,z,heading,zone_id,bind_id FROM start_zones " - "WHERE player_choice=%i AND player_class=%i " + 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 - ); + 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); @@ -450,25 +445,19 @@ bool WorldDatabase::GetStartZoneSoF(PlayerProfile_Struct* in_pp, CharCreate_Stru 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; - RunQuery - ( - query, - MakeAnyLenString - ( - &query, - "SELECT x,y,z,heading,bind_id FROM start_zones " - "WHERE zone_id=%i AND player_class=%i " + 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 - ); + 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); - _log(WORLD__CLIENT_TRACE, "SoF Start zone query: %s\n", query); safe_delete_array(query); if((rows = mysql_num_rows(result)) > 0)