entity *unpack_entity_safe_ptr (void) { int index; entity *en; index = unpack_entity_safe_index (); en = get_local_entity_safe_ptr (index); return (en); }
void unpack_local_only_sound_effect_data (entity *parent, pack_modes mode) { int side, entity_index, sample_index, valid; entity_sub_types sub_type; ASSERT (parent); // // unpack data // if (mode == PACK_MODE_CLIENT_SESSION) { entity_index = unpack_entity_safe_index (); } else { entity_index = ENTITY_INDEX_DONT_CARE; } side = unpack_int_value (NULL, INT_TYPE_SIDE); sub_type = unpack_int_value (NULL, INT_TYPE_ENTITY_SUB_TYPE); valid = unpack_int_value (NULL, INT_TYPE_VALID_SOUND_EFFECT); sample_index = unpack_int_value (NULL, INT_TYPE_SOUND_EFFECT_INDEX); register_attach_sound_effect_to_object (parent, entity_index, side, sub_type, valid, sample_index); #if DEBUG_MODULE debug_log ("SE_PACK: Unpacked Local-Only %d - Sub-type %d", entity_index, sub_type); #endif }
static void unpack_local_data (entity *en, entity_types type, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { int loop, index; sound_effect *raw; // // create entity // index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, type); raw = malloc_heap_mem (sizeof (sound_effect)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (sound_effect)); // // unpack effect data (in exactly the same order as the data was packed) // unpack_effect_data( en, &raw->eff, mode ); // // unpack sound data // raw->sound_effect_sequence_count = unpack_int_value (en, INT_TYPE_SOUND_EFFECT_SEQUENCE_COUNT); ASSERT (raw->sound_effect_sequence_count > 0); raw->effect_index = malloc_fast_mem (sizeof (sound_sample_indices) * raw->sound_effect_sequence_count); for (loop = 0; loop < raw->sound_effect_sequence_count; loop ++) { raw->effect_index [loop] = unpack_int_value (en, INT_TYPE_SOUND_EFFECT_INDEX); } raw->amplification = unpack_float_value (en, FLOAT_TYPE_AMPLIFICATION); raw->effect_lifetime = unpack_float_value (en, FLOAT_TYPE_EFFECT_LIFETIME); raw->valid_effect_lifetime = unpack_float_value (en, FLOAT_TYPE_VALID_EFFECT_LIFETIME); //sound_effect_data raw->sound_channel = unpack_int_value (en, INT_TYPE_SOUND_CHANNEL); raw->sound_locality = unpack_int_value (en, INT_TYPE_SOUND_LOCALITY); raw->valid_sound_effect = unpack_int_value (en, INT_TYPE_VALID_SOUND_EFFECT); raw->looping = unpack_int_value (en, INT_TYPE_SOUND_EFFECT_LOOPING); raw->panning = unpack_int_value (en, INT_TYPE_SOUND_EFFECT_PANNING); // // link into system // // sound effect needs a parent //ASSERT (raw->eff.special_effect_link.parent); if (unpack_int_value (en, INT_TYPE_VALID)) { insert_local_entity_into_parents_child_list (en, LIST_TYPE_UPDATE, get_update_entity (), NULL); } #if DEBUG_MODULE debug_log ("SE_PACK: Unpacked %d - Sub-type %d", get_local_entity_safe_index (en), raw->eff.sub_type); #endif break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { // // always use access functions to set the data // break; } } }
static void unpack_local_data (entity *en, entity_types type, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { int index; routed_vehicle *raw; node_link_data *route_data; // // create entity // index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, type); raw = (routed_vehicle *) malloc_fast_mem (sizeof (routed_vehicle)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (routed_vehicle)); // // unpack vehicle data (in exactly the same order as the data was packed) // unpack_vehicle_data (en, &raw->vh, mode); if (unpack_int_value (en, INT_TYPE_VALID)) { raw->vh.mob.velocity = 0.0; raw->desired_velocity = 0.0; } else { raw->vh.mob.velocity = unpack_float_value (en, FLOAT_TYPE_LOW_VELOCITY); raw->desired_velocity = unpack_float_value (en, FLOAT_TYPE_DESIRED_VELOCITY); } // // unpack routed data // if (unpack_int_value (en, INT_TYPE_VALID)) { raw->sub_waypoint_count = unpack_int_value (en, INT_TYPE_SUB_WAYPOINT_COUNT); raw->waypoint_next_index = unpack_int_value (en, INT_TYPE_WAYPOINT_NEXT_INDEX); raw->waypoint_this_index = unpack_int_value (en, INT_TYPE_WAYPOINT_THIS_INDEX); } // // turn lights on if necessary // set_vehicle_headlight_state (en, raw->vh.lights_on); // // setup waypoint route pointer // #if DEBUG_MODULE debug_log ("ROUTED ENTITY PACK: client setting up waypoint list pointer"); #endif route_data = get_road_sub_route (raw->waypoint_this_index, raw->waypoint_next_index, &index, NULL); if ((route_data) && (route_data->link_positions)) { raw->sub_route = route_data; } else { if ((raw->waypoint_this_index + raw->waypoint_next_index) != 0) { debug_log ("RV_PACK: WARNING NO SUB ROUTE FOUND BETWEEN %d AND %d", raw->waypoint_this_index, raw->waypoint_next_index); } } // // radar dish rotation (ok to use a random number as this is for visual effect only) // raw->vh.radar_rotation_state = frand1 (); set_routed_vehicle_id_number (en); set_initial_rotation_angle_of_routed_vehicle_wheels (raw->vh.inst3d); // // link into system // insert_local_entity_into_parents_child_list (en, LIST_TYPE_VIEW, get_camera_entity (), NULL); insert_local_entity_into_parents_child_list (en, LIST_TYPE_SECTOR, get_local_sector_entity (&raw->vh.mob.position), NULL); insert_local_entity_into_parents_child_list (en, LIST_TYPE_UPDATE, get_update_entity (), NULL); add_to_force_info (get_local_force_entity ((entity_sides) raw->vh.mob.side), en); // // attached smoke lists must be unpacked after the entity is linked into the world // unpack_routed_vehicle_meta_smoke_lists (en, mode); unpack_mobile_local_sound_effects (en, mode); break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { // // always use access functions to set the data // vec3d position; matrix3x3 attitude; int sub_waypoint_count; // // unpack all data (even if the echoed data is to be ignored) // unpack_vec3d (en, VEC3D_TYPE_POSITION, &position); unpack_attitude_matrix (en, attitude); sub_waypoint_count = unpack_int_value (en, INT_TYPE_SUB_WAYPOINT_COUNT); set_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &position); set_local_entity_attitude_matrix (en, attitude); set_local_entity_int_value (en, INT_TYPE_SUB_WAYPOINT_COUNT, sub_waypoint_count); // Vehicle is moving so sleep must equal 0 set_local_entity_float_value (en, FLOAT_TYPE_SLEEP, 0.0); break; } } }
void unpack_local_keysite_data (pack_modes mode) { entity *en, *landing_en; landing *landing_raw; keysite *raw; int side, landing_lock, landed_lock, takeoff_lock, in_use, index; ASSERT (mode != PACK_MODE_UPDATE_ENTITY); if (mode == PACK_MODE_BROWSE_SESSION) { return; } en = get_local_entity_list (); while (en) { if (get_local_entity_type (en) == ENTITY_TYPE_KEYSITE) { // // unpack keysite // index = unpack_entity_safe_index (); raw = (keysite *) get_local_entity_data (en); raw->supplies.ammo_supply_level = unpack_float_value (en, FLOAT_TYPE_AMMO_SUPPLY_LEVEL); raw->supplies.fuel_supply_level = unpack_float_value (en, FLOAT_TYPE_FUEL_SUPPLY_LEVEL); raw->keysite_strength = unpack_float_value (en, FLOAT_TYPE_KEYSITE_STRENGTH); raw->keysite_maximum_strength = unpack_float_value (en, FLOAT_TYPE_KEYSITE_MAXIMUM_STRENGTH); raw->alive = unpack_int_value (en, INT_TYPE_ALIVE); side = unpack_int_value (en, INT_TYPE_SIDE); if (side != raw->side) { // // update I-Maps (remove old side) // if (raw->in_use) { update_imap_sector_side (en, FALSE); if (mode == PACK_MODE_SERVER_SESSION) { update_imap_importance_level (en, FALSE); } } // // change side of keysite buildings // change_local_keysite_building_sides (en, (entity_sides) side); // // place into other sides force // delete_local_entity_from_parents_child_list (en, LIST_TYPE_KEYSITE_FORCE); insert_local_entity_into_parents_child_list (en, LIST_TYPE_KEYSITE_FORCE, get_local_force_entity ((entity_sides) side), NULL); if (mode == PACK_MODE_SERVER_SESSION) { // Must be done after removed from force update_imap_distance_to_friendly_base ((entity_sides) raw->side); } // // switch sides // raw->side = side; // // update I-Maps (add new side) // if (raw->in_use) { update_imap_sector_side (en, TRUE); if (mode == PACK_MODE_SERVER_SESSION) { update_imap_importance_level (en, TRUE); update_keysite_distance_to_friendly_base (en, (entity_sides) side); } } } in_use = unpack_int_value (en, INT_TYPE_IN_USE); raw->keysite_id = unpack_int_value (en, INT_TYPE_KEYSITE_ID); raw->keysite_usable_state = unpack_int_value (en, INT_TYPE_KEYSITE_USABLE_STATE); if (raw->in_use != in_use) { // // Update I-Maps (in use flag changed) // raw->in_use = in_use; update_imap_sector_side (en, in_use); if (mode == PACK_MODE_SERVER_SESSION) { update_imap_importance_level (en, in_use); if (in_use) { update_keysite_distance_to_friendly_base (en, (entity_sides) side); } else { update_imap_distance_to_friendly_base ((entity_sides) side); } } } unpack_list_root (en, LIST_TYPE_UNASSIGNED_TASK, &raw->unassigned_task_root); unpack_list_root (en, LIST_TYPE_ASSIGNED_TASK, &raw->assigned_task_root); unpack_list_root (en, LIST_TYPE_COMPLETED_TASK, &raw->completed_task_root); // unpack_list_root (en, LIST_TYPE_KEYSITE_GROUP, &raw->keysite_group_root); unpack_list_root (en, LIST_TYPE_DIVISION_HEADQUARTERS, &raw->division_headquarters_root); if (unpack_int_value (en, INT_TYPE_VALID)) { unpack_list_link (en, LIST_TYPE_CAMPAIGN_OBJECTIVE, &raw->campaign_objective_link); } #if DEBUG_MODULE debug_log ("KS_PACK: unpacking keysite %s", raw->keysite_name); #endif if (mode == PACK_MODE_SERVER_SESSION) { raw->repair_timer = unpack_float_value (en, FLOAT_TYPE_REPAIR_TIMER); raw->sleep = unpack_float_value (en, FLOAT_TYPE_SLEEP); raw->assist_timer = unpack_float_value (en, FLOAT_TYPE_ASSIST_TIMER); raw->assign_timer = unpack_float_value (en, FLOAT_TYPE_ASSIGN_TIMER); // // unpack landing data // landing_en = get_local_entity_first_child (en, LIST_TYPE_LANDING_SITE); while (landing_en) { landing_raw = (landing *) get_local_entity_data (landing_en); landing_raw->reserved_landing_sites = unpack_int_value (landing_en, INT_TYPE_RESERVED_LANDING_SITES); //landing_raw->free_landing_sites = unpack_int_value (en, INT_TYPE_FREE_LANDING_SITES); landing_raw->free_landing_sites = landing_raw->total_landing_sites; landing_lock = unpack_int_value (landing_en, INT_TYPE_LANDING_LOCK); landed_lock = unpack_int_value (landing_en, INT_TYPE_LANDED_LOCK); takeoff_lock = unpack_int_value (landing_en, INT_TYPE_TAKEOFF_LOCK); #if DEBUG_MODULE debug_log ("KS_PACK: %s (%d) unpacking %s landing entity, reserved %d, free %d, locks (saved :landing %d, landed %d, takeoff %d, calc landing %d, landed %d, takeoff %d)", raw->keysite_name, get_local_entity_index (en), entity_sub_type_landing_names [landing_raw->sub_type], landing_raw->reserved_landing_sites, landing_raw->free_landing_sites, landing_lock, landed_lock, takeoff_lock, landing_raw->landing_lock, landing_raw->landed_lock, landing_raw->takeoff_lock); if (landing_raw->landing_lock != landing_lock) { debug_log ("KS_PACK: %s %s landing entity needs landing_lock repairing", raw->keysite_name, entity_sub_type_landing_names [landing_raw->sub_type]); } if (landing_raw->landed_lock != landed_lock) { debug_log ("KS_PACK: %s %s landing entity needs landed_lock repairing", raw->keysite_name, entity_sub_type_landing_names [landing_raw->sub_type]); } if (landing_raw->takeoff_lock != takeoff_lock) { debug_log ("KS_PACK: %s %s landing entity needs takeoff_lock repairing", raw->keysite_name, entity_sub_type_landing_names [landing_raw->sub_type]); } #endif unpack_list_root (landing_en, LIST_TYPE_TAKEOFF_QUEUE, &landing_raw->takeoff_queue_root); landing_en = get_local_entity_child_succ (landing_en, LIST_TYPE_LANDING_SITE); } } } en = get_local_entity_succ (en); } }
void unpack_local_session_data (pack_modes mode) { session *raw; entity *en; int index; ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: //////////////////////////////////////// { en = get_session_entity (); ASSERT (en); raw = (session *) get_local_entity_data (en); raw->version_number = unpack_int_value (en, INT_TYPE_VERSION_NUMBER); unpack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); // special_effect_root // update_link raw->elapsed_time = unpack_float_value (en, FLOAT_TYPE_ELAPSED_TIME); raw->lightning_timer = unpack_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER); raw->start_time = unpack_float_value (en, FLOAT_TYPE_START_TIME); // time_of_day_resync raw->time_of_day_acceleration = unpack_float_value (en, FLOAT_TYPE_TIME_OF_DAY_ACCELERATION); raw->fog_of_war_maximum_value = unpack_float_value (en, FLOAT_TYPE_FOG_OF_WAR_MAXIMUM_VALUE); // // rain effect // raw->weather_radius = unpack_float_value (en, FLOAT_TYPE_WEATHER_RADIUS); raw->weather_mode_transitional_period = unpack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_PERIOD); raw->weather_mode_transitional_status = unpack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_STATUS); raw->weather_mode = (weathermodes) unpack_int_value (en, INT_TYPE_WEATHER_MODE); raw->target_weather_mode = (weathermodes) unpack_int_value (en, INT_TYPE_TARGET_WEATHER_MODE); unpack_vec3d (en, VEC3D_TYPE_WEATHER_POSITION, &raw->weather_position); unpack_vec3d (en, VEC3D_TYPE_WEATHER_VELOCITY, &raw->weather_velocity); // // wind effect // raw->wind_effect_radius = unpack_float_value (en, FLOAT_TYPE_WIND_EFFECT_RADIUS); raw->wind_gusting_value = unpack_float_value (en, FLOAT_TYPE_WIND_GUSTING_VALUE); raw->wind_minimum_speed = unpack_float_value (en, FLOAT_TYPE_WIND_MINIMUM_SPEED); raw->wind_maximum_speed = unpack_float_value (en, FLOAT_TYPE_WIND_MAXIMUM_SPEED); unpack_vec3d (en, VEC3D_TYPE_WIND_DIRECTION_VECTOR, &raw->wind_direction_vector); unpack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_POSITION, &raw->wind_effect_position); unpack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_VELOCITY, &raw->wind_effect_velocity); // raw->day_segment_type = (day_segment_types) unpack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE); raw->population_x_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN); raw->population_x_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX); raw->population_z_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN); raw->population_z_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX); raw->campaign_medal = unpack_int_value (en, INT_TYPE_CAMPAIGN_MEDAL); raw->campaign_requires_apache_havoc = unpack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC); raw->auto_assign_gunship = unpack_int_value (en, INT_TYPE_AUTO_ASSIGN_GUNSHIP); raw->infinite_fuel = unpack_int_value (en, INT_TYPE_INFINITE_FUEL); raw->infinite_weapons = unpack_int_value (en, INT_TYPE_INFINITE_WEAPONS); raw->suppress_ai_fire = unpack_int_value (en, INT_TYPE_SUPPRESS_AI_FIRE); raw->invulnerable_from_collisions = unpack_int_value (en, INT_TYPE_INVULNERABLE_FROM_COLLISIONS); raw->invulnerable_from_weapons = unpack_int_value (en, INT_TYPE_INVULNERABLE_FROM_WEAPONS); raw->cheats_enabled = unpack_int_value (en, INT_TYPE_CHEATS_ENABLED); raw->skip_night_time = unpack_int_value (en, INT_TYPE_SKIP_NIGHT_TIME); raw->weather_increasing = unpack_int_value (en, INT_TYPE_WEATHER_INCREASING); raw->wind_increasing = unpack_int_value (en, INT_TYPE_WIND_INCREASING); raw->local_weather_model = unpack_int_value (en, INT_TYPE_LOCAL_WEATHER_MODEL); break; } //////////////////////////////////////// case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { // // create entity // ASSERT (!get_session_entity ()); index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, ENTITY_TYPE_SESSION); raw = (session *) malloc_fast_mem (sizeof (session)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (session)); // // unpack data (in exactly the same order as the data was packed) // raw->version_number = unpack_int_value (en, INT_TYPE_VERSION_NUMBER); raw->session_complete = unpack_int_value (en, INT_TYPE_SESSION_COMPLETE); unpack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); unpack_list_root (en, LIST_TYPE_SPECIAL_EFFECT, &raw->special_effect_root); // update_link raw->elapsed_time = unpack_float_value (en, FLOAT_TYPE_ELAPSED_TIME); raw->lightning_timer = unpack_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER); raw->start_time = unpack_float_value (en, FLOAT_TYPE_START_TIME); // time_of_day_resync raw->time_of_day_acceleration = unpack_float_value (en, FLOAT_TYPE_TIME_OF_DAY_ACCELERATION); raw->fog_of_war_maximum_value = unpack_float_value (en, FLOAT_TYPE_FOG_OF_WAR_MAXIMUM_VALUE); // // rain effect // raw->weather_radius = unpack_float_value (en, FLOAT_TYPE_WEATHER_RADIUS); raw->weather_mode_transitional_period = unpack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_PERIOD); raw->weather_mode_transitional_status = unpack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_STATUS); raw->weather_mode = (weathermodes) unpack_int_value (en, INT_TYPE_WEATHER_MODE); raw->target_weather_mode = (weathermodes) unpack_int_value (en, INT_TYPE_TARGET_WEATHER_MODE); unpack_vec3d (en, VEC3D_TYPE_WEATHER_POSITION, &raw->weather_position); unpack_vec3d (en, VEC3D_TYPE_WEATHER_VELOCITY, &raw->weather_velocity); // // wind effect // raw->wind_effect_radius = unpack_float_value (en, FLOAT_TYPE_WIND_EFFECT_RADIUS); raw->wind_gusting_value = unpack_float_value (en, FLOAT_TYPE_WIND_GUSTING_VALUE); raw->wind_minimum_speed = unpack_float_value (en, FLOAT_TYPE_WIND_MINIMUM_SPEED); raw->wind_maximum_speed = unpack_float_value (en, FLOAT_TYPE_WIND_MAXIMUM_SPEED); unpack_vec3d (en, VEC3D_TYPE_WIND_DIRECTION_VECTOR, &raw->wind_direction_vector); unpack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_POSITION, &raw->wind_effect_position); unpack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_VELOCITY, &raw->wind_effect_velocity); // raw->day_segment_type = (day_segment_types) unpack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE); raw->population_x_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN); raw->population_x_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX); raw->population_z_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN); raw->population_z_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX); raw->campaign_medal = unpack_int_value (en, INT_TYPE_CAMPAIGN_MEDAL); raw->campaign_requires_apache_havoc = unpack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC); raw->auto_assign_gunship = unpack_int_value (en, INT_TYPE_AUTO_ASSIGN_GUNSHIP); raw->infinite_fuel = unpack_int_value (en, INT_TYPE_INFINITE_FUEL); raw->infinite_weapons = unpack_int_value (en, INT_TYPE_INFINITE_WEAPONS); raw->suppress_ai_fire = unpack_int_value (en, INT_TYPE_SUPPRESS_AI_FIRE); raw->invulnerable_from_collisions = unpack_int_value (en, INT_TYPE_INVULNERABLE_FROM_COLLISIONS); raw->invulnerable_from_weapons = unpack_int_value (en, INT_TYPE_INVULNERABLE_FROM_WEAPONS); raw->cheats_enabled = unpack_int_value (en, INT_TYPE_CHEATS_ENABLED); raw->skip_night_time = unpack_int_value (en, INT_TYPE_SKIP_NIGHT_TIME); raw->weather_increasing = unpack_int_value (en, INT_TYPE_WEATHER_INCREASING); raw->wind_increasing = unpack_int_value (en, INT_TYPE_WIND_INCREASING); raw->local_weather_model = unpack_int_value (en, INT_TYPE_LOCAL_WEATHER_MODEL); // // link into system // // // need to insert session into update list after camera entity // ASSERT (get_camera_entity ()); insert_local_entity_into_parents_child_list (en, LIST_TYPE_UPDATE, get_update_entity (), get_camera_entity ()); set_session_entity (en); set_display_campaign_timer_valid (FALSE); break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { // // create entity // ASSERT (!get_session_entity ()); index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, ENTITY_TYPE_SESSION); raw = (session *) malloc_fast_mem (sizeof (session)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (session)); // // unpack data (in exactly the same order as the data was packed) // raw->version_number = unpack_int_value (en, INT_TYPE_VERSION_NUMBER); unpack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); // update_link // tour of duty time raw->elapsed_time = unpack_float_value (en, FLOAT_TYPE_ELAPSED_TIME); raw->start_time = unpack_float_value (en, FLOAT_TYPE_START_TIME); // time_of_day_resync // time_of_day_acceleration // weather radius // weather_mode_transitional_period // weather_mode_transitional_status raw->weather_mode = (weathermodes) unpack_int_value (en, INT_TYPE_WEATHER_MODE); // target_weather_mode // weather position // weather velocity raw->day_segment_type = (day_segment_types) unpack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE); raw->population_x_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN); raw->population_x_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX); raw->population_z_min = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN); raw->population_z_max = unpack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX); raw->campaign_requires_apache_havoc = unpack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC); // infinite_weapons // skip_night_time // weather increasing set_session_entity (en); break; } } }
void unpack_routed_vehicle_meta_smoke_lists (entity *en, pack_modes mode) { object_3d_instance *inst3d; int item, loop, count, point, *entity_index_list; meta_smoke_list_types type; object_3d_sub_object_index_numbers attachment_point; if (get_local_entity_int_value (en, INT_TYPE_ALIVE)) { inst3d = (object_3d_instance *) get_local_entity_ptr_value (en, PTR_TYPE_INSTANCE_3D_OBJECT); if (inst3d) { #if DEBUG_MODULE debug_log ("ROUTED : Unpacking smoke for %s ( %d )", vehicle_database [get_local_entity_int_value (en, INT_TYPE_ENTITY_SUB_TYPE)].full_name, en); #endif item = 0; while (TRUE) { type = attached_meta_smoke_list_table [item].type; if (type == -1) { break; } else { for (point = 0; point < MAX_META_SMOKE_LIST_ATTACHMENT_POINTS; point ++) { attachment_point = attached_meta_smoke_list_table [item].attachment_point [point]; if (attachment_point == -1) { break; } else { count = count_sub_object_type_depth (inst3d, attachment_point); if (count >0) { count *= count_entities_in_meta_smoke_list (type); entity_index_list = (int *) malloc_fast_mem (sizeof (int) * count); for (loop = 0; loop < count; loop ++) { if (mode == PACK_MODE_SERVER_SESSION) { entity_index_list [loop] = ENTITY_INDEX_DONT_CARE; } else { entity_index_list [loop] = unpack_entity_safe_index (); } #if DEBUG_MODULE debug_log ("ROUTED : Index %d = %d", loop, entity_index_list [loop]); #endif } register_attach_meta_smoke_list_to_object (en, type, attachment_point, entity_index_list, count); free_mem (entity_index_list); } } } } item ++; } } } }
static void unpack_local_data (entity *en, entity_types type, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { int index; pilot *raw; // // create entity // index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, type); raw = malloc_fast_mem (sizeof (pilot)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (pilot)); // // unpack data (in exactly the same order as the data was packed) // raw->sub_type = unpack_int_value (en, INT_TYPE_ENTITY_SUB_TYPE); unpack_string (en, STRING_TYPE_PILOTS_NAME, raw->pilots_name); raw->rank = unpack_int_value (en, INT_TYPE_PILOT_RANK); raw->kills = unpack_int_value (en, INT_TYPE_KILLS); raw->unique_id = unpack_int_value (en, INT_TYPE_UNIQUE_ID); raw->crew_role = CREW_ROLE_PILOT; unpack_list_root (en, LIST_TYPE_PILOT_LOCK, &raw->pilot_lock_root); unpack_list_link (en, LIST_TYPE_AIRCREW, &raw->aircrew_link); unpack_list_link (en, LIST_TYPE_PILOT, &raw->pilot_link); unpack_list_link (en, LIST_TYPE_PLAYER_TASK, &raw->player_task_link); raw->side = unpack_int_value (en, INT_TYPE_SIDE); raw->difficulty_level = unpack_int_value (en, INT_TYPE_DIFFICULTY_LEVEL); break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { int index; pilot *raw; // // create entity // index = unpack_entity_safe_index (); en = get_free_entity (index); set_local_entity_type (en, type); raw = malloc_fast_mem (sizeof (pilot)); set_local_entity_data (en, raw); memset (raw, 0, sizeof (pilot)); // // unpack data (in exactly the same order as the data was packed) // raw->sub_type = unpack_int_value (en, INT_TYPE_ENTITY_SUB_TYPE); unpack_string (en, STRING_TYPE_PILOTS_NAME, raw->pilots_name); raw->rank = unpack_int_value (en, INT_TYPE_PILOT_RANK); raw->kills = unpack_int_value (en, INT_TYPE_KILLS); raw->unique_id = unpack_int_value (en, INT_TYPE_UNIQUE_ID); raw->crew_role = CREW_ROLE_PILOT; // aircrew_link unpack_list_link (en, LIST_TYPE_PILOT, &raw->pilot_link); raw->side = unpack_int_value (en, INT_TYPE_SIDE); break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { // // always use access functions to set the data // break; } } }