Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
killerwife committed Sep 22, 2024
1 parent e65c5bb commit 258bb7f
Show file tree
Hide file tree
Showing 6 changed files with 132 additions and 85 deletions.
47 changes: 36 additions & 11 deletions src/game/BattleGround/BattleGroundDefines.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,49 @@

enum BattleGroundQueueGroupTypes
{
BG_QUEUE_PREMADE_ALLIANCE = 0,
BG_QUEUE_PREMADE_HORDE = 1,
BG_QUEUE_NORMAL_ALLIANCE = 2,
BG_QUEUE_NORMAL_HORDE = 3
BG_QUEUE_PREMADE_ALLIANCE = 0,
BG_QUEUE_PREMADE_HORDE = 1,
BG_QUEUE_NORMAL_ALLIANCE = 2,
BG_QUEUE_NORMAL_HORDE = 3
};

#define BG_QUEUE_GROUP_TYPES_COUNT 4

enum BattleGroundGroupJoinStatus
{
BG_GROUP_JOIN_STATUS_TEAM_LEFT_QUEUE = -7,
BG_GROUP_JOIN_STATUS_QUEUED_FOR_RATED = -6,
BG_GROUP_JOIN_STATUS_TEAM_LEFT_QUEUE = -7,
BG_GROUP_JOIN_STATUS_QUEUED_FOR_RATED = -6,
BG_GROUP_JOIN_STATUS_CANNOT_QUEUE_FOR_RATED = -5,
BG_GROUP_JOIN_STATUS_TOO_MANY_QUEUES = -4,
BG_GROUP_JOIN_STATUS_NOT_IN_TEAM = -3,
BG_GROUP_JOIN_STATUS_DESERTERS = -2,
BG_GROUP_JOIN_STATUS_NOT_ELIGIBLE = -1,
BG_GROUP_JOIN_STATUS_SUCCESS = 0,
BG_GROUP_JOIN_STATUS_TOO_MANY_QUEUES = -4,
BG_GROUP_JOIN_STATUS_NOT_IN_TEAM = -3,
BG_GROUP_JOIN_STATUS_DESERTERS = -2,
BG_GROUP_JOIN_STATUS_NOT_ELIGIBLE = -1,
BG_GROUP_JOIN_STATUS_SUCCESS = 0,
};

// indexes of BattlemasterList.dbc
enum BattleGroundTypeId
{
BATTLEGROUND_TYPE_NONE = 0,
BATTLEGROUND_AV = 1,
BATTLEGROUND_WS = 2,
BATTLEGROUND_AB = 3,
BATTLEGROUND_NA = 4,
BATTLEGROUND_BE = 5,
BATTLEGROUND_AA = 6, // all arenas
BATTLEGROUND_EY = 7,
BATTLEGROUND_RL = 8
};
#define MAX_BATTLEGROUND_TYPE_ID 9

enum ArenaType
{
ARENA_TYPE_NONE = 0, // used for mark non-arenas or problematic cases
ARENA_TYPE_2v2 = 2,
ARENA_TYPE_3v3 = 3,
ARENA_TYPE_5v5 = 5
};

inline bool IsArenaTypeValid(ArenaType type) { return type == ARENA_TYPE_2v2 || type == ARENA_TYPE_3v3 || type == ARENA_TYPE_5v5; }

