Skip to content

Commit

Permalink
Core/PacketIO: Converted BattlegroundPackets to classes
Browse files Browse the repository at this point in the history
  • Loading branch information
Shauren committed Feb 9, 2025
1 parent de9340c commit 8565ba9
Show file tree
Hide file tree
Showing 36 changed files with 1,190 additions and 648 deletions.
10 changes: 5 additions & 5 deletions src/server/game/Battlefield/Battlefield.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "Battlefield.h"
#include "BattlefieldMgr.h"
#include "Battleground.h"
#include "BattlegroundPackets.h"
#include "CellImpl.h"
#include "CreatureTextMgr.h"
#include "DBCStores.h"
Expand Down Expand Up @@ -630,11 +631,10 @@ void Battlefield::RemovePlayerFromResurrectQueue(ObjectGuid playerGuid)

void Battlefield::SendAreaSpiritHealerQueryOpcode(Player* player, ObjectGuid guid)
{
WorldPacket data(SMSG_AREA_SPIRIT_HEALER_TIME, 12);
uint32 time = m_LastResurrectTimer; // resurrect every 30 seconds

data << guid << time;
player->SendDirectMessage(&data);
WorldPackets::Battleground::AreaSpiritHealerTime areaSpiritHealerTime;
areaSpiritHealerTime.HealerGuid = guid;
areaSpiritHealerTime.TimeLeft = m_LastResurrectTimer;
player->SendDirectMessage(areaSpiritHealerTime.Write());
}

// ----------------------
Expand Down
34 changes: 9 additions & 25 deletions src/server/game/Battlegrounds/Arena.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,44 +18,28 @@
#include "Arena.h"
#include "ArenaScore.h"
#include "ArenaTeamMgr.h"
#include "BattlegroundPackets.h"
#include "Log.h"
#include "ObjectAccessor.h"
#include "Player.h"
#include "World.h"
#include "WorldSession.h"
#include "WorldStatePackets.h"

void ArenaScore::AppendToPacket(WorldPacket& data)
void ArenaScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData)
{
data << uint64(PlayerGuid);
playerData.PlayerGUID = PlayerGuid;

data << uint32(KillingBlows);
data << uint8(TeamId);
data << uint32(DamageDone);
data << uint32(HealingDone);
playerData.Kills = KillingBlows;
playerData.HonorOrFaction = TeamId;
playerData.DamageDone = DamageDone;
playerData.HealingDone = HealingDone;

BuildObjectivesBlock(data);
BuildObjectivesBlock(playerData);
}

void ArenaScore::BuildObjectivesBlock(WorldPacket& data)
void ArenaScore::BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& /*playerData*/)
{
data << uint32(0); // Objectives Count
}

void ArenaTeamScore::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(ratingLost);
data << uint32(ratingWon);
data << uint32(MatchmakerRating);
}

void ArenaTeamScore::BuildTeamInfoBlock(WorldPacket& data)
{
data << TeamName;
}

Arena::Arena()
Expand Down
11 changes: 3 additions & 8 deletions src/server/game/Battlegrounds/ArenaScore.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@
#include "BattlegroundScore.h"
#include <sstream>

struct TC_GAME_API ArenaScore : public BattlegroundScore
struct TC_GAME_API ArenaScore final : public BattlegroundScore
{
friend class Arena;

protected:
ArenaScore(ObjectGuid playerGuid, uint32 team) : BattlegroundScore(playerGuid), TeamId(team == ALLIANCE ? PVP_TEAM_ALLIANCE : PVP_TEAM_HORDE) { }

void AppendToPacket(WorldPacket& data) final override;
void BuildObjectivesBlock(WorldPacket& data) final override;
void AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData) override;
void BuildObjectivesBlock(WorldPackets::Battleground::PVPLogData_Player& playerData) override;

// For Logging purpose
std::string ToString() const override
Expand All @@ -50,8 +50,6 @@ struct TC_GAME_API ArenaTeamScore
protected:
ArenaTeamScore() : RatingChange(0), MatchmakerRating(0) { }

virtual ~ArenaTeamScore() { }

void Reset()
{
RatingChange = 0;
Expand All @@ -66,9 +64,6 @@ struct TC_GAME_API ArenaTeamScore
TeamName = teamName;
}

void BuildRatingInfoBlock(WorldPacket& data);
void BuildTeamInfoBlock(WorldPacket& data);

