void EyeOfTheStorm::UpdateCPs() { uint32 i; set< Object* >::iterator itr, itrend; Player* plr; GameObject* go; int32 delta = 0; uint32 playercounts[2]; uint32 towers[2] = {0, 0}; EOTSCaptureDisplayList::iterator eitr, eitr2, eitrend; EOTSCaptureDisplayList* disp; for(i = 0; i < EOTS_TOWER_COUNT; ++i) { /* loop players in range, add any that aren't in the set to the set */ playercounts[0] = playercounts[1] = 0; go = m_CPStatusGO[i]; disp = &m_CPDisplay[i]; itr = go->GetInRangePlayerSetBegin(); itrend = go->GetInRangePlayerSetEnd(); for(; itr != itrend; ++itr) { plr = TO< Player* >(*itr); if(plr->isAlive() && !(plr->IsStealth()) && !(plr->m_invisible) && !(plr->SchoolImmunityList[0]) && plr->GetDistance2dSq(go) <= EOTS_CAPTURE_DISTANCE) { playercounts[plr->GetTeam()]++; if(disp->find(plr) == disp->end()) { disp->insert(plr); plr->SendWorldStateUpdate(WORLDSTATE_EOTS_DISPLAYON, 1); } } } /* score diff calculation */ //printf("EOTS: Playercounts = %u %u\n", playercounts[0], playercounts[1]); if(playercounts[0] != playercounts[1]) { if(playercounts[0] > playercounts[1]) delta = playercounts[0]; else if(playercounts[1] > playercounts[0]) delta = -(int32)playercounts[1]; delta *= EOTS_CAPTURE_RATE; m_CPStatus[i] += delta; if(m_CPStatus[i] > 100) m_CPStatus[i] = 100; else if(m_CPStatus[i] < 0) m_CPStatus[i] = 0; // change the flag depending on cp status if(m_CPStatus[i] <= 30) { if(m_CPBanner[i] && m_CPBanner[i]->GetEntry() != EOTS_BANNER_HORDE) { RespawnCPFlag(i, EOTS_BANNER_HORDE); if(m_spiritGuides[i] != NULL) { RepopPlayersOfTeam(0, m_spiritGuides[i]); m_spiritGuides[i]->Despawn(0, 0); RemoveSpiritGuide(m_spiritGuides[i]); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide(EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 1); AddSpiritGuide(m_spiritGuides[i]); SetWorldState(m_iconsStates[i][0], 0); SetWorldState(m_iconsStates[i][1], 0); SetWorldState(m_iconsStates[i][2], 1); SendChatMessage(CHAT_MSG_BG_EVENT_HORDE, 0, "The Horde has taken the %s !", EOTSControlPointNames[i]); PlaySoundToAll(SOUND_HORDE_CAPTURE); } } else if(m_CPStatus[i] >= 70) { if(m_CPBanner[i] && m_CPBanner[i]->GetEntry() != EOTS_BANNER_ALLIANCE) { RespawnCPFlag(i, EOTS_BANNER_ALLIANCE); if(m_spiritGuides[i] != NULL) { RepopPlayersOfTeam(1, m_spiritGuides[i]); m_spiritGuides[i]->Despawn(0, 0); RemoveSpiritGuide(m_spiritGuides[i]); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide(EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 0); AddSpiritGuide(m_spiritGuides[i]); SetWorldState(m_iconsStates[i][0], 0); SetWorldState(m_iconsStates[i][1], 1); SetWorldState(m_iconsStates[i][2], 0); SendChatMessage(CHAT_MSG_BG_EVENT_ALLIANCE, 0, "The Alliance has taken the %s", EOTSControlPointNames[i]); PlaySoundToAll(SOUND_ALLIANCE_CAPTURE); } } else { if(m_CPBanner[i]->GetEntry() != EOTS_BANNER_NEUTRAL) { if(m_CPBanner[i]->GetEntry() == EOTS_BANNER_ALLIANCE) { SendChatMessage(CHAT_MSG_BG_EVENT_NEUTRAL, 0, "The Alliance has lost the control of the %s.", EOTSControlPointNames[i]); } else if(m_CPBanner[i]->GetEntry() == EOTS_BANNER_HORDE) { SendChatMessage(CHAT_MSG_BG_EVENT_NEUTRAL, 0, "The Horde has lost the control of the %s.", EOTSControlPointNames[i]); } RespawnCPFlag(i, EOTS_BANNER_NEUTRAL); if(m_spiritGuides[i] != NULL) { RepopPlayersOfTeam(-1, m_spiritGuides[i]); m_spiritGuides[i]->Despawn(0, 0); RemoveSpiritGuide(m_spiritGuides[i]); m_spiritGuides[i] = NULL; } SetWorldState(m_iconsStates[i][0], 1); SetWorldState(m_iconsStates[i][1], 0); SetWorldState(m_iconsStates[i][2], 0); } } } /* update the players with the new value */ eitr = disp->begin(); eitrend = disp->end(); for(; eitr != eitrend;) { plr = *eitr; eitr2 = eitr; ++eitr; if(plr->GetDistance2dSq(go) > EOTS_CAPTURE_DISTANCE) { disp->erase(eitr2); plr->SendWorldStateUpdate(WORLDSTATE_EOTS_DISPLAYON, 0); // hide the cp bar } else plr->SendWorldStateUpdate(WORLDSTATE_EOTS_DISPLAYVALUE, m_CPStatus[i]); } } for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if(m_CPBanner[i] && m_CPBanner[i]->GetEntry() == EOTS_BANNER_ALLIANCE) towers[0]++; else if(m_CPBanner[i] && m_CPBanner[i]->GetEntry() == EOTS_BANNER_HORDE) towers[1]++; } SetWorldState(WORLDSTATE_EOTS_ALLIANCE_BASES, towers[0]); SetWorldState(WORLDSTATE_EOTS_HORDE_BASES, towers[1]); }
void EyeOfTheStorm::UpdateCPs() { uint32 i; set<Player*>::iterator itr, itrend; Player * plr; GameObject * go; int32 delta; uint32 playercounts[2]; uint32 towers[2] = {0,0}; EOTSCaptureDisplayList::iterator eitr, eitr2, eitrend; EOTSCaptureDisplayList * disp; for(i = 0; i < EOTS_TOWER_COUNT; ++i) { /* loop players inrange, add any that arent in the set to the set */ playercounts[0] = playercounts[1] = 0; go = m_CPStatusGO[i]; disp = &m_CPDisplay[i]; itr = go->GetInRangePlayerSetBegin(); itrend = go->GetInRangePlayerSetEnd(); for( ; itr != itrend; ++itr ) { plr = *itr; if( (plr->GetDistance2dSq( go ) <= EOTS_CAPTURE_DISTANCE) && plr->isAlive() && !plr->IsStealth() ) { playercounts[plr->GetTeam()]++; if( disp->find( plr ) == disp->end() ) { disp->insert( plr ); plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYON, 1); } } } /* score diff calculation */ //printf("EOTS: Playercounts = %u %u\n", playercounts[0], playercounts[1]); if(playercounts[0] != playercounts[1]) { if(playercounts[0] > playercounts[1]) delta = playercounts[0]; else if(playercounts[1] > playercounts[0]) delta = -(int32)playercounts[1]; delta *= EOTS_CAPTURE_RATE; m_CPStatus[i] += delta; if( m_CPStatus[i] > 100 ) m_CPStatus[i] = 100; else if( m_CPStatus[i] < 0 ) m_CPStatus[i] = 0; // change the flag depending on cp status if( m_CPStatus[i] == 0 ) { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_HORDE ) { SetWorldState( TowerWorldStates[i][0], 0); SetWorldState( TowerWorldStates[i][1], 1); RespawnCPFlag(i, EOTS_BANNER_HORDE); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( 0, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 1 ); AddSpiritGuide( m_spiritGuides[i] ); } } else if( m_CPStatus[i] == 100 ) { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_ALLIANCE ) { SetWorldState( TowerWorldStates[i][1], 0); SetWorldState( TowerWorldStates[i][0], 1); RespawnCPFlag(i, EOTS_BANNER_ALLIANCE); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( 1, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } m_spiritGuides[i] = SpawnSpiritGuide( EOTSGraveyardLocations[i][0], EOTSGraveyardLocations[i][1], EOTSGraveyardLocations[i][2], 0, 0 ); AddSpiritGuide( m_spiritGuides[i] ); } } else { if( m_CPBanner[i]->GetEntry() != EOTS_BANNER_NEUTRAL ) { for( uint32 j = 0; j < 2; ++j ) SetWorldState( TowerWorldStates[i][j], 0); RespawnCPFlag(i, EOTS_BANNER_NEUTRAL); if( m_spiritGuides[i] != NULL ) { RepopPlayersOfTeam( -1, m_spiritGuides[i] ); m_spiritGuides[i]->Despawn( 0, 0 ); RemoveSpiritGuide( m_spiritGuides[i] ); m_spiritGuides[i] = NULL; } } } } /* update the players with the new value */ eitr = disp->begin(); eitrend = disp->end(); for( ; eitr != eitrend; ) { plr = *eitr; eitr2 = eitr; ++eitr; if( plr->GetDistance2dSq( go ) > EOTS_CAPTURE_DISTANCE ) { disp->erase( eitr2 ); plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYON, 0); // hide the cp bar } else plr->SendWorldStateUpdate(EOTS_WORLDSTATE_DISPLAYVALUE, m_CPStatus[i]); } } for(i = 0; i < EOTS_TOWER_COUNT; ++i) { if( m_CPStatus[i] == 100 ) towers[0]++; else if( m_CPStatus[i] == 0 ) towers[1]++; } SetWorldState( EOTS_WORLDSTATE_ALLIANCE_BASES, towers[0] ); SetWorldState( EOTS_WORLDSTATE_HORDE_BASES, towers[1] ); }