static void update_client (entity *en) { helicopter *raw; int loop; aircraft_damage_types damage_type; raw = get_local_entity_data (en); update_local_entity_view_interest_level (en); update_local_helicopter_rotor_sounds (en); damage_type = aircraft_critically_damaged (en); if (raw->ac.mob.alive) { switch (raw->player) { //////////////////////////////////////// case ENTITY_PLAYER_AI: //////////////////////////////////////// { //////////////////////////////////////// for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { helicopter_death_movement (en); } else { if (!get_local_entity_int_value (en, INT_TYPE_LANDED)) { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); } helicopter_movement (en); } } //////////////////////////////////////// //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_rotors (en); update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); } // //////////////////////////////////////// break; } //////////////////////////////////////// case ENTITY_PLAYER_LOCAL: //////////////////////////////////////// { if (en != get_gunship_entity ()) { // // Client might be waiting for server to set old gunship to AI controlled. // return; } if (raw->invulnerable_timer > 0.0) { raw->invulnerable_timer -= get_delta_time (); } update_current_flight_dynamics_fuel_weight (); if ((!fire_continuous_weapon) && (get_local_entity_sound_type_valid (en, weapon_database [raw->ac.selected_weapon].launch_sound_effect_sub_type))) { pause_client_server_continuous_weapon_sound_effect (en, raw->ac.selected_weapon); } //helicopter_death_movement (en); //////////////////////////////////////// if ((!get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) && (!get_local_entity_int_value (en, INT_TYPE_EJECTED))) { update_flight_dynamics (); transmit_entity_comms_message (ENTITY_COMMS_UPDATE, en); } else { if (get_local_entity_int_value (en, INT_TYPE_LANDED)) { if (get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) { set_current_flight_dynamics_rotor_brake (TRUE); set_current_flight_dynamics_auto_pilot (FALSE); current_flight_dynamics->input_data.collective.value = 0.0; } } if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED)) || (get_local_entity_int_value (en, INT_TYPE_LANDED))) { set_current_flight_dynamics_auto_pilot (FALSE); } for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { helicopter_death_movement (en); } else { if (!get_local_entity_int_value (en, INT_TYPE_LANDED)) { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); } helicopter_movement (en); if (get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) { set_dynamics_entity_values (get_gunship_entity ()); } } } } //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); update_avionics (); update_cockpits (); update_aircraft_decoy_release (en); } // //////////////////////////////////////// // // Check if gunship has a task - if not then set gunship entity to NULL // if (!get_local_entity_parent (en, LIST_TYPE_FOLLOWER)) { if (!get_local_entity_int_value (en, INT_TYPE_EJECTED)) { if (en == get_gunship_entity ()) { set_gunship_entity (NULL); } } } break; } //////////////////////////////////////// case ENTITY_PLAYER_REMOTE: //////////////////////////////////////// { //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); } if ((get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { // no need for death_movement as if the remote_player is damaged it will default back to manual flight. if (get_local_entity_int_value (en, INT_TYPE_EJECTED)) { helicopter_death_movement (en); } else { if (!get_local_entity_int_value (en, INT_TYPE_LANDED)) { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); } helicopter_movement (en); } } } else { interpolate_entity_position (en); } // //////////////////////////////////////// break; } } } else { if (get_local_entity_int_value (en, INT_TYPE_OPERATIONAL_STATE) == OPERATIONAL_STATE_DEAD) { } else { for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { helicopter_death_movement (en); } } } }
static void update_server (entity *en) { entity *group; helicopter *raw; int loop; aircraft_damage_types damage_type; raw = get_local_entity_data (en); update_local_entity_view_interest_level (en); update_local_helicopter_rotor_sounds (en); damage_type = aircraft_critically_damaged (en); if (raw->ac.mob.alive) { switch (raw->player) { //////////////////////////////////////// case ENTITY_PLAYER_AI: //////////////////////////////////////// { //////////////////////////////////////// for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { helicopter_death_movement (en); } else { if (!get_local_entity_int_value (en, INT_TYPE_LANDED)) { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); } helicopter_movement (en); } } // provide resync for AI wingmen group = get_local_entity_parent (en, LIST_TYPE_MEMBER); if (group) { if ((get_local_entity_int_value (en, INT_TYPE_OPERATIONAL_STATE) != OPERATIONAL_STATE_LANDED) && (get_local_entity_int_value (group, INT_TYPE_MULTIPLAYER_GROUP))) { transmit_entity_comms_message (ENTITY_COMMS_UPDATE, en); } } //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_rotors (en); update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_rudder (en); update_aircraft_target_scan (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); update_aircraft_weapon_fire (en); update_aircraft_decoy_release (en); } // //////////////////////////////////////// break; } //////////////////////////////////////// case ENTITY_PLAYER_LOCAL: //////////////////////////////////////// { ASSERT (en == get_gunship_entity ()); if (raw->invulnerable_timer > 0.0) { raw->invulnerable_timer -= get_delta_time (); } update_current_flight_dynamics_fuel_weight (); update_current_flight_dynamics_flight_time (); //////////////////////////////////////// if ((!get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) && (!get_local_entity_int_value (en, INT_TYPE_EJECTED))) { update_flight_dynamics (); update_player_helicopter_waypoint_distance (en); } else { if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED)) || (get_local_entity_int_value (en, INT_TYPE_LANDED))) { set_current_flight_dynamics_auto_pilot (FALSE); if (get_local_entity_int_value (en, INT_TYPE_LANDED)) { set_current_flight_dynamics_rotor_brake (TRUE); current_flight_dynamics->input_data.collective.value = 0.0; } } for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { if (get_local_entity_int_value (en, INT_TYPE_EJECTED)) { helicopter_death_movement (en); } else { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); helicopter_movement (en); if (get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) { set_dynamics_entity_values (en); } } } } //////////////////////////////////////// transmit_entity_comms_message (ENTITY_COMMS_UPDATE, en); //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); update_avionics (); update_cockpits (); update_aircraft_decoy_release (en); } // //////////////////////////////////////// // // Check if gunship has a task - if not then set gunship entity to NULL // if (!get_local_entity_parent (en, LIST_TYPE_FOLLOWER)) { if (!get_local_entity_int_value (en, INT_TYPE_EJECTED)) { if (en == get_gunship_entity ()) { set_gunship_entity (NULL); } } } break; } //////////////////////////////////////// case ENTITY_PLAYER_REMOTE: //////////////////////////////////////// { //////////////////////////////////////// if (raw->invulnerable_timer > 0.0) { raw->invulnerable_timer -= get_delta_time (); } if ((get_local_entity_int_value (en, INT_TYPE_AUTO_PILOT)) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { if ((damage_type == AIRCRAFT_DAMAGE_CRITICAL) || (get_local_entity_int_value (en, INT_TYPE_EJECTED))) { helicopter_death_movement (en); } else { if (!get_local_entity_int_value (en, INT_TYPE_LANDED)) { get_3d_terrain_point_data (raw->ac.mob.position.x, raw->ac.mob.position.z, &raw->ac.terrain_info); } helicopter_movement (en); } } #if DEBUG_MODULE debug_log ("HC_UPDT: SERVER: moving client %d using AUTO PILOT", get_local_entity_index (en)); #endif } else { interpolate_entity_position (en); update_player_helicopter_waypoint_distance (en); } //////////////////////////////////////// // // ORDER IS CRITICAL // if (raw->ac.mob.alive) { update_aircraft_loading_doors (en); update_aircraft_cargo_doors (en); update_aircraft_undercarriage (en); update_aircraft_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); } // //////////////////////////////////////// break; } } } else { if (get_local_entity_int_value (en, INT_TYPE_OPERATIONAL_STATE) == OPERATIONAL_STATE_DEAD) { raw->ac.death_timer -= get_delta_time (); if (raw->ac.death_timer <= 0.0) { if (get_local_entity_int_value (en, INT_TYPE_PLAYER) == ENTITY_PLAYER_AI) { // // don't destroy helicopters while they are still occupied by players (otherwise avionics / pilot-entity etc. don't get deinitialised) // destroy_client_server_entity_family (en); } else { raw->ac.death_timer = 0.0; } } } else { for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { helicopter_death_movement (en); } } } }
void update_weapon_lock_type (target_acquisition_systems system) { entity *source, *target; entity_sub_types selected_weapon_type; float target_range, theta, weapon_min_range, weapon_max_range; vec3d *source_position, *target_position, *weapon_vector, *weapon_to_target_vector; //////////////////////////////////////// // // WEAPON_LOCK_NO_ACQUIRE // //////////////////////////////////////// if (system == TARGET_ACQUISITION_SYSTEM_OFF) { weapon_lock_type = WEAPON_LOCK_NO_ACQUIRE; return; } //////////////////////////////////////// // // WEAPON_LOCK_NO_WEAPON // //////////////////////////////////////// source = get_gunship_entity (); selected_weapon_type = get_local_entity_int_value (source, INT_TYPE_SELECTED_WEAPON); if (selected_weapon_type == ENTITY_SUB_TYPE_WEAPON_NO_WEAPON) { weapon_lock_type = WEAPON_LOCK_NO_WEAPON; return; } //////////////////////////////////////// // // WEAPON_LOCK_NO_TARGET // //////////////////////////////////////// target = get_local_entity_parent (source, LIST_TYPE_TARGET); if (!target) { weapon_lock_type = WEAPON_LOCK_NO_TARGET; return; } //////////////////////////////////////// // // WEAPON_LOCK_INVALID_TARGET // //////////////////////////////////////// // // infra-red air-to-air weapons require an airborne target // if (weapon_database[selected_weapon_type].guidance_type == WEAPON_GUIDANCE_TYPE_PASSIVE_INFRA_RED) { if (weapon_database[selected_weapon_type].weapon_class & WEAPON_CLASS_AIR_TO_AIR) { if (!get_local_entity_int_value (target, INT_TYPE_AIRBORNE_AIRCRAFT)) { weapon_lock_type = WEAPON_LOCK_INVALID_TARGET; return; } } } //////////////////////////////////////// // // WEAPON_LOCK_SEEKER_LIMIT // //////////////////////////////////////// // // if guided weapon check target is inside the seeker limit // if (weapon_database[selected_weapon_type].guidance_type != WEAPON_GUIDANCE_TYPE_NONE) { update_entity_weapon_system_weapon_and_target_vectors (source); if (get_local_entity_int_value (source, INT_TYPE_WEAPON_AND_TARGET_VECTORS_VALID)) { weapon_vector = get_local_entity_vec3d_ptr (source, VEC3D_TYPE_WEAPON_VECTOR); weapon_to_target_vector = get_local_entity_vec3d_ptr (source, VEC3D_TYPE_WEAPON_TO_TARGET_VECTOR); theta = get_3d_unit_vector_dot_product (weapon_vector, weapon_to_target_vector); theta = fabs (acos (theta)); if (theta > weapon_database[selected_weapon_type].max_launch_angle_error) { weapon_lock_type = WEAPON_LOCK_SEEKER_LIMIT; return; } } else { // // this should never happen // debug_colour_log (DEBUG_COLOUR_RED, "WARNING! Target and weapon vectors are not valid"); } } //////////////////////////////////////// // // WEAPON_LOCK_NO_LOS // //////////////////////////////////////// // // if air or ground radar then check line of sight // if ((system == TARGET_ACQUISITION_SYSTEM_GROUND_RADAR) || (system == TARGET_ACQUISITION_SYSTEM_AIR_RADAR)) { if (!get_local_entity_int_value (target, INT_TYPE_GUNSHIP_RADAR_LOS_CLEAR)) { weapon_lock_type = WEAPON_LOCK_NO_LOS; return; } } //////////////////////////////////////// // // WEAPON_LOCK_NO_BORESIGHT // //////////////////////////////////////// // // a boresight_weapon will be an unguided weapon so the seeker limit test is not being repeated here // if (weapon_database[selected_weapon_type].boresight_weapon) { update_entity_weapon_system_weapon_and_target_vectors (source); if (get_local_entity_int_value (source, INT_TYPE_WEAPON_AND_TARGET_VECTORS_VALID)) { weapon_vector = get_local_entity_vec3d_ptr (source, VEC3D_TYPE_WEAPON_VECTOR); weapon_to_target_vector = get_local_entity_vec3d_ptr (source, VEC3D_TYPE_WEAPON_TO_TARGET_VECTOR); theta = get_3d_unit_vector_dot_product (weapon_vector, weapon_to_target_vector); theta = fabs (acos (theta)); if (theta > rad (1.0)) { weapon_lock_type = WEAPON_LOCK_NO_BORESIGHT; return; } } else { // // this should never happen // debug_colour_log (DEBUG_COLOUR_RED, "WARNING! Target and weapon vectors are not valid"); } } //////////////////////////////////////// // // WEAPON_LOCK_MIN_RANGE // WEAPON_LOCK_MAX_RANGE // //////////////////////////////////////// source_position = get_local_entity_vec3d_ptr (source, VEC3D_TYPE_POSITION); target_position = get_local_entity_vec3d_ptr (target, VEC3D_TYPE_POSITION); target_range = get_3d_range (source_position, target_position); weapon_min_range = weapon_database[selected_weapon_type].min_range; if (weapon_database[selected_weapon_type].hellfire_flight_profile) { if (get_local_entity_int_value (source, INT_TYPE_LOCK_ON_AFTER_LAUNCH)) { weapon_min_range = weapon_database[selected_weapon_type].min_range_loal; } } if (target_range < weapon_min_range) { weapon_lock_type = WEAPON_LOCK_MIN_RANGE; return; } weapon_max_range = weapon_database[selected_weapon_type].max_range; if (weapon_database[selected_weapon_type].hellfire_flight_profile) { if (get_local_entity_int_value (source, INT_TYPE_LOCK_ON_AFTER_LAUNCH)) { weapon_max_range = weapon_database[selected_weapon_type].max_range_loal; } } if (target_range > weapon_max_range) { weapon_lock_type = WEAPON_LOCK_MAX_RANGE; return; } //////////////////////////////////////// // // WEAPON_LOCK_VALID // //////////////////////////////////////// weapon_lock_type = WEAPON_LOCK_VALID; }
static void update_server (entity *en) { ship_vehicle *raw; int loop; raw = (ship_vehicle *) get_local_entity_data (en); update_local_entity_view_interest_level (en); raw->vh.sleep -= get_delta_time (); raw->vh.sleep = max (raw->vh.sleep, 0.0f); if (raw->vh.mob.alive) { //////////////////////////////////////// for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { ship_vehicle_movement (en); } //////////////////////////////////////// update_vehicle_loading_doors (en); update_vehicle_radar (en); //////////////////////////////////////// // // ORDER IS CRITICAL // update_vehicle_target_scan (en); update_vehicle_weapon_system_ready (en); suppress_ineffective_ship_weapons (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); update_vehicle_weapon_fire (en); if (tacview_is_logging() && command_line_tacview_logging < 3) { // for modes < 3 we have to check if it's visible now and add or remove it accordingly // ships never move, so no need to update for that write_tacview_unit_update(en, FALSE, FALSE, FALSE); } // //////////////////////////////////////// } else { for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { ship_vehicle_death_movement (en); } } }
static void update_server (entity *en) { person *raw; int loop; raw = (person *) get_local_entity_data (en); update_local_entity_view_interest_level (en); raw->vh.sleep -= get_delta_time (); raw->vh.sleep = max (raw->vh.sleep, 0.0f); if (raw->vh.mob.alive) { // // Update // for (loop = 0; loop < get_entity_movement_iterations (); loop ++) { person_movement (en); } //////////////////////////////////////// update_person_animation (en); //////////////////////////////////////// // // ORDER IS CRITICAL // update_vehicle_target_scan (en); update_vehicle_weapon_system_ready (en); update_entity_weapon_systems (en); update_entity_weapon_system_weapon_and_target_vectors (en); update_vehicle_weapon_fire (en); update_vehicle_decoy_release (en); // //////////////////////////////////////// } else { update_person_animation (en); raw->vh.death_timer -= get_delta_time (); if (raw->vh.death_timer <= 0.0) { destroy_client_server_entity_family (en); } } }