Update code related to character name data.
Note: need to add/delete data when character is created/deleted.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user