diff options
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
| -rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 5a56cb150e0..2f617b62c52 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -48,6 +48,7 @@ #include "ScriptMgr.h" #include "ServerMotd.h" #include "SocialMgr.h" +#include "StringConvert.h" #include "SystemPackets.h" #include "QueryHolder.h" #include "World.h" @@ -2068,18 +2069,24 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptr<Charact // Title conversion if (!knownTitlesStr.empty()) { - uint32 const ktcount = KNOWN_TITLES_SIZE * 2; - uint32 knownTitles[ktcount]; - Tokenizer tokens(knownTitlesStr, ' ', ktcount); + std::vector<std::string_view> tokens = Trinity::Tokenize(knownTitlesStr, ' ', false); + std::array<uint32, KNOWN_TITLES_SIZE * 2> knownTitles; - if (tokens.size() != ktcount) + for (uint32 index = 0; index < knownTitles.size(); ++index) { - SendCharFactionChange(CHAR_CREATE_ERROR, factionChangeInfo.get()); - return; - } + Optional<uint32> thisMask; + if (index < tokens.size()) + thisMask = Trinity::StringTo<uint32>(tokens[index]); - for (uint32 index = 0; index < ktcount; ++index) - knownTitles[index] = atoul(tokens[index]); + if (thisMask) + knownTitles[index] = *thisMask; + else + { + TC_LOG_WARN("entities.player", "%s has invalid title data '%s' at index %u - skipped, this may result in titles being lost", + GetPlayerInfo().c_str(), (index < tokens.size()) ? std::string(tokens[index]).c_str() : "<none>", index); + knownTitles[index] = 0; + } + } for (std::map<uint32, uint32>::const_iterator it = sObjectMgr->FactionChangeTitles.begin(); it != sObjectMgr->FactionChangeTitles.end(); ++it) { @@ -2117,8 +2124,8 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptr<Charact } std::ostringstream ss; - for (uint32 index = 0; index < ktcount; ++index) - ss << knownTitles[index] << ' '; + for (uint32 mask : knownTitles) + ss << mask << ' '; stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_TITLES_FACTION_CHANGE); stmt->setString(0, ss.str()); |
