static void update_server (entity *en) { weapon *raw; raw = (weapon *) get_local_entity_data (en); if (raw->mob.kill_next_update) { destroy_client_server_entity_family (en); return; } weapon_movement (en); update_weapon_animation (en); if (weapon_database[raw->mob.sub_type].decoy_type != WEAPON_DECOY_TYPE_NONE) { update_decoy (en); } if (raw->kill_code != WEAPON_KILL_CODE_OK) { create_client_server_weapon_killed_explosion_effect (en); raw->mob.kill_next_update = TRUE; } }
void destroy_client_server_sound_effects (entity *en) { entity *spec, *next; spec = get_local_entity_first_child (en, LIST_TYPE_SPECIAL_EFFECT); while (spec) { next = get_local_entity_child_succ (spec, LIST_TYPE_SPECIAL_EFFECT); if (get_local_entity_type (spec) == ENTITY_TYPE_SOUND_EFFECT) { destroy_client_server_entity_family (spec); } spec = next; } }
void kill_entities_awaiting_update (void) { entity *destroy_en, *en; en = get_local_entity_list (); while (en) { destroy_en = en; en = get_local_entity_succ (en); if (get_local_entity_int_value (destroy_en, INT_TYPE_KILL_NEXT_UPDATE)) { destroy_client_server_entity_family (destroy_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 destroy_client_server_entity_children (entity *en, list_types list) { entity *child; child = get_local_entity_first_child (en, list); while (child) { #if DEBUG_MODULE { static int reported_segment = FALSE, reported_city_building = FALSE, reported_sector = FALSE; #if DEBUG_UPDATE_LIST_VALIDATION entity *succ, *pred, *updt; if (get_update_entity ()) { updt = get_local_entity_first_child (get_update_entity (), LIST_TYPE_UPDATE); while (updt) { ASSERT (updt->type != ENTITY_TYPE_UNKNOWN); succ = get_local_entity_child_succ (updt, LIST_TYPE_UPDATE); if (succ) { ASSERT (get_local_entity_child_pred (succ, LIST_TYPE_UPDATE) == updt); } pred = get_local_entity_child_pred (updt, LIST_TYPE_UPDATE); if (pred) { ASSERT (get_local_entity_child_succ (pred, LIST_TYPE_UPDATE) == updt); } updt = get_local_entity_child_succ (updt, LIST_TYPE_UPDATE); } } #endif switch (get_local_entity_type (en)) { case ENTITY_TYPE_SEGMENT: case ENTITY_TYPE_SECTOR: case ENTITY_TYPE_CITY_BUILDING: { if (get_local_entity_type (en) == ENTITY_TYPE_SEGMENT) { if (reported_segment) { break; } reported_segment = TRUE; } if (get_local_entity_type (en) == ENTITY_TYPE_SECTOR) { if (reported_sector) { break; } reported_sector = TRUE; } if (get_local_entity_type (en) == ENTITY_TYPE_CITY_BUILDING) { if (reported_city_building) { break; } reported_city_building = TRUE; } } default: { debug_log ("EN_DSTRY: destroying %s, index %d, sub_type %d", get_local_entity_type_name (child), get_local_entity_index (child), get_local_entity_int_value (en, INT_TYPE_ENTITY_SUB_TYPE)); break; } } } #endif destroy_client_server_entity_family (child); child = get_local_entity_first_child (en, list); } }
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); } } }
void ship_vehicle_death_movement (entity *en) { ship_vehicle *raw; float speed, heading, pitch, roll; vec3d *pos, *velocity, new_pos; raw = get_local_entity_data (en); // // work out new position // velocity = get_local_entity_vec3d_ptr (en, VEC3D_TYPE_MOTION_VECTOR); pos = get_local_entity_vec3d_ptr (en, VEC3D_TYPE_POSITION); new_pos.x = pos->x + (velocity->x * get_entity_movement_delta_time()); new_pos.y = pos->y + (velocity->y * get_entity_movement_delta_time()); new_pos.z = pos->z + (velocity->z * get_entity_movement_delta_time()); // // update velocity // velocity->x -= (velocity->x * 0.2 * get_entity_movement_delta_time ()); velocity->z -= (velocity->z * 0.2 * get_entity_movement_delta_time ()); velocity->y -= (SHIP_SINK_RATE * get_entity_movement_delta_time ()); speed = get_3d_vector_magnitude (velocity); set_local_entity_float_value (en, FLOAT_TYPE_VELOCITY, speed); // // update attitude // heading = get_heading_from_attitude_matrix (raw->vh.mob.attitude); pitch = get_pitch_from_attitude_matrix (raw->vh.mob.attitude); pitch += (SHIP_SINK_DELTA_PITCH_RATE * get_entity_movement_delta_time()); roll = get_roll_from_attitude_matrix (raw->vh.mob.attitude); roll += (SHIP_SINK_DELTA_ROLL_RATE * get_entity_movement_delta_time()); get_3d_transformation_matrix (raw->vh.mob.attitude, heading, pitch, roll); // // set new position // set_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &new_pos); clear_ship_fires (en, ENTITY_SUB_TYPE_EFFECT_SMOKE_LIST_FIRE); clear_ship_fires (en, ENTITY_SUB_TYPE_EFFECT_SMOKE_LIST_EXPLOSION_TRAIL); // // remove ship if totally obscured (i.e. sunk) // if (get_comms_model () == COMMS_MODEL_SERVER) { struct OBJECT_3D_BOUNDS *bounding_box; vec3d d; float obscured_altitude; bounding_box = get_object_3d_bounding_box (get_local_entity_int_value (en, INT_TYPE_OBJECT_3D_SHAPE)); d.x = bounding_box->xmax - bounding_box->xmin; d.y = bounding_box->ymax - bounding_box->ymin; d.z = bounding_box->zmax - bounding_box->zmin; obscured_altitude = -(0.5 * get_3d_vector_magnitude (&d)); if (new_pos.y < obscured_altitude) { // // ship is no longer visible // destroy_client_server_entity_family (en); } } }