#endif
34 changes: 17 additions & 17 deletions src/game/BattleGround/BattleGroundMgr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ void BattleGroundMgr::DeleteAllBattleGrounds()
@param diff
*/
void BattleGroundMgr::Update(uint32 diff)
void BattleGroundMgr::Update(uint32 /*diff*/)
{

}
Expand All @@ -98,11 +98,11 @@ void BattleGroundMgr::Update(uint32 diff)
@param arena type
@param arena team
*/
void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket& data, BattleGround* bg, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, ArenaType arenaType, Team arenaTeam) const
void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket& data, bool bgExists, uint32 bgTypeId, uint32 bgClientInstanceId, bool isRated, uint32 mapId, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, ArenaType arenaType, Team arenaTeam)
{
// we can be in 3 queues in same time...

if (statusId == 0 || !bg)
if (statusId == 0 || !bgExists)
{
data.Initialize(SMSG_BATTLEFIELD_STATUS, 4 + 8);
data << uint32(queueSlot); // queue id (0...2)
Expand All @@ -113,25 +113,25 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket& data, BattleGro
data.Initialize(SMSG_BATTLEFIELD_STATUS, (4 + 8 + 4 + 1 + 4 + 4 + 4));
data << uint32(queueSlot); // queue id (0...2) - player can be in 3 queues in time
// uint64 in client
data << uint64(uint64(arenaType) | (uint64(0x0D) << 8) | (uint64(bg->GetTypeId()) << 16) | (uint64(0x1F90) << 48));
data << uint32(bg->GetClientInstanceId());
data << uint64(uint64(arenaType) | (uint64(0x0D) << 8) | (uint64(bgTypeId) << 16) | (uint64(0x1F90) << 48));
data << uint32(bgClientInstanceId);
// alliance/horde for BG and skirmish/rated for Arenas
// following displays the minimap-icon 0 = faction icon 1 = arenaicon
data << uint8(bg->IsRated());
data << uint8(isRated);
data << uint32(statusId); // status

switch (statusId)
{
case STATUS_WAIT_QUEUE: // status_in_queue
case STATUS_WAIT_QUEUE: // status_in_queue
data << uint32(time1); // average wait time, milliseconds
data << uint32(time2); // time in queue, updated every minute!, milliseconds
break;
case STATUS_WAIT_JOIN: // status_invite
data << uint32(bg->GetMapId()); // map id
case STATUS_WAIT_JOIN: // status_invite
data << uint32(mapId); // map id
data << uint32(time1); // time to remove from queue, milliseconds
break;
case STATUS_IN_PROGRESS: // status_in_progress
data << uint32(bg->GetMapId()); // map id
case STATUS_IN_PROGRESS: // status_in_progress
data << uint32(mapId); // map id
data << uint32(time1); // time to bg auto leave, 0 at bg start, 120000 after bg end, milliseconds
data << uint32(time2); // time from bg start, milliseconds
data << uint8(arenaTeam == ALLIANCE ? 1 : 0); // arenaTeam (0 for horde, 1 for alliance)
Expand All @@ -148,7 +148,7 @@ void BattleGroundMgr::BuildBattleGroundStatusPacket(WorldPacket& data, BattleGro
@param packet
@param battleground
*/
void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket& data, BattleGround* bg) const
void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket& data, BattleGround* bg)
{
uint8 type = (bg->IsArena() ? 1 : 0);
// last check on 2.4.1
Expand Down Expand Up @@ -250,7 +250,7 @@ void BattleGroundMgr::BuildPvpLogDataPacket(WorldPacket& data, BattleGround* bg)
@param battleground type id
@param battleground group join status
*/
void BattleGroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket& data, BattleGroundTypeId bgTypeId, BattleGroundGroupJoinStatus status) const
void BattleGroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket& data, BattleGroundTypeId bgTypeId, BattleGroundGroupJoinStatus status)
{
data.Initialize(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
switch (status)
Expand All @@ -277,7 +277,7 @@ void BattleGroundMgr::BuildGroupJoinedBattlegroundPacket(WorldPacket& data, Batt
@param field
@param value
*/
void BattleGroundMgr::BuildUpdateWorldStatePacket(WorldPacket& data, uint32 field, uint32 value) const
void BattleGroundMgr::BuildUpdateWorldStatePacket(WorldPacket& data, uint32 field, uint32 value)
{
data.Initialize(SMSG_UPDATE_WORLD_STATE, 4 + 4);
data << uint32(field);
Expand All @@ -290,7 +290,7 @@ void BattleGroundMgr::BuildUpdateWorldStatePacket(WorldPacket& data, uint32 fiel
@param packet
@param sound id
*/
void BattleGroundMgr::BuildPlaySoundPacket(WorldPacket& data, uint32 soundId) const
void BattleGroundMgr::BuildPlaySoundPacket(WorldPacket& data, uint32 soundId)
{
data.Initialize(SMSG_PLAY_SOUND, 4);
data << uint32(soundId);
Expand All @@ -302,7 +302,7 @@ void BattleGroundMgr::BuildPlaySoundPacket(WorldPacket& data, uint32 soundId) co
@param packet
@param object guid
*/
void BattleGroundMgr::BuildPlayerLeftBattleGroundPacket(WorldPacket& data, ObjectGuid guid) const
void BattleGroundMgr::BuildPlayerLeftBattleGroundPacket(WorldPacket& data, ObjectGuid guid)
{
data.Initialize(SMSG_BATTLEGROUND_PLAYER_LEFT, 8);
data << ObjectGuid(guid);
Expand All @@ -314,7 +314,7 @@ void BattleGroundMgr::BuildPlayerLeftBattleGroundPacket(WorldPacket& data, Objec
@param packet
@param player
*/
void BattleGroundMgr::BuildPlayerJoinedBattleGroundPacket(WorldPacket& data, Player* player) const
void BattleGroundMgr::BuildPlayerJoinedBattleGroundPacket(WorldPacket& data, Player* player)
{
data.Initialize(SMSG_BATTLEGROUND_PLAYER_JOINED, 8);
data << player->GetObjectGuid();
Expand Down
14 changes: 7 additions & 7 deletions src/game/BattleGround/BattleGroundMgr.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ class BattleGroundMgr
void Update(uint32 /*diff*/);

/* Packet Building */
void BuildPlayerJoinedBattleGroundPacket(WorldPacket& /*data*/, Player* /*player*/) const;
void BuildPlayerLeftBattleGroundPacket(WorldPacket& /*data*/, ObjectGuid /*guid*/) const;
static void BuildPlayerJoinedBattleGroundPacket(WorldPacket& /*data*/, Player* /*player*/);
static void BuildPlayerLeftBattleGroundPacket(WorldPacket& /*data*/, ObjectGuid /*guid*/);
static void BuildGroupJoinedBattlegroundPacket(WorldPacket& /*data*/, BattleGroundTypeId /*bgTypeId*/, BattleGroundGroupJoinStatus /*status*/);
static void BuildUpdateWorldStatePacket(WorldPacket& /*data*/, uint32 /*field*/, uint32 /*value*/);
static void BuildPvpLogDataPacket(WorldPacket& /*data*/, BattleGround* /*bg*/);
static void BuildBattleGroundStatusPacket(WorldPacket& data, bool bgExists, uint32 bgTypeId, uint32 bgClientInstanceId, bool isRated, uint32 mapId, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, ArenaType arenaType, Team arenaTeam);
static void BuildPlaySoundPacket(WorldPacket& /*data*/, uint32 /*soundId*/);
void BuildBattleGroundListPacket(WorldPacket& /*data*/, ObjectGuid /*guid*/, Player* /*player*/, BattleGroundTypeId /*bgTypeId*/) const;
void BuildGroupJoinedBattlegroundPacket(WorldPacket& /*data*/, BattleGroundTypeId /*bgTypeId*/, BattleGroundGroupJoinStatus /*status*/) const;
void BuildUpdateWorldStatePacket(WorldPacket& /*data*/, uint32 /*field*/, uint32 /*value*/) const;
void BuildPvpLogDataPacket(WorldPacket& /*data*/, BattleGround* /*bg*/) const;
void BuildBattleGroundStatusPacket(WorldPacket& /*data*/, BattleGround* /*bg*/, uint8 /*queueSlot*/, uint8 /*statusId*/, uint32 /*time1*/, uint32 /*time2*/, ArenaType /*arenaType*/, Team /*arenaTeam*/) const;
void BuildPlaySoundPacket(WorldPacket& /*data*/, uint32 /*soundId*/) const;

/* Battlegrounds */
BattleGround* GetBattleGroundThroughClientInstance(uint32 /*instanceId*/, BattleGroundTypeId /*bgTypeId*/);
Expand Down
74 changes: 54 additions & 20 deletions src/game/BattleGround/BattleGroundQueue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -846,7 +846,7 @@ bool BattleGroundQueueItem::CheckSkirmishForSameFaction(BattleGroundBracketId br
@param isRated
@param arenaRating
*/
void BattleGroundQueueItem::Update(BattleGroundTypeId bgTypeId, BattleGroundBracketId bracketId, ArenaType arenaType, bool isRated, uint32 arenaRating)
void BattleGroundQueueItem::Update(BattleGroundQueue& queue, BattleGroundTypeId bgTypeId, BattleGroundBracketId bracketId, ArenaType arenaType, bool isRated, uint32 arenaRating)
{
// std::lock_guard<std::recursive_mutex> guard(m_Lock);
// if no players in queue - do nothing
Expand All @@ -859,7 +859,8 @@ void BattleGroundQueueItem::Update(BattleGroundTypeId bgTypeId, BattleGroundBrac
// battleground with free slot for player should be always in the beggining of the queue
// maybe it would be better to create bgfreeslotqueue for each bracket_id
BgFreeSlotQueueType::iterator next;
for (BgFreeSlotQueueType::iterator itr = sBattleGroundMgr.BgFreeSlotQueue[bgTypeId].begin(); itr != sBattleGroundMgr.BgFreeSlotQueue[bgTypeId].end(); itr = next)
auto queueItems = queue.GetFreeSlotQueueItem(bgTypeId);
for (BgFreeSlotQueueType::iterator itr = queueItems.begin(); itr != queueItems.end(); itr = next)
{
next = itr;
++next;
Expand Down Expand Up @@ -1153,19 +1154,35 @@ bool BgQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
if (!bg)
return;

bool bgExists = bg;
BattleGroundTypeId bgTypeId = event.m_bgTypeId;
uint32 bgInstanceId = bg->GetClientInstanceId();
bool isRated = bg->IsRated();
uint32 mapId = bg->GetMapId();

BattleGroundQueueTypeId bgQueueTypeId = BattleGroundMgr::BgQueueTypeId(bg->GetTypeId(), bg->GetArenaType());
uint32 queueSlot = plr->GetBattleGroundQueueIndex(bgQueueTypeId);
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue or in battleground
{
// check if player is invited to this bg
BattleGroundQueueItem& bgQueue = sBattleGroundMgr.m_battleGroundQueues[bgQueueTypeId];
if (bgQueue.IsPlayerInvited(event.m_playerGuid, event.m_bgInstanceGuid, event.m_removeTime))
sWorld.GetBGueue().GetMessager().AddMessage([playerGuid = event.m_playerGuid, bgTypeId, bgInstanceId, isRated, mapId, removeTime = event.m_removeTime, bgQueueTypeId, queueSlot, bgExists, arenaType = event.m_arenaType](BattleGroundQueue* queue)
{
WorldPacket data;
// we must send remaining time in queue
sBattleGroundMgr.BuildBattleGroundStatusPacket(data, bg, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, event.m_arenaType, TEAM_NONE);
plr->GetSession()->SendPacket(data);
}
// check if player is invited to this bg
BattleGroundQueueItem& bgQueue = queue->m_battleGroundQueues[bgQueueTypeId];
if (bgQueue.IsPlayerInvited(playerGuid, bgInstanceId, removeTime))
{
WorldPacket data;
// we must send remaining time in queue
BattleGroundMgr::BuildBattleGroundStatusPacket(data, bgExists, bgTypeId, bgInstanceId, isRated, mapId, queueSlot, STATUS_WAIT_JOIN, INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, 0, arenaType, TEAM_NONE);

sWorld.GetMessager().AddMessage([playerGuid, bgQueueTypeId, data](World* /*world*/)
{
if (Player* plr = sObjectMgr.GetPlayer(playerGuid))
{
plr->GetSession()->SendPacket(data);
}
});
}
});
}
});
return true; // event will be deleted
Expand Down Expand Up @@ -1200,28 +1217,40 @@ bool BgQueueRemoveEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
// bg pointer can be nullptr! so use it carefully!

bool isBattleGround = bg && bg->IsBattleGround();
bool bgExists = bg;
BattleGroundTypeId bgTypeId = event.m_bgTypeId;
uint32 bgInstanceId = bg ? bg->GetClientInstanceId() : 0;
bool isRated = bg ? bg->IsRated() : false;
uint32 mapId = bg ? bg->GetMapId() : 0;

uint32 queueSlot = plr->GetBattleGroundQueueIndex(event.m_bgQueueTypeId);
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue, or in Battleground
{
sWorld.GetBGueue().GetMessager().AddMessage([bgQueueTypeId = event.m_bgQueueTypeId, bgTypeId = , playerGuid = event.m_playerGuid, instanceGuid = event.m_bgInstanceGuid, removeTime = event.m_removeTime, isBattleGround](BattleGroundQueue* queue)
sWorld.GetBGueue().GetMessager().AddMessage([bgQueueTypeId = event.m_bgQueueTypeId, bgTypeId, bracketId = bg->GetBracketId(), playerGuid = event.m_playerGuid, instanceGuid = event.m_bgInstanceGuid, removeTime = event.m_removeTime, isBattleGround, queueSlot, bgStatus = bg->GetStatus(), bgExists, bgInstanceId, isRated, mapId](BattleGroundQueue* queue)
{
// check if player is in queue for this BG and if we are removing his invite event
BattleGroundQueueItem& bgQueue = queue->m_battleGroundQueues[bgQueueTypeId];
if (bgQueue.IsPlayerInvited(playerGuid, instanceGuid, removeTime))
{
DEBUG_LOG("Battleground: removing player %u from bg queue for instance %u because of not pressing enter battle in time.", playerGuid.GetCounter(), instanceGuid);

plr->RemoveBattleGroundQueueId(bgTypeId);
bgQueue.RemovePlayer(playerGuid, true);

// update queues if battleground isn't ended
if (isBattleGround && bg->GetStatus() != STATUS_WAIT_LEAVE)
queue->ScheduleQueueUpdate(0, ARENA_TYPE_NONE, bgQueueTypeId, bgTypeId, bg->GetBracketId());
if (isBattleGround && bgStatus != STATUS_WAIT_LEAVE)
queue->ScheduleQueueUpdate(0, ARENA_TYPE_NONE, bgQueueTypeId, bgTypeId, bracketId);

WorldPacket data;
sBattleGroundMgr.BuildBattleGroundStatusPacket(data, bg, queueSlot, STATUS_NONE, 0, 0, ARENA_TYPE_NONE, TEAM_NONE);
plr->GetSession()->SendPacket(data);
BattleGroundMgr::BuildBattleGroundStatusPacket(data, bgExists, bgTypeId, bgInstanceId, isRated, mapId, queueSlot, STATUS_NONE, 0, 0, ARENA_TYPE_NONE, TEAM_NONE);

sWorld.GetMessager().AddMessage([playerGuid, bgQueueTypeId, data](World* /*world*/)
{
if (Player* plr = sObjectMgr.GetPlayer(playerGuid))
{
plr->RemoveBattleGroundQueueId(bgQueueTypeId);
plr->GetSession()->SendPacket(data);
}
});
}
});
}
Expand Down Expand Up @@ -1269,7 +1298,7 @@ void BattleGroundQueue::Update()
BattleGroundTypeId bgTypeId = BattleGroundTypeId((i >> 8) & 255);
BattleGroundBracketId bracket_id = BattleGroundBracketId(i & 255);

m_battleGroundQueues[bgQueueTypeId].Update(bgTypeId, bracket_id, arenaType, arenaRating > 0, arenaRating);
m_battleGroundQueues[bgQueueTypeId].Update(*this, bgTypeId, bracket_id, arenaType, arenaRating > 0, arenaRating);
}
}

Expand All @@ -1281,9 +1310,9 @@ void BattleGroundQueue::Update()
{
// forced update for level 70 rated arenas
DEBUG_LOG("BattleGroundMgr: UPDATING ARENA QUEUES");
m_battleGroundQueues[BATTLEGROUND_QUEUE_2v2].Update(BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_2v2, true, 0);
m_battleGroundQueues[BATTLEGROUND_QUEUE_3v3].Update(BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_3v3, true, 0);
m_battleGroundQueues[BATTLEGROUND_QUEUE_5v5].Update(BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_5v5, true, 0);
m_battleGroundQueues[BATTLEGROUND_QUEUE_2v2].Update(*this, BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_2v2, true, 0);
m_battleGroundQueues[BATTLEGROUND_QUEUE_3v3].Update(*this, BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_3v3, true, 0);
m_battleGroundQueues[BATTLEGROUND_QUEUE_5v5].Update(*this, BATTLEGROUND_AA, BG_BRACKET_ID_FIRST, ARENA_TYPE_5v5, true, 0);

m_nextRatingDiscardUpdate = now + std::chrono::milliseconds(sWorld.getConfig(CONFIG_UINT32_ARENA_RATING_DISCARD_TIMER));
}
Expand Down Expand Up @@ -1386,3 +1415,8 @@ void BattleGroundQueue::ScheduleQueueUpdate(uint32 arenaRating, ArenaType arenaT
if (!found)
m_queueUpdateScheduler.push_back(schedule_id);
}

BgFreeSlotQueueType& BattleGroundQueue::GetFreeSlotQueueItem(BattleGroundTypeId bgTypeId)
{
return m_bgFreeSlotQueue[bgTypeId];
}
Loading

0 comments on commit 258bb7f

Please sign in to comment.