From 877a7e9968a0d2a1e3f646a94bfb81018ef318a9 Mon Sep 17 00:00:00 2001 From: Machiavelli Date: Thu, 14 Feb 2013 15:43:26 +0100 Subject: Core/Handlers: Fix a crash in HandleCharFactionOrRaceChange Ensure there's always valid character name data present, even for characters that were manually inserted into the database, by adding character name data on char enum if needed. --- src/server/game/Handlers/CharacterHandler.cpp | 10 ++++++++++ src/server/game/World/World.h | 1 + 2 files changed, 11 insertions(+) (limited to 'src') diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index d8e50be11f0..1e6dfa8c94c 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -225,6 +225,8 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (Player::BuildEnumData(result, &data)) { _allowedCharsToLogin.insert(guidlow); + if (!sWorld->HasCharacterNameData(guidlow)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. + sWorld->AddCharacterNameData(guidlow, (*result)[1].GetString(), (*result)[4].GetUInt8(), (*result)[2].GetUInt8(), (*result)[3].GetUInt8(), (*result)[7].GetUInt8()); ++num; } } @@ -1624,6 +1626,14 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recvData) // get the players old (at this moment current) race CharacterNameData const* nameData = sWorld->GetCharacterNameData(lowGuid); + if (!nameData) + { + WorldPacket data(SMSG_CHAR_FACTION_CHANGE, 1); + data << uint8(CHAR_CREATE_ERROR); + SendPacket(&data); + return; + } + uint8 oldRace = nameData->m_race; uint8 playerClass = nameData->m_class; uint8 level = nameData->m_level; diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 95c10329690..30021338c4e 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -734,6 +734,7 @@ class World void UpdateCharacterNameData(uint32 guid, std::string const& name, uint8 gender = GENDER_NONE, uint8 race = RACE_NONE); void UpdateCharacterNameDataLevel(uint32 guid, uint8 level); void DeleteCharaceterNameData(uint32 guid) { _characterNameDataMap.erase(guid); } + bool HasCharacterNameData(uint32 guid) { return _characterNameDataMap.find(guid) != _characterNameDataMap.end(); } uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } -- cgit v1.2.3