static void pack_local_data (entity *en, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { session *raw; raw = (session *) get_local_entity_data (en); pack_float_value (en, FLOAT_TYPE_ELAPSED_TIME, raw->elapsed_time); pack_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER, raw->lightning_timer); // // rain effect // pack_float_value (en, FLOAT_TYPE_WEATHER_RADIUS, raw->weather_radius); pack_vec3d (en, VEC3D_TYPE_WEATHER_POSITION, &raw->weather_position); pack_vec3d (en, VEC3D_TYPE_WEATHER_VELOCITY, &raw->weather_velocity); // // wind effect // pack_float_value (en, FLOAT_TYPE_WIND_EFFECT_RADIUS, raw->wind_effect_radius); pack_float_value (en, FLOAT_TYPE_WIND_GUSTING_VALUE, raw->wind_gusting_value); pack_vec3d (en, VEC3D_TYPE_WIND_DIRECTION_VECTOR, &raw->wind_direction_vector); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_POSITION, &raw->wind_effect_position); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_VELOCITY, &raw->wind_effect_velocity); // pack_int_value (en, INT_TYPE_WEATHER_INCREASING, raw->weather_increasing); pack_int_value (en, INT_TYPE_WIND_INCREASING, raw->wind_increasing); break; } } }
void pack_effect_data (entity *en, effect *raw, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { // // some effects should never be packed up ( should be re-constructed when the vehicle is unpacked ) // ASSERT (!effect_database [raw->sub_type].constructed_locally); pack_int_value (en, INT_TYPE_ENTITY_SUB_TYPE, raw->sub_type); pack_vec3d (en, VEC3D_TYPE_POSITION, &raw->position); ///////////////////////////////////////////////////////////////// // // Special effect packing, manually packing link data // if (raw->special_effect_link.parent) { list_link link; entity *spec; pack_int_value (en, INT_TYPE_VALID, TRUE); // // parent // link.parent = raw->special_effect_link.parent; // // succ : search forwards through special effect list for valid child succ // spec = get_local_entity_child_succ (en, LIST_TYPE_SPECIAL_EFFECT); while (TRUE) { if ((spec == NULL) || (effect_database [get_local_entity_int_value (spec, INT_TYPE_ENTITY_SUB_TYPE)].constructed_locally == FALSE)) { link.child_succ = spec; break; } spec = get_local_entity_child_succ (spec, LIST_TYPE_SPECIAL_EFFECT); } // // pred : search backwards through special effect list for valid child pred // spec = get_local_entity_child_pred (en, LIST_TYPE_SPECIAL_EFFECT); while (TRUE) { if ((spec == NULL) || (effect_database [get_local_entity_int_value (spec, INT_TYPE_ENTITY_SUB_TYPE)].constructed_locally == FALSE)) { link.child_pred = spec; break; } spec = get_local_entity_child_pred (spec, LIST_TYPE_SPECIAL_EFFECT); } pack_list_link (en, LIST_TYPE_SPECIAL_EFFECT, &link); } else { pack_int_value (en, INT_TYPE_VALID, FALSE); } ///////////////////////////////////////////////////////////////// // update_link break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { // // cannot update entity at this level as the update may not apply to all entity types below // break; } } }
static void pack_local_data (entity *en, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { routed_vehicle *raw; raw = (routed_vehicle *) get_local_entity_data (en); pack_entity_type (get_local_entity_type (en)); pack_entity_safe_ptr (en); // // pack vehicle data // pack_vehicle_data (en, &raw->vh, mode); ///////////////////////////////////////////////////////////////// if ((raw->vh.mob.velocity == 0.0) && (raw->desired_velocity == 0.0)) { pack_int_value (en, INT_TYPE_VALID, TRUE); } else { pack_int_value (en, INT_TYPE_VALID, FALSE); pack_float_value (en, FLOAT_TYPE_LOW_VELOCITY, raw->vh.mob.velocity); pack_float_value (en, FLOAT_TYPE_DESIRED_VELOCITY, raw->desired_velocity); } ///////////////////////////////////////////////////////////////// // // pack routed data // ///////////////////////////////////////////////////////////////// if ((raw->sub_waypoint_count == 0) && (raw->waypoint_next_index == 0) && (raw->waypoint_this_index == 0)) { pack_int_value (en, INT_TYPE_VALID, FALSE); } else { pack_int_value (en, INT_TYPE_VALID, TRUE); pack_int_value (en, INT_TYPE_SUB_WAYPOINT_COUNT, raw->sub_waypoint_count); pack_int_value (en, INT_TYPE_WAYPOINT_NEXT_INDEX, raw->waypoint_next_index); pack_int_value (en, INT_TYPE_WAYPOINT_THIS_INDEX, raw->waypoint_this_index); } ///////////////////////////////////////////////////////////////// // sub_waypoint_list reconstructed locally // // spin through special effects link and pack up local only smoke trails // pack_routed_vehicle_meta_smoke_lists (en, mode); pack_mobile_local_sound_effects (en, mode); break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { routed_vehicle *raw; raw = (routed_vehicle *) get_local_entity_data (en); pack_vec3d (en, VEC3D_TYPE_POSITION, &raw->vh.mob.position); pack_attitude_matrix (en, raw->vh.mob.attitude); pack_int_value (en, INT_TYPE_SUB_WAYPOINT_COUNT, raw->sub_waypoint_count); break; } } }
void pack_fixed_data (entity *en, fixed *raw, pack_modes mode) { ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { pack_vec3d (en, VEC3D_TYPE_POSITION, &raw->position); ///////////////////////////////////////////////////////////////// if (mode == PACK_MODE_SERVER_SESSION) { if (raw->task_dependent_root.first_child) { pack_int_value (en, INT_TYPE_VALID, TRUE); pack_list_root (en, LIST_TYPE_TASK_DEPENDENT, &raw->task_dependent_root); } else { pack_int_value (en, INT_TYPE_VALID, FALSE); } } ///////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////// if (raw->target_root.first_child) { pack_int_value (en, INT_TYPE_VALID, TRUE); pack_list_root (en, LIST_TYPE_TARGET, &raw->target_root); } else { pack_int_value (en, INT_TYPE_VALID, FALSE); } ///////////////////////////////////////////////////////////////// // gunship_target_link // sector_link pack_int_value (en, INT_TYPE_ENTITY_SUB_TYPE, raw->sub_type); pack_int_value (en, INT_TYPE_OBJECT_3D_SHAPE, raw->object_3d_shape); pack_int_value (en, INT_TYPE_ALIVE, raw->alive); pack_int_value (en, INT_TYPE_SIDE, raw->side); // gunship_radar_los_clear // object_drawn_once_this_frame pack_float_value (en, FLOAT_TYPE_HEADING, raw->heading); if (raw->heading == 0.0) { debug_log ("FX_PACK: heading = zero"); } break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { break; } //////////////////////////////////////// case PACK_MODE_UPDATE_ENTITY: //////////////////////////////////////// { // // cannot update entity at this level as the update may not apply to all entity types below // break; } } }
void pack_local_session_data (pack_modes mode) { session *raw; entity *en; ASSERT ((mode >= 0) && (mode < NUM_PACK_MODES)); en = get_session_entity (); ASSERT (en); raw = (session *) get_local_entity_data (en); switch (mode) { //////////////////////////////////////// case PACK_MODE_SERVER_SESSION: //////////////////////////////////////// { ASSERT (!raw->session_complete); pack_int_value (en, INT_TYPE_VERSION_NUMBER, raw->version_number); pack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); // special_effect_root // update_link pack_float_value (en, FLOAT_TYPE_ELAPSED_TIME, raw->elapsed_time); pack_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER, raw->lightning_timer); pack_float_value (en, FLOAT_TYPE_START_TIME, raw->start_time); // time_of_day_resync pack_float_value (en, FLOAT_TYPE_TIME_OF_DAY_ACCELERATION, raw->time_of_day_acceleration); pack_float_value (en, FLOAT_TYPE_FOG_OF_WAR_MAXIMUM_VALUE, raw->fog_of_war_maximum_value); // // rain effect // pack_float_value (en, FLOAT_TYPE_WEATHER_RADIUS, raw->weather_radius); pack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_PERIOD, raw->weather_mode_transitional_period); pack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_STATUS, raw->weather_mode_transitional_status); pack_int_value (en, INT_TYPE_WEATHER_MODE, raw->weather_mode); pack_int_value (en, INT_TYPE_TARGET_WEATHER_MODE, raw->target_weather_mode); pack_vec3d (en, VEC3D_TYPE_WEATHER_POSITION, &raw->weather_position); pack_vec3d (en, VEC3D_TYPE_WEATHER_VELOCITY, &raw->weather_velocity); // // wind effect // pack_float_value (en, FLOAT_TYPE_WIND_EFFECT_RADIUS, raw->wind_effect_radius); pack_float_value (en, FLOAT_TYPE_WIND_GUSTING_VALUE, raw->wind_gusting_value); pack_float_value (en, FLOAT_TYPE_WIND_MINIMUM_SPEED, raw->wind_minimum_speed); pack_float_value (en, FLOAT_TYPE_WIND_MAXIMUM_SPEED, raw->wind_maximum_speed); pack_vec3d (en, VEC3D_TYPE_WIND_DIRECTION_VECTOR, &raw->wind_direction_vector); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_POSITION, &raw->wind_effect_position); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_VELOCITY, &raw->wind_effect_velocity); // pack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE, raw->day_segment_type); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN, raw->population_x_min); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX, raw->population_x_max); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN, raw->population_z_min); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX, raw->population_z_max); pack_int_value (en, INT_TYPE_CAMPAIGN_MEDAL, raw->campaign_medal); pack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC, raw->campaign_requires_apache_havoc); pack_int_value (en, INT_TYPE_AUTO_ASSIGN_GUNSHIP, raw->auto_assign_gunship); pack_int_value (en, INT_TYPE_INFINITE_FUEL, raw->infinite_fuel); pack_int_value (en, INT_TYPE_INFINITE_WEAPONS, raw->infinite_weapons); pack_int_value (en, INT_TYPE_SUPPRESS_AI_FIRE, raw->suppress_ai_fire); pack_int_value (en, INT_TYPE_INVULNERABLE_FROM_COLLISIONS, raw->invulnerable_from_collisions); pack_int_value (en, INT_TYPE_INVULNERABLE_FROM_WEAPONS, raw->invulnerable_from_weapons); pack_int_value (en, INT_TYPE_CHEATS_ENABLED, raw->cheats_enabled); pack_int_value (en, INT_TYPE_SKIP_NIGHT_TIME, raw->skip_night_time); pack_int_value (en, INT_TYPE_WEATHER_INCREASING, raw->weather_increasing); pack_int_value (en, INT_TYPE_WIND_INCREASING, raw->wind_increasing); pack_int_value (en, INT_TYPE_LOCAL_WEATHER_MODEL, raw->local_weather_model); break; } //////////////////////////////////////// case PACK_MODE_CLIENT_SESSION: //////////////////////////////////////// { pack_entity_safe_ptr (en); pack_int_value (en, INT_TYPE_VERSION_NUMBER, raw->version_number); pack_int_value (en, INT_TYPE_SESSION_COMPLETE, raw->session_complete); pack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); pack_list_root (en, LIST_TYPE_SPECIAL_EFFECT, &raw->special_effect_root); // update_link pack_float_value (en, FLOAT_TYPE_ELAPSED_TIME, raw->elapsed_time); pack_float_value (en, FLOAT_TYPE_LIGHTNING_TIMER, raw->lightning_timer); pack_float_value (en, FLOAT_TYPE_START_TIME, raw->start_time); // time_of_day_resync pack_float_value (en, FLOAT_TYPE_TIME_OF_DAY_ACCELERATION, raw->time_of_day_acceleration); pack_float_value (en, FLOAT_TYPE_FOG_OF_WAR_MAXIMUM_VALUE, raw->fog_of_war_maximum_value); // // rain effect // pack_float_value (en, FLOAT_TYPE_WEATHER_RADIUS, raw->weather_radius); pack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_PERIOD, raw->weather_mode_transitional_period); pack_float_value (en, FLOAT_TYPE_WEATHER_MODE_TRANSITIONAL_STATUS, raw->weather_mode_transitional_status); pack_int_value (en, INT_TYPE_WEATHER_MODE, raw->weather_mode); pack_int_value (en, INT_TYPE_TARGET_WEATHER_MODE, raw->target_weather_mode); pack_vec3d (en, VEC3D_TYPE_WEATHER_POSITION, &raw->weather_position); pack_vec3d (en, VEC3D_TYPE_WEATHER_VELOCITY, &raw->weather_velocity); // // wind effect // pack_float_value (en, FLOAT_TYPE_WIND_EFFECT_RADIUS, raw->wind_effect_radius); pack_float_value (en, FLOAT_TYPE_WIND_GUSTING_VALUE, raw->wind_gusting_value); pack_float_value (en, FLOAT_TYPE_WIND_MINIMUM_SPEED, raw->wind_minimum_speed); pack_float_value (en, FLOAT_TYPE_WIND_MAXIMUM_SPEED, raw->wind_maximum_speed); pack_vec3d (en, VEC3D_TYPE_WIND_DIRECTION_VECTOR, &raw->wind_direction_vector); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_POSITION, &raw->wind_effect_position); pack_vec3d (en, VEC3D_TYPE_WIND_EFFECT_VELOCITY, &raw->wind_effect_velocity); // pack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE, raw->day_segment_type); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN, raw->population_x_min); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX, raw->population_x_max); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN, raw->population_z_min); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX, raw->population_z_max); pack_int_value (en, INT_TYPE_CAMPAIGN_MEDAL, raw->campaign_medal); pack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC, raw->campaign_requires_apache_havoc); pack_int_value (en, INT_TYPE_AUTO_ASSIGN_GUNSHIP, raw->auto_assign_gunship); pack_int_value (en, INT_TYPE_INFINITE_FUEL, raw->infinite_fuel); pack_int_value (en, INT_TYPE_INFINITE_WEAPONS, raw->infinite_weapons); pack_int_value (en, INT_TYPE_SUPPRESS_AI_FIRE, raw->suppress_ai_fire); pack_int_value (en, INT_TYPE_INVULNERABLE_FROM_COLLISIONS, raw->invulnerable_from_collisions); pack_int_value (en, INT_TYPE_INVULNERABLE_FROM_WEAPONS, raw->invulnerable_from_weapons); pack_int_value (en, INT_TYPE_CHEATS_ENABLED, raw->cheats_enabled); pack_int_value (en, INT_TYPE_SKIP_NIGHT_TIME, raw->skip_night_time); pack_int_value (en, INT_TYPE_WEATHER_INCREASING, raw->weather_increasing); pack_int_value (en, INT_TYPE_WIND_INCREASING, raw->wind_increasing); pack_int_value (en, INT_TYPE_LOCAL_WEATHER_MODEL, raw->local_weather_model); break; } //////////////////////////////////////// case PACK_MODE_BROWSE_SESSION: //////////////////////////////////////// { pack_entity_safe_ptr (en); pack_int_value (en, INT_TYPE_VERSION_NUMBER, raw->version_number); pack_list_root (en, LIST_TYPE_FORCE, &raw->force_root); // update_link // tour of duty time pack_float_value (en, FLOAT_TYPE_ELAPSED_TIME, raw->elapsed_time); // lightning_timer pack_float_value (en, FLOAT_TYPE_START_TIME, raw->start_time); // time_of_day_resync // time_of_day_acceleration // weather radius // weather_mode_transitional_period // weather_mode_transitional_status pack_int_value (en, INT_TYPE_WEATHER_MODE, raw->weather_mode); // target_weather_mode // weather position // weather velocity pack_int_value (en, INT_TYPE_DAY_SEGMENT_TYPE, raw->day_segment_type); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MIN, raw->population_x_min); pack_float_value (en, FLOAT_TYPE_POPULATION_X_MAX, raw->population_x_max); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MIN, raw->population_z_min); pack_float_value (en, FLOAT_TYPE_POPULATION_Z_MAX, raw->population_z_max); pack_int_value (en, INT_TYPE_CAMPAIGN_REQUIRES_APACHE_HAVOC, raw->campaign_requires_apache_havoc); // infinite_weapons // skip_night_time // weather increasing break; } } }