void CBattlegroundManager::RemovePlayerFromQueues(Player * plr) { m_queueLock.Acquire(); ASSERT(plr->m_bgQueueType < BATTLEGROUND_NUM_TYPES); uint32 lgroup = GetLevelGrouping(plr->getLevel()); list<uint32>::iterator itr = m_queuedPlayers[plr->m_bgQueueType][lgroup].begin(); while(itr != m_queuedPlayers[plr->m_bgQueueType][lgroup].end()) { if((*itr) == plr->GetLowGUID()) { Log.Debug("BattlegroundManager", "Removing player %u from queue instance %u type %u", plr->GetLowGUID(), plr->m_bgQueueInstanceId, plr->m_bgQueueType); m_queuedPlayers[plr->m_bgQueueType][lgroup].erase(itr); break; } ++itr; } plr->m_bgIsQueued = false; plr->m_bgTeam=plr->GetTeam(); plr->m_pendingBattleground=0; SendBattlefieldStatus(plr,0,0,0,0,0,0); m_queueLock.Release(); }
void CBattlegroundManager::HandleBattlegroundJoin(WorldSession * m_session, WorldPacket & pck) { uint64 guid; uint32 pguid = m_session->GetPlayer()->GetLowGUID(); uint32 lgroup = GetLevelGrouping(m_session->GetPlayer()->getLevel()); uint32 bgtype; uint32 instance; pck >> guid >> bgtype >> instance; if ( ! guid ) return; //crash fix. /script JoinBattlefield(0,1); ;s if(bgtype >= BATTLEGROUND_NUM_TYPES || guid == 0 ) return; // cheater! /* Check the instance id */ if(instance) { /* We haven't picked the first instance. This means we've specified an instance to join. */ m_instanceLock.Acquire(); map<uint32, CBattleground*>::iterator itr = m_instances[bgtype].find(instance); if(itr == m_instances[bgtype].end()) { sChatHandler.SystemMessage(m_session, "You have tried to join an invalid instance id."); m_instanceLock.Release(); return; } m_instanceLock.Release(); } /* Queue him! */ m_queueLock.Acquire(); m_queuedPlayers[bgtype][lgroup].push_back(pguid); Log.Success("BattlegroundManager", "Player %u is now in battleground queue for instance %u", m_session->GetPlayer()->GetLowGUID(), instance ); /* send the battleground status packet */ SendBattlefieldStatus(m_session->GetPlayer(), 1, bgtype, instance, 0, BGMapIds[bgtype],0); m_session->GetPlayer()->m_bgIsQueued = true; m_session->GetPlayer()->m_bgQueueInstanceId = instance; m_session->GetPlayer()->m_bgQueueType = bgtype; /* Set battleground entry point */ m_session->GetPlayer()->m_bgEntryPointX = m_session->GetPlayer()->GetPositionX(); m_session->GetPlayer()->m_bgEntryPointY = m_session->GetPlayer()->GetPositionY(); m_session->GetPlayer()->m_bgEntryPointZ = m_session->GetPlayer()->GetPositionZ(); m_session->GetPlayer()->m_bgEntryPointMap = m_session->GetPlayer()->GetMapId(); m_session->GetPlayer()->m_bgEntryPointInstance = m_session->GetPlayer()->GetInstanceID(); m_queueLock.Release(); /* We will get updated next few seconds =) */ }
void CBattlegroundManager::DeleteBattleground(CBattleground* bg) { try { uint32 i = bg->GetType(); uint32 j = bg->GetLevelGroup(); Player* plr; m_instanceLock.Acquire(); m_queueLock.Acquire(); m_instances[i].erase(bg->GetId()); /* erase any queued players */ list<uint32>::iterator itr = m_queuedPlayers[i][j].begin(); list<uint32>::iterator it2; for (; itr != m_queuedPlayers[i][j].end();) { it2 = itr++; plr = objmgr.GetPlayer(*it2); if (!plr) { m_queuedPlayers[i][j].erase(it2); continue; } if (plr && plr->m_bgQueueInstanceId == bg->GetId()) { sChatHandler.SystemMessageToPlr(plr, plr->GetSession()->LocalizedWorldSrv(54), bg->GetId()); SendBattlefieldStatus(plr, BGSTATUS_NOFLAGS, 0, 0, 0, 0, 0); plr->m_bgIsQueued = false; m_queuedPlayers[i][j].erase(it2); } } m_queueLock.Release(); m_instanceLock.Release(); //LOG_DETAIL("Deleting battleground from queue %u, instance %u", bg->GetType(), bg->GetId()); delete bg; } catch (...) // for Win32 Debug { LOG_ERROR("Exception: CBattlegroundManager::DeleteBattleground"); printStackTrace(); throw; } }
void CBattlegroundManager::RemoveGroupFromQueues(Group * grp) { m_queueLock.Acquire(); for(uint32 i = BATTLEGROUND_ARENA_2V2; i < BATTLEGROUND_ARENA_5V5+1; ++i) { for(list<uint32>::iterator itr = m_queuedGroups[i].begin(); itr != m_queuedGroups[i].end(); ) { if((*itr) == grp->GetID()) itr = m_queuedGroups[i].erase(itr); else ++itr; } } for(GroupMembersSet::iterator itr = grp->GetSubGroup(0)->GetGroupMembersBegin(); itr != grp->GetSubGroup(0)->GetGroupMembersEnd(); ++itr) if((*itr)->m_loggedInPlayer) SendBattlefieldStatus((*itr)->m_loggedInPlayer, 0, 0, 0, 0, 0, 0); m_queueLock.Release(); }
void CBattlegroundManager::RemovePlayerFromQueues(Player* plr) { m_queueLock.Acquire(); ARCEMU_ASSERT(plr->m_bgQueueType < BATTLEGROUND_NUM_TYPES); sEventMgr.RemoveEvents(plr, EVENT_BATTLEGROUND_QUEUE_UPDATE); uint32 lgroup = GetLevelGrouping(plr->getLevel()); list<uint32>::iterator itr; itr = m_queuedPlayers[plr->m_bgQueueType][lgroup].begin(); while (itr != m_queuedPlayers[plr->m_bgQueueType][lgroup].end()) { if ((*itr) == plr->GetLowGUID()) { Log.Debug("BattlegroundManager", "Removing player %u from queue instance %u type %u", plr->GetLowGUID(), plr->m_bgQueueInstanceId, plr->m_bgQueueType); m_queuedPlayers[plr->m_bgQueueType][lgroup].erase(itr); break; } ++itr; } plr->m_bgIsQueued = false; plr->m_bgTeam = plr->GetTeam(); plr->m_pendingBattleground = NULL; SendBattlefieldStatus(plr, BGSTATUS_NOFLAGS, 0, 0, 0, 0, 0); m_queueLock.Release(); Group* group; group = plr->GetGroup(); if (group) //if da n****s in a group, boot dis bitch ass' group outa da q { Log.Debug("BattlegroundManager", "Player %u removed whilst in a group. Removing players group %u from queue", plr->GetLowGUID(), group->GetID()); RemoveGroupFromQueues(group); } }
void CBattlegroundManager::DeleteBattleground(CBattleground * bg) { uint32 i = bg->GetType(); uint32 j = bg->GetLevelGroup(); Player * plr; m_instanceLock.Acquire(); m_queueLock.Acquire(); m_instances[i].erase(bg->GetId()); /* erase any queued players */ list<uint32>::iterator itr = m_queuedPlayers[i][j].begin(); list<uint32>::iterator it2; for(; itr != m_queuedPlayers[i][j].end();) { it2 = itr++; plr = objmgr.GetPlayer(*it2); if(!plr) { m_queuedPlayers[i][j].erase(it2); continue; } if(plr && plr->m_bgQueueInstanceId == bg->GetId()) { sChatHandler.SystemMessageToPlr(plr, "Your queue on battleground instance %u is no longer valid, the instance no longer exists.", bg->GetId()); SendBattlefieldStatus(plr, 0, 0, 0, 0, 0,0); plr->m_bgIsQueued = false; m_queuedPlayers[i][j].erase(it2); } } m_queueLock.Release(); m_instanceLock.Release(); }
void CBattlegroundManager::HandleArenaJoin(WorldSession * m_session, uint32 BattlegroundType, uint8 as_group, uint8 rated_match) { uint32 pguid = m_session->GetPlayer()->GetLowGUID(); uint32 lgroup = GetLevelGrouping(m_session->GetPlayer()->getLevel()); if(as_group && m_session->GetPlayer()->GetGroup() == NULL) return; Group * pGroup = m_session->GetPlayer()->GetGroup(); if(as_group) { if(pGroup->GetSubGroupCount() != 1) { m_session->SystemMessage("Sorry, raid groups joining battlegrounds are currently unsupported."); return; } if(pGroup->GetLeader() != m_session->GetPlayer()->m_playerInfo) { m_session->SystemMessage("You must be the party leader to add a group to an arena."); return; } GroupMembersSet::iterator itx; if(!rated_match) { /* add all players normally.. bleh ;P */ pGroup->Lock(); for(itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if((*itx)->m_loggedInPlayer && !(*itx)->m_loggedInPlayer->m_bgIsQueued && !(*itx)->m_loggedInPlayer->m_bg) HandleArenaJoin((*itx)->m_loggedInPlayer->GetSession(), BattlegroundType, 0, 0); } pGroup->Unlock(); return; } else { /* make sure all players are 70 */ uint32 maxplayers; uint32 arenateamtype; switch(BattlegroundType) { case BATTLEGROUND_ARENA_2V2: arenateamtype=0; maxplayers=2; break; case BATTLEGROUND_ARENA_3V3: arenateamtype=1; maxplayers=3; break; case BATTLEGROUND_ARENA_5V5: arenateamtype=2; maxplayers=5; break; default: arenateamtype=0; maxplayers=2; break; } uint32 team_id = 0; pGroup->Lock(); for(itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if( maxplayers == 0 ) { m_session->SystemMessage("You have too many players in your party to join this type of arena."); pGroup->Unlock(); return; } if((*itx)->lastLevel < 70) { m_session->SystemMessage("Sorry, some of your party members are not level 70."); pGroup->Unlock(); return; } if((*itx)->m_loggedInPlayer) { ArenaTeam * t = (*itx)->m_loggedInPlayer->m_arenaTeams[arenateamtype]; if( t != NULL ) { if ( team_id == 0 ) team_id = t->m_id; if ( team_id != t->m_id ) { m_session->SystemMessage("Sorry, not all your party members are in same arena team."); pGroup->Unlock(); return; } } else { m_session->SystemMessage("Sorry, not all your party members are in same arena team."); pGroup->Unlock(); return; } if( (*itx)->m_loggedInPlayer->m_bgIsQueued ) BattlegroundManager.RemovePlayerFromQueues((*itx)->m_loggedInPlayer); /* if((*itx)->m_loggedInPlayer->m_bg || (*itx)->m_loggedInPlayer->m_bg || (*itx)->m_loggedInPlayer->m_bgIsQueued) { m_session->SystemMessage("One or more of your party members are already queued or inside a battleground."); pGroup->Unlock(); return; } */ --maxplayers; } } if( maxplayers > 0 ) { m_session->SystemMessage("Sorry, you have too few valid arena members in your group."); pGroup->Unlock(); return; } WorldPacket data(SMSG_GROUP_JOINED_BATTLEGROUND, 4); data << uint32(6); // all arenas for(itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if((*itx)->m_loggedInPlayer) { SendBattlefieldStatus((*itx)->m_loggedInPlayer, 1, BattlegroundType, 0 , 0, 0,1); (*itx)->m_loggedInPlayer->m_bgIsQueued = true; (*itx)->m_loggedInPlayer->m_bgQueueInstanceId = 0; (*itx)->m_loggedInPlayer->m_bgQueueType = BattlegroundType; (*itx)->m_loggedInPlayer->GetSession()->SendPacket(&data); (*itx)->m_loggedInPlayer->m_bgEntryPointX=(*itx)->m_loggedInPlayer->GetPositionX(); (*itx)->m_loggedInPlayer->m_bgEntryPointY=(*itx)->m_loggedInPlayer->GetPositionY(); (*itx)->m_loggedInPlayer->m_bgEntryPointZ=(*itx)->m_loggedInPlayer->GetPositionZ(); (*itx)->m_loggedInPlayer->m_bgEntryPointMap=(*itx)->m_loggedInPlayer->GetMapId(); } } pGroup->Unlock(); m_queueLock.Acquire(); m_queuedGroups[BattlegroundType].push_back(pGroup->GetID()); m_queueLock.Release(); Log.Success("BattlegroundMgr", "Group %u is now in battleground queue for arena type %u", pGroup->GetID(), BattlegroundType); /* send the battleground status packet */ return; } } /* Queue him! */ m_queueLock.Acquire(); m_queuedPlayers[BattlegroundType][lgroup].push_back(pguid); Log.Success("BattlegroundMgr", "Player %u is now in battleground queue for {Arena %u}", m_session->GetPlayer()->GetLowGUID(), BattlegroundType ); /* send the battleground status packet */ SendBattlefieldStatus(m_session->GetPlayer(), 1, BattlegroundType, 0 , 0, 0,0); m_session->GetPlayer()->m_bgIsQueued = true; m_session->GetPlayer()->m_bgQueueInstanceId = 0; m_session->GetPlayer()->m_bgQueueType = BattlegroundType; /* Set battleground entry point */ m_session->GetPlayer()->m_bgEntryPointX = m_session->GetPlayer()->GetPositionX(); m_session->GetPlayer()->m_bgEntryPointY = m_session->GetPlayer()->GetPositionY(); m_session->GetPlayer()->m_bgEntryPointZ = m_session->GetPlayer()->GetPositionZ(); m_session->GetPlayer()->m_bgEntryPointMap = m_session->GetPlayer()->GetMapId(); m_session->GetPlayer()->m_bgEntryPointInstance = m_session->GetPlayer()->GetInstanceID(); m_queueLock.Release(); }
void CBattlegroundManager::HandleBattlegroundJoin(WorldSession* m_session, WorldPacket& pck) { uint64 guid; uint32 pguid = m_session->GetPlayer()->GetLowGUID(); uint32 lgroup = GetLevelGrouping(m_session->GetPlayer()->getLevel()); uint32 bgtype; uint32 instance; pck >> guid >> bgtype >> instance; // Random battlegrounds aren't yet implemented if (bgtype == BATTLEGROUND_RANDOM) return; if ((bgtype >= BATTLEGROUND_NUM_TYPES) || (bgtype == 0) || ((bgMaps.find(bgtype) == bgMaps.end()) && bgtype != BATTLEGROUND_RANDOM)) { sCheatLog.writefromsession(m_session, "tried to crash the server by joining battleground that does not exist (0)"); m_session->Disconnect(); return; // cheater! } /* Check the instance id */ if (instance) { /* We haven't picked the first instance. This means we've specified an instance to join. */ m_instanceLock.Acquire(); map<uint32, CBattleground*>::iterator itr = m_instances[bgtype].find(instance); if (itr == m_instances[bgtype].end()) { sChatHandler.SystemMessage(m_session, m_session->LocalizedWorldSrv(51)); m_instanceLock.Release(); return; } m_instanceLock.Release(); } /* Queue him! */ m_queueLock.Acquire(); m_queuedPlayers[bgtype][lgroup].push_back(pguid); Log.Notice("BattlegroundManager", "Player %u is now in battleground queue for instance %u", m_session->GetPlayer()->GetLowGUID(), (instance + 1)); /* send the battleground status packet */ SendBattlefieldStatus(m_session->GetPlayer(), BGSTATUS_INQUEUE, bgtype, instance, 0, bgMaps[bgtype], 0); m_session->GetPlayer()->m_bgIsQueued = true; m_session->GetPlayer()->m_bgQueueInstanceId = instance; m_session->GetPlayer()->m_bgQueueType = bgtype; /* Set battleground entry point */ m_session->GetPlayer()->m_bgEntryPointX = m_session->GetPlayer()->GetPositionX(); m_session->GetPlayer()->m_bgEntryPointY = m_session->GetPlayer()->GetPositionY(); m_session->GetPlayer()->m_bgEntryPointZ = m_session->GetPlayer()->GetPositionZ(); m_session->GetPlayer()->m_bgEntryPointMap = m_session->GetPlayer()->GetMapId(); m_session->GetPlayer()->m_bgEntryPointInstance = m_session->GetPlayer()->GetInstanceID(); m_queueLock.Release(); /* We will get updated next few seconds =) */ }
void CBattlegroundManager::HandleArenaJoin(WorldSession* m_session, uint32 BattlegroundType, uint8 as_group, uint8 rated_match) { uint32 pguid = m_session->GetPlayer()->GetLowGUID(); uint32 lgroup = GetLevelGrouping(m_session->GetPlayer()->getLevel()); if (as_group && m_session->GetPlayer()->GetGroup() == NULL) return; Group* pGroup = m_session->GetPlayer()->GetGroup(); if (as_group) { if (pGroup->GetSubGroupCount() != 1) { m_session->SystemMessage(m_session->LocalizedWorldSrv(55)); return; } if (pGroup->GetLeader() != m_session->GetPlayer()->getPlayerInfo()) { m_session->SystemMessage(m_session->LocalizedWorldSrv(56)); return; } GroupMembersSet::iterator itx; if (!rated_match) { /* add all players normally.. bleh ;P */ pGroup->Lock(); for (itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if ((*itx)->m_loggedInPlayer && !(*itx)->m_loggedInPlayer->m_bgIsQueued && !(*itx)->m_loggedInPlayer->m_bg) HandleArenaJoin((*itx)->m_loggedInPlayer->GetSession(), BattlegroundType, 0, 0); } pGroup->Unlock(); return; } else { /* make sure all players are 70 */ uint32 maxplayers; uint32 type = BattlegroundType - BATTLEGROUND_ARENA_2V2; switch (BattlegroundType) { case BATTLEGROUND_ARENA_3V3: maxplayers = 3; break; case BATTLEGROUND_ARENA_5V5: maxplayers = 5; break; case BATTLEGROUND_ARENA_2V2: default: maxplayers = 2; break; } if (pGroup->GetLeader()->m_loggedInPlayer && pGroup->GetLeader()->m_loggedInPlayer->m_arenaTeams[type] == NULL) { m_session->SendNotInArenaTeamPacket(uint8(maxplayers)); return; } pGroup->Lock(); for (itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if (maxplayers == 0) { m_session->SystemMessage(m_session->LocalizedWorldSrv(58)); pGroup->Unlock(); return; } if ((*itx)->lastLevel < PLAYER_ARENA_MIN_LEVEL) { m_session->SystemMessage(m_session->LocalizedWorldSrv(59)); pGroup->Unlock(); return; } if ((*itx)->m_loggedInPlayer) { if ((*itx)->m_loggedInPlayer->m_bg || (*itx)->m_loggedInPlayer->m_bgIsQueued) { m_session->SystemMessage(m_session->LocalizedWorldSrv(60)); pGroup->Unlock(); return; }; if ((*itx)->m_loggedInPlayer->m_arenaTeams[type] != pGroup->GetLeader()->m_loggedInPlayer->m_arenaTeams[type]) { m_session->SystemMessage(m_session->LocalizedWorldSrv(61)); pGroup->Unlock(); return; } --maxplayers; } } WorldPacket data(SMSG_GROUP_JOINED_BATTLEGROUND, 4); data << uint32(6); // all arenas for (itx = pGroup->GetSubGroup(0)->GetGroupMembersBegin(); itx != pGroup->GetSubGroup(0)->GetGroupMembersEnd(); ++itx) { if ((*itx)->m_loggedInPlayer) { SendBattlefieldStatus((*itx)->m_loggedInPlayer, BGSTATUS_INQUEUE, BattlegroundType, 0, 0, 0, 1); (*itx)->m_loggedInPlayer->m_bgIsQueued = true; (*itx)->m_loggedInPlayer->m_bgQueueInstanceId = 0; (*itx)->m_loggedInPlayer->m_bgQueueType = BattlegroundType; (*itx)->m_loggedInPlayer->GetSession()->SendPacket(&data); (*itx)->m_loggedInPlayer->m_bgEntryPointX = (*itx)->m_loggedInPlayer->GetPositionX(); (*itx)->m_loggedInPlayer->m_bgEntryPointY = (*itx)->m_loggedInPlayer->GetPositionY(); (*itx)->m_loggedInPlayer->m_bgEntryPointZ = (*itx)->m_loggedInPlayer->GetPositionZ(); (*itx)->m_loggedInPlayer->m_bgEntryPointMap = (*itx)->m_loggedInPlayer->GetMapId(); } } pGroup->Unlock(); m_queueLock.Acquire(); m_queuedGroups[BattlegroundType].push_back(pGroup->GetID()); m_queueLock.Release(); Log.Notice("BattlegroundMgr", "Group %u is now in battleground queue for arena type %u", pGroup->GetID(), BattlegroundType); /* send the battleground status packet */ return; } } /* Queue him! */ m_queueLock.Acquire(); m_queuedPlayers[BattlegroundType][lgroup].push_back(pguid); Log.Notice("BattlegroundMgr", "Player %u is now in battleground queue for {Arena %u}", m_session->GetPlayer()->GetLowGUID(), BattlegroundType); /* send the battleground status packet */ SendBattlefieldStatus(m_session->GetPlayer(), BGSTATUS_INQUEUE, BattlegroundType, 0, 0, 0, 0); m_session->GetPlayer()->m_bgIsQueued = true; m_session->GetPlayer()->m_bgQueueInstanceId = 0; m_session->GetPlayer()->m_bgQueueType = BattlegroundType; /* Set battleground entry point */ m_session->GetPlayer()->m_bgEntryPointX = m_session->GetPlayer()->GetPositionX(); m_session->GetPlayer()->m_bgEntryPointY = m_session->GetPlayer()->GetPositionY(); m_session->GetPlayer()->m_bgEntryPointZ = m_session->GetPlayer()->GetPositionZ(); m_session->GetPlayer()->m_bgEntryPointMap = m_session->GetPlayer()->GetMapId(); m_session->GetPlayer()->m_bgEntryPointInstance = m_session->GetPlayer()->GetInstanceID(); m_queueLock.Release(); }