int32 RatingChange;
uint32 MatchmakerRating;
std::string TeamName;
Expand Down
7 changes: 4 additions & 3 deletions src/server/game/Battlegrounds/ArenaTeam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "ArenaTeam.h"
#include "ArenaTeamMgr.h"
#include "BattlegroundMgr.h"
#include "BattlegroundPackets.h"
#include "CalendarPackets.h"
#include "CharacterCache.h"
#include "DatabaseEnv.h"
Expand Down Expand Up @@ -337,11 +338,11 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb)
if (queue.GetPlayerGroupInfoData(playerMember->GetGUID(), &ginfo))
if (!ginfo.IsInvitedToBGInstanceGUID)
{
WorldPacket data;
playerMember->RemoveBattlegroundQueueId(bgQueue);
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, i, STATUS_NONE, 0, 0, 0, 0);
WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus;
BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, i);
queue.RemovePlayer(playerMember->GetGUID(), true);
playerMember->GetSession()->SendPacket(&data);
playerMember->SendDirectMessage(battlefieldStatus.Write());
}
}
}
Expand Down
110 changes: 58 additions & 52 deletions src/server/game/Battlegrounds/Battleground.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include "Battleground.h"
#include "ArenaScore.h"
#include "BattlegroundMgr.h"
#include "BattlegroundPackets.h"
#include "BattlegroundScore.h"
#include "ChatTextBuilder.h"
#include "Creature.h"
Expand All @@ -42,18 +43,21 @@
#include "WorldStatePackets.h"
#include <cstdarg>

void BattlegroundScore::AppendToPacket(WorldPacket& data)
void BattlegroundScore::AppendToPacket(WorldPackets::Battleground::PVPLogData_Player& playerData)
{
data << uint64(PlayerGuid);
playerData.PlayerGUID = PlayerGuid;

data << uint32(KillingBlows);
data << uint32(HonorableKills);
data << uint32(Deaths);
data << uint32(BonusHonor);
data << uint32(DamageDone);
data << uint32(HealingDone);
playerData.Kills = KillingBlows;
playerData.HonorOrFaction = WorldPackets::Battleground::PVPLogData_Honor
{
.HonorKills = HonorableKills,
.Deaths = Deaths,
.ContributionPoints = BonusHonor
};
playerData.DamageDone = DamageDone;
playerData.HealingDone = HealingDone;

BuildObjectivesBlock(data);
BuildObjectivesBlock(playerData);
}

template<class Do>
Expand Down Expand Up @@ -461,11 +465,10 @@ inline void Battleground::_ProcessJoin(uint32 diff)
if (Player* player = ObjectAccessor::FindPlayer(itr->first))
{
// BG Status packet
WorldPacket status;
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_TypeID, GetBracketId(), GetArenaType());
uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBGTeam());
player->SendDirectMessage(&status);
WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId);
player->SendDirectMessage(battlefieldStatus.Write());

player->RemoveAurasDueToSpell(SPELL_ARENA_PREPARATION);
player->ResetAllPowers();
Expand Down Expand Up @@ -716,8 +719,9 @@ void Battleground::EndBattleground(uint32 winner)
//we must set it this way, because end time is sent in packet!
m_EndTime = TIME_TO_AUTOREMOVE;

WorldPacket pvpLogData;
BuildPvPLogDataPacket(pvpLogData);
WorldPackets::Battleground::PVPMatchStatistics pvpMatchStatistics;
BuildPvPLogDataPacket(pvpMatchStatistics);
pvpMatchStatistics.Write();

BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());

Expand Down Expand Up @@ -798,11 +802,12 @@ void Battleground::EndBattleground(uint32 winner)

BlockMovement(player);

player->SendDirectMessage(&pvpLogData);
player->SendDirectMessage(pvpMatchStatistics.GetRawPacket());

WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId);
player->SendDirectMessage(battlefieldStatus.Write());

WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, TIME_TO_AUTOREMOVE, GetStartTime(), GetArenaType(), player->GetBGTeam());
player->SendDirectMessage(&data);
player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_BATTLEGROUND, player->GetMapId());
}
}
Expand Down Expand Up @@ -886,9 +891,9 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen

if (SendPacket)
{
WorldPacket data;
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_NONE, 0, 0, 0, 0);
player->SendDirectMessage(&data);
WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus;
BattlegroundMgr::BuildBattlegroundStatusNone(&battlefieldStatus, player->GetBattlegroundQueueIndex(bgQueueTypeId));
player->SendDirectMessage(battlefieldStatus.Write());
}

