diff options
author | Machiavelli <machiavelli.trinity@gmail.com> | 2013-02-14 15:43:26 +0100 |
---|---|---|
committer | Machiavelli <machiavelli.trinity@gmail.com> | 2013-02-14 15:43:26 +0100 |
commit | 877a7e9968a0d2a1e3f646a94bfb81018ef318a9 (patch) | |
tree | 23acb4ee93aaca16299f42d66f3917dea44390bb /src | |
parent | 8befbdcc5675d2249e4e252ba303c149df0ecad3 (diff) |
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 10 | ||||
-rw-r--r-- | src/server/game/World/World.h | 1 |
2 files changed, 11 insertions, 0 deletions
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; } |