aboutsummaryrefslogtreecommitdiff
path: root/src/game/BattleGroundHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/BattleGroundHandler.cpp')
-rw-r--r--src/game/BattleGroundHandler.cpp152
1 files changed, 67 insertions, 85 deletions
diff --git a/src/game/BattleGroundHandler.cpp b/src/game/BattleGroundHandler.cpp
index dc7fd519182..6e38362ef66 100644
--- a/src/game/BattleGroundHandler.cpp
+++ b/src/game/BattleGroundHandler.cpp
@@ -117,14 +117,16 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data)
if (!bracketEntry)
return;
- // check queueing conditions
+ GroupJoinBattlegroundResult err;
+
+ // check queue conditions
if (!joinAsGroup)
{
// check Deserter debuff
if (!_player->CanJoinToBattleground())
{
- WorldPacket data(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
- data << uint32(0xFFFFFFFE);
+ WorldPacket data;
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
_player->GetSession()->SendPacket(&data);
return;
}
@@ -142,13 +144,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data)
// no group found, error
if (!grp)
return;
- uint32 err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0);
- isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());
- if (err != BG_JOIN_ERR_OK)
- {
- SendBattleGroundOrArenaJoinError(err);
+ if (grp->GetLeaderGUID() != _player->GetGUID())
return;
- }
+ err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0);
+ isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());
}
// if we're here, then the conditions to join a bg are met. We can proceed in joining.
@@ -156,21 +155,37 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket & recv_data)
BattleGroundQueue& bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
if (joinAsGroup /* && _player->GetGroup()*/)
{
- sLog.outDebug("Battleground: the following players are joining as group:");
- GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0);
- uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
+ GroupQueueInfo * ginfo;
+ uint32 avgTime;
+
+ if(err > 0)
+ {
+ sLog.outDebug("Battleground: the following players are joining as group:");
+ ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, 0, false, isPremade, 0);
+ avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
+ }
+
for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player *member = itr->getSource();
if (!member) continue; // this should never happen
- uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId); // add to queue
-
WorldPacket data;
- // send status packet (in queue)
+
+ if(err <= 0)
+ {
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
+ member->GetSession()->SendPacket(&data);
+ continue;
+ }
+
+ // add to queue
+ uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);
+
+ // send status packet (in queue)
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, ginfo->ArenaType);
member->GetSession()->SendPacket(&data);
- sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
member->GetSession()->SendPacket(&data);
sLog.outDebug("Battleground: player joined queue for bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
}
@@ -364,8 +379,8 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recv_data)
if (!_player->CanJoinToBattleground())
{
//send bg command result to show nice message
- WorldPacket data2(SMSG_GROUP_JOINED_BATTLEGROUND, 4);
- data2 << uint32(0xFFFFFFFE);
+ WorldPacket data2;
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data2, ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS);
_player->GetSession()->SendPacket(&data2);
action = 0;
sLog.outDebug("Battleground: player %s (%u) has a deserter debuff, do not port him to battleground!", _player->GetName(), _player->GetGUIDLow());
@@ -635,7 +650,8 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
if (!bracketEntry)
return;
- // check queueing conditions
+ GroupJoinBattlegroundResult err;
+
if (!asGroup)
{
// check if already in queue
@@ -652,12 +668,9 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
// no group found, error
if (!grp)
return;
- uint32 err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot);
- if (err != BG_JOIN_ERR_OK)
- {
- SendBattleGroundOrArenaJoinError(err);
- return;
- }
+ if (grp->GetLeaderGUID() != _player->GetGUID())
+ return;
+ err = grp->CanJoinBattleGroundQueue(bg, bgQueueTypeId, arenatype, arenatype, (bool)isRated, arenaslot);
}
uint32 ateamId = 0;
@@ -696,34 +709,48 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPacket & recv_data)
BattleGroundQueue &bgQueue = sBattleGroundMgr.m_BattleGroundQueues[bgQueueTypeId];
if (asGroup)
{
- sLog.outDebug("Battleground: arena join as group start");
- if (isRated)
- {
- sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
- bg->SetRated(true);
+ uint32 avgTime;
+
+ if(err > 0)
+ {
+ sLog.outDebug("Battleground: arena join as group start");
+ if (isRated)
+ {
+ sLog.outDebug("Battleground: arena team id %u, leader %s queued with rating %u for type %u",_player->GetArenaTeamId(arenaslot),_player->GetName(),arenaRating,arenatype);
+ bg->SetRated(true);
+ }
+ else
+ bg->SetRated(false);
+
+ GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
+ avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
}
- else
- bg->SetRated(false);
- GroupQueueInfo * ginfo = bgQueue.AddGroup(_player, grp, bgTypeId, bracketEntry, arenatype, isRated, false, arenaRating, ateamId);
- uint32 avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry->GetBracketId());
for (GroupReference *itr = grp->GetFirstMember(); itr != NULL; itr = itr->next())
{
Player *member = itr->getSource();
- if (!member) continue;
-
- uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);// add to queue
+ if (!member)
+ continue;
WorldPacket data;
+
+ if (err <= 0)
+ {
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
+ member->GetSession()->SendPacket(&data);
+ continue;
+ }
+
+ // add to queue
+ uint32 queueSlot = member->AddBattleGroundQueueId(bgQueueTypeId);
+
// send status packet (in queue)
sBattleGroundMgr.BuildBattleGroundStatusPacket(&data, bg, queueSlot, STATUS_WAIT_QUEUE, avgTime, 0, arenatype);
member->GetSession()->SendPacket(&data);
- sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, bgTypeId);
+ sBattleGroundMgr.BuildGroupJoinedBattlegroundPacket(&data, err);
member->GetSession()->SendPacket(&data);
sLog.outDebug("Battleground: player joined queue for arena as group bg queue type %u bg type %u: GUID %u, NAME %s",bgQueueTypeId,bgTypeId,member->GetGUIDLow(), member->GetName());
}
- sLog.outDebug("Battleground: arena join as group end");
- //announce to world ... removed
}
else
{
@@ -756,48 +783,3 @@ void WorldSession::HandleReportPvPAFK(WorldPacket & recv_data)
reportedPlayer->ReportedAfkBy(_player);
}
-
-void WorldSession::SendBattleGroundOrArenaJoinError(uint8 err)
-{
- WorldPacket data;
- int32 msg;
- switch (err)
- {
- case BG_JOIN_ERR_OFFLINE_MEMBER:
- msg = LANG_BG_GROUP_OFFLINE_MEMBER;
- break;
- case BG_JOIN_ERR_GROUP_TOO_MANY:
- msg = LANG_BG_GROUP_TOO_LARGE;
- break;
- case BG_JOIN_ERR_MIXED_FACTION:
- msg = LANG_BG_GROUP_MIXED_FACTION;
- break;
- case BG_JOIN_ERR_MIXED_LEVELS:
- msg = LANG_BG_GROUP_MIXED_LEVELS;
- break;
- case BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE:
- msg = LANG_BG_GROUP_MEMBER_ALREADY_IN_QUEUE;
- break;
- case BG_JOIN_ERR_GROUP_DESERTER:
- msg = LANG_BG_GROUP_MEMBER_DESERTER;
- break;
- case BG_JOIN_ERR_ALL_QUEUES_USED:
- msg = LANG_BG_GROUP_MEMBER_NO_FREE_QUEUE_SLOTS;
- break;
- case BG_JOIN_ERR_ARENA_DISABLED:
- msg = LANG_ARENA_DISABLED;
- break;
- case BG_JOIN_ERR_BG_DISABLED:
- msg = LANG_BG_DISABLED;
- break;
- case BG_JOIN_ERR_GROUP_NOT_ENOUGH:
- case BG_JOIN_ERR_MIXED_ARENATEAM:
- default:
- return;
- break;
- }
- ChatHandler::FillMessageData(&data, NULL, CHAT_MSG_BG_SYSTEM_NEUTRAL, LANG_UNIVERSAL, NULL, 0, GetTrinityString(msg), NULL);
- SendPacket(&data);
- return;
-}
-