diff options
Diffstat (limited to 'src/game/BattleGroundHandler.cpp')
-rw-r--r-- | src/game/BattleGroundHandler.cpp | 152 |
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; -} - |