Update code related to character name data.

Note: need to add/delete data when character is created/deleted.
This commit is contained in:
megamage
2011-10-08 16:09:12 -04:00
parent 72fc756bff
commit 0bb86a3e97
6 changed files with 24 additions and 49 deletions
@@ -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()
@@ -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,
@@ -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;
@@ -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);
+17 -41
View File
@@ -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;
}
+3 -4
View File
@@ -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();