void unpack_local_city_building_data (pack_modes mode) { city_building *raw; entity *destroy_en, *en; int city_building_count, city_building_alive; if ((mode != PACK_MODE_SERVER_SESSION) && (mode != PACK_MODE_CLIENT_SESSION)) { return; } // // RLE encoded // debug_log ("RLE CITY BLOCK"); en = get_local_entity_list (); city_building_count = unpack_int_value (NULL, INT_TYPE_LENGTH); city_building_alive = unpack_int_value (NULL, INT_TYPE_ALIVE); while (en) { destroy_en = en; en = get_local_entity_succ (en); if (get_local_entity_type (destroy_en) == ENTITY_TYPE_CITY_BUILDING) { if (city_building_count == 0) { city_building_count = unpack_int_value (NULL, INT_TYPE_LENGTH); city_building_alive = unpack_int_value (NULL, INT_TYPE_ALIVE); } city_building_count --; raw = get_local_entity_data (destroy_en); raw->fix.alive = city_building_alive; if (!city_building_alive) { raw->fix.object_3d_shape = get_3d_object_destroyed_object_index (raw->fix.object_3d_shape); } } } }
static void kill_local (entity *en) { site *raw; vec3d pos; entity *task, *destroy_task; //////////////////////////////////////// // // PRE-AMBLE // //////////////////////////////////////// #if DEBUG_MODULE debug_log_entity_args (ENTITY_DEBUG_LOCAL, ENTITY_DEBUG_KILL, en); #endif raw = get_local_entity_data (en); //////////////////////////////////////// // // UNLINK FROM SYSTEM // //////////////////////////////////////// if (get_comms_model () == COMMS_MODEL_SERVER) { task = get_local_entity_first_child (en, LIST_TYPE_TASK_DEPENDENT); while (task) { destroy_task = task; task = get_local_entity_child_succ (task, LIST_TYPE_TASK_DEPENDENT); if (destroy_task->type == ENTITY_TYPE_TASK) { #if DEBUG_MODULE debug_log ("ST_DSTRY: killing site, notifying task %s complete", entity_sub_type_task_names [get_local_entity_int_value (destroy_task, INT_TYPE_ENTITY_SUB_TYPE)]); #endif notify_local_entity (ENTITY_MESSAGE_TASK_COMPLETED, destroy_task, en, TASK_TERMINATED_OBJECTIVE_MESSAGE); } } } // // fixed // unlink_local_entity_children (en, LIST_TYPE_TASK_DEPENDENT); unlink_local_entity_children (en, LIST_TYPE_TARGET); // gunship_target_link // sector_link // // site // //////////////////////////////////////// // // KILL // //////////////////////////////////////// // must be done BEFORE alive flag set subtract_local_entity_importance_from_keysite (en); set_local_entity_int_value (en, INT_TYPE_ALIVE, FALSE); //////////////////////////////////////// // // SPECIAL EFFECTS // //////////////////////////////////////// if (get_comms_model () == COMMS_MODEL_SERVER) { create_client_server_object_killed_explosion_effect (en); get_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &pos); pos.y = get_3d_terrain_elevation (pos.x, pos.z); create_client_server_crater (CRATER_TYPE_LARGE_EXPLOSION, &pos); } // // must be done AFTER object explosion // raw->fix.object_3d_shape = get_3d_object_destroyed_object_index (raw->fix.object_3d_shape); }
void unpack_local_site_updatable_data (pack_modes mode) { site_updatable *raw; entity *en; int count, alive; if ((mode != PACK_MODE_SERVER_SESSION) && (mode != PACK_MODE_CLIENT_SESSION)) { return; } // // RLE encoded // debug_log ("RLE SITE UPDATEABLE"); en = get_local_entity_list (); count = unpack_int_value (NULL, INT_TYPE_LENGTH); alive = unpack_int_value (NULL, INT_TYPE_ALIVE); #if DEBUG_MODULE debug_log ("SU_PACK: unpacking count %d, alive %d", count, alive); #endif while (en) { if (get_local_entity_type (en) == ENTITY_TYPE_SITE_UPDATABLE) { if (count == 0) { count = unpack_int_value (NULL, INT_TYPE_LENGTH); alive = unpack_int_value (NULL, INT_TYPE_ALIVE); #if DEBUG_MODULE debug_log ("SU_PACK: unpacking count %d, alive %d", count, alive); #endif } count --; raw = get_local_entity_data (en); if (!alive) { delete_local_entity_from_parents_child_list (en, LIST_TYPE_UPDATE); // must be done BEFORE alive flag set, and BEFORE shape changed // subtract_local_entity_importance_from_keysite (en); raw->fix.object_3d_shape = get_3d_object_destroyed_object_index (raw->fix.object_3d_shape); } raw->fix.alive = alive; } en = get_local_entity_succ (en); } }
static int get_local_int_value (entity *en, int_types type) { vehicle *raw; int value; raw = (vehicle *) get_local_entity_data (en); switch (type) { //////////////////////////////////////// case INT_TYPE_COLLISION_TEST_MOBILE: //////////////////////////////////////// { value = TRUE; break; } //////////////////////////////////////// case INT_TYPE_CPG_IDENTIFIED: //////////////////////////////////////// { value = raw->cpg_identified; break; } //////////////////////////////////////// case INT_TYPE_DAMAGE_LEVEL: //////////////////////////////////////// { value = raw->damage_level; break; } //////////////////////////////////////// case INT_TYPE_DEFAULT_3D_SHAPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].default_3d_shape; break; } //////////////////////////////////////// case INT_TYPE_DEFAULT_WEAPON_CONFIG_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].default_weapon_config_type; break; } //////////////////////////////////////// case INT_TYPE_DEFAULT_WEAPON_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].default_weapon_type; break; } //////////////////////////////////////// case INT_TYPE_DESTROYED_3D_SHAPE: //////////////////////////////////////// { value = get_3d_object_destroyed_object_index (raw->object_3d_shape); break; } //////////////////////////////////////// case INT_TYPE_ENGAGE_ENEMY: //////////////////////////////////////// { entity *group; value = FALSE; switch (raw->operational_state) { case OPERATIONAL_STATE_LANDED: { if (get_local_entity_parent (en, LIST_TYPE_TAKEOFF_QUEUE)) { // // Don't engage if waiting to takeoff... // break; } // deliberate fall-through... } case OPERATIONAL_STATE_NAVIGATING: case OPERATIONAL_STATE_STOPPED: { group = get_local_entity_parent (en, LIST_TYPE_MEMBER); if (group) { value = get_local_entity_int_value (group, INT_TYPE_ENGAGE_ENEMY); } break; } } break; } //////////////////////////////////////// case INT_TYPE_EXPLOSIVE_POWER: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].explosive_power; break; } //////////////////////////////////////// case INT_TYPE_EXPLOSIVE_QUALITY: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].explosive_quality; break; } //////////////////////////////////////// case INT_TYPE_FORCE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].force; break; } //////////////////////////////////////// case INT_TYPE_FORCE_INFO_CATAGORY: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].force_info_catagory; break; } //////////////////////////////////////// case INT_TYPE_FORMATION_POSITION: //////////////////////////////////////// { value = raw->formation_position; break; } //////////////////////////////////////// case INT_TYPE_GROUP_LEADER: //////////////////////////////////////// { if ((get_local_entity_parent (en, LIST_TYPE_MEMBER)) && (get_local_entity_child_pred (en, LIST_TYPE_MEMBER) == NULL)) { value = TRUE; } else { value = FALSE; } break; } //////////////////////////////////////// case INT_TYPE_GROUP_MEMBER_ID: //////////////////////////////////////// { value = raw->group_member_number + 1; break; } //////////////////////////////////////// case INT_TYPE_GROUP_MEMBER_NUMBER: //////////////////////////////////////// { value = raw->group_member_number; break; } //////////////////////////////////////// case INT_TYPE_GROUP_MEMBER_STATE: //////////////////////////////////////// { entity *task; // // Check Task // task = get_local_entity_current_task (en); if (task) { if (get_local_entity_int_value (task, INT_TYPE_ENTITY_SUB_TYPE) == ENTITY_SUB_TYPE_TASK_ENGAGE) { value = GROUP_MEMBER_STATE_ATTACKING; } else { value = GROUP_MEMBER_STATE_NAVIGATING; } } else { value = GROUP_MEMBER_STATE_IDLE; } break; } //////////////////////////////////////// case INT_TYPE_GUNSHIP_RADAR_LOS_CLEAR: //////////////////////////////////////// { value = raw->gunship_radar_los_clear; break; } //////////////////////////////////////// case INT_TYPE_IDENTIFY_VEHICLE: //////////////////////////////////////// { value = TRUE; break; } //////////////////////////////////////// case INT_TYPE_ID_NUMBER: //////////////////////////////////////// { value = raw->id_number; break; } //////////////////////////////////////// case INT_TYPE_ID_NUMBER_SIGNIFICANT_DIGITS: //////////////////////////////////////// { value = raw->id_number_significant_digits; break; } //////////////////////////////////////// case INT_TYPE_INITIAL_DAMAGE_LEVEL: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].initial_damage_level; break; } //////////////////////////////////////// case INT_TYPE_LANDED: //////////////////////////////////////// { switch (raw->operational_state) { case OPERATIONAL_STATE_LANDED: //case OPERATIONAL_STATE_REPAIRING: //case OPERATIONAL_STATE_REARMING: //case OPERATIONAL_STATE_REFUELING: { value = TRUE; break; } case OPERATIONAL_STATE_STOPPED: case OPERATIONAL_STATE_UNKNOWN: case OPERATIONAL_STATE_WAITING: case OPERATIONAL_STATE_ASLEEP: case OPERATIONAL_STATE_DEAD: case OPERATIONAL_STATE_DYING: case OPERATIONAL_STATE_LANDING: case OPERATIONAL_STATE_LANDING_HOLDING: case OPERATIONAL_STATE_NAVIGATING: case OPERATIONAL_STATE_TAKEOFF: case OPERATIONAL_STATE_TAKEOFF_HOLDING: case OPERATIONAL_STATE_TAXIING: { value = FALSE; break; } default: { debug_fatal ("VH_INT: unknown operational state"); } } break; } //////////////////////////////////////// case INT_TYPE_LIGHTS_ON: //////////////////////////////////////// { value = raw->lights_on; break; } //////////////////////////////////////// case INT_TYPE_LOS_TO_TARGET: //////////////////////////////////////// { value = raw->los_to_target; break; } //////////////////////////////////////// case INT_TYPE_MAP_ICON: //////////////////////////////////////// { value = vehicle_database [raw->mob.sub_type].map_icon; break; } //////////////////////////////////////// case INT_TYPE_MAX_WEAPON_CONFIG_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].max_weapon_config_type; break; } //////////////////////////////////////// case INT_TYPE_MIN_WEAPON_CONFIG_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].min_weapon_config_type; break; } //////////////////////////////////////// case INT_TYPE_MOBILE_MOVING: //////////////////////////////////////// { switch (raw->operational_state) { case OPERATIONAL_STATE_ASLEEP: case OPERATIONAL_STATE_DEAD: case OPERATIONAL_STATE_LANDED: case OPERATIONAL_STATE_STOPPED: case OPERATIONAL_STATE_UNKNOWN: case OPERATIONAL_STATE_WAITING: { value = FALSE; break; } case OPERATIONAL_STATE_DYING: case OPERATIONAL_STATE_LANDING: case OPERATIONAL_STATE_LANDING_HOLDING: case OPERATIONAL_STATE_NAVIGATING: case OPERATIONAL_STATE_TAKEOFF: case OPERATIONAL_STATE_TAKEOFF_HOLDING: case OPERATIONAL_STATE_TAXIING: { value = TRUE; break; } default: { debug_fatal ("VH_INT: unknown operational state"); } } break; } //////////////////////////////////////// case INT_TYPE_OBJECT_3D_SHAPE: //////////////////////////////////////// { value = raw->object_3d_shape; break; } //////////////////////////////////////// case INT_TYPE_OFFENSIVE_CAPABILITY: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].offensive_capability; break; } //////////////////////////////////////// case INT_TYPE_OPERATIONAL_STATE: //////////////////////////////////////// { value = raw->operational_state; break; } //////////////////////////////////////// case INT_TYPE_POINTS_VALUE: //////////////////////////////////////// { value = vehicle_database [raw->mob.sub_type].points_value; break; } //////////////////////////////////////// case INT_TYPE_RADAR_ON: //////////////////////////////////////// { // // vehicles must have radar and a target for the radar to be on // value = FALSE; if (vehicle_database[raw->mob.sub_type].threat_type != THREAT_TYPE_INVALID) { if (raw->mob.target_link.parent != NULL) { value = TRUE; } } break; } //////////////////////////////////////// case INT_TYPE_SELECTED_WEAPON: //////////////////////////////////////// { value = raw->selected_weapon; break; } //////////////////////////////////////// case INT_TYPE_SELECTED_WEAPON_SYSTEM_READY: //////////////////////////////////////// { value = raw->selected_weapon_system_ready; break; } //////////////////////////////////////// case INT_TYPE_TARGET_PRIORITY_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].target_priority_type; break; } //////////////////////////////////////// case INT_TYPE_TARGET_SYMBOL_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].target_symbol_type; break; } //////////////////////////////////////// case INT_TYPE_TARGET_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].target_type; break; } //////////////////////////////////////// case INT_TYPE_TASK_LEADER: //////////////////////////////////////// { entity *guide; value = FALSE; guide = get_local_entity_parent (en, LIST_TYPE_FOLLOWER); if (guide) { if (get_local_entity_ptr_value (guide, PTR_TYPE_TASK_LEADER) == en) { value = TRUE; } } break; } //////////////////////////////////////// case INT_TYPE_TASK_TARGET_TYPE: //////////////////////////////////////// { value = (TASK_TARGET_TYPE_ANY | TASK_TARGET_TYPE_MOBILE | TASK_TARGET_TYPE_VEHICLE); break; } //////////////////////////////////////// case INT_TYPE_THREAT_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].threat_type; break; } //////////////////////////////////////// case INT_TYPE_TRACK_ENTITY_ON_MAP: //////////////////////////////////////// { value = TRUE; break; } //////////////////////////////////////// case INT_TYPE_VIEW_CATEGORY: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].view_category; break; } //////////////////////////////////////// case INT_TYPE_VIEW_TYPE: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].view_type; break; } //////////////////////////////////////// case INT_TYPE_VIEWABLE: //////////////////////////////////////// { value = raw->view_link.parent != NULL; break; } //////////////////////////////////////// case INT_TYPE_WARHEAD_EFFECTIVE_CLASS: //////////////////////////////////////// { value = vehicle_database[raw->mob.sub_type].warhead_effective_class; break; } //////////////////////////////////////// case INT_TYPE_WEAPON_AND_TARGET_VECTORS_VALID: //////////////////////////////////////// { value = raw->weapon_and_target_vectors_valid; break; } //////////////////////////////////////// case INT_TYPE_WEAPON_CONFIG_TYPE: //////////////////////////////////////// { value = raw->weapon_config_type; break; } //////////////////////////////////////// case INT_TYPE_WEAPON_SYSTEM_READY: //////////////////////////////////////// { //////////////////////////////////////// // // WARNING! This only returns a valid value for vehicles that have weapon // systems to be made ready in the current weapons configuration. // //////////////////////////////////////// if (get_local_entity_float_value (en, FLOAT_TYPE_WEAPON_SYSTEM_READY_STATE) == VEHICLE_WEAPON_SYSTEM_READY_OPEN_FLOAT_VALUE) { value = TRUE; } else { value = FALSE; } break; } //////////////////////////////////////// default: //////////////////////////////////////// { debug_fatal_invalid_int_type (en, type); break; } } return (value); }
static void kill_local (entity *en) { object *raw; vec3d pos; //////////////////////////////////////// // // PRE-AMBLE // //////////////////////////////////////// #if DEBUG_MODULE debug_log_entity_args (ENTITY_DEBUG_LOCAL, ENTITY_DEBUG_KILL, en); #endif raw = (object *) get_local_entity_data (en); set_local_entity_int_value (en, INT_TYPE_ALIVE, FALSE); //////////////////////////////////////// // // UNLINK FROM SYSTEM // //////////////////////////////////////// // // fixed // unlink_local_entity_children (en, LIST_TYPE_TASK_DEPENDENT); unlink_local_entity_children (en, LIST_TYPE_TARGET); // gunship_target_link // sector_link // // object // //////////////////////////////////////// // // SPECIAL EFFECTS // //////////////////////////////////////// if (get_comms_model () == COMMS_MODEL_SERVER) { create_client_server_object_killed_explosion_effect (en); get_local_entity_vec3d (en, VEC3D_TYPE_POSITION, &pos); pos.y = get_3d_terrain_elevation (pos.x, pos.z); create_client_server_crater (CRATER_TYPE_LARGE_EXPLOSION, &pos); } // // must be done AFTER object explosion // raw->fix.object_3d_shape = get_3d_object_destroyed_object_index (raw->fix.object_3d_shape); }