void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket *data, BattleGround *bg) { uint8 type = (bg->isArena() ? 1 : 0); // last check on 2.4.1 data->Initialize(MSG_PVP_LOG_DATA, (1+1+4+40*bg->GetPlayerScoresSize())); *data << uint8(type); // seems to be type (battleground=0/arena=1) if(type) // arena { // it seems this must be according to BG_WINNER_A/H and _NOT_ BG_TEAM_A/H for(int i = 1; i>=0; --i) { uint32 at_id = bg->m_ArenaTeamIds[i]; // *data << at_id; // probably rating change? though if the order is rating-at_id, it shows ------ as rating change :S // maybe should try with all 0s ArenaTeam * at = objmgr.GetArenaTeamById(at_id); sLog.outDebug("rating change: %d", bg->m_ArenaTeamRatingChanges[i]); *data << uint32(3000 + bg->m_ArenaTeamRatingChanges[i]); // rating change: showed value - 3000 *data << uint32(0); if(at) *data << at->GetName(); else//*/ *data << (uint8)0; } } if(bg->GetWinner() == 2) { *data << uint8(0); // bg in progress } else { *data << uint8(1); // bg ended *data << uint8(bg->GetWinner()); // who win } *data << (int32)(bg->GetPlayerScoresSize()); for(std::map::const_iterator itr = bg->GetPlayerScoresBegin(); itr != bg->GetPlayerScoresEnd(); ++itr) { *data << (uint64)itr->first; *data << (int32)itr->second->KillingBlows; Player *plr = objmgr.GetPlayer(itr->first); uint32 team = bg->GetPlayerTeam(itr->first); if(!team && plr) team = plr->GetTeam(); if(type == 0) { *data << (int32)itr->second->HonorableKills; *data << (int32)itr->second->Deaths; *data << (int32)(itr->second->BonusHonor*10); } else { // that part probably wrong if(plr) { if(team == HORDE) *data << uint8(0); else if(team == ALLIANCE) { *data << uint8(1); } else *data << uint8(0); } else *data << uint8(0); } *data << (int32)itr->second->DamageDone; // damage done *data << (int32)itr->second->HealingDone; // healing done switch(bg->GetTypeID()) // battleground specific things { case BATTLEGROUND_AV: *data << (uint32)0x00000005; // count of next fields *data << (uint32)((BattleGroundAVScore*)itr->second)->GraveyardsAssaulted; // GraveyardsAssaulted *data << (uint32)((BattleGroundAVScore*)itr->second)->GraveyardsDefended; // GraveyardsDefended *data << (uint32)((BattleGroundAVScore*)itr->second)->TowersAssaulted; // TowersAssaulted *data << (uint32)((BattleGroundAVScore*)itr->second)->TowersDefended; // TowersDefended *data << (uint32)((BattleGroundAVScore*)itr->second)->MinesCaptured; // MinesCaptured break; case BATTLEGROUND_WS: *data << (uint32)0x00000002; // count of next fields *data << (uint32)((BattleGroundWGScore*)itr->second)->FlagCaptures; // flag captures *data << (uint32)((BattleGroundWGScore*)itr->second)->FlagReturns; // flag returns break; case BATTLEGROUND_AB: *data << (uint32)0x00000002; // count of next fields *data << (uint32)((BattleGroundABScore*)itr->second)->BasesAssaulted; // bases asssulted *data << (uint32)((BattleGroundABScore*)itr->second)->BasesDefended; // bases defended break; case BATTLEGROUND_NA: case BATTLEGROUND_BE: case BATTLEGROUND_AA: case BATTLEGROUND_RL: *data << int32(0); break; default: sLog.outDebug("Unhandled MSG_PVP_LOG_DATA for BG id %u", bg->GetTypeID()); *data << (int32)0; break; } } }