// this call is important, because player, when joins to battleground, this method is not called, so it must be called when leaving bg
Expand All @@ -910,9 +915,9 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId);
}
// Let others know
WorldPacket data;
sBattlegroundMgr->BuildPlayerLeftBattlegroundPacket(&data, guid);
SendPacketToTeam(team, &data, player, false);
WorldPackets::Battleground::BattlegroundPlayerLeft playerLeft;
playerLeft.Guid = guid;
SendPacketToTeam(team, playerLeft.Write(), player, false);
}

if (player)
Expand Down Expand Up @@ -1001,9 +1006,9 @@ void Battleground::AddPlayer(Player* player)
if (!isInBattleground)
UpdatePlayersCountByTeam(team, false); // +1 player

WorldPacket data;
sBattlegroundMgr->BuildPlayerJoinedBattlegroundPacket(&data, player);
SendPacketToTeam(team, &data, player, false);
WorldPackets::Battleground::BattlegroundPlayerJoined playerJoined;
playerJoined.Guid = player->GetGUID();
SendPacketToTeam(team, playerJoined.Write(), player, false);

player->RemoveAurasByType(SPELL_AURA_MOUNTED);

Expand Down Expand Up @@ -1200,33 +1205,33 @@ bool Battleground::HasFreeSlots() const
return GetPlayersSize() < GetMaxPlayers();
}

void Battleground::BuildPvPLogDataPacket(WorldPacket& data)
void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchStatistics& pvpLogData)
{
uint8 type = (isArena() ? 1 : 0);

data.Initialize(MSG_PVP_LOG_DATA, 1 + 1 + 4 + 40 * GetPlayerScoresSize());
data << uint8(type); // type (battleground = 0 / arena = 1)

if (type) // arena
if (isArena())
{
for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
_arenaTeamScores[i].BuildRatingInfoBlock(data);
WorldPackets::Battleground::PVPLogData_Arena& arena = pvpLogData.Arena.emplace();

for (uint8 i = 0; i < PVP_TEAMS_COUNT; ++i)
_arenaTeamScores[i].BuildTeamInfoBlock(data);
{
ArenaTeamScore const& score = _arenaTeamScores[i];

uint32 ratingLost = std::abs(std::min(score.RatingChange, 0));
uint32 ratingWon = std::max(score.RatingChange, 0);

// should be old rating, new rating, and client will calculate rating change itself
arena.Ratings.Prematch[i] = ratingLost;
arena.Ratings.Postmatch[i] = ratingWon;
arena.Ratings.PrematchMMR[i] = score.MatchmakerRating;

arena.TeamName[i] = score.TeamName;
}
}

if (GetStatus() == STATUS_WAIT_LEAVE)
{
data << uint8(1); // bg ended
data << uint8(GetWinner()); // who win
}
else
data << uint8(0); // bg not ended
pvpLogData.Winner = GetWinner();

data << uint32(GetPlayerScoresSize());
for (auto const& score : PlayerScores)
score.second->AppendToPacket(data);
for (auto const& [_, score] : PlayerScores)
score->AppendToPacket(pvpLogData.Players.emplace_back());
}

bool Battleground::UpdatePlayerScore(Player* player, uint32 type, uint32 value, bool doAddHonor)
Expand Down Expand Up @@ -1729,16 +1734,17 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)
if (GetStatus() != STATUS_WAIT_LEAVE)
return;

WorldPacket data;
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());

BlockMovement(player);

BuildPvPLogDataPacket(data);
player->SendDirectMessage(&data);
WorldPackets::Battleground::PVPMatchStatistics pvpMatchStatistics;
BuildPvPLogDataPacket(pvpMatchStatistics);
player->SendDirectMessage(pvpMatchStatistics.Write());

sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, this, player->GetBattlegroundQueueIndex(bgQueueTypeId), STATUS_IN_PROGRESS, GetEndTime(), GetStartTime(), GetArenaType(), player->GetBGTeam());
player->SendDirectMessage(&data);
WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
BattlegroundMgr::BuildBattlegroundStatusActive(&battlefieldStatus, this, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), bgQueueTypeId);
player->SendDirectMessage(battlefieldStatus.Write());
}

uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const
Expand Down
6 changes: 5 additions & 1 deletion src/server/game/Battlegrounds/Battleground.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@

namespace WorldPackets
{
namespace Battleground
{
class PVPMatchStatistics;
}
namespace WorldState
{
class InitWorldStates;
Expand Down Expand Up @@ -399,7 +403,7 @@ class TC_GAME_API 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::PVPMatchStatistics& 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; }
Expand Down
Loading

0 comments on commit 8565ba9

Please sign in to comment.