void OutdoorPvPObjective::SendUpdateWorldState(uint32 field, uint32 value) { // send to all players present in the area for(std::set<uint64>::iterator itr = m_ActivePlayerGuids.begin(); itr != m_ActivePlayerGuids.end(); ++itr) { Player * plr = objmgr.GetPlayer(*itr); if(plr) { plr->SendUpdateWorldState(field,value); } } }
void BattlegroundEY::UpdatePointStatuses() { for (uint8 point = 0; point < EY_POINTS_MAX; ++point) { if (m_PlayersNearPoint[point].empty()) continue; //count new point bar status: m_PointBarStatus[point] += (m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] < BG_EY_POINT_MAX_CAPTURERS_COUNT) ? m_CurrentPointPlayersCount[2 * point] - m_CurrentPointPlayersCount[2 * point + 1] : BG_EY_POINT_MAX_CAPTURERS_COUNT; if (m_PointBarStatus[point] > BG_EY_PROGRESS_BAR_ALI_CONTROLLED) //point is fully alliance's m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_ALI_CONTROLLED; if (m_PointBarStatus[point] < BG_EY_PROGRESS_BAR_HORDE_CONTROLLED) //point is fully horde's m_PointBarStatus[point] = BG_EY_PROGRESS_BAR_HORDE_CONTROLLED; uint32 pointOwnerTeamId = 0; //find which team should own this point if (m_PointBarStatus[point] <= BG_EY_PROGRESS_BAR_NEUTRAL_LOW) pointOwnerTeamId = HORDE; else if (m_PointBarStatus[point] >= BG_EY_PROGRESS_BAR_NEUTRAL_HIGH) pointOwnerTeamId = ALLIANCE; else pointOwnerTeamId = EY_POINT_NO_OWNER; for (uint8 i = 0; i < m_PlayersNearPoint[point].size(); ++i) { Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[point][i]); if (player) { player->SendUpdateWorldState(PROGRESS_BAR_STATUS, m_PointBarStatus[point]); //if point owner changed we must evoke event! if (pointOwnerTeamId != m_PointOwnedByTeam[point]) { //point was uncontrolled and player is from team which captured point if (m_PointState[point] == EY_POINT_STATE_UNCONTROLLED && player->GetTeam() == pointOwnerTeamId) this->EventTeamCapturedPoint(player, point); //point was under control and player isn't from team which controlled it if (m_PointState[point] == EY_POINT_UNDER_CONTROL && player->GetTeam() != m_PointOwnedByTeam[point]) this->EventTeamLostPoint(player, point); } /// @workaround The original AreaTrigger is covered by a bigger one and not triggered on client side. if (point == FEL_REAVER && m_PointOwnedByTeam[point] == player->GetTeam()) if (m_FlagState && GetFlagPickerGUID() == player->GetGUID()) if (player->GetDistance(2044.0f, 1729.729f, 1190.03f) < 3.0f) EventPlayerCapturedFlag(player, BG_EY_OBJECT_FLAG_FEL_REAVER); } } } }
void BattlegroundEY::CheckSomeoneJoinedPoint() { GameObject* obj = NULL; for (uint8 i = 0; i < EY_POINTS_MAX; ++i) { obj = GetBgMap()->GetGameObject(BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i]); if (obj) { uint8 j = 0; while (j < m_PlayersNearPoint[EY_POINTS_MAX].size()) { Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[EY_POINTS_MAX][j]); if (!player) { TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneJoinedPoint: Player (%s) could not be found!", m_PlayersNearPoint[EY_POINTS_MAX][j].ToString().c_str()); ++j; continue; } if (player->CanCaptureTowerPoint() && player->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)) { //player joined point! //show progress bar player->SendUpdateWorldState(PROGRESS_BAR_PERCENT_GREY, BG_EY_PROGRESS_BAR_PERCENT_GREY); player->SendUpdateWorldState(PROGRESS_BAR_STATUS, m_PointBarStatus[i]); player->SendUpdateWorldState(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_SHOW); //add player to point m_PlayersNearPoint[i].push_back(m_PlayersNearPoint[EY_POINTS_MAX][j]); //remove player from "free space" m_PlayersNearPoint[EY_POINTS_MAX].erase(m_PlayersNearPoint[EY_POINTS_MAX].begin() + j); } else ++j; } } } }
void OutdoorPvP::SendUpdateWorldState(uint32 field, uint32 value) { // send to both factions for(int i = 0; i < 2; ++i) { // send to all players present in the area for(std::set<uint64>::iterator itr = m_PlayerGuids[i].begin(); itr != m_PlayerGuids[i].end(); ++itr) { Player * plr = objmgr.GetPlayer(*itr); if(plr) { plr->SendUpdateWorldState(field,value); } } } }
void BattlegroundEY::CheckSomeoneLeftPoint() { //reset current point counts for (uint8 i = 0; i < 2*EY_POINTS_MAX; ++i) m_CurrentPointPlayersCount[i] = 0; GameObject* obj = NULL; for (uint8 i = 0; i < EY_POINTS_MAX; ++i) { obj = GetBgMap()->GetGameObject(BgObjects[BG_EY_OBJECT_TOWER_CAP_FEL_REAVER + i]); if (obj) { uint8 j = 0; while (j < m_PlayersNearPoint[i].size()) { Player* player = ObjectAccessor::FindPlayer(m_PlayersNearPoint[i][j]); if (!player) { TC_LOG_ERROR("bg.battleground", "BattlegroundEY:CheckSomeoneLeftPoint Player (%s) could not be found!", m_PlayersNearPoint[i][j].ToString().c_str()); //move non-existing players to "free space" - this will cause many errors showing in log, but it is a very important bug m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); continue; } if (!player->CanCaptureTowerPoint() || !player->IsWithinDistInMap(obj, BG_EY_POINT_RADIUS)) //move player out of point (add him to players that are out of points { m_PlayersNearPoint[EY_POINTS_MAX].push_back(m_PlayersNearPoint[i][j]); m_PlayersNearPoint[i].erase(m_PlayersNearPoint[i].begin() + j); player->SendUpdateWorldState(PROGRESS_BAR_SHOW, BG_EY_PROGRESS_BAR_DONT_SHOW); } else { //player is neat flag, so update count: m_CurrentPointPlayersCount[2 * i + GetTeamIndexByTeamId(player->GetTeam())]++; ++j; } } } } }