aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/CharacterHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp29
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());