// Called when a player leave the zone void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) { if (IsWarTime()) { // If the player is participating to the battle if (m_PlayersInWar[player->GetTeamId()].find(player->GetGUID()) != m_PlayersInWar[player->GetTeamId()].end()) { m_PlayersInWar[player->GetTeamId()].erase(player->GetGUID()); player->GetSession()->SendBfLeaveMessage(m_BattleId); if (Group* group = player->GetGroup()) // Remove the player from the raid group group->RemoveMember(player->GetGUID()); OnPlayerLeaveWar(player); } } for (BfCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) itr->second->HandlePlayerLeave(player); m_InvitedPlayers[player->GetTeamId()].erase(player->GetGUID()); m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID()); m_players[player->GetTeamId()].erase(player->GetGUID()); SendRemoveWorldStates(player); RemovePlayerFromResurrectQueue(player->GetGUID()); OnPlayerLeaveZone(player); }
//Called when a player leave the zone void Battlefield::HandlePlayerLeaveZone(Player* player, uint32 /*zone */ ) { if (IsWarTime()) { //if player is in war list if (m_PlayersInWar[player->GetTeamId()].find(player->GetGUID()) != m_PlayersInWar[player->GetTeamId()].end()) { m_PlayersInWar[player->GetTeamId()].erase(player->GetGUID()); player->GetSession()->SendBfLeaveMessage(m_BattleId); if (Group* group = GetGroupPlayer(player->GetGUID(), player->GetTeamId())) // remove from raid group if player is member { // I think that now is not a hack if (!group->RemoveMember(player->GetGUID())) // group was disbanded { m_Groups[player->GetTeamId()].erase(group->GetGUID()); group->SetBattlefieldGroup(NULL); sGroupMgr->RemoveGroup(group); delete group; } } OnPlayerLeaveWar(player); //For scripting } } for (BfCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) itr->second->HandlePlayerLeave(player); m_InvitedPlayers[player->GetTeamId()].erase(player->GetGUID()); m_PlayersWillBeKick[player->GetTeamId()].erase(player->GetGUID()); m_players[player->GetTeamId()].erase(player->GetGUID()); SendRemoveWorldStates(player); RemovePlayerFromResurrectQueue(player->GetGUID()); OnPlayerLeaveZone(player); //For scripting }
void OutdoorPvP::HandlePlayerLeaveZone(Player* player, uint32 /*zone*/) { // inform the objectives of the leaving for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) itr->second->HandlePlayerLeave(player); // remove the world state information from the player (we can't keep everyone up to date, so leave out those who are not in the concerning zones) if (!player->GetSession()->PlayerLogout()) SendRemoveWorldStates(player); m_players[player->GetTeamId()].erase(player->GetGUID()); TC_LOG_DEBUG("outdoorpvp", "Player %s left an outdoorpvp zone", player->GetName().c_str()); }
/** Function that removes a player from the players of the affected outdoor pvp zones @param player to remove @param whether zone is main outdoor pvp zone or a affected zone */ void OutdoorPvP::HandlePlayerLeaveZone(Player* player, bool isMainZone) { if (m_zonePlayers.erase(player->GetObjectGuid())) { // remove the world state information from the player if (isMainZone && !player->GetSession()->PlayerLogout()) SendRemoveWorldStates(player); sLog.outDebug("Player %s left an Outdoor PvP zone", player->GetName()); } }
/** Function that a players to a players set @param player to be removed */ void WorldPvP::HandlePlayerLeaveZone(Player* pPlayer) { if (!pPlayer) return; // remove the world state information from the player if (!pPlayer->GetSession()->PlayerLogout()) SendRemoveWorldStates(pPlayer); m_sZonePlayers.erase(pPlayer->GetObjectGuid()); sLog.outDebug("Player %s left an outdoorpvp zone", pPlayer->GetName()); }
void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone) { // inform the objectives of the leaving for(OutdoorPvPObjectiveSet::iterator itr = m_OutdoorPvPObjectives.begin(); itr != m_OutdoorPvPObjectives.end(); ++itr) (*itr)->HandlePlayerLeave(plr); // remove the world state information from the player (we can't keep everyone up to date, so leave out those who are not in the concerning zones) if(zone != plr->GetZoneId()) SendRemoveWorldStates(plr); if(plr->GetTeam()==ALLIANCE) m_PlayerGuids[0].erase(plr->GetGUID()); else m_PlayerGuids[1].erase(plr->GetGUID()); sLog.outDebug("OutdoorPvP: player left an outdoorpvp zone"); }
void OutdoorPvP::HandlePlayerLeaveZone(Player * plr, uint32 zone) { if(!plr) return; // inform the objectives of the leaving for (OPvPCapturePointMap::iterator itr = m_capturePoints.begin(); itr != m_capturePoints.end(); ++itr) itr->second->HandlePlayerLeave(plr); // remove the world state information from the player (we can't keep everyone up to date, so leave out those who are not in the concerning zones) if(!plr->GetSession()->PlayerLogout()) SendRemoveWorldStates(plr); m_players[BattleGround::GetTeamIndexByTeamId(plr->GetTeam())].erase(plr); sLog.outDebug("Player %s left an outdoorpvp zone", plr->GetName()); }
/** Function that starts battlefield battle @param defender team */ void Battlefield::StartBattle(Team defender) { DEBUG_LOG("Battlefield: Battle has started. Defender Team: %s.", defender == ALLIANCE ? "Alliance" : "Horde"); m_startTime = time(nullptr); m_status = BF_STATUS_IN_PROGRESS; m_timer = m_battleDuration; m_zoneOwner = defender; // refresh all players before battle InitPlayersBeforeBattle(); // disband existing raid groups for (auto& m_battlefieldRaid : m_battlefieldRaids) { for (auto group : m_battlefieldRaid) { group->Disband(); delete group; } m_battlefieldRaid.clear(); } for (auto& m_zonePlayer : m_zonePlayers) { if (!m_zonePlayer.first) continue; Player* player = sObjectMgr.GetPlayer(m_zonePlayer.first); if (!player) continue; uint8 idx = 0; std::set<ObjectGuid>::iterator itr2 = m_queuedPlayers[idx].find(m_zonePlayer.first); if (itr2 == m_queuedPlayers[idx].end()) { ++idx; itr2 = m_queuedPlayers[idx].find(m_zonePlayer.first); } // send battle invite to players added to queue if (itr2 != m_queuedPlayers[idx].end()) { m_invitedPlayers[idx][m_zonePlayer.first] = time(nullptr) + BF_TIME_TO_ACCEPT; player->GetSession()->SendBattlefieldWarInvite(m_battleFieldId, m_zoneId, BF_TIME_TO_ACCEPT); m_queuedPlayers[idx].erase(itr2); } // kick players not in queue else { player->GetSession()->SendBattlefieldLeaveMessage(m_battleFieldId, BATTLEFIELD_LEAVE_REASON_EXITED); SendRemoveWorldStates(player); if (m_activePlayers.find(m_zonePlayer.first) != m_activePlayers.end()) { m_activePlayers[m_zonePlayer.first]->removeTime = time(nullptr); m_activePlayers[m_zonePlayer.first]->removeDelay = BF_UNACCEPTED_REMOVE_DELAY; } } } // non-zone queued players for (uint32 i = 0; i < PVP_TEAM_COUNT; ++i) { for (std::set<ObjectGuid>::iterator itr = m_queuedPlayers[i].begin(); itr != m_queuedPlayers[i].end();) { if (Player* plr = sObjectMgr.GetPlayer(*itr, true)) { m_invitedPlayers[i][plr->GetObjectGuid()] = time(nullptr) + BF_TIME_TO_ACCEPT; plr->GetSession()->SendBattlefieldWarInvite(m_battleFieldId, m_zoneId, BF_TIME_TO_ACCEPT); } m_queuedPlayers[i].erase(itr++); } } }