void update_create_entity_statistics (entity_types type) { ASSERT ((type > ENTITY_TYPE_UNKNOWN) && (type < NUM_ENTITY_TYPES)); // // ignore client create on transmit (wait until client create on receive) // if ((get_comms_model () == COMMS_MODEL_CLIENT) && (get_comms_data_flow () == COMMS_DATA_FLOW_TX)) { return; } if (++entity_count > entity_peak_count) { entity_peak_count = entity_count; } entity_type_stats[type].total_created++; if (++entity_type_stats[type].count > entity_type_stats[type].peak_count) { entity_type_stats[type].peak_count = entity_type_stats[type].count; } }
int assert_local_create_entity_index (int index) { //Xhit: Added so that ENTITY_INDEX_CREATE_LOCAL are also accepted (030428) //VJ 030508 if downwash if (command_line_downwash && index == ENTITY_INDEX_CREATE_LOCAL) { return (TRUE); } if (get_comms_model () == COMMS_MODEL_SERVER) { return (index == ENTITY_INDEX_DONT_CARE); } else { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { return (FALSE); } else { return (index != ENTITY_INDEX_DONT_CARE); } } }
void set_pilot_entity (entity *en) { comms_data_flow_types store_data_flow; if (en) { debug_log ("PILOT: Setting pilot_entity to %s", get_local_entity_string (en, STRING_TYPE_PILOTS_NAME)); ASSERT (pilot_entity == NULL); ASSERT (get_local_entity_type (en) == ENTITY_TYPE_PILOT); pilot_entity = en; // turn on NEXT button now Pilot entity has arrived if (get_comms_model () == COMMS_MODEL_CLIENT) { set_display_gunship_buttons (FALSE, "ENGAGE"); // turn on only the gunship_next button set_ui_object_drawable (gunship_screen_next_button, TRUE); } //-- Werewolf else { // If we're the server, remember our player name. This will be sent out in the heartbeat packets. net_set_hostname( get_local_entity_string (en, STRING_TYPE_PILOTS_NAME) ); } //-- Werewolf } else if (pilot_entity) { debug_log ("PILOT: Setting pilot_entity to NULL"); ASSERT (pilot_entity); // // Program MUST be in TX mode otherwise clients pilot will not be destroyed on the server // store_data_flow = get_comms_data_flow (); set_comms_data_flow (COMMS_DATA_FLOW_TX); destroy_client_server_entity (pilot_entity); set_comms_data_flow (store_data_flow); pilot_entity = NULL; } }
static void debug_log_text (entity_debug_modes mode, entity *en, char *format, ...) { va_list pargs; char s1[400], s2[400], *name; // // prefix // strcpy (s1, debug_log_comms_prefix[get_comms_model ()][get_comms_data_flow ()]); strcat (s1, debug_log_mode_prefix[mode]); // // entity type and index // if (en) { name = get_local_entity_type_name (en); } else { name = get_entity_type_name (ENTITY_TYPE_UNKNOWN); } sprintf (s2, "%-25.25s (index = %5d): ", name, get_local_entity_safe_index (en)); strcat (s1, s2); // // args // va_start (pargs, format); vsprintf (s2, format, pargs); va_end (pargs); strcat (s1, s2); debug_log (s1); }
static void set_client_int_value (entity *en, int_types type, int value) { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { validate_client_server_remote_fn (); set_remote_int_value (en, type, value); } else { validate_client_server_local_fn (); set_local_int_value (en, type, value); } }
static void set_client_vec3d (entity *en, vec3d_types type, vec3d *v) { ASSERT (v); if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { validate_client_server_remote_fn (); set_remote_vec3d (en, type, v); } else { validate_client_server_local_fn (); set_local_vec3d (en, type, v); } }
static void set_client_string (entity *en, string_types type, const char *s) { ASSERT (s); if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { validate_client_server_remote_fn (); set_remote_string (en, type, s); } else { validate_client_server_local_fn (); set_local_string (en, type, s); } }
int assert_remote_create_entity_index (int index) { if (get_comms_model () == COMMS_MODEL_SERVER) { return (index != ENTITY_INDEX_DONT_CARE); } else { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { return (index == ENTITY_INDEX_DONT_CARE); } else { return (FALSE); } } }
static void kill_client (entity *en) { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { validate_client_server_remote_fn (); kill_remote (en); } else { validate_client_server_local_fn (); // // kill local using 'full' function // kill_local_entity (en); } }
static entity *create_client (entity_types type, int index, char *pargs) { entity *en; if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { validate_client_server_remote_fn (); en = create_remote (type, index, pargs); } else { validate_client_server_local_fn (); en = create_local (type, index, pargs); } return (en); }
void set_client_server_entity_weapon_damage (entity *en, int heading_depth, entity_sub_types weapon_sub_type, int damage) { ASSERT (en); if (get_comms_model () == COMMS_MODEL_SERVER) { //////////////////////////////////////// // // SERVER/TX and SERVER/RX // //////////////////////////////////////// set_local_entity_weapon_damage (en, heading_depth, weapon_sub_type, damage); transmit_entity_comms_message (ENTITY_COMMS_DAMAGE_WEAPON_PACKAGE, en, heading_depth, weapon_sub_type, damage); } else { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { //////////////////////////////////////// // // CLIENT/TX // //////////////////////////////////////// transmit_entity_comms_message (ENTITY_COMMS_DAMAGE_WEAPON_PACKAGE, en, heading_depth, weapon_sub_type, damage); } else { //////////////////////////////////////// // // CLIENT/RX // //////////////////////////////////////// set_local_entity_weapon_damage (en, heading_depth, weapon_sub_type, damage); } } }
void reinitialise_client_ai_system (void) { comms_model_types temp_comms_model; comms_data_flow_types temp_comms_data_flow; temp_comms_model = get_comms_model (); temp_comms_data_flow = get_comms_data_flow (); // // set comms model and data flow to SERVER/TX // set_comms_model (COMMS_MODEL_SERVER); set_comms_data_flow (COMMS_DATA_FLOW_TX); if (population_placement_filename) { read_population_placement_file (population_placement_filename); } set_comms_model (temp_comms_model); set_comms_data_flow (temp_comms_data_flow); initialise_keysite_farp_enable (get_local_force_entity (ENTITY_SIDE_BLUE_FORCE)); initialise_keysite_farp_enable (get_local_force_entity (ENTITY_SIDE_RED_FORCE)); initialise_briefing_parser (); set_assign_create_waypoint_route (TRUE); }
entity *create_local_sound_effect_entity ( int index, entity *parent, entity_sides side, entity_sub_types sub_type, sound_channel_types channel, sound_locality_types locality, vec3d *position, float amp, int valid, int looping, int sample_count, sound_sample_indices *sample_indices ) { entity *en; vec3d pos; int panning, create_stack_attributes; ASSERT (parent); create_stack_attributes = force_local_entity_create_stack_attributes; if (get_comms_data_flow () == COMMS_DATA_FLOW_RX) { set_force_local_entity_create_stack_attributes (TRUE); } panning = TRUE; if (position) { pos = *position; } else { position = get_local_entity_vec3d_ptr (parent, VEC3D_TYPE_POSITION); if (position) { pos = *position; } else { pos.x = MID_MAP_X; pos.y = MID_MAP_Y; pos.z = MID_MAP_Z; panning = FALSE; } } // // special cases for speech // switch (sub_type) { case ENTITY_SUB_TYPE_EFFECT_SOUND_RADIO_MESSAGE: { if (get_global_gunship_side () == side) { amp = adjust_radio_message_amplification (amp, &pos); } else { amp = 0.0; } panning = FALSE; break; } case ENTITY_SUB_TYPE_EFFECT_SOUND_CPG_MESSAGE: case ENTITY_SUB_TYPE_EFFECT_SOUND_WARNING_MESSAGE: { if (parent == get_gunship_entity ()) { amp = 1.0; } else { amp = 0.0; } panning = FALSE; break; } } // // create sound // en = create_local_entity ( ENTITY_TYPE_SOUND_EFFECT, index, ENTITY_ATTR_INT_VALUE (INT_TYPE_ENTITY_SUB_TYPE, sub_type), ENTITY_ATTR_PARENT (LIST_TYPE_SPECIAL_EFFECT, parent), ENTITY_ATTR_VEC3D (VEC3D_TYPE_POSITION, pos.x, pos.y, pos.z), ENTITY_ATTR_INT_VALUE (INT_TYPE_SOUND_CHANNEL, channel), ENTITY_ATTR_INT_VALUE (INT_TYPE_SOUND_EFFECT_LOOPING, looping), ENTITY_ATTR_INT_VALUE (INT_TYPE_SOUND_EFFECT_PANNING, panning), ENTITY_ATTR_INT_VALUE (INT_TYPE_SOUND_LOCALITY, locality), ENTITY_ATTR_INT_VALUE (INT_TYPE_VALID_SOUND_EFFECT, valid), ENTITY_ATTR_FLOAT_VALUE (FLOAT_TYPE_AMPLIFICATION, amp), ENTITY_ATTR_END ); set_local_sound_effect_sample_indices (en, sample_count, sample_indices); #if DEBUG_MODULE debug_log ("SOUNDEFF : created effect %s (%d), parent %s (%d), next %d, looping %d, valid %d", application_sound_effects [sample_indices [0]].name, get_local_entity_index (en), get_local_entity_type_name (parent), get_local_entity_index (parent), looping, valid); #endif set_force_local_entity_create_stack_attributes (create_stack_attributes); return en; }
void create_client_server_entity_weapon (entity *launcher, entity_sub_types weapon_sub_type, int weapon_index, int burst_size, int *smoke_trail_indices) { entity *force, *target, *weapon; meta_smoke_list_types smoke_trail_type; int i, num_smoke_trail_entities, valid_sound_effect, current_weapon_count, new_weapon_count; ASSERT (launcher); ASSERT (entity_sub_type_weapon_valid (weapon_sub_type)); // // get target // if (!(weapon_database[weapon_sub_type].weapon_class & (WEAPON_CLASS_DECOY | WEAPON_CLASS_CARGO | WEAPON_CLASS_DEBRIS))) { target = get_local_entity_parent (launcher, LIST_TYPE_TARGET); /* if (weapon_database[weapon_sub_type].hellfire_flight_profile) { if (get_local_entity_int_value (launcher, INT_TYPE_LOCK_ON_AFTER_LAUNCH)) { target = NULL; } } */ } else { target = NULL; } if (get_comms_model () == COMMS_MODEL_SERVER) { //////////////////////////////////////// // // SERVER/TX and SERVER/RX // //////////////////////////////////////// ASSERT (weapon_index == ENTITY_INDEX_DONT_CARE); ASSERT (burst_size == BURST_SIZE_DONT_CARE); ASSERT (!smoke_trail_indices); // NOTE: The clients' weapon counters lag the servers' so it is possible that the // client may unknowingly attempt to create more weapons than are available. // This is prone to happen during rapid firing. current_weapon_count = get_local_entity_weapon_count (launcher, weapon_sub_type); if (current_weapon_count > 0) { int loal_mode = weapon_database[weapon_sub_type].hellfire_flight_profile && get_local_entity_int_value (launcher, INT_TYPE_LOCK_ON_AFTER_LAUNCH); if (get_comms_data_flow () == COMMS_DATA_FLOW_RX) { set_force_local_entity_create_stack_attributes (TRUE); } // // get burst size wrt rate of fire // if (weapon_database[weapon_sub_type].rate_of_fire != FIRE_SINGLE_WEAPON) { float time_per_shot = weapon_database[weapon_sub_type].inverse_rate_of_fire * ONE_MINUTE; unsigned int* last_shot = NULL; switch (launcher->type) { case ENTITY_TYPE_HELICOPTER: last_shot = &((helicopter*)get_local_entity_data(launcher))->ac.weapon_salvo_timer; break; case ENTITY_TYPE_FIXED_WING: last_shot = &((fixed_wing*)get_local_entity_data(launcher))->ac.weapon_salvo_timer; break; case ENTITY_TYPE_ANTI_AIRCRAFT: last_shot = &((anti_aircraft*)get_local_entity_data(launcher))->vh.weapon_salvo_timer; break; case ENTITY_TYPE_PERSON: last_shot = &((person*)get_local_entity_data(launcher))->vh.weapon_salvo_timer; break; case ENTITY_TYPE_ROUTED_VEHICLE: last_shot = &((routed_vehicle*)get_local_entity_data(launcher))->vh.weapon_salvo_timer; break; case ENTITY_TYPE_SHIP_VEHICLE: last_shot = &((ship_vehicle*)get_local_entity_data(launcher))->vh.weapon_salvo_timer; break; } if (last_shot) { unsigned int current_time = get_system_time(); float elapsed_time = 1; if (*last_shot > 0) { if (current_time < *last_shot) return; elapsed_time = (current_time - *last_shot) * 0.001; } else elapsed_time = get_delta_time(); burst_size = (int)(weapon_database[weapon_sub_type].rate_of_fire * ONE_OVER_ONE_MINUTE * elapsed_time); if (burst_size < 1) { if (*last_shot == 0) // first shot in salvo always get fired burst_size = 1; else return; } if (*last_shot) *last_shot += (int)(burst_size * time_per_shot * 1000.0); else *last_shot = current_time; } else { ASSERT(FALSE); burst_size = 1; } } else { burst_size = 1; } // // set burst timer // valid_sound_effect = FALSE; if (get_local_entity_float_value (launcher, FLOAT_TYPE_WEAPON_BURST_TIMER) == 0.0) { set_local_entity_float_value (launcher, FLOAT_TYPE_WEAPON_BURST_TIMER, weapon_database[weapon_sub_type].burst_duration); valid_sound_effect = TRUE; } // // create weapon // weapon = create_local_entity ( ENTITY_TYPE_WEAPON, ENTITY_INDEX_DONT_CARE, ENTITY_ATTR_INT_VALUE (INT_TYPE_ENTITY_SUB_TYPE, weapon_sub_type), ENTITY_ATTR_INT_VALUE (INT_TYPE_WEAPON_BURST_SIZE, burst_size), ENTITY_ATTR_INT_VALUE (INT_TYPE_WEAPON_MISSILE_PHASE, MISSILE_PHASE1), ENTITY_ATTR_INT_VALUE (INT_TYPE_LOCK_ON_AFTER_LAUNCH, loal_mode), ENTITY_ATTR_PARENT (LIST_TYPE_LAUNCHED_WEAPON, launcher), ENTITY_ATTR_PARENT (LIST_TYPE_TARGET, target), ENTITY_ATTR_END ); if (weapon) { // // send FIRE message to force (unless it's a decoy/cargo/debris being launched) // if ((target) && (!(weapon_database[weapon_sub_type].weapon_class & (WEAPON_CLASS_DECOY | WEAPON_CLASS_CARGO | WEAPON_CLASS_DEBRIS)))) { force = get_local_force_entity ((entity_sides) get_local_entity_int_value (target, INT_TYPE_SIDE)); if (force) { notify_local_entity (ENTITY_MESSAGE_ENTITY_FIRED_AT, force, launcher, target); } } // // create sound effect(s) // if (valid_sound_effect) { create_weapon_launched_sound_effects (launcher, weapon_sub_type); } // // create smoke trail // smoke_trail_type = (meta_smoke_list_types) get_local_entity_int_value (weapon, INT_TYPE_WEAPON_SMOKE_TRAIL_TYPE); if (smoke_trail_type != META_SMOKE_LIST_TYPE_NONE) { struct OBJECT_3D_BOUNDS *bounding_box; vec3d exhaust_offset; num_smoke_trail_entities = count_entities_in_meta_smoke_list (smoke_trail_type); ASSERT (num_smoke_trail_entities > 0); smoke_trail_indices = (int *) malloc_fast_mem (sizeof (int) * num_smoke_trail_entities); for (i = 0; i < num_smoke_trail_entities; i++) { smoke_trail_indices[i] = ENTITY_INDEX_DONT_CARE; } bounding_box = get_object_3d_bounding_box (get_local_entity_int_value (weapon, INT_TYPE_DEFAULT_3D_SHAPE)); if ((weapon_sub_type == ENTITY_SUB_TYPE_WEAPON_HOKUM_PILOT) ||(weapon_sub_type == ENTITY_SUB_TYPE_WEAPON_HOKUM_CO_PILOT)) { exhaust_offset.x = 0.0; exhaust_offset.y = 0.0; exhaust_offset.z = 0.0; } else { exhaust_offset.x = 0.0; exhaust_offset.y = 0.0; exhaust_offset.z = bounding_box->zmin; } create_meta_smoke_list_specified_offset (smoke_trail_type, weapon, &exhaust_offset, smoke_trail_indices); } transmit_entity_comms_message ( ENTITY_COMMS_CREATE_WEAPON, NULL, launcher, weapon_sub_type, get_local_entity_safe_index (weapon), burst_size, smoke_trail_indices ); if (smoke_trail_indices) { free_mem (smoke_trail_indices); } // // out of weapons (if infinite weapons then reload else select next weapon) // new_weapon_count = get_local_entity_weapon_count (launcher, weapon_sub_type); if (new_weapon_count <= 0) { #if !DEMO_VERSION if (get_local_entity_int_value (get_session_entity (), INT_TYPE_INFINITE_WEAPONS)) { weapon_config_types config_type; config_type = (weapon_config_types) get_local_entity_int_value (launcher, INT_TYPE_WEAPON_CONFIG_TYPE); set_client_server_entity_int_value (launcher, INT_TYPE_WEAPON_CONFIG_TYPE, config_type); } else #endif { // // play weapon out of ammo speech // play_entity_weapon_out_speech (launcher, weapon_sub_type); // // select next weapon // /* if (!(weapon_database[weapon_sub_type].weapon_class & (WEAPON_CLASS_DECOY | WEAPON_CLASS_CARGO | WEAPON_CLASS_DEBRIS))) { entity_sub_types next_weapon_sub_type; if (get_local_entity_int_value (launcher, INT_TYPE_PLAYER) != ENTITY_PLAYER_AI) { next_weapon_sub_type = get_next_available_weapon_sub_type (launcher); } else { next_weapon_sub_type = ENTITY_SUB_TYPE_WEAPON_NO_WEAPON; } set_client_server_entity_int_value (launcher, INT_TYPE_SELECTED_WEAPON, next_weapon_sub_type); } */ } } else { int report_ammo_low_count; report_ammo_low_count = weapon_database[weapon_sub_type].report_ammo_low_count; if ((current_weapon_count > report_ammo_low_count) && (new_weapon_count <= report_ammo_low_count)) { // // play weapon low speech // play_entity_weapon_low_speech (launcher, weapon_sub_type); } else { // // weapon launch speech // play_entity_weapon_launched_speech (launcher, weapon_sub_type); } } } set_force_local_entity_create_stack_attributes (FALSE); } else { pause_client_server_continuous_weapon_sound_effect (launcher, weapon_sub_type); } } else { if (get_comms_data_flow () == COMMS_DATA_FLOW_TX) { //////////////////////////////////////// // // CLIENT/TX // //////////////////////////////////////// ASSERT (weapon_index == ENTITY_INDEX_DONT_CARE); ASSERT (burst_size == BURST_SIZE_DONT_CARE); ASSERT (!smoke_trail_indices); // NOTE: The clients' weapon counters lag the servers' so it is possible that the // client may unknowingly attempt to create more weapons than are available. // This is prone to happen during rapid firing. if (get_local_entity_weapon_available (launcher, weapon_sub_type)) { transmit_entity_comms_message ( ENTITY_COMMS_CREATE_WEAPON, NULL, launcher, weapon_sub_type, ENTITY_INDEX_DONT_CARE, burst_size, NULL ); } } else { //////////////////////////////////////// // // CLIENT/RX // //////////////////////////////////////// ASSERT (weapon_index != ENTITY_INDEX_DONT_CARE); ASSERT (burst_size > 0); set_force_local_entity_create_stack_attributes (TRUE); weapon = create_local_entity ( ENTITY_TYPE_WEAPON, weapon_index, ENTITY_ATTR_INT_VALUE (INT_TYPE_ENTITY_SUB_TYPE, weapon_sub_type), ENTITY_ATTR_INT_VALUE (INT_TYPE_WEAPON_BURST_SIZE, burst_size), ENTITY_ATTR_PARENT (LIST_TYPE_LAUNCHED_WEAPON, launcher), ENTITY_ATTR_PARENT (LIST_TYPE_TARGET, target), ENTITY_ATTR_END ); ASSERT (weapon); // // create smoke trail // smoke_trail_type = (meta_smoke_list_types) get_local_entity_int_value (weapon, INT_TYPE_WEAPON_SMOKE_TRAIL_TYPE); if (smoke_trail_type != META_SMOKE_LIST_TYPE_NONE) { struct OBJECT_3D_BOUNDS *bounding_box; vec3d exhaust_offset; ASSERT (smoke_trail_indices); bounding_box = get_object_3d_bounding_box (get_local_entity_int_value (weapon, INT_TYPE_DEFAULT_3D_SHAPE)); if ((weapon_sub_type == ENTITY_SUB_TYPE_WEAPON_HOKUM_PILOT) ||(weapon_sub_type == ENTITY_SUB_TYPE_WEAPON_HOKUM_CO_PILOT)) { exhaust_offset.x = 0.0; exhaust_offset.y = 0.0; exhaust_offset.z = 0.0; } else { exhaust_offset.x = 0.0; exhaust_offset.y = 0.0; exhaust_offset.z = bounding_box->zmin; } create_meta_smoke_list_specified_offset (smoke_trail_type, weapon, &exhaust_offset, smoke_trail_indices); } else { ASSERT (!smoke_trail_indices); } set_force_local_entity_create_stack_attributes (FALSE); } } }
int assert_client_server_remote_fn (void) { return (!((get_comms_model () == COMMS_MODEL_CLIENT) && (get_comms_data_flow () == COMMS_DATA_FLOW_RX))); }