void CAnomalyDetector::update_schedule() { if (m_active) m_object->feel_touch_update(m_object->Position(), m_radius); if (m_storage.empty()) return; xr_vector<u16> temp_out_restrictors; xr_vector<u16> temp_in_restrictors; temp_in_restrictors.reserve(m_storage.size()); // add new restrictions for (ANOMALY_INFO_VEC_IT it = m_storage.begin(); it != m_storage.end(); it++) { if (it->time_registered == 0) { temp_in_restrictors.push_back(it->object->ID()); it->time_registered = time(); } } m_object->control().path_builder().restrictions().add_restrictions(temp_out_restrictors,temp_in_restrictors); // remove old restrictions temp_in_restrictors.clear(); for (ANOMALY_INFO_VEC_IT it = m_storage.begin(); it != m_storage.end(); it++) { if (it->time_registered + m_time_to_rememeber < time()) { temp_in_restrictors.push_back(it->object->ID()); } } m_object->control().path_builder().restrictions().remove_restrictions(temp_out_restrictors,temp_in_restrictors); // remove from storage m_storage.erase ( std::remove_if( m_storage.begin(), m_storage.end(), remove_predicate(m_time_to_rememeber) ), m_storage.end() ); }
void CPolterFlame::update_schedule() { inherited::update_schedule(); //--------------------------------------------------------------------- // Update Scanner if (m_object->g_Alive()) { // check the start of scanning if (!m_state_scanning && !m_object->EnemyMan.get_enemy()) { // check radius if (Actor()->Position().distance_to(m_object->Position()) < m_scan_radius) { // check timing if (m_scan_next_time < time()) { // start here m_state_scanning = true; // играть звук //m_scan_sound.play_at_pos(m_object, get_head_position(Actor()),sm_2D); ::Sound->play_at_pos(m_scan_sound, 0, Actor()->Position()); // постпроцесс Actor()->Cameras().AddPPEffector(new CMonsterEffector(m_scan_effector_info, m_scan_effector_time, m_scan_effector_time_attack, m_scan_effector_time_release)); } } } // check stop of scanning (it currently scans) else { if (!m_scan_sound._feedback()) { // stop here m_state_scanning = false; // count next scan time m_scan_next_time = time() + Random.randI(m_scan_delay_min,m_scan_delay_max); } } } //--------------------------------------------------------------------- // check all flames for (FLAME_ELEMS_IT it = m_flames.begin();it != m_flames.end();it++) { SFlameElement *elem = *it; // test switches to states switch(elem->state) { case ePrepare: // check if time_out if (elem->time_started + m_time_fire_delay < time()) select_state(elem,eFire); break; case eFire: if (elem->time_started + m_time_fire_play < time()) select_state(elem,eStop); else { // check if we need test hit to enemy if (elem->time_last_hit + m_hit_delay < time()) { // test hit collide::rq_result rq; if (Level().ObjectSpace.RayPick(elem->position, elem->target_dir, m_length, collide::rqtBoth, rq, NULL)) { if ((rq.O == elem->target_object) && (rq.range < m_length)) { float hit_value; hit_value = m_hit_value - m_hit_value * rq.range / m_length; NET_Packet P; SHit HS; HS.GenHeader (GE_HIT, elem->target_object->ID()); // u_EventGen (P,GE_HIT, element->target_object->ID()); HS.whoID = (m_object->ID()); // P.w_u16 (ID()); HS.weaponID = (m_object->ID()); // P.w_u16 (ID()); HS.dir = (elem->target_dir); // P.w_dir (element->target_dir); HS.power = (hit_value); // P.w_float (m_flame_hit_value); HS.boneID = (BI_NONE); // P.w_s16 (BI_NONE); HS.p_in_bone_space = (Fvector().set(0.f,0.f,0.f)); // P.w_vec3 (Fvector().set(0.f,0.f,0.f)); HS.impulse = (0.f); // P.w_float (0.f); HS.hit_type = (ALife::eHitTypeBurn); // P.w_u16 (u16(ALife::eHitTypeBurn)); HS.Write_Packet (P); m_object->u_EventSend (P); elem->time_last_hit = time(); } } } } break; case eStop: xr_delete(*it); break; } } // remove all flames in state stop // удалить все элементы, выполнение которых закончено m_flames.erase ( std::remove_if( m_flames.begin(), m_flames.end(), remove_predicate() ), m_flames.end() ); // check if we can create another flame if (m_object->g_Alive() && m_object->EnemyMan.get_enemy() && (m_flames.size() < m_count)) { // check aura radius and accessibility float dist = m_object->EnemyMan.get_enemy()->Position().distance_to(m_object->Position()); if ((dist < m_pmt_aura_radius) && m_object->control().path_builder().accessible(m_object->EnemyMan.get_enemy()->Position())) { // check timing if (m_time_flame_started + m_delay < time()) { create_flame(m_object->EnemyMan.get_enemy()); } } } }