diff options
Diffstat (limited to 'src')
19 files changed, 240 insertions, 264 deletions
diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp index 6348359511b..ac6911681cb 100644 --- a/src/server/game/Battlegrounds/Arena.cpp +++ b/src/server/game/Battlegrounds/Arena.cpp @@ -172,8 +172,8 @@ void Arena::EndBattleground(uint32 winner) uint8 winnerTeam = winner == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE; uint8 loserTeam = winner == ALLIANCE ? BG_TEAM_HORDE : BG_TEAM_ALLIANCE; - _arenaTeamScores[winnerTeam].Assign(winnerChange, winnerMatchmakerRating, winnerArenaTeam->GetName()); - _arenaTeamScores[loserTeam].Assign(loserChange, loserMatchmakerRating, loserArenaTeam->GetName()); + _arenaTeamScores[winnerTeam].Assign(winnerTeamRating, winnerTeamRating + winnerChange, winnerMatchmakerRating); + _arenaTeamScores[loserTeam].Assign(loserTeamRating, loserTeamRating + loserChange, loserMatchmakerRating); TC_LOG_DEBUG("bg.arena", "Arena match Type: %u for Team1Id: %u - Team2Id: %u ended. WinnerTeamId: %u. Winner rating: +%d, Loser rating: %d", GetArenaType(), GetArenaTeamIdByIndex(TEAM_ALLIANCE), GetArenaTeamIdByIndex(TEAM_HORDE), winnerArenaTeam->GetId(), winnerChange, loserChange); @@ -190,8 +190,8 @@ void Arena::EndBattleground(uint32 winner) // Deduct 16 points from each teams arena-rating if there are no winners after 45+2 minutes else { - _arenaTeamScores[BG_TEAM_ALLIANCE].Assign(ARENA_TIMELIMIT_POINTS_LOSS, winnerMatchmakerRating, winnerArenaTeam->GetName()); - _arenaTeamScores[BG_TEAM_HORDE].Assign(ARENA_TIMELIMIT_POINTS_LOSS, loserMatchmakerRating, loserArenaTeam->GetName()); + _arenaTeamScores[BG_TEAM_ALLIANCE].Assign(winnerTeamRating, winnerTeamRating + ARENA_TIMELIMIT_POINTS_LOSS, winnerMatchmakerRating); + _arenaTeamScores[BG_TEAM_HORDE].Assign(loserTeamRating, loserTeamRating + ARENA_TIMELIMIT_POINTS_LOSS, loserMatchmakerRating); winnerArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); loserArenaTeam->FinishGame(ARENA_TIMELIMIT_POINTS_LOSS); diff --git a/src/server/game/Battlegrounds/ArenaScore.h b/src/server/game/Battlegrounds/ArenaScore.h index a5f032777ac..67666104d46 100644 --- a/src/server/game/Battlegrounds/ArenaScore.h +++ b/src/server/game/Battlegrounds/ArenaScore.h @@ -30,68 +30,7 @@ struct ArenaScore : public BattlegroundScore protected: ArenaScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid, team), TeamId(team == ALLIANCE ? BG_TEAM_ALLIANCE : BG_TEAM_HORDE) { } - void AppendToPacket(WorldPacket& data, ByteBuffer& content) final override - { - uint32 primaryTree = 0; - /* TODO: 6.x update to new talent system (and probably rewrite this packet) - if (Player* player = ObjectAccessor::FindPlayer(PlayerGuid)) - primaryTree = player->GetPrimaryTalentTree(player->GetActiveSpec());*/ - - data.WriteBit(0); // Unk 1 - data.WriteBit(0); // Unk 2 - data.WriteBit(PlayerGuid[2]); - data.WriteBit(/*!IsArena*/ 0); // IsArena - data.WriteBit(0); // Unk 4 - data.WriteBit(0); // Unk 5 - data.WriteBit(0); // Unk 6 - data.WriteBit(PlayerGuid[3]); - data.WriteBit(PlayerGuid[0]); - data.WriteBit(PlayerGuid[5]); - data.WriteBit(PlayerGuid[1]); - data.WriteBit(PlayerGuid[6]); - data.WriteBit(TeamId); - data.WriteBit(PlayerGuid[7]); - - content << uint32(HealingDone); // healing done - content << uint32(DamageDone); // damage done - - content.WriteByteSeq(PlayerGuid[4]); - content << uint32(KillingBlows); - - //if (unk5) - // content << int32(RatingChange); // RatingChange - - content.WriteByteSeq(PlayerGuid[5]); - - //if (unk 6) - // content << uint32(); - - //if (unk 2) - // content << uint32(); - - content.WriteByteSeq(PlayerGuid[1]); - content.WriteByteSeq(PlayerGuid[6]); - - content << int32(primaryTree); - - BuildObjectivesBlock(data, content); - - data.WriteBit(PlayerGuid[4]); - - content.WriteByteSeq(PlayerGuid[0]); - content.WriteByteSeq(PlayerGuid[3]); - - //if (unk 4) - // content << uint32() unk - - content.WriteByteSeq(PlayerGuid[7]); - content.WriteByteSeq(PlayerGuid[2]); - } - - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& /*content*/) final override - { - data.WriteBits(0, 24); // Objectives Count - } + void BuildObjectivesBlock(std::vector<int32>& /*stats*/) override { } // For Logging purpose std::string ToString() const override @@ -110,48 +49,27 @@ struct ArenaTeamScore friend class Battleground; protected: - ArenaTeamScore() : RatingChange(0), MatchmakerRating(0) { } + ArenaTeamScore() : OldRating(0), NewRating(0), MatchmakerRating(0) { } virtual ~ArenaTeamScore() { } void Reset() { - RatingChange = 0; + OldRating = 0; + NewRating = 0; MatchmakerRating = 0; - TeamName.clear(); } - void Assign(int32 ratingChange, uint32 matchMakerRating, std::string const& teamName) + void Assign(int32 oldRating, int32 newRating, uint32 matchMakerRating) { - RatingChange = ratingChange; + OldRating = oldRating; + NewRating = newRating; MatchmakerRating = matchMakerRating; - TeamName = teamName; - } - - void BuildRatingInfoBlock(WorldPacket& data) - { - uint32 ratingLost = std::abs(std::min(RatingChange, 0)); - uint32 ratingWon = std::max(RatingChange, 0); - - // should be old rating, new rating, and client will calculate rating change itself - data << uint32(MatchmakerRating); - data << uint32(ratingLost); - data << uint32(ratingWon); - } - - void BuildTeamInfoLengthBlock(WorldPacket& data) - { - data.WriteBits(TeamName.length(), 8); - } - - void BuildTeamInfoBlock(WorldPacket& data) - { - data.WriteString(TeamName); } - int32 RatingChange; + int32 OldRating; + int32 NewRating; uint32 MatchmakerRating; - std::string TeamName; }; #endif // TRINITY_ARENA_SCORE_H diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index db7d2192b84..02050c8087b 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -38,6 +38,7 @@ #include "Util.h" #include "WorldPacket.h" #include "Transport.h" +#include "BattlegroundPackets.h" namespace Trinity { @@ -786,7 +787,7 @@ void Battleground::EndBattleground(uint32 winner) //we must set it this way, because end time is sent in packet! SetRemainingTime(TIME_AUTOCLOSE_BATTLEGROUND); - WorldPacket pvpLogData; + WorldPackets::Battleground::PVPLogData pvpLogData; BuildPvPLogDataPacket(pvpLogData); BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); @@ -882,7 +883,7 @@ void Battleground::EndBattleground(uint32 winner) BlockMovement(player); - player->SendDirectMessage(&pvpLogData); + player->SendDirectMessage(pvpLogData.Write()); WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); @@ -1296,53 +1297,65 @@ bool Battleground::HasFreeSlots() const return GetPlayersSize() < GetMaxPlayers(); } -void Battleground::BuildPvPLogDataPacket(WorldPacket& data) +void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData& pvpLogData) { - ByteBuffer buff; + if (GetStatus() == STATUS_WAIT_LEAVE) + pvpLogData.Winner.Set(GetWinner()); - data.Initialize(SMSG_PVP_LOG_DATA, (1 + 1 + 4 + 40 * GetPlayerScoresSize())); + pvpLogData.Players.reserve(GetPlayerScoresSize()); + for (auto const& score : PlayerScores) + { + WorldPackets::Battleground::PVPLogData::PlayerData playerData; - data.WriteBit(isRated()); - data.WriteBit(isArena()); + playerData.PlayerGUID = score.second->PlayerGuid; + playerData.Kills = score.second->KillingBlows; + playerData.Faction = score.second->TeamId; + if (score.second->HonorableKills || score.second->Deaths || score.second->BonusHonor) + { + WorldPackets::Battleground::PVPLogData::HonorData& honorData = playerData.Honor.Value; + honorData.HonorKills = score.second->HonorableKills; + honorData.Deaths = score.second->Deaths; + honorData.ContributionPoints = score.second->BonusHonor; - if (isArena()) - { - // it seems this must be according to BG_WINNER_A/H and _NOT_ TEAM_A/H - for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) - _arenaTeamScores[i].BuildTeamInfoLengthBlock(data); - } + playerData.Honor.HasValue = true; + } - size_t countPos = data.bitwpos(); - data.WriteBits(0, 21); - for (auto const& score : PlayerScores) - score.second->AppendToPacket(data, buff); + playerData.DamageDone = score.second->DamageDone; + playerData.HealingDone = score.second->HealingDone; + score.second->BuildObjectivesBlock(playerData.Stats); - data.PutBits(countPos, GetPlayerScoresSize(), 21); - data.WriteBit(GetStatus() == STATUS_WAIT_LEAVE); // If Ended + if (Player* player = ObjectAccessor::GetObjectInMap(playerData.PlayerGUID, GetBgMap(), (Player*)nullptr)) + { + playerData.IsInWorld = true; + playerData.PrimaryTalentTree = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); + } - if (isRated()) - { - // it seems this must be according to BG_WINNER_A/H and _NOT_ BG_TEAM_A/H - for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) - _arenaTeamScores[i].BuildRatingInfoBlock(data); - } + //if (isRated()) + //{ + // playerData.PreMatchRating; + // playerData.RatingChange; + // playerData.PreMatchMMR; + // playerData.MmrChange; + //} - data.FlushBits(); - data.append(buff); + pvpLogData.Players.push_back(playerData); + } - if (isArena()) + if (isRated()) { - // it seems this must be according to BG_WINNER_A/H and _NOT_ TEAM_A/H + WorldPackets::Battleground::PVPLogData::RatingData& ratingData = pvpLogData.Ratings.Value; for (uint8 i = 0; i < BG_TEAMS_COUNT; ++i) - _arenaTeamScores[i].BuildTeamInfoBlock(data); - } - - data << uint8(GetPlayersCountByTeam(HORDE)); + { + ratingData.Postmatch[i] = _arenaTeamScores[i].NewRating; + ratingData.Prematch[i] = _arenaTeamScores[i].OldRating; + ratingData.PrematchMMR[i] = _arenaTeamScores[i].MatchmakerRating; + } - if (GetStatus() == STATUS_WAIT_LEAVE) - data << uint8(GetWinner()); + pvpLogData.Ratings.HasValue = true; + } - data << uint8(GetPlayersCountByTeam(ALLIANCE)); + pvpLogData.PlayerCount[0] = int8(GetPlayersCountByTeam(HORDE)); + pvpLogData.PlayerCount[1] = int8(GetPlayersCountByTeam(ALLIANCE)); } bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor) @@ -1811,14 +1824,15 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player) if (GetStatus() != STATUS_WAIT_LEAVE) return; - WorldPacket data; + WorldPackets::Battleground::PVPLogData pvpLogData; BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType()); BlockMovement(player); - BuildPvPLogDataPacket(data); - player->SendDirectMessage(&data); + BuildPvPLogDataPacket(pvpLogData); + player->SendDirectMessage(pvpLogData.Write()); + WorldPacket data; sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, player->GetBattlegroundQueueJoinTime(GetTypeID()), GetElapsedTime(), GetArenaType()); player->SendDirectMessage(&data); } diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h index e5692c3eb02..0fe95a0c7a5 100644 --- a/src/server/game/Battlegrounds/Battleground.h +++ b/src/server/game/Battlegrounds/Battleground.h @@ -40,6 +40,14 @@ class BattlegroundMap; struct PvPDifficultyEntry; struct WorldSafeLocsEntry; +namespace WorldPackets +{ + namespace Battleground + { + class PVPLogData; + } +} + enum BattlegroundCriteriaId { BG_CRITERIA_CHECK_RESILIENT_VICTORY, @@ -376,7 +384,7 @@ class Battleground Group* GetBgRaid(uint32 TeamID) const { return TeamID == ALLIANCE ? m_BgRaids[TEAM_ALLIANCE] : m_BgRaids[TEAM_HORDE]; } void SetBgRaid(uint32 TeamID, Group* bg_raid); - void BuildPvPLogDataPacket(WorldPacket& data); + void BuildPvPLogDataPacket(WorldPackets::Battleground::PVPLogData& pvpLogData); virtual bool UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor = true); static TeamId GetTeamIndexByTeamId(uint32 Team) { return Team == ALLIANCE ? TEAM_ALLIANCE : TEAM_HORDE; } diff --git a/src/server/game/Battlegrounds/BattlegroundScore.h b/src/server/game/Battlegrounds/BattlegroundScore.h index 309c8bff17f..efaaa25c974 100644 --- a/src/server/game/Battlegrounds/BattlegroundScore.h +++ b/src/server/game/Battlegrounds/BattlegroundScore.h @@ -90,72 +90,7 @@ struct BattlegroundScore } } - virtual void AppendToPacket(WorldPacket& data, ByteBuffer& content) - { - uint32 primaryTree = 0; - /* TODO: 6.x update to new talent system (and probably rewrite this packet) - if (Player* player = ObjectAccessor::FindPlayer(PlayerGuid)) - primaryTree = player->GetPrimaryTalentTree(player->GetActiveSpec());*/ - - data.WriteBit(0); // Unk 1 - data.WriteBit(0); // Unk 2 - data.WriteBit(PlayerGuid[2]); - data.WriteBit(/*!IsArena*/ 1); // IsArena - data.WriteBit(0); // Unk 4 - data.WriteBit(0); // Unk 5 - data.WriteBit(0); // Unk 6 - data.WriteBit(PlayerGuid[3]); - data.WriteBit(PlayerGuid[0]); - data.WriteBit(PlayerGuid[5]); - data.WriteBit(PlayerGuid[1]); - data.WriteBit(PlayerGuid[6]); - data.WriteBit(TeamId); - data.WriteBit(PlayerGuid[7]); - - content << uint32(HealingDone); // healing done - content << uint32(DamageDone); // damage done - - //if (!IsArena) - //{ - content << uint32(BonusHonor / 100); - content << uint32(Deaths); - content << uint32(HonorableKills); - //} - - content.WriteByteSeq(PlayerGuid[4]); - content << uint32(KillingBlows); - - //if (unk 5) - // data << uint32() unk - - content.WriteByteSeq(PlayerGuid[5]); - - //if (unk 6) - // data << uint32() unk - - //if (unk 2) - // data << uint32() unk - - content.WriteByteSeq(PlayerGuid[1]); - content.WriteByteSeq(PlayerGuid[6]); - - content << int32(primaryTree); - - BuildObjectivesBlock(data, content); - - data.WriteBit(PlayerGuid[4]); - - content.WriteByteSeq(PlayerGuid[0]); - content.WriteByteSeq(PlayerGuid[3]); - - //if (unk 4) - // data << uint32() unk - - content.WriteByteSeq(PlayerGuid[7]); - content.WriteByteSeq(PlayerGuid[2]); - } - - virtual void BuildObjectivesBlock(WorldPacket& /*data*/, ByteBuffer& /*content*/) = 0; + virtual void BuildObjectivesBlock(std::vector<int32>& /*stats*/) = 0; // For Logging purpose virtual std::string ToString() const { return ""; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h index b0b06acaab6..48b2b94951c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h @@ -260,11 +260,10 @@ struct BattlegroundABScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(2, 24); // Objectives Count - content << uint32(BasesAssaulted); - content << uint32(BasesDefended); + stats.push_back(BasesAssaulted); + stats.push_back(BasesDefended); } uint32 GetAttr1() const final override { return BasesAssaulted; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h index 533c41a2ed2..93516279cb0 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h @@ -1581,14 +1581,13 @@ struct BattlegroundAVScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(5, 24); // Objectives Count - content << uint32(GraveyardsAssaulted); - content << uint32(GraveyardsDefended); - content << uint32(TowersAssaulted); - content << uint32(TowersDefended); - content << uint32(MinesCaptured); + stats.push_back(GraveyardsAssaulted); + stats.push_back(GraveyardsDefended); + stats.push_back(TowersAssaulted); + stats.push_back(TowersDefended); + stats.push_back(MinesCaptured); } uint32 GetAttr1() const final override { return GraveyardsAssaulted; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h index 993ffb37190..3694c62d663 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundBFG.h @@ -42,11 +42,10 @@ class BattlegroundBFGScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final + void BuildObjectivesBlock(std::vector<int32>& stats) { - data.WriteBits(2, 24); // Objectives Count - content << uint32(BasesAssaulted); - content << uint32(BasesDefended); + stats.push_back(BasesAssaulted); + stats.push_back(BasesDefended); } uint32 GetAttr1() const final override { return BasesAssaulted; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h index 53f5c9aa44f..d6a2991f01d 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h @@ -343,10 +343,9 @@ struct BattlegroundEYScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(1, 24); // Objectives Count - content << uint32(FlagCaptures); + stats.push_back(FlagCaptures); } uint32 GetAttr1() const final override { return FlagCaptures; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h index 36c5a460a34..64025cb8a4c 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h @@ -905,11 +905,10 @@ struct BattlegroundICScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(2, 24); // Objectives Count - content << uint32(BasesAssaulted); - content << uint32(BasesDefended); + stats.push_back(BasesAssaulted); + stats.push_back(BasesDefended); } uint32 GetAttr1() const final override { return BasesAssaulted; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 21c666c94ab..0877da8781a 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -531,11 +531,10 @@ struct BattlegroundSAScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(2, 24); // Objectives Count - content << uint32(DemolishersDestroyed); - content << uint32(GatesDestroyed); + stats.push_back(DemolishersDestroyed); + stats.push_back(GatesDestroyed); } uint32 GetAttr1() const final override { return DemolishersDestroyed; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h index a7e35ef2438..b11485d6025 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundTP.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundTP.h @@ -42,11 +42,10 @@ class BattlegroundTPScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final + void BuildObjectivesBlock(std::vector<int32>& stats) { - data.WriteBits(2, 24); // Objectives Count - content << uint32(FlagCaptures); - content << uint32(FlagReturns); + stats.push_back(FlagCaptures); + stats.push_back(FlagReturns); } uint32 GetAttr1() const final override { return FlagCaptures; } diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h index 734a42174a6..3736c01b045 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h @@ -170,11 +170,10 @@ struct BattlegroundWGScore final : public BattlegroundScore } } - void BuildObjectivesBlock(WorldPacket& data, ByteBuffer& content) final override + void BuildObjectivesBlock(std::vector<int32>& stats) override { - data.WriteBits(2, 24); // Objectives Count - content << uint32(FlagCaptures); - content << uint32(FlagReturns); + stats.push_back(FlagCaptures); + stats.push_back(FlagReturns); } uint32 GetAttr1() const final override { return FlagCaptures; } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 96bf04092e8..0b9bf2f5d65 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -271,8 +271,6 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvData*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEGROUND_PLAYER_POSITIONS Message"); - Battleground* bg = _player->GetBattleground(); if (!bg) // can't be received if player not in battleground return; @@ -361,10 +359,8 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa SendPacket(&data); } -void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogDataRequest& /*pvpLogDataRequest*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_PVP_LOG_DATA Message"); - Battleground* bg = _player->GetBattleground(); if (!bg) return; @@ -373,17 +369,13 @@ void WorldSession::HandlePVPLogDataOpcode(WorldPacket & /*recvData*/) if (bg->isArena()) return; - WorldPacket data; - bg->BuildPvPLogDataPacket(data); - SendPacket(&data); - - TC_LOG_DEBUG("network", "WORLD: Sent SMSG_PVP_LOG_DATA Message"); + WorldPackets::Battleground::PVPLogData pvpLogData; + bg->BuildPvPLogDataPacket(pvpLogData); + SendPacket(pvpLogData.Write()); } void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recvData) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_LIST Message"); - uint32 bgTypeId; recvData >> bgTypeId; // id from DBC @@ -401,8 +393,6 @@ void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recvData) void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_PORT Message"); - uint32 time; uint32 queueSlot; uint32 unk; @@ -591,8 +581,6 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/) { - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_LEAVE Message"); - // not allow leave battleground in combat if (_player->IsInCombat()) if (Battleground* bg = _player->GetBattleground()) @@ -604,9 +592,6 @@ void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/) void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData*/) { - // empty opcode - TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_STATUS Message"); - WorldPacket data; // we must update all queues here Battleground* bg = NULL; @@ -669,8 +654,6 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData* void WorldSession::HandleBattlemasterJoinArena(WorldPacket& recvData) { - TC_LOG_DEBUG("network", "WORLD: CMSG_BATTLEMASTER_JOIN_ARENA"); - uint8 arenaslot; // 2v2, 3v3 or 5v5 recvData >> arenaslot; @@ -793,8 +776,6 @@ void WorldSession::HandleReportPvPAFK(WorldPacket& recvData) void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPacket& recvData) { - TC_LOG_DEBUG("network", "WORLD: CMSG_REQUEST_RATED_BATTLEFIELD_INFO"); - uint8 unk; recvData >> unk; @@ -827,8 +808,6 @@ void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPacket& recvData) void WorldSession::HandleGetPVPOptionsEnabled(WorldPacket& /*recvData*/) { - TC_LOG_DEBUG("network", "WORLD: CMSG_GET_PVP_OPTIONS_ENABLED"); - /// @Todo: perfome research in this case WorldPacket data(SMSG_PVP_OPTIONS_ENABLED, 1); data.WriteBit(1); diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp index 2e07664f5c9..5507887625b 100644 --- a/src/server/game/Handlers/ChatHandler.cpp +++ b/src/server/game/Handlers/ChatHandler.cpp @@ -492,7 +492,7 @@ void WorldSession::HandleChatAddonMessage(ChatMsg type, std::string prefix, std: { if (ChannelMgr* cMgr = ChannelMgr::ForTeam(sender->GetTeam())) if (Channel* chn = cMgr->GetChannel(target, sender, false)) - chn->Say(sender->GetGUID(), text.c_str(), LANG_ADDON); + chn->Say(sender->GetGUID(), text.c_str(), uint32(LANG_ADDON)); break; } default: diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 9bf63aec21c..e11fd9c1ac8 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -34,3 +34,79 @@ void WorldPackets::Battleground::AreaSpiritHealerQueue::Read() { _worldPacket >> HealerGuid; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::RatingData const& ratingData) +{ + data.append(ratingData.Prematch, 2); + data.append(ratingData.Postmatch, 2); + data.append(ratingData.PrematchMMR, 2); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::HonorData const& honorData) +{ + data << uint32(honorData.HonorKills); + data << uint32(honorData.Deaths); + data << uint32(honorData.ContributionPoints); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::PVPLogData::PlayerData const& playerData) +{ + data << playerData.PlayerGUID; + data << uint32(playerData.Kills); + data << uint32(playerData.DamageDone); + data << uint32(playerData.HealingDone); + data << uint32(playerData.Stats.size()); + data << int32(playerData.PrimaryTalentTree); + data << uint32(playerData.PrimaryTalentTreeNameIndex); + if (!playerData.Stats.empty()) + data.append(playerData.Stats.data(), playerData.Stats.size()); + + data.WriteBit(playerData.Faction); + data.WriteBit(playerData.IsInWorld); + data.WriteBit(playerData.Honor.HasValue); + data.WriteBit(playerData.PreMatchRating.HasValue); + data.WriteBit(playerData.RatingChange.HasValue); + data.WriteBit(playerData.PreMatchMMR.HasValue); + data.WriteBit(playerData.MmrChange.HasValue); + data.FlushBits(); + + if (playerData.Honor.HasValue) + data << playerData.Honor.Value; + + if (playerData.PreMatchRating.HasValue) + data << uint32(playerData.PreMatchRating.Value); + + if (playerData.RatingChange.HasValue) + data << uint32(playerData.RatingChange.Value); + + if (playerData.PreMatchMMR.HasValue) + data << uint32(playerData.PreMatchMMR.Value); + + if (playerData.MmrChange.HasValue) + data << uint32(playerData.MmrChange.Value); + + return data; +} + +WorldPacket const* WorldPackets::Battleground::PVPLogData::Write() +{ + _worldPacket.reserve(Players.size() * sizeof(PlayerData) + sizeof(PVPLogData)); + + _worldPacket.WriteBit(Ratings.HasValue); + _worldPacket.WriteBit(Winner.HasValue); + _worldPacket << uint32(Players.size()); + _worldPacket.append(PlayerCount, 2); + + if (Ratings.HasValue) + _worldPacket << Ratings.Value; + + if (Winner.HasValue) + _worldPacket << uint8(Winner.Value); + + for (PlayerData const& player : Players) + _worldPacket << player; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index a71f4164fd7..8620112f548 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -63,6 +63,59 @@ namespace WorldPackets void Read() override { } }; + + class PVPLogDataRequest final : public ClientPacket + { + public: + PVPLogDataRequest(WorldPacket&& packet) : ClientPacket(CMSG_PVP_LOG_DATA, std::move(packet)) { } + + void Read() override { } + }; + + class PVPLogData final : public ServerPacket + { + public: + PVPLogData() : ServerPacket(SMSG_PVP_LOG_DATA, 0) { } + + WorldPacket const* Write() override; + + struct RatingData + { + int32 Prematch[2] = { }; + int32 Postmatch[2] = { }; + int32 PrematchMMR[2] = { }; + }; + + struct HonorData + { + uint32 HonorKills = 0; + uint32 Deaths = 0; + uint32 ContributionPoints = 0; + }; + + struct PlayerData + { + ObjectGuid PlayerGUID; + uint32 Kills = 0; + uint8 Faction = 0; + bool IsInWorld = false; + Optional<HonorData> Honor; + uint32 DamageDone = 0; + uint32 HealingDone = 0; + Optional<uint32> PreMatchRating; + Optional<int32> RatingChange; + Optional<uint32> PreMatchMMR; + Optional<int32> MmrChange; + std::vector<int32> Stats; + int32 PrimaryTalentTree = 0; + uint32 PrimaryTalentTreeNameIndex = 0; // controls which name field from ChrSpecialization.dbc will be sent to lua + }; + + Optional<uint8> Winner; + std::vector<PlayerData> Players; + Optional<RatingData> Ratings; + int8 PlayerCount[2] = { }; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index cfe33b986f5..523cdec7032 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -616,7 +616,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_PROTOCOL_MISMATCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PUSH_QUEST_TO_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_PVP_LOG_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandlePVPLogDataOpcode ); + DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::PVPLogDataRequest, &WorldSession::HandlePVPLogDataOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseLocationFromClient, &WorldSession::HandleQueryCorpseLocation); DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseTransport, &WorldSession::HandleQueryCorpseTransport); @@ -1495,7 +1495,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c31b913b68d..9f8cc42e163 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -109,6 +109,7 @@ namespace WorldPackets class AreaSpiritHealerQuery; class AreaSpiritHealerQueue; class HearthAndResurrect; + class PVPLogDataRequest; } namespace BlackMarket @@ -1271,7 +1272,7 @@ class WorldSession void HandleBattlemasterHelloOpcode(WorldPacket& recvData); void HandleBattlemasterJoinOpcode(WorldPacket& recvData); void HandleBattlegroundPlayerPositionsOpcode(WorldPacket& recvData); - void HandlePVPLogDataOpcode(WorldPacket& recvData); + void HandlePVPLogDataOpcode(WorldPackets::Battleground::PVPLogDataRequest& pvpLogDataRequest); void HandleBattleFieldPortOpcode(WorldPacket& recvData); void HandleBattlefieldListOpcode(WorldPacket& recvData); void HandleBattlefieldLeaveOpcode(WorldPacket& recvData); |