diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Entities/Object/ObjectDefines.h | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 242 | ||||
-rwxr-xr-x | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 106 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 8 |
5 files changed, 143 insertions, 217 deletions
diff --git a/src/server/game/Entities/Object/ObjectDefines.h b/src/server/game/Entities/Object/ObjectDefines.h index 922ff519d75..a9d14b85a59 100755 --- a/src/server/game/Entities/Object/ObjectDefines.h +++ b/src/server/game/Entities/Object/ObjectDefines.h @@ -45,7 +45,7 @@ enum HighGuid HIGHGUID_CORPSE = 0xF101, // blizz F100 HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) HIGHGUID_GROUP = 0x1F50, - HIGHGUID_GUILD = 0x1FF // new 4.x + HIGHGUID_GUILD = 0x1FF5, // new 4.x }; #define IS_EMPTY_GUID(Guid) (Guid == 0) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f66f3b95128..cdd0927bed5 100755 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1843,7 +1843,8 @@ void Player::setDeathState(DeathState s) //clear aura case after resurrection by another way (spells will be applied before next death) SetUInt32Value(PLAYER_SELF_RES_SPELL, 0); } -bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* data) + +bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer, ByteBuffer* bitBuffer) { // 0 1 2 3 4 5 6 7 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.playerBytes, characters.playerBytes2, characters.level, " @@ -1852,70 +1853,31 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* data) // 15 16 17 18 19 20 21 // "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.data, character_banned.guid, character_declinedname.genitive " - Field *fields = result->Fetch(); - - //uint64 GuildGuid = (*result)[13].GetUInt32();//TODO: store as uin64 + Field* fields = result->Fetch(); + uint8 guid[8]; + uint8 guildGuid[8]; + *reinterpret_cast<uint64*>(&guid[0]) = MAKE_NEW_GUID(fields[0].GetUInt32(), 0, HIGHGUID_PLAYER); + std::string name = fields[1].GetString(); uint8 plrRace = fields[2].GetUInt8(); uint8 plrClass = fields[3].GetUInt8(); uint8 gender = fields[4].GetUInt8(); + uint8 skin = uint8(fields[5].GetUInt32() & 0xFF); + uint8 face = uint8((fields[5].GetUInt32() >> 8) & 0xFF); + uint8 hairStyle = uint8((fields[5].GetUInt32() >> 16) & 0xFF); + uint8 hairColor = uint8((fields[5].GetUInt32() >> 24) & 0xFF); + uint8 facialHair = uint8(fields[6].GetUInt32() & 0xFF); uint8 level = fields[7].GetUInt8(); - uint32 GuidLow = fields[0].GetUInt32(); - uint32 playerBytes = fields[5].GetUInt32(); - uint32 playerFlags = fields[14].GetUInt32(); - uint32 atLoginFlags = fields[15].GetUInt32(); uint32 zone = fields[8].GetUInt16(); - uint32 petDisplayId = 0; - uint32 petLevel = 0; - uint32 petFamily = 0; - // show pet at selection character in character list only for non-ghost character - if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || plrClass == CLASS_DEATH_KNIGHT)) - { - uint32 entry = fields[16].GetUInt32(); - CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry); - if (creatureInfo) - { - petDisplayId = fields[17].GetUInt32(); - petLevel = fields[18].GetUInt16(); - petFamily = creatureInfo->family; - } - } - - *data << fields[1].GetString(); // name - *data << uint8(playerBytes >> 8); // face - *data << uint32(fields[9].GetUInt16()); // map - - uint8 Guid0 = uint8(GuidLow); - uint8 Guid1 = uint8(GuidLow >> 8); - uint8 Guid2 = uint8(GuidLow >> 16); - uint8 Guid3 = uint8(GuidLow >> 24); - - if (Guid1) - *data << uint8(Guid1^1); - - //if (uint8(GuildGuid)) - // *data << uint8(GuildGuid^1); - - *data << fields[10].GetFloat(); // x - *data << fields[11].GetFloat(); // y - *data << fields[12].GetFloat(); // z - - if (Guid0) - *data << uint8(Guid0^1); - - *data << uint32(zone); // Zone id - *data << uint32(petLevel); // pet level - - if (Guid3) - *data << uint8(Guid3^1); - - //*data << uint8(2); // unk, bit 14 - - uint32 playerBytes2 = fields[6].GetUInt32(); - *data << uint8(playerBytes2 & 0xFF); // facial hair - *data << uint8(playerBytes); // skin - *data << uint8(plrClass); // class - *data << uint32(petFamily); // Pet Family + uint32 mapId = uint32(fields[9].GetUInt16()); + float x = fields[10].GetFloat(); + float y = fields[11].GetFloat(); + float z = fields[12].GetFloat(); + uint32 guildId = fields[13].GetUInt32(); + *reinterpret_cast<uint64*>(&guildGuid[0]) = MAKE_NEW_GUID(guildId, 0, guildId ? HIGHGUID_GUILD : 0); + uint32 playerFlags = fields[14].GetUInt32(); + uint32 atLoginFlags = fields[15].GetUInt16(); + Tokens equipment(fields[19].GetString(), ' '); uint32 charFlags = 0; if (playerFlags & PLAYER_FLAGS_HIDE_HELM) @@ -1933,55 +1895,65 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* data) if (fields[20].GetUInt32()) charFlags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED)) - { - if (!fields[21].GetString().empty()) - charFlags |= CHARACTER_FLAG_DECLINED; - } - else + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[21].GetString().empty()) charFlags |= CHARACTER_FLAG_DECLINED; - *data << uint32(charFlags); // character flags - - if (Guid2) - *data << uint8(Guid2^1); - - *data << uint32(petDisplayId); // Pet DisplayID - - //if (uint8(GuildGuid >> 56)) - // *data << uint8(GuildGuid^1 >> 56); - - *data << uint8(level); // Level - *data << uint8(playerBytes >> 16); // Hair style - - //if (uint8(GuildGuid >> 16)) - // *data << uint8(GuildGuid^1 >> 16); - - *data << uint8(plrRace); // Race - *data << uint8(playerBytes >> 24); // Hair color - - //if (uint8(GuildGuid >> 48)) - // *data << uint8(GuildGuid^1 >> 48); - - *data << uint8(gender); // Gender - - //if (uint8(GuildGuid >> 24)) - // *data << uint8(GuildGuid^1 >> 24); + uint32 customizationFlag = 0; + if (atLoginFlags & AT_LOGIN_CUSTOMIZE) + customizationFlag = CHAR_CUSTOMIZE_FLAG_CUSTOMIZE; + else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION) + customizationFlag = CHAR_CUSTOMIZE_FLAG_FACTION; + else if (atLoginFlags & AT_LOGIN_CHANGE_RACE) + customizationFlag = CHAR_CUSTOMIZE_FLAG_RACE; - *data << uint8(0); // character order id (used for char list positioning) TODO: implement + uint32 petDisplayId = 0; + uint32 petLevel = 0; + uint32 petFamily = 0; + // show pet at selection character in character list only for non-ghost character + if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (plrClass == CLASS_WARLOCK || plrClass == CLASS_HUNTER || plrClass == CLASS_DEATH_KNIGHT)) + { + uint32 entry = fields[16].GetUInt32(); + CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(entry); + if (creatureInfo) + { + petDisplayId = fields[17].GetUInt32(); + petLevel = fields[18].GetUInt16(); + petFamily = creatureInfo->family; + } + } - Tokens equipment(fields[19].GetString(), ' '); - for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; ++slot) + // Packet content flags + bitBuffer->WriteBit(guid[3]); + bitBuffer->WriteBit(guildGuid[1]); + bitBuffer->WriteBit(guildGuid[7]); + bitBuffer->WriteBit(guildGuid[2]); + bitBuffer->WriteBits(uint32(name.length()), 7); + bitBuffer->WriteBit(guid[4]); + bitBuffer->WriteBit(guid[7]); + bitBuffer->WriteBit(guildGuid[3]); + bitBuffer->WriteBit(guid[5]); + bitBuffer->WriteBit(guildGuid[6]); + bitBuffer->WriteBit(guid[1]); + bitBuffer->WriteBit(guildGuid[5]); + bitBuffer->WriteBit(guildGuid[4]); + bitBuffer->WriteBit(atLoginFlags & AT_LOGIN_FIRST); + bitBuffer->WriteBit(guid[0]); + bitBuffer->WriteBit(guid[2]); + bitBuffer->WriteBit(guid[6]); + bitBuffer->WriteBit(guildGuid[0]); + + // Character data + *dataBuffer << uint8(plrClass); // Class + for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { uint32 visualbase = slot * 2; uint32 itemId = GetUInt32ValueFromArray(equipment, visualbase); ItemTemplate const* proto = sObjectMgr->GetItemTemplate(itemId); - ItemEntry const *db2Item = sItemStore.LookupEntry(itemId); // Use Item.db2.DisplayID for Char Enum - if (!proto || !db2Item) + if (!proto) { - *data << uint32(0); - *data << uint8(0); - *data << uint32(0); + *dataBuffer << uint8(0); + *dataBuffer << uint32(0); + *dataBuffer << uint32(0); continue; } @@ -1998,35 +1970,48 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* data) if (enchant) break; } - *data << uint32(enchant ? enchant->aura_id : 0); - *data << uint8(proto->InventoryType); - *data << uint32(db2Item->DisplayId); - } - - // Bags (not supported) TODO: implement - for (uint32 i = 0; i < 4; ++i) - { - *data << uint32(0); // enchant - *data << uint8(0); // invtype - *data << uint32(0); // displayid - } - - // character customize flags - if (atLoginFlags & AT_LOGIN_CUSTOMIZE) - *data << uint32(CHAR_CUSTOMIZE_FLAG_CUSTOMIZE); - - else if (atLoginFlags & AT_LOGIN_CHANGE_FACTION) - *data << uint32(CHAR_CUSTOMIZE_FLAG_FACTION); - - else if (atLoginFlags & AT_LOGIN_CHANGE_RACE) - *data << uint32(CHAR_CUSTOMIZE_FLAG_RACE); - - else - *data << uint32(CHAR_CUSTOMIZE_FLAG_NONE); - - //if (uint8(GuildGuid >> 8)) - // *data << uint8(GuildGuid^1 >> 8); + *dataBuffer << uint8(proto->InventoryType); + *dataBuffer << uint32(proto->DisplayInfoID); + *dataBuffer << uint32(enchant ? enchant->aura_id : 0); + } + + *dataBuffer << uint32(petFamily); // Pet family + dataBuffer->WriteByteSeq(guildGuid[2]); + *dataBuffer << uint8(0); // List order + *dataBuffer << uint8(hairStyle); // Hair style + dataBuffer->WriteByteSeq(guildGuid[3]); + *dataBuffer << uint32(petDisplayId); // Pet DisplayID + *dataBuffer << uint32(charFlags); // Character flags + *dataBuffer << uint8(hairColor); // Hair color + dataBuffer->WriteByteSeq(guid[4]); + *dataBuffer << uint32(mapId); // Map Id + dataBuffer->WriteByteSeq(guildGuid[5]); + *dataBuffer << float(z); // Z + dataBuffer->WriteByteSeq(guildGuid[6]); + *dataBuffer << uint32(petLevel); // Pet level + dataBuffer->WriteByteSeq(guid[3]); + *dataBuffer << float(y); // Y + *dataBuffer << uint32(customizationFlag); // Character customization flags + *dataBuffer << uint8(facialHair); // Facial hair + dataBuffer->WriteByteSeq(guid[7]); + *dataBuffer << uint8(gender); // Gender + dataBuffer->append(name.c_str(), name.length()); // Name + *dataBuffer << uint8(face); // Face + dataBuffer->WriteByteSeq(guid[0]); + dataBuffer->WriteByteSeq(guid[2]); + dataBuffer->WriteByteSeq(guildGuid[1]); + dataBuffer->WriteByteSeq(guildGuid[7]); + *dataBuffer << float(x); // X + *dataBuffer << uint8(skin); // Skin + *dataBuffer << uint8(plrRace); // Race + *dataBuffer << uint8(level); // Level + dataBuffer->WriteByteSeq(guid[6]); + dataBuffer->WriteByteSeq(guildGuid[4]); + dataBuffer->WriteByteSeq(guildGuid[0]); + dataBuffer->WriteByteSeq(guid[5]); + dataBuffer->WriteByteSeq(guid[1]); + *dataBuffer << uint32(zone); // Zone id return true; } @@ -16496,7 +16481,7 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP, Object* questGiver) sGameEventMgr->HandleQuestComplete(questId); WorldPacket data(SMSG_QUESTGIVER_QUEST_COMPLETE, (4+4+4+4+4)); - data << int8(0x80); // 4.x unknown flag, most common value is 0x80 (it might be a single bit) + data << uint8(0x80); // 4.x unknown flag, most common value is 0x80 (it might be a single bit) if (getLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { @@ -24695,7 +24680,6 @@ void Player::BuildPlayerTalentsInfoData(WorldPacket* data) // find class talent tabs (all players have 3 talent tabs) uint32 const* talentTabIds = GetTalentTabPages(getClass()); - uint32 talentCounts[3] = { 0, 0, 0 }; for (uint8 i = 0; i < MAX_TALENT_TABS; ++i) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index e273ba81077..82189bf03e2 100755 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1150,7 +1150,7 @@ class Player : public Unit, public GridObject<Player> void Update(uint32 time); - static bool BuildEnumData(PreparedQueryResult result, ByteBuffer* data); + static bool BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer, ByteBuffer* bitBuffer); void SetInWater(bool apply); diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 26a3e7c67ea..d31e1c8316f 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -203,100 +203,42 @@ bool LoginQueryHolder::Initialize() void WorldSession::HandleCharEnum(PreparedQueryResult result) { - WorldPacket data(SMSG_CHAR_ENUM, 270); - - data << uint8(0x80); // 0 causes the client to free memory of charlist - data << uint32(0); // number of characters - data << uint32(0); // unk loop counter + uint32 charCount = 0; + ByteBuffer bitBuffer; + ByteBuffer dataBuffer; + bitBuffer.WriteBits(0, 23); + bitBuffer.WriteBit(1); if (result) { - typedef std::pair<uint32, uint64> Guids; - std::vector<Guids> guidsVect; - ByteBuffer buffer; _allowedCharsToLogin.clear(); - do - { - uint32 GuidLow = (*result)[0].GetUInt32(); - uint64 GuildGuid = (*result)[13].GetUInt32();//TODO: store as uin64 + charCount = uint32(result->GetRowCount()); + bitBuffer.reserve(24 * charCount / 8); + dataBuffer.reserve(charCount * 381); - guidsVect.push_back(std::make_pair(GuidLow, GuildGuid)); + bitBuffer.WriteBits(charCount, 17); - sLog->outDetail("Loading char guid %u from account %u.", GuidLow, GetAccountId()); + do + { + uint32 guidLow = (*result)[0].GetUInt32(); - if (!Player::BuildEnumData(result, &buffer)) - { - sLog->outError("Building enum data for SMSG_CHAR_ENUM has failed, aborting"); - return; - } - _allowedCharsToLogin.insert(GuidLow); - } - while (result->NextRow()); + sLog->outDetail("Loading char guid %u from account %u.", guidLow, GetAccountId()); - for (std::vector<Guids>::iterator itr = guidsVect.begin(); itr != guidsVect.end(); ++itr) - { - uint32 GuidLow = (*itr).first; - uint64 GuildGuid = (*itr).second; + Player::BuildEnumData(result, &dataBuffer, &bitBuffer); - uint8 Guid0 = uint8(GuidLow); - uint8 Guid1 = uint8(GuidLow >> 8); - uint8 Guid2 = uint8(GuidLow >> 16); - uint8 Guid3 = uint8(GuidLow >> 24); + _allowedCharsToLogin.insert(guidLow); + } while (result->NextRow()); - for (uint8 i = 0; i < 17; ++i) - { - switch(i) - { - //case 14: - // data.writeBit(1);//unk - // break; - case 11: data.WriteBit(Guid0 ? 1 : 0); break; - case 12: data.WriteBit(Guid1 ? 1 : 0); break; - case 9: data.WriteBit(Guid2 ? 1 : 0); break; - case 8: data.WriteBit(Guid3 ? 1 : 0); break; - /*case 15: - if(uint8(GuildGuid)) - data.writeBit(1); - break; - case 4: - if(uint8(GuildGuid >> 8)) - data.writeBit(1); - break; - case 13: - if(uint8(GuildGuid >> 16)) - data.writeBit(1); - break; - case 2: - if(uint8(GuildGuid >> 24)) - data.writeBit(1); - break;*/ - /*case 0: - if(uint8(GuildGuid >> 32)) - data.writeBit(1); - break; - case 0: - if(uint8(GuildGuid >> 40)) - data.writeBit(1); - break;*/ - /*case 5: - if(uint8(GuildGuid >> 48)) - data.writeBit(1); - break; - case 3: - if(uint8(GuildGuid >> 56)) - data.writeBit(1); - break;*/ - default: - data.WriteBit(0); - break; - } - } - } - data.FlushBits(); - data.append(buffer); - data.put<uint32>(1, guidsVect.size()); + bitBuffer.FlushBits(); } + else + bitBuffer.WriteBits(0, 17); + + WorldPacket data(SMSG_CHAR_ENUM, 7 + bitBuffer.size() + dataBuffer.size()); + data.append(bitBuffer); + if (charCount) + data.append(dataBuffer); SendPacket(&data); } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index ee28bd59618..f1f0bcc2f5b 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -172,7 +172,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCustomize ); //DEFINE_OPCODE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharDeleteOpcode ); - //DEFINE_OPCODE_HANDLER(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharEnumOpcode ); + DEFINE_OPCODE_HANDLER(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharEnumOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_CHAR_FACTION_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharFactionOrRaceChange ); //DEFINE_OPCODE_HANDLER(CMSG_CHAR_RACE_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharFactionOrRaceChange ); //DEFINE_OPCODE_HANDLER(CMSG_CHAR_RENAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharRenameOpcode ); @@ -537,7 +537,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepairItemOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode ); //DEFINE_OPCODE_HANDLER(CMSG_REPORT_PVP_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK ); - //DEFINE_OPCODE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData ); + DEFINE_OPCODE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData ); //DEFINE_OPCODE_HANDLER(CMSG_REQUEST_HOTFIX, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleRequestHotfix ); //DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode); //DEFINE_OPCODE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode ); @@ -876,7 +876,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_CHAR_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_CHAR_ENUM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_CHAR_ENUM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CHAR_RENAME, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_CHAT_NOT_IN_PARTY, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); @@ -1356,7 +1356,7 @@ void InitOpcodes() //DEFINE_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); - //DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); + DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); DEFINE_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA_COMPLETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_UPDATE_COMBO_POINTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); //DEFINE_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide ); |