Skip to content

Commit

Permalink
Fix CMSG_CHAR_CREATE, CMSG_CHAR_DELETE Thanks Zuse for help.
Browse files Browse the repository at this point in the history
Signed-off-by: Salja <salja2012@hotmail.de>
  • Loading branch information
Salja committed Aug 2, 2012
1 parent 762ed30 commit 708af57
Show file tree
Hide file tree
Showing 7 changed files with 151 additions and 161 deletions.
6 changes: 3 additions & 3 deletions src/game/CharacterHandler.cpp
Expand Up @@ -164,7 +164,7 @@ void WorldSession::HandleCharEnum(QueryResult * result)

do
{
uint64 GuidLow = (*result)[0].GetUInt64();
uint32 GuidLow = (*result)[0].GetUInt32();
uint32 atLoginFlags = (*result)[15].GetUInt32();
uint64 GuildGuid = (*result)[13].GetUInt64();

Expand All @@ -180,11 +180,11 @@ void WorldSession::HandleCharEnum(QueryResult * result)

sLog.outDetail("Loading char guid %u from account %u.", GuidLow, GetAccountId());

/*if (!Player::BuildEnumData(result, &buffer))
if (!Player::BuildEnumData(result, &buffer))
{
sLog.outError("Building enum data for SMSG_CHAR_ENUM has failed, aborting");
return;
}*/
}
_allowedCharsToLogin.insert(GuidLow);
}
while (result->NextRow());
Expand Down
10 changes: 5 additions & 5 deletions src/game/Opcodes.cpp
Expand Up @@ -99,13 +99,13 @@ void InitializeOpcodes()
//OPCODE(CMSG_AUTH_SRP6_BEGIN, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(CMSG_AUTH_SRP6_PROOF, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(CMSG_AUTH_SRP6_RECODE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL );
//OPCODE(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode );
OPCODE(CMSG_CHAR_CREATE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode );
OPCODE(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharEnumOpcode );
//OPCODE(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharDeleteOpcode );
OPCODE(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharDeleteOpcode );
//OPCODE(SMSG_AUTH_SRP6_RESPONSE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_CHAR_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_CHAR_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_CHAR_ENUM, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_CHAR_DELETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_CHAR_DELETE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayerLoginOpcode );
//OPCODE(SMSG_NEW_WORLD, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_TRANSFER_PENDING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
Expand Down Expand Up @@ -563,7 +563,7 @@ void InitializeOpcodes()
//OPCODE(SMSG_GMTICKET_CREATE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_GMTICKET_UPDATETEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateTextOpcode );
//OPCODE(SMSG_GMTICKET_UPDATETEXT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
OPCODE(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
//OPCODE(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData );
//OPCODE(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData);
//OPCODE(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_ServerSide );
Expand Down
10 changes: 5 additions & 5 deletions src/game/Opcodes.h
Expand Up @@ -93,13 +93,13 @@ enum Opcodes
CMSG_AUTH_SRP6_BEGIN = 0x1034,
CMSG_AUTH_SRP6_PROOF = 0x1035,
CMSG_AUTH_SRP6_RECODE = 0x1036,
CMSG_CHAR_CREATE = 0x469,
CMSG_CHAR_CREATE = 0x4A36,
CMSG_CHAR_ENUM = 0x0502,
CMSG_CHAR_DELETE = 0x0D6,
CMSG_CHAR_DELETE = 0x6425,
SMSG_AUTH_SRP6_RESPONSE = 0x103A,
SMSG_CHAR_CREATE = 0x4BB,
SMSG_CHAR_CREATE = 0x2D05,
SMSG_CHAR_ENUM = 0x10B0,
SMSG_CHAR_DELETE = 0x23A,
SMSG_CHAR_DELETE = 0x0304,
CMSG_PLAYER_LOGIN = 0xD25,
SMSG_NEW_WORLD = 0x103F,
SMSG_TRANSFER_PENDING = 0x1040,
Expand Down Expand Up @@ -557,7 +557,7 @@ enum Opcodes
SMSG_GMTICKET_CREATE = 0x1207,
CMSG_GMTICKET_UPDATETEXT = 0x1208,
SMSG_GMTICKET_UPDATETEXT = 0x1209,
SMSG_ACCOUNT_DATA_TIMES = 0x120A,
SMSG_ACCOUNT_DATA_TIMES = 0x4B05,
CMSG_REQUEST_ACCOUNT_DATA = 0x120B,
CMSG_UPDATE_ACCOUNT_DATA = 0x120C,
SMSG_UPDATE_ACCOUNT_DATA = 0x120D,
Expand Down
157 changes: 82 additions & 75 deletions src/game/Player.cpp
Expand Up @@ -1528,7 +1528,7 @@ void Player::SetDeathState(DeathState s)
}
}

bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
bool Player::BuildEnumData( QueryResult * result, ByteBuffer * p_data )
{
// 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, "
Expand All @@ -1539,45 +1539,40 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )

Field *fields = result->Fetch();

uint32 guid = fields[0].GetUInt32();
uint32 Guid = fields[0].GetUInt32();
uint64 GuildGuid = fields[13].GetUInt64();

uint8 pRace = fields[2].GetUInt8();
uint8 pClass = fields[3].GetUInt8();

PlayerInfo const *info = sObjectMgr.GetPlayerInfo(pRace, pClass);
if(!info)
{
sLog.outError("Player %u has incorrect race/class pair. Don't build enum.", guid);
return false;
}

*p_data << ObjectGuid(HIGHGUID_PLAYER, guid);
*p_data << fields[1].GetString(); // name
*p_data << uint8(pRace); // race
*p_data << uint8(pClass); // class
*p_data << uint8(fields[4].GetUInt8()); // gender

uint8 gender = fields[4].GetUInt8();
uint32 playerBytes = fields[5].GetUInt32();
*p_data << uint8(playerBytes); // skin
*p_data << uint8(playerBytes >> 8); // face
*p_data << uint8(playerBytes >> 16); // hair style
*p_data << uint8(playerBytes >> 24); // hair color

uint32 playerBytes2 = fields[6].GetUInt32();
*p_data << uint8(playerBytes2 & 0xFF); // facial hair

*p_data << uint8(fields[7].GetUInt8()); // level
*p_data << uint32(fields[8].GetUInt32()); // zone
*p_data << uint32(fields[9].GetUInt32()); // map
uint8 level = fields[7].GetUInt8();
uint32 playerFlags = fields[14].GetUInt32();
uint32 atLoginFlags = fields[15].GetUInt32();
uint32 zone = fields[8].GetUInt32();
uint32 petDisplayId = 0;
uint32 petLevel = 0;
uint32 petFamily = 0;
uint32 char_flags = 0;

*p_data << fields[10].GetFloat(); // x
*p_data << fields[11].GetFloat(); // y
*p_data << fields[12].GetFloat(); // z
uint8 Guid0 = uint8(Guid);
uint8 Guid1 = uint8(Guid >> 8);
uint8 Guid2 = uint8(Guid >> 16);
uint8 Guid3 = uint8(Guid >> 24);

*p_data << uint32(fields[13].GetUInt32()); // guild id
// show pet at selection character in character list only for non-ghost character
if (result && !(playerFlags & PLAYER_FLAGS_GHOST) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT))
{
uint32 entry = fields[16].GetUInt32();
CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);
if(cInfo)
{
petDisplayId = fields[17].GetUInt32();
petLevel = fields[18].GetUInt32();
petFamily = cInfo->family;
}
}

uint32 char_flags = 0;
uint32 playerFlags = fields[14].GetUInt32();
uint32 atLoginFlags = fields[15].GetUInt32();
if(playerFlags & PLAYER_FLAGS_HIDE_HELM)
char_flags |= CHARACTER_FLAG_HIDE_HELM;
if(playerFlags & PLAYER_FLAGS_HIDE_CLOAK)
Expand All @@ -1594,36 +1589,15 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
else
char_flags |= CHARACTER_FLAG_DECLINED;

*p_data << uint32(char_flags); // character flags
// character customize flags
*p_data << uint32(atLoginFlags & AT_LOGIN_CUSTOMIZE ? CHAR_CUSTOMIZE_FLAG_CUSTOMIZE : CHAR_CUSTOMIZE_FLAG_NONE);
// First login
*p_data << uint8(atLoginFlags & AT_LOGIN_FIRST ? 1 : 0);

// Pets info
PlayerInfo const *info = sObjectMgr.GetPlayerInfo(pRace, pClass);
if(!info)
{
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) && (pClass == CLASS_WARLOCK || pClass == CLASS_HUNTER || pClass == CLASS_DEATH_KNIGHT))
{
uint32 entry = fields[16].GetUInt32();
CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(entry);
if(cInfo)
{
petDisplayId = fields[17].GetUInt32();
petLevel = fields[18].GetUInt32();
petFamily = cInfo->family;
}
}

*p_data << uint32(petDisplayId);
*p_data << uint32(petLevel);
*p_data << uint32(petFamily);
sLog.outError("Player %u has incorrect race/class pair. Don't build enum.", Guid);
return false;
}

*p_data << uint8(pClass); // Race

Tokens data = StrSplit(fields[19].GetCppString(), " ");
for (uint8 slot = 0; slot < EQUIPMENT_SLOT_END; slot++)
Expand All @@ -1633,9 +1607,9 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
const ItemPrototype * proto = ObjectMgr::GetItemPrototype(item_id);
if(!proto)
{
*p_data << uint32(0);
*p_data << uint8(0);
*p_data << uint32(0);
*p_data << uint32(0);
continue;
}

Expand All @@ -1653,23 +1627,56 @@ bool Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
break;
}

*p_data << uint32(proto->DisplayInfoID);
*p_data << uint8(proto->InventoryType);
*p_data << uint32(proto->DisplayInfoID);
*p_data << uint32(enchant ? enchant->aura_id : 0);
}

*p_data << uint32(0); // bag 1 display id
*p_data << uint8(0); // bag 1 inventory type
*p_data << uint32(0); // enchant?
*p_data << uint32(0); // bag 2 display id
*p_data << uint8(0); // bag 2 inventory type
*p_data << uint32(0); // enchant?
*p_data << uint32(0); // bag 3 display id
*p_data << uint8(0); // bag 3 inventory type
*p_data << uint32(0); // enchant?
*p_data << uint32(0); // bag 4 display id
*p_data << uint8(0); // bag 4 inventory type
*p_data << uint32(0); // enchant?
for (int32 i = 0; i < 4; i++)
{
*p_data << uint8(0);
*p_data << uint32(0);
*p_data << uint32(0);
}

*p_data << uint32(petDisplayId); // Pet DisplayID
*p_data << uint8(0); // char order id
*p_data << uint8(playerBytes >> 16); // Hair style
*p_data << uint32(petDisplayId); // Pet DisplayID
*p_data << uint32(char_flags); // character flags
*p_data << uint8(playerBytes >> 24); // Hair color
*p_data << uint32(fields[9].GetUInt32()); // map
*p_data << fields[12].GetFloat(); // z
*p_data << uint32(petLevel); // pet level

if (Guid3)
*p_data << uint8(Guid3 ^ 1);

*p_data << fields[11].GetFloat(); // y
// character customize flags
*p_data << uint32(atLoginFlags & AT_LOGIN_CUSTOMIZE ? CHAR_CUSTOMIZE_FLAG_CUSTOMIZE : CHAR_CUSTOMIZE_FLAG_NONE);

uint32 playerBytes2 = fields[6].GetUInt32();
*p_data << uint8(playerBytes2 & 0xFF); // facial hair
*p_data << uint8(gender); // Gender
p_data->append(fields[1].GetCppString().c_str(), fields[1].GetCppString().size());
*p_data << uint8(playerBytes >> 8); // face

if (Guid0)
*p_data << uint8(Guid0 ^ 1);

if (Guid2)
*p_data << uint8(Guid2 ^ 1);

*p_data << fields[10].GetFloat(); // x
*p_data << uint8(playerBytes); // skin
*p_data << uint8(pRace); // Race
*p_data << uint8(level); // Level

if (Guid1)
*p_data << uint8(Guid1 ^ 1);

*p_data << uint32(zone); // Zone id

return true;
}
Expand Down Expand Up @@ -17199,7 +17206,7 @@ void Player::SaveToDB()
"trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, "
"death_expire_time, taxi_path, arenaPoints, totalHonorPoints, todayHonorPoints, yesterdayHonorPoints, totalKills, "
"todayKills, yesterdayKills, chosenTitle, knownCurrencies, watchedFaction, drunk, health, power1, power2, power3, "
"power4, power5, power6, power7, power8, power9, power10, specCount, activeSpec, exploredZones, equipmentCache, knownTitles, actionBars) VALUES ("
"power4, power5, power6, power7, power8, power9, power10, specCount, activeSpec, exploredZones, equipmentCache, knownTitles, actionBars) "
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, "
"?, ?, ?, ?, ?, ?, "
"?, ?, ?, "
Expand Down
2 changes: 1 addition & 1 deletion src/game/Player.h
Expand Up @@ -1074,7 +1074,7 @@ class MANGOS_DLL_SPEC Player : public Unit

void Update(uint32 update_diff, uint32 time) override;

static bool BuildEnumData( QueryResult * result, WorldPacket * p_data );
static bool BuildEnumData( QueryResult * result, ByteBuffer * p_data );

void SetInWater(bool apply);

Expand Down

0 comments on commit 708af57

Please sign in to comment.