diff options
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 1 | ||||
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 1 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp | 4 | ||||
-rwxr-xr-x | src/server/game/Server/Protocol/Handlers/QueryHandler.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/World/World.cpp | 58 | ||||
-rwxr-xr-x | src/server/game/World/World.h | 7 |
6 files changed, 24 insertions, 49 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0aa47b38412..4a8e2c9de0d 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -19029,7 +19029,6 @@ void Player::Customize(uint64 guid, uint8 gender, uint8 skin, uint8 face, uint8 player_bytes2 |= facialHair; CharacterDatabase.PExecute("UPDATE characters SET gender = '%u', playerBytes = '%u', playerBytes2 = '%u' WHERE guid = '%u'", gender, skin | (face << 8) | (hairStyle << 16) | (hairColor << 24), player_bytes2, GUID_LOPART(guid)); - sWorld->ReloadSingleCharacterNameData(GUID_LOPART(guid)); } void Player::SendAttackSwingDeadTarget() diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index fa18cd801a4..380af30c175 100755 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -53,6 +53,7 @@ enum Gender // Race value is index in ChrRaces.dbc enum Races { + RACE_NONE = 0, RACE_HUMAN = 1, RACE_ORC = 2, RACE_DWARF = 3, diff --git a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp index 7b504060789..35fea620cfd 100755 --- a/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/CharacterHandler.cpp @@ -1414,6 +1414,7 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data) Player::Customize(guid, gender, skin, face, hairStyle, hairColor, facialHair); CharacterDatabase.PExecute("UPDATE characters set name = '%s', at_login = at_login & ~ %u WHERE guid ='%u'", newname.c_str(), uint32(AT_LOGIN_CUSTOMIZE), GUID_LOPART(guid)); CharacterDatabase.PExecute("DELETE FROM character_declinedname WHERE guid ='%u'", GUID_LOPART(guid)); + sWorld->UpdateCharacterNameData(GUID_LOPART(guid), newname, gender); WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1+8+(newname.size()+1)+6); data << uint8(RESPONSE_SUCCESS); @@ -1426,8 +1427,6 @@ void WorldSession::HandleCharCustomize(WorldPacket& recv_data) data << uint8(hairColor); data << uint8(facialHair); SendPacket(&data); - - sWorld->ReloadSingleCharacterNameData(GUID_LOPART(guid)); } void WorldSession::HandleEquipmentSetSave(WorldPacket &recv_data) @@ -1633,6 +1632,7 @@ void WorldSession::HandleCharFactionOrRaceChange(WorldPacket& recv_data) SQLTransaction trans = CharacterDatabase.BeginTransaction(); trans->PAppend("UPDATE `characters` SET name='%s', race='%u', at_login=at_login & ~ %u WHERE guid='%u'", newname.c_str(), race, used_loginFlag, lowGuid); trans->PAppend("DELETE FROM character_declinedname WHERE guid ='%u'", lowGuid); + sWorld->UpdateCharacterNameData(GUID_LOPART(guid), newname, gender, race); BattlegroundTeamId team = BG_TEAM_ALLIANCE; diff --git a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp index bfd1fae2306..bdb4b93a238 100755 --- a/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp +++ b/src/server/game/Server/Protocol/Handlers/QueryHandler.cpp @@ -69,7 +69,7 @@ void WorldSession::HandleNameQueryOpcode(WorldPacket& recv_data) SendNameQueryOpcode(pChar); else { - if (CharacterNameData* cname = sWorld->GetCharacterNameData(guid)) + if (const CharacterNameData* cname = sWorld->GetCharacterNameData(GUID_LOPART(guid))) { WorldPacket data(SMSG_NAME_QUERY_RESPONSE, 8+1+1+1+1+1+1+10); data.appendPackGUID(guid); diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 34b93c71fb4..359d278956b 100755 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -132,10 +132,6 @@ World::~World() VMAP::VMapFactory::clear(); - // Clean up character name data - for (std::map<uint32, CharacterNameData*>::iterator itr = m_CharacterNameDataMap.begin(); itr != m_CharacterNameDataMap.end(); ++itr) - delete itr->second; - //TODO free addSessQueue } @@ -2864,58 +2860,38 @@ void World::LoadCharacterNameData() return; } - ACE_Guard<ACE_Thread_Mutex> guard(m_CharacterNameDataMapMutex); - uint32 count = 0; do { Field *fields = result->Fetch(); - CharacterNameData* data = new CharacterNameData; - data->m_name = fields[1].GetString(); - data->m_race = fields[2].GetUInt8(); - data->m_gender = fields[3].GetUInt8(); - data->m_class = fields[4].GetUInt8(); - - m_CharacterNameDataMap[fields[0].GetUInt32()] = data; + CharacterNameData& data = _characterNameDataMap[fields[0].GetUInt32()]; + data.m_name = fields[1].GetString(); + data.m_race = fields[2].GetUInt8(); + data.m_gender = fields[3].GetUInt8(); + data.m_class = fields[4].GetUInt8(); ++count; } while (result->NextRow()); sLog->outString("Loaded name data for %u characters", count); } -void World::ReloadSingleCharacterNameData(uint32 guid) +void World::UpdateCharacterNameData(uint32 guid, const std::string& name, uint8 gender, uint8 race) { - ACE_Guard<ACE_Thread_Mutex> guard(m_CharacterNameDataMapMutex); - - std::map<uint32, CharacterNameData*>::iterator itr = m_CharacterNameDataMap.find(guid); - - if (itr != m_CharacterNameDataMap.end()) - { - delete itr->second; - m_CharacterNameDataMap.erase(itr); - } - - QueryResult result = CharacterDatabase.PQuery("SELECT name, race, gender, class FROM characters WHERE guid = '%u'", guid); - if (result) - { - Field *fields = result->Fetch(); - CharacterNameData* newdata = new CharacterNameData; - newdata->m_name = fields[0].GetString(); - newdata->m_race = fields[1].GetUInt8(); - newdata->m_gender = fields[2].GetUInt8(); - newdata->m_class = fields[3].GetUInt8(); - m_CharacterNameDataMap[guid] = newdata; - } + std::map<uint32, CharacterNameData>::iterator itr = _characterNameDataMap.find(guid); + if (itr == _characterNameDataMap.end()) + return; + itr->second.m_name = name; + itr->second.m_gender = gender; + if(race != RACE_NONE) + itr->second.m_race = race; } -CharacterNameData* World::GetCharacterNameData(uint32 guid) +const CharacterNameData* World::GetCharacterNameData(uint32 guid) const { - ACE_Guard<ACE_Thread_Mutex> guard(m_CharacterNameDataMapMutex); - - std::map<uint32, CharacterNameData*>::iterator itr = m_CharacterNameDataMap.find(guid); - if (itr != m_CharacterNameDataMap.end()) - return itr->second; + std::map<uint32, CharacterNameData>::const_iterator itr = _characterNameDataMap.find(guid); + if (itr != _characterNameDataMap.end()) + return &itr->second; else return NULL; } diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index 7430dd22420..d632a010b8b 100755 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -739,8 +739,8 @@ class World bool isEventKillStart; - CharacterNameData *GetCharacterNameData(uint32 guid); - void ReloadSingleCharacterNameData(uint32 guid); + const CharacterNameData* GetCharacterNameData(uint32 guid) const; + void UpdateCharacterNameData(uint32 guid, const std::string& name, uint8 gender, uint8 race = RACE_NONE); uint32 GetCleaningFlags() const { return m_CleaningFlags; } void SetCleaningFlags(uint32 flags) { m_CleaningFlags = flags; } @@ -829,8 +829,7 @@ class World std::list<std::string> m_Autobroadcasts; - std::map<uint32, CharacterNameData*> m_CharacterNameDataMap; - ACE_Thread_Mutex m_CharacterNameDataMapMutex; + std::map<uint32, CharacterNameData> _characterNameDataMap; void LoadCharacterNameData(); void ProcessQueryCallbacks(); |