From 95243fd6ce67405ac992291d7ec1501b3788425a Mon Sep 17 00:00:00 2001 From: Natedog2012 Date: Thu, 28 May 2015 11:45:07 -0700 Subject: [PATCH] Modified ZippZipp's bot name fix from the forums. Limited bot name length to fix a crash. Added Filter check too if you use the Name Filter. --- zone/bot.cpp | 42 +++++++++++++++++------------------------- zone/bot.h | 2 +- zone/questmgr.cpp | 10 +++++----- 3 files changed, 23 insertions(+), 31 deletions(-) diff --git a/zone/bot.cpp b/zone/bot.cpp index a3e07707c..650d6e191 100644 --- a/zone/bot.cpp +++ b/zone/bot.cpp @@ -2327,30 +2327,22 @@ bool Bot::IsValidName() { return Result; } -bool Bot::IsBotNameAvailable(std::string* errorMessage) { +bool Bot::IsBotNameAvailable(char *botName, std::string* errorMessage) { + if (botName == "" || strlen(botName) > 15 || !database.CheckNameFilter(botName) || !database.CheckUsedName(botName)) { + return false; //Check if Botname is Empty / Check if Botname larger than 15 char / Valid to Player standards / Not used by a player! + } - if(!this->GetCleanName()) - return false; - - std::string query = StringFormat("SELECT COUNT(id) FROM vwBotCharacterMobs " - "WHERE name LIKE '%s'", this->GetCleanName()); - auto results = database.QueryDatabase(query); + std::string query = StringFormat("SELECT id FROM vwBotCharacterMobs WHERE name LIKE '%s'", botName); + auto results = database.QueryDatabase(query); if(!results.Success()) { - *errorMessage = std::string(results.ErrorMessage()); + *errorMessage = std::string(results.ErrorMessage()); return false; - } - - uint32 existingNameCount = 0; - - for (auto row = results.begin(); row != results.end(); ++row) { - existingNameCount = atoi(row[0]); - break; - } - - if(existingNameCount != 0) + } + if (results.RowCount()) { //Name already in use! return false; - - return true; + } + + return true; //We made it with a valid name! } bool Bot::Save() { @@ -11330,6 +11322,11 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { if(!strcasecmp(sep->arg[5], "female")) gender = 1; + if(!IsBotNameAvailable(sep->arg[2],&TempErrorMessage)) { + c->Message(0, "The name %s is already being used or is invalid. Please choose a different name.", sep->arg[2]); + return; + } + NPCType DefaultNPCTypeStruct = CreateDefaultNPCTypeStructForBot(std::string(sep->arg[2]), std::string(), c->GetLevel(), atoi(sep->arg[4]), atoi(sep->arg[3]), gender); Bot* NewBot = new Bot(DefaultNPCTypeStruct, c); @@ -11344,11 +11341,6 @@ void Bot::ProcessBotCommands(Client *c, const Seperator *sep) { return; } - if(!NewBot->IsBotNameAvailable(&TempErrorMessage)) { - c->Message(0, "The name %s is already being used. Please choose a different name.", NewBot->GetCleanName()); - return; - } - if(!TempErrorMessage.empty()) { c->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return; diff --git a/zone/bot.h b/zone/bot.h index 871d96df4..33644c8ea 100644 --- a/zone/bot.h +++ b/zone/bot.h @@ -154,7 +154,7 @@ public: // Class Methods bool IsValidRaceClassCombo(); bool IsValidName(); - bool IsBotNameAvailable(std::string* errorMessage); + static bool IsBotNameAvailable(char *botName, std::string* errorMessage); bool DeleteBot(std::string* errorMessage); void Spawn(Client* botCharacterOwner, std::string* errorMessage); virtual void SetLevel(uint8 in_level, bool command = false); diff --git a/zone/questmgr.cpp b/zone/questmgr.cpp index 6b5c8978d..825e3b7b1 100644 --- a/zone/questmgr.cpp +++ b/zone/questmgr.cpp @@ -2071,6 +2071,11 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level return false; } + if(Bot::IsBotNameAvailable((char*)name,&TempErrorMessage)) { + initiator->Message(0, "The name %s is already being used or is invalid. Please choose a different name.", (char*)name); + return false; + } + NPCType DefaultNPCTypeStruct = Bot::CreateDefaultNPCTypeStructForBot(name, lastname, level, race, botclass, gender); Bot* NewBot = new Bot(DefaultNPCTypeStruct, initiator); @@ -2086,11 +2091,6 @@ bool QuestManager::createBot(const char *name, const char *lastname, uint8 level return false; } - if(!NewBot->IsBotNameAvailable(&TempErrorMessage)) { - initiator->Message(0, "The name %s is already being used. Please choose a different name.", NewBot->GetCleanName()); - return false; - } - if(!TempErrorMessage.empty()) { initiator->Message(13, "Database Error: %s", TempErrorMessage.c_str()); return false;