aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none.none>2011-10-08 16:09:12 -0400
committermegamage <none@none.none>2011-10-08 16:09:12 -0400
commit0bb86a3e97cf720512ae00c9bee209a30c5fb928 (patch)
tree15cf743d86eb5cd70f9994bdd709c4c56942af19
parent72fc756bff32e68ee02043a7d635cdee357781b1 (diff)
Update code related to character name data.
Note: need to add/delete data when character is created/deleted.
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp1
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h1
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/CharacterHandler.cpp4
-rwxr-xr-xsrc/server/game/Server/Protocol/Handlers/QueryHandler.cpp2
-rwxr-xr-xsrc/server/game/World/World.cpp58
-rwxr-xr-xsrc/server/game/World/World.h7
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();