| 1247 | uint32 Group::CanJoinBattleGroundQueue(uint32 bgTypeId, uint32 bgQueueType, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot) |
| 1248 | { |
| 1249 | // check for min / max count |
| 1250 | uint32 memberscount = GetMembersCount(); |
| 1251 | if(memberscount < MinPlayerCount) |
| 1252 | return BG_JOIN_ERR_GROUP_NOT_ENOUGH; |
| 1253 | if(memberscount > MaxPlayerCount) |
| 1254 | return BG_JOIN_ERR_GROUP_TOO_MANY; |
| 1255 | |
| 1256 | // get a player as reference, to compare other players' stats to (arena team id, queue id based on level, etc.) |
| 1257 | Player * reference = GetFirstMember()->getSource(); |
| 1258 | // no reference found, can't join this way |
| 1259 | if(!reference) |
| 1260 | return BG_JOIN_ERR_OFFLINE_MEMBER; |
| 1261 | |
| 1262 | uint32 bgQueueId = reference->GetBattleGroundQueueIdFromLevel(); |
| 1263 | uint32 arenaTeamId = reference->GetArenaTeamId(arenaSlot); |
| 1264 | uint32 team = reference->GetTeam(); |
| 1265 | |
| 1266 | // check every member of the group to be able to join |
| 1267 | for(GroupReference *itr = GetFirstMember(); itr != NULL; itr = itr->next()) |
| 1268 | { |
| 1269 | Player *member = itr->getSource(); |
| 1270 | // offline member? don't let join |
| 1271 | if(!member) |
| 1272 | return BG_JOIN_ERR_OFFLINE_MEMBER; |
| 1273 | // don't allow cross-faction join as group |
| 1274 | if(member->GetTeam() != team) |
| 1275 | return BG_JOIN_ERR_MIXED_FACTION; |
| 1276 | // not in the same battleground level braket, don't let join |
| 1277 | if(member->GetBattleGroundQueueIdFromLevel() != bgQueueId) |
| 1278 | return BG_JOIN_ERR_MIXED_LEVELS; |
| 1279 | // don't let join rated matches if the arena team id doesn't match |
| 1280 | if(isRated && member->GetArenaTeamId(arenaSlot) != arenaTeamId) |
| 1281 | return BG_JOIN_ERR_MIXED_ARENATEAM; |
| 1282 | // don't let join if someone from the group is already in that bg queue |
| 1283 | if(member->InBattleGroundQueueForBattleGroundQueueType(bgQueueType)) |
| 1284 | return BG_JOIN_ERR_GROUP_MEMBER_ALREADY_IN_QUEUE; |
| 1285 | // check for deserter debuff in case not arena queue |
| 1286 | if(bgTypeId != BATTLEGROUND_AA && !member->CanJoinToBattleground()) |
| 1287 | return BG_JOIN_ERR_GROUP_DESERTER; |
| 1288 | // check if member can join any more battleground queues |
| 1289 | if(!member->HasFreeBattleGroundQueueId()) |
| 1290 | return BG_JOIN_ERR_ALL_QUEUES_USED; |
| 1291 | } |
| 1292 | return BG_JOIN_ERR_OK; |
| 1293 | } |
| 1294 | |