aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-12 15:34:00 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-12 15:34:00 +0200
commit011e14bf057e8d395c171e15d2e2f916332caa0b (patch)
tree106f70da019b01dfa13cfc45ca3b6a98aa4402df /src
parent98f0e496c99b2a0666a167f2287712da75f3bfc8 (diff)
Core/PacketIO: Updated and enabled PVP_LOG_DATA
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/Arena.cpp8
-rw-r--r--src/server/game/Battlegrounds/ArenaScore.h100
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp92
-rw-r--r--src/server/game/Battlegrounds/Battleground.h10
-rw-r--r--src/server/game/Battlegrounds/BattlegroundScore.h67
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h7
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h13
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundBFG.h7
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h5
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h7
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h7
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundTP.h7
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h7
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp29
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp2
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp76
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h53
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h3
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);