#include maps\_utility; #include common_scripts\utility; #include maps\_anim; #include maps\boneyard_code; main() { precacheItem( "littlebird_FFAR" ); PrecacheItem( "smoke_grenade_american" ); PrecacheItem( "rpg_straight" ); PrecacheItem( "rpg_distant" ); PreCacheRumble( "c130_flyby" ); maps\_juggernaut::main(); maps\_drone_ai::init(); start_points_setup(); maps\_load::set_player_viewhand_model( "viewhands_player_marines" ); animscripts\dog\dog_init::initDogAnimations(); maps\boneyard_precache::main(); level.vttype = "uaz_physics"; level.vtmodel = "vehicle_uaz_open_destructible"; maps\_vehicle::build_aianims( maps\boneyard_anim::uaz_overrides, maps\boneyard_anim::uaz_override_vehicle ); maps\_vehicle::build_unload_groups( ::uaz_unload_groups ); level.vttype = "truck_physics"; level.vtmodel = "vehicle_pickup_roobars"; maps\_vehicle::build_aianims( maps\boneyard_anim::truck_overrides, maps\boneyard_anim::truck_vehicle_overrides ); level.vttype = "suburban_minigun"; level.vtmodel = "vehicle_suburban_technical"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_aianims( maps\boneyard_anim::suburban_minigun_overrides, maps\_suburban_minigun::set_vehicle_anims ); maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 ); maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" ); level.vttype = "suburban"; level.vtmodel = "vehicle_suburban"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_aianims( maps\boneyard_anim::suburban_overrides, maps\_suburban::set_vehicle_anims ); maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 ); maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" ); maps\createart\boneyard_fog::main(); maps\createfx\boneyard_audio::main(); maps\boneyard_fx::main(); maps\_load::main(); maps\boneyard_anim::main(); thread maps\boneyard_amb::main(); maps\_compass::setupMiniMap( "compass_map_boneyard" ); // setup stuff flags_setup(); threatbiasgroups_setup(); threewayfight_setup(); fire_missile_setup(); delete_not_touching_setup(); delete_excess_setup(); vehicle_event_node_setup(); vehicle_aianimthread_setup(); launch_object_setup(); // killer_bird_setup(); vehicle_sweetener_setup(); ride_rumble_setup(); // consines used for fov checks. level.cosine[ "20" ] = cos( 20 ); level.cosine[ "60" ] = cos( 60 ); thread objectives(); // used for switching colors on ai level.base_colors = []; level.base_colors[ "axis" ] = "r"; level.base_colors[ "team3" ] = "p"; // gameplay threads thread road(); thread flyby(); thread higround(); thread ride(); thread music_thread(); // it sounds like they are friendlies because some of the battlechatter is over the radio. // battlechatter_off( "team3" ); // enemies need to be closer to tell each other about an enemy setsaveddvar( "ai_eventDistNewEnemy", 512 ); // makes you less likely to just walk up to enemies. setsaveddvar( "ai_eventDistFootstepSprint", 640 ); //400 setsaveddvar( "ai_eventDistFootstep", 480 ); //256 setsaveddvar( "ai_eventDistFootstepWalk", 320 ); //128 } flags_setup() { flag_init( "delete_excess" ); flag_init( "suburban_target_btr80" ); flag_init( "littlebird_at_goal" ); flag_init( "btr80_target_littlebird" ); flag_init( "btr80_destroyed" ); flag_init( "littlebird_stage1" ); flag_init( "uaz_park" ); flag_init( "uaz_player_in_control" ); flag_init( "intro_btr80_dead" ); flag_init( "ride_uaz_arriving" ); flag_init( "uaz_mounted" ); flag_init( "ride_enemy_vehicles_spawn" ); flag_init( "uaz_driver_dead" ); flag_init( "music_boneyard_intro" ); flag_init( "music_boneyard_flyby" ); flag_init( "makarov_dialogue" ); flag_init( "ride_minigun_gunner_dead" ); flag_init( "player_loses_control_of_uaz" ); flag_init( "uaz_nag" ); /************************* *** FLAGS FROM RADIANT *** ************************** blow_tanker_first blow_tanker_second blow_wing boneyard_mission_completed btr80_at_end btr80_destroy c130_hatch_open c130_takeoff c130_takeoff_missed flyby_c130 flyby_minigun_move flyby_rockets friendly_stay_ahead frontal_suburban_move higround_1 higround_2 higround_ascend hummer_destroy hunt_btr80 intro_btr80_attack intro_btr80_attack_kill intro_btr80_destroy intro_btr80_pre_attack intro_littlebird_strafe intro_rockets_2 keep_moving littlebird_react littlebird_stage1_wait music_boneyard_planechase no_align obj_ride ride_shadows ride_driver_death road road_rocket_guys road_rocket_guys runway_save runway_suburban_rightside scene_a_wave2 stop_road_rockets switch_color uaz_drive uaz_driver_dialogue uaz_driver_mount uaz_mount_end uaz_player_control wait_for_player where_is_nikolai wing_fall *************************/ } threatbiasgroups_setup() { CreateThreatBiasGroup( "aware_of_player" ); CreateThreatBiasGroup( "ignore_player" ); CreateThreatBiasGroup( "enemy_dog" ); CreateThreatBiasGroup( "lowthreat" ); SetThreatBias( "allies", "aware_of_player", 0 ); //aware_of_player are using the base threat level. SetThreatBias( "allies", "axis", -1000 ); // axis find the player to be less of a threat. // used 1000 before SetThreatBias( "allies", "team3", -1000 ); // team3 find the player to be less of a threat. // used 1000 before SetThreatBias( "allies", "enemy_dog", -3000 ); // dogs find the player to be less of a threat. SetIgnoreMeGroup( "allies", "ignore_player" ); // ignore_player ignores the player SetThreatBias( "lowthreat", "axis", -2000 ); // axis find the target less of a threat. SetThreatBias( "lowthreat", "team3", -2000 ); // team3 find the target less of a threat. } start_points_setup() { default_start( ::start_default ); add_start( "intro", ::start_default, "Intro" ); add_start( "road", ::start_road, "Road" ); add_start( "flyby", ::start_flyby, "Flyby" ); add_start( "higround", ::start_higround, "Higround" ); add_start( "ride", ::start_ride, "Ride" ); add_start( "ride_end", ::start_ride_end, "Ride_end" ); } objectives() { flag_init( "obj_rallypoint" ); flag_init( "obj_ride" ); flag_init( "obj_ride_c130" ); objective_number = 0; // each case is a start point; switch( level.start_point ) { default: case "intro": // this will have to change when I go backwards and do the sniper clearing. flag_wait( "obj_rallypoint" ); objective_number = 0; end_position = getent( "rallypoint", "targetname" ); obj_position = getent( end_position.target, "targetname" ); objective_add( objective_number, "current", &"BONEYARD_OBJ_RALLYPOINT", obj_position.origin ); level thread lerp_objective_pos( objective_number, obj_position, end_position ); case "flyby": case "higround": case "ride": flag_wait( "obj_ride" ); Objective_State( objective_number, "done" ); objective_number = 1; obj_position = getent( "rallypoint", "targetname" ); objective_add( objective_number, "current", &"BONEYARD_OBJ_RIDE", obj_position.origin ); Objective_SetPointerTextOverride( objective_number, &"BONEYARD_OBJ_RIDE_ICON" ); // flag_wait( "uaz_drive" ); Objective_OnEntity( objective_number, level.uaz, (-48,-32,16) ); case "ride_c130": flag_wait( "obj_ride_c130" ); level notify( "release_objective" ); Objective_State( objective_number, "done" ); objective_number = 2; obj_position = level.c130; objective_add( objective_number, "current", &"BONEYARD_OBJ_C130", obj_position.origin ); setsaveddvar( "compass", 0 ); thread sp_objective_onentity( objective_number, level.c130 ); } flag_wait( "uaz_park" ); wait 0.5; Objective_State( objective_number, "done" ); fade_out_level( 2 ); if ( is_default_start() ) { nextmission(); } else { IPrintLnBold( "DEVELOPER: END OF SCRIPTED LEVEL" ); } } lerp_objective_pos( objective_number, obj_position, end_position ) { flag_wait( "objective_lerp" ); obj_position moveto( end_position.origin, 60 ); for ( i = 0; i<6; i++ ) { wait 10; Objective_Position( objective_number, obj_position.origin ); } Objective_Position( objective_number, end_position.origin ); } music_thread() { flag_wait( "music_boneyard_intro" ); music_loop( "boneyard_intro", 151 ); flag_wait( "music_boneyard_flyby" ); music_loop( "boneyard_flyby", 184, 6 ); flag_wait( "ride_enemy_vehicles_spawn" ); music_play( "boneyard_jeepride", 4 ); flag_wait( "music_boneyard_planechase" ); music_play( "boneyard_planechase", 1 ); flag_wait( "player_loses_control_of_uaz" ); wait 0.8; musicstop( 1.5 ); level notify( "stop_music" ); level.player play_sound_on_entity( "boneyard_planechase_end" ); } start_default() { level thread intro(); } intro() { getent( "littlebird", "targetname" ) add_spawn_function( ::littlebird_init ); getent( "intro_littlebird", "script_noteworthy" ) add_spawn_function( ::littlebird_init, true ); getent( "intro_littlebird_2", "script_noteworthy" ) add_spawn_function( ::littlebird_init, true ); getent( "intro_littlebird_2", "script_noteworthy" ) add_spawn_function( ::intro_littlebird_strafe ); getent( "intro_hummer", "script_noteworthy" ) add_spawn_function( ::intro_hummer ); getent( "intro_btr80", "script_noteworthy" ) add_spawn_function( ::intro_btr80 ); getent( "scene_a_suburban", "script_noteworthy" ) add_spawn_function( ::scene_a_suburban ); level thread intro_player(); level thread intro_rockets(); level thread intro_dialogue(); activate_trigger_with_targetname( "intro_trigger" ); exploder( "intro_exploder" ); level thread intro_introscreen(); flag_wait( "pullup_weapon" ); wait 0.2; level.player.surprisedByMeDistSq = squared( 5000 ); //what is this for? - Roger starttime = gettime(); flag_wait_or_timeout( "player_left_fuselage", 15 ); wait_for_buffer_time_to_pass( starttime, 5 ); activate_trigger_with_targetname( "intro_trigger_2" ); array_thread( getentarray( "littlebird_trigger", "targetname" ), ::littlebird_trigger ); level thread littlebird_spawn(); wait 5; activate_trigger_with_targetname( "intro_color_trigger" ); flag_wait( "intro_btr80_destroy" ); wait 2; activate_trigger_with_targetname( "intro_threeway_fight" ); flag_set( "switch_color" ); } intro_introscreen() { // flag_wait_either( "intro_btr80_dead", "objective_lerp" ); flag_wait( "obj_rallypoint" ); wait 1; maps\_introscreen::boneyard_intro(); } intro_player() { level.player.ignoreme = true; level.player waittill_any_timeout( 6, "weapon_fired", "grenade_fire" ); wait 6; level.player.ignoreme = false; } intro_dialogue() { wait 2.5; flag_set( "music_boneyard_intro" ); // Soap! Shepherd's trying to wipe out *us* and Makarov at the same time! Head for rally point Bravo to the north! Trust no one! radio_dialogue( "byard_pri_wipeoutus" ); flag_set( "obj_rallypoint" ); flag_wait_either( "intro_btr80_dead", "objective_lerp" ); wait 8; // I'm gonna call in the backup plan! Head for the rally point while I coordinate with Nikolai! radio_dialogue( "byard_pri_backupplan" ); wait 1; // Nikolai! This is Price! Now would be a good time!!! The LZ is hot, I repeat the LZ is hot!!! radio_dialogue( "byard_pri_lzishot" ); // Ok, Captain Price, I am on the way! Try to get the situation under control BEFORE I get there, ok? radio_dialogue( "byard_nkl_ontheway" ); // Right, whatever you say Nikolai! Just get here sharpish! radio_dialogue( "byard_pri_sharpish" ); flag_wait( "let_them_fight" ); // Soap, let Makarov and Shepherd's men kill each other off as much as you can! radio_dialogue( "byard_pri_radiotraffic" ); // We can use their radios to listen in on their radio traffic! I'm going to try to contact Makarov! radio_dialogue( "byard_pri_contactmakarov" ); wait 2; level thread makarov_dialogue(); level endon( "flyby_c130" ); flag_waitopen( "makarov_dialogue" ); flag_wait( "keep_moving" ); // Soap! Don't get pinned down out there! Keep heading north for the runway area! radio_dialogue( "byard_pri_headnorth" ); flag_wait( "road" ); // Nikolai, where the hell are you? radio_dialogue( "byard_pri_whereareyou" ); // Sand storms around Kandahar, Captain Price. I have to fly around them. I'm not getting paid enough to crash my plane. radio_dialogue( "byard_nkl_sandstorms" ); } makarov_dialogue() { flag_set( "makarov_dialogue" ); wait 2; // Makarov, this is Price! Shepherd's a war hero now! He's got your operations playbook and he's got a blank check! radio_dialogue( "byard_pri_warhero" ); wait 1.5; // Give me what you've got on Shepherd, and I'll take care of the rest! radio_dialogue( "byard_pri_takecareofrest" ); wait 1.5; // I know you can hear me on this channel Makarov! radio_dialogue( "byard_pri_onthischannel" ); wait 0.5; // You and I both know you won't last a week! radio_dialogue( "byard_pri_lastaweek" ); // And neither will you! wait 1; radio_dialogue( "byard_mkv_neitherwillyou" ); wait 0.25; // Makarov...you ever hear the old saying...the enemy of my enemy is my friend? radio_dialogue( "byard_pri_myfriend" ); // Price, one day you're going to find that cuts both ways! radio_dialogue( "byard_mkv_cutsbothways" ); // Shepherd is using Site Hotel Bravo. You know where it is! I'll see you in hell! radio_dialogue( "byard_mkv_hotelbravo" ); // Looking forward to it! radio_dialogue( "byard_pri_myregards" ); wait 3; flag_clear( "makarov_dialogue" ); } intro_rockets() { flag_wait( "intro_rockets" ); array_thread( getentarray( "intro_first_rocket", "targetname" ), ::magic_rocket ); flag_wait( "intro_rockets_2" ); array_thread( getentarray( "intro_rocket_start", "targetname" ), ::magic_rocket ); } intro_hummer(){ damage_types = []; damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true; damage_types[ tolower( "MOD_PROJECTILE" ) ] = true; self waittill_damage( damage_types, undefined, true, 9 ); self maps\_vehicle::force_kill(); } intro_btr80() { self main_turret_init(); self thread makesentient( self.script_team ); self thread intro_btr80_death(); flag_wait( "intro_btr80_pre_attack" ); self ent_flag_set( "hold_fire" ); self thread main_turret_attack( level.intro_heli.fake_target, ( 0,0,0 ), true ); level.intro_heli.fake_target = undefined; flag_wait( "intro_btr80_attack" ); self ent_flag_clear( "hold_fire" ); flag_wait( "intro_btr80_attack_kill" ); self main_turret_attack( level.intro_heli, ( 0,0,0 ), true ); wait 1; self thread intro_btr80_target_axis(); } intro_btr80_death() { flag_wait( "intro_btr80_destroy" ); level.intro_heli.fake_target = undefined; damage_types = []; damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true; damage_types[ tolower( "MOD_PROJECTILE" ) ] = true; self waittill_damage( damage_types, undefined, true, 4 ); flag_set( "intro_btr80_dead" ); self maps\_vehicle::force_kill(); } intro_btr80_target_axis() { self endon( "death" ); while( true ) { ai_arr = getaiarray( "axis" ); ai_arr = array_add( ai_arr, level.player ); self main_turret_attack( ai_arr[0], ( 0,0,0 ), true ); } } intro_littlebird_strafe() { level.intro_heli = self; flag_wait( "intro_littlebird_strafe" ); // make turret fire. array_thread( self.mgturret, ::road_target, self ); } vehicle_sweetener_setup() { // ents for helicopters array = getentarray( "vehicle_sweetener", "script_noteworthy" ); array_thread( array, ::vehicle_sweetener ); // nodes for other vehicles array = getvehiclenodearray( "vehicle_sweetener", "script_noteworthy" ); array_thread( array, ::vehicle_sweetener ); } vehicle_sweetener() { self waittill( "trigger", vehicle ); vehicle playsound( self.script_soundalias ); } road_target( heli ) { heli endon( "death" ); self setconvergencetime( 0 ); forward = anglestoforward( self.angles ); target_origin = self.origin + 700 * forward + (0,0,-80); target_ent = spawn( "script_origin", target_origin ); /* target_ent = spawn( "script_model", target_origin ); target_ent setmodel( "fx" ); */ target_ent linkto( self ); old_mode = self getmode(); self setmode( "manual" ); self SetTargetEntity( target_ent ); flag_waitopen( "intro_littlebird_strafe" ); target_ent delete(); self cleartargetentity(); self setmode( old_mode ); } scene_a_suburban() { self endon( "death" ); self thread set_flag_on_player_damage( "scene_a_wave2" ); turret = self.mgturret[0]; turret waittill( "turret_ready" ); // turret SetMode( "auto_ai" ); mg_guy = turret getturretowner(); assert( isdefined( mg_guy ) ); mg_guy thread set_flag_on_player_damage( "scene_a_wave2" ); main_target = getent( "mg_target", "targetname" ); turret thread animscripts\hummer_turret\common::set_manual_target( main_target, 3, 6 ); flag_wait( "scene_a_wave2" ); thread scene_a_rpg_guy( self ); while( true ) { self waittill( "damage", damage, guy ); assert( isdefined(guy) ); if ( isdefined( self.rpg_guy ) && guy == self.rpg_guy ) break; } self maps\_vehicle::godoff(); self notify( "death", self.rpg_guy, "MOD_PROJECTILE" ); } scene_a_rpg_guy( vehicle ) { sight_ent = spawn( "script_origin", vehicle.origin + ( 0,0,150 ) ); sight_ent linkto( vehicle ); sight_ent waittill_player_lookat( undefined, undefined, undefined, 5, vehicle ); guy = getent( "scene_a_rpg_guy", "targetname" ) spawn_ai( true ); guy endon( "death" ); vehicle.rpg_guy = guy; anim_ent = getent( "scene_a_rpg_spot" ,"targetname" ); guy set_allowdeath( true ); guy.ignoreall = true; guy.ignoreme = true; anim_ent anim_generic( guy, "prone_2_stand" ); guy SetStableMissile( true ); guy.ignoreall = false; guy SetEntityTarget( vehicle, 1 ); vehicle waittill_notify_or_timeout( "death", 5 ); guy SetStableMissile( false ); guy ClearEntityTarget(); guy.ignoreme = false; guy set_force_color( "p" ); guy.goalheight = 128; guy threewayfight_threads_defaults(); } littlebird_init( no_repulsor ) { level notify( "road_heli_spawned" ); array_thread( self.mgturret, ::littlebird_minigun ); level.heli = self; self.script_AI_invulnerable = true; waittillframeend; self thread makesentient( self.script_team ); if ( !isdefined( no_repulsor ) ) self thread toggle_repulsor(); self.fake_target = spawn( "script_model", (0,0,0) ); // self.fake_target setmodel( "fx" ); self.fake_target linkto( self, "tag_origin", ( 100, 0, 150 ), ( 0, 0, 0 ) ); self thread fake_target_delete( self.fake_target ); /# self thread drawpath(); ent = self.currentnode; self thread mark_heli_path( ent ); #/ } toggle_repulsor() { self endon( "death" ); while( true ) { self waittill( "rpg_fired" ); repulsor = Missile_CreateRepulsorEnt( self, 2500, 1000 ); wait 2.5; Missile_DeleteAttractor( repulsor ); } } littlebird_alive() { if ( !isdefined( level.heli ) ) return false; if ( !isalive( level.heli ) ) return false; if ( level.heli.health < level.heli.healthbuffer ) return false; return true; } fake_target_delete( fake_target ) { fake_target endon( "death" ); self waittill( "death" ); fake_target delete(); } littlebird_minigun() { self SetBottomArc( 18 ); self setrightarc( 20 ); self setleftarc( 20 ); self SetConvergenceTime( 1.5, "yaw" ); self SetConvergenceTime( 0.7, "pitch" ); } littlebird_trigger() { level endon( "spawn_littlebird" ); self waittill( "trigger" ); level notify( "spawn_littlebird", self.target ); } littlebird_spawn() { level waittill( "spawn_littlebird", ent_str ); ent = getent( ent_str, "targetname" ); heli_spawner = getent( "littlebird", "targetname" ); level.heli = heli_spawner move_spawn_and_go( ent ); flag_clear( "littlebird_react" ); level.heli thread littlebird_reaction( "strafe_path" ); } flyby_littlebird() { flag_wait( "flyby_c130" ); if ( !littlebird_alive() ) { // if dead respawn path_ent = getent( "littlebird_flyby_start", "targetname" ); heli_spawner = getent( "littlebird", "targetname" ); level.heli = heli_spawner move_spawn_and_go( path_ent ); } // level.heli might be overritten by the higround heli if the player moves fast. heli = level.heli; heli maps\_vehicle::godon(); heli notify( "reaction_end" ); path = getent( "littlebird_flyby_standby", "targetname" ); heli maps\_vehicle::set_heli_move( "faster" ); heli Vehicle_SetSpeed( 65, 25, 25 ); heli thread maps\_vehicle::vehicle_paths( path ); flag_wait( "flyby_c130" ); path = getent( "flyby_chase_path", "targetname" ); heli maps\_vehicle::set_heli_move( "faster" ); heli Vehicle_SetSpeed( 60, 25, 25 ); heli thread maps\_vehicle::vehicle_paths( path ); heli waittill( "reached_dynamic_path_end" ); heli delete(); } start_road() { level.player start_at( GetEnt( "start_road_player", "targetname" ) ); activate_trigger_with_targetname( "middle_road_start_trigger" ); heli_spawner = getent( "littlebird", "targetname" ); heli_spawner add_spawn_function( ::littlebird_init ); array_thread( getentarray( "littlebird_trigger", "targetname" ), ::littlebird_trigger ); level thread littlebird_spawn(); getentarray( "littlebird_trigger", "targetname" )[0] notify( "trigger" ); wait 1; flag_set( "littlebird_react" ); waittillframeend; level.heli notify( "react"); level.heli maps\_vehicle::mgon(); } road() { level thread road_rocket_guys(); level thread flyby_c130(); level thread road_crash(); getent( "road_hummer", "script_noteworthy" ) add_spawn_function( ::road_hummer ); triggers = getentarray( "middle_road", "targetname" ); foreach( trigger in triggers ) level waittill_stack_add( "trigger", trigger ); level waittill( "waittill_stack", msg, trigger ); // tmp fix dist = 1000; while( true ) { wait 0.5; ai = getaiarray( "axis", "team3" ); if ( !isdefined( ai[0] ) ) continue; ai = SortByDistance( ai, level.player.origin ); if ( distance( ai[0].origin, level.player.origin ) > dist ) break; dist *= 0.95; } exploder( "road_exploder" ); level waittill_stack_clear(); // clear stack } road_hummer() { turret = self.mgturret[0]; turret waittill( "turret_ready" ); // could this break it? mg_guy = turret getturretowner(); if ( littlebird_alive() ) self thread turret_track_target( turret, level.heli ); array_thread( self.riders, ::set_flag_on_player_damage, "road" ); self thread set_flag_on_player_damage( "road" ); self waittill( "death" ); level notify( "hummer_dead" ); } road_crash() { flag_wait( "hummer_destroy" ); // pickup trucks blow up and switch model after in 1 second instead of the default 2. level.vttype = "truck_physics"; level.vtmodel = "vehicle_pickup_roobars"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode", undefined, undefined, undefined, 0, true ); maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_fx_tire_right_r", "smallfire", undefined, undefined, true, 0.1, true ); maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_fx_cab", "smallfire", undefined, undefined, true, 0.11, true ); maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_engine_left", "smallfire", undefined, undefined, true, 0.11, true ); level.vehicle_deathmodel_delay[ level.vtmodel ] = 0; flag_wait( "road" ); activate_trigger_with_targetname( "road_crash" ); } road_rocket_guys() { level endon( "stop_road_rockets" ); // called by a flag_set in radiant. spawner_arr = getentarray( "road_rocket_guys", "targetname" ); while( true ) { flag_wait( "road_rocket_guys" ); if ( !littlebird_alive() ) return; level.heli endon( "death" ); guy = undefined; spawner_arr = SortByDistance( spawner_arr, level.player.origin ); for( i=spawner_arr.size; i>0; i-- ) { spawner = spawner_arr[i-1]; spawner.count++; guy = spawner spawn_ai(); if( !spawn_failed( guy ) ) break; } if ( distance( level.player.origin, guy.origin ) > 800 ) guy.ignoreme = true; guy.rocket_target = level.heli; guy thread road_rocket_guys_clear(); flag_clear( "road_rocket_guys" ); } } flyby_c130() { array_thread( getentarray( "rocket_start", "targetname" ), ::flyby_magic_rocket, 2 ); flag_wait( "flyby_c130" ); spawner = getent( "flyby_c130_spawner", "targetname" ); c130 = spawner spawn_vehicle(); c130 thread maps\_vehicle::gopath(); c130 playsound( "veh_c130_flyby" ); level.player thread flyby_rumble(); flag_wait( "flyby_angel_flare" ); c130 thread angel_flare_burst( 10 ); wait 11; c130 thread angel_flare_burst( 5 ); } start_flyby() { level.player start_at( GetEnt( "start_flyby_player", "targetname" ) ); path_ent = getent( "littlebird_flyby_start", "targetname" ); heli_spawner = getent( "littlebird", "targetname" ); level.heli = heli_spawner move_spawn_and_go( path_ent ); } flyby() { level thread flyby_dialogue(); // fewer enemies level.ai_cap[ "axis" ] = 10; level.ai_cap[ "team3" ] = 10; getent( "flyby_suburban", "script_noteworthy" ) add_spawn_function( ::flyby_suburban ); flag_wait( "flyby_rockets" ); level thread flyby_littlebird(); flag_wait( "flyby_c130" ); // SetCullDist( 12000 ); flag_set( "music_boneyard_flyby" ); activate_trigger_with_targetname( "flyby_area_trigger" ); level thread flyby_advance(); flag_wait( "flyby_vision_change" ); level thread maps\_utility::vision_set_fog_changes( "boneyard", 10 ); flag_wait( "higround_ascend" ); SetCullDist( 0 ); } flyby_advance() { // this should happen after the drop dow flag_wait( "flyby_vision_change" ); axis = get_ai_group_ai( "flyby_axis" ); team3 = get_ai_group_ai( "flyby_team3" ); if ( axis.size < 5 && team3.size < 5 ) { // move enemies and start the suv going. activate_trigger_with_noteworthy( "flyby_advance_color_trigger" ); flag_set( "flyby_minigun_move" ); } } flyby_dialogue() { level endon( "higround_ascend" ); flag_wait( "flyby_c130" ); flag_waitopen( "makarov_dialogue" ); // Price, I am approaching the boneyard. I see you do not have situation under control. // Very unsafe to land. It looks like when I was in Afghanistan with the Soviets! radio_dialogue( "byard_nkl_unsafetoland" ); // Nikolai! Shut up and just land the bloody plane! We're on our way! radio_dialogue( "byard_pri_landtheplane" ); // This is such bullshit! I'm not getting paid nearly enough for these missions! // These flares are expensive!! FUCK!!! radio_dialogue( "byard_nkl_paidenough" ); flag_wait( "flyby_minigun_move" ); wait 7; // Soap! Hurry! We've got to get to Nikolai's plane! Keep moving north! radio_dialogue( "byard_pri_gettoplane" ); } flyby_suburban() { self endon( "death" ); level.flyby_suburban = self; flag_wait( "flyby_suburban_go" ); // wait till the minigun vehicle has passed. path_start = getvehiclenode( "flyby_retreat_path","targetname" ); self new_vehicle_path( path_start ); flag_wait( "flyby_suburban_kill" ); self VehPhys_launch( (-450,50,100), true ); self maps\_vehicle::godoff(); self maps\_vehicle::force_kill(); } start_higround() { flag_set( "music_boneyard_intro" ); flag_set( "music_boneyard_flyby" ); objective_number = 0; obj_position = getent( "rallypoint", "targetname" ); objective_add( objective_number, "current", &"BONEYARD_OBJ_RALLYPOINT", obj_position.origin ); level.player start_at( GetEnt( "start_higround_player", "targetname" ) ); vnode = getvehiclenode( "higround_minigun_suburban_start", "script_noteworthy" ); suburban_spawner = getent( "higround_minigun_suburban", "script_noteworthy" ); vehicle = suburban_spawner move_spawn_and_go( vnode ); vnode = getvehiclenode( "higround_btr80_start", "script_noteworthy" ); btr80_spawner = getent( "higround_btr80", "script_noteworthy" ); vehicle = btr80_spawner move_spawn_and_go( vnode ); flag_set( "flyby_suburban_go" ); /# // debug shit ent = getent( "higround_heli_path", "script_noteworthy" ); thread mark_heli_path( ent ); #/ trigger = getent( "higround_start_trigger_off", "script_noteworthy" ); trigger trigger_off(); activate_trigger_with_targetname( "higround_start_color_trigger" ); activate_trigger_with_noteworthy( "higround_start_ai_trigger" ); flag_wait_or_timeout( "higround_ascend", 3 ); activate_trigger_with_targetname( "higround_start_color_trigger_2" ); } higround() { getent( "higround_btr80", "script_noteworthy" ) add_spawn_function( ::higround_btr80 ); getent( "higround_minigun_suburban", "script_noteworthy" ) add_spawn_function( ::higround_minigun_suburban ); getent( "higround_littlebird", "targetname" ) add_spawn_function( ::littlebird_init ); getent( "higround_littlebird", "targetname" ) add_spawn_function( ::higround_littlebird ); array_spawn_function_noteworthy( "higround_guy", ::higround_guy ); level thread higround_dialogue(); flag_wait( "flyby_suburban_go" ); SetThreatBias( "allies", "team3", 0 ); // team3 find the player to be normal threat for when they are crossing the road. level thread higround_second_save(); // start the ride once living higround guys are 4 or less and the btr80 died or reached it's final destination. level thread higround_ride_force_start( 4 ); } higround_ride_force_start( living ) { flag_wait( "higround_2" ); flag_wait_either( "btr80_at_end", "btr80_destroyed" ); while( level.higround_guy > living ) wait 0.5; activate_trigger_with_noteworthy( "ride_start_trigger" ); } higround_guy() { level endon( "ride_uaz_arriving" ); if ( !isdefined( level.higround_guy ) ) level.higround_guy = 0; level.higround_guy++; self waittill_either( "death", "pain_death" ); level.higround_guy--; } higround_second_save() { // save halfway through the higround when atleast 30 seconds has passed. level endon( "ride_uaz_arriving" ); flag_wait( "higround_ascend" ); start_time = gettime(); flag_wait( "higround_2" ); wait_for_buffer_time_to_pass( start_time, 30 ); autosave_by_name( "higround_second_save" ); } higround_dialogue() { level endon( "higround_2" ); flag_wait( "higround_ascend" ); flag_waitopen( "makarov_dialogue" ); // Soap! I'm going to get some transport! Make your way north towards the runway! radio_dialogue( "byard_pri_gettransport" ); starttime = gettime(); flag_wait( "higround_1" ); wait_for_buffer_time_to_pass( starttime, 15 ); // Soap! I've found some transport! Keep moving north! I'll meet you en route! radio_dialogue( "byard_pri_foudntransport" ); } higround_littlebird() { self endon( "death" ); level.btr80 endon( "death" ); level endon( "obj_ride" ); self thread higround_littlebird_ondeath(); self thread higround_littlebird_onkill(); flag_wait( "hunt_btr80" ); self SetMaxPitchRoll( 25, 25 ); self SetYawSpeed( 90, 45, 22.5, 0 ); self thread higround_littlebird_hunt_btr80( "hunt_btr80" ); self higround_littlebird_aligned( "higround_2" ); if ( !flag( "btr80_at_end" ) ) { flag_clear( "no_align" ); // this will fire but miss. self higround_littlebird_failed_attack(); self notify( "stop_hunt" ); self ClearLookAtEnt(); self ClearTurretTarget(); flag_set( "btr80_target_littlebird" ); self maps\_vehicle::godon(); self Vehicle_SetSpeed( 70, 35, 10 ); self SetNearGoalNotifyDist( 512 ); self SetVehGoalPos( level.player.origin + ( 0,0,768 ) ); self waittill_any( "goal", "near_goal" ); flag_clear_delayed( "btr80_target_littlebird", 3 ); self delaythread( 4, maps\_vehicle::godoff ); } self notify( "stop_hunt" ); // stops the first hunt self thread higround_littlebird_hunt_btr80( "hunt_btr80_final" ); self higround_littlebird_aligned(); self notify( "stop_hunt" ); // stops the hunt just above. // might kill the btr80 or it might not. if ( cointoss() ) { target_arr = []; target_arr[0] = level.btr80; self thread fire_missile( target_arr, 3 ); } else { self higround_littlebird_failed_attack(); thread flag_set_delayed( "btr80_target_littlebird", 3 ); self.fake_target delayCall( randomfloatrange( 4, 8 ), ::delete ); } level.heli notify( "missed_final" ); self ClearLookAtEnt(); self ClearTurretTarget(); start_path = getent( "higround_strafe_path_first", "targetname" ); level.heli thread maps\_vehicle::vehicle_paths( start_path ); flag_clear( "littlebird_react" ); level.heli thread littlebird_reaction( "higround_strafe_path" ); } higround_littlebird_onkill() { level endon( "obj_ride" ); level.heli endon( "death" ); level.heli endon( "missed_final" ); level.btr80 waittill( "death" ); self ClearLookAtEnt(); self ClearTurretTarget(); start_path = getent( "higround_strafe_path_first", "targetname" ); level.heli thread maps\_vehicle::vehicle_paths( start_path ); flag_clear( "littlebird_react" ); level.heli thread littlebird_reaction( "higround_strafe_path" ); } higround_littlebird_ondeath() { level endon( "obj_ride" ); level.btr80 endon( "death" ); level.heli waittill( "death" ); level.btr80.main_turret_enemies = array_remove( level.btr80.main_turret_enemies, level.heli ); } higround_btr80() { self endon( "death" ); level.btr80 = self; self.dontunloadonend = true; self thread higround_btr80_on_death(); flag_set( "suburban_target_btr80" ); vehicle_set_health( 500 ); self main_turret_init(); // self thread makesentient( self.script_team ); flag_wait( "flyby_suburban_go" ); if ( isalive( level.flyby_suburban ) ) { wait 2; self main_turret_attack( level.flyby_suburban, ( 0,0,30 ), true, 10 ); } mg = self.mgturret[0]; mg SetTopArc( 10 ); self main_turret_aim_straight(); wait 5; self ent_flag_clear( "hold_fire" ); self thread main_turret_think(); SetThreatBias( "allies", "team3", 1000 ); // team3 find the player to be less of a threat again. self higround_btr80_target_littlebird(); wait 2; self notify( "clear_turret_target" ); flag_set( "higround_2" ); } higround_btr80_target_littlebird() { self endon( "death" ); while( true ) { flag_wait( "btr80_target_littlebird" ); if ( !isdefined( level.heli ) ) return; level.heli endon( "death" ); // addes the heli as a target. if ( self.main_turret_enemies.size == 0 ) self.main_turret_enemies = array_add( self.main_turret_enemies, level.heli ); else self.main_turret_enemies = array_insert( self.main_turret_enemies, level.heli, 0 ); self notify( "clear_turret_target" ); flag_waitopen( "btr80_target_littlebird" ); self.main_turret_enemies = array_remove( self.main_turret_enemies, level.heli ); } } higround_btr80_on_death() { self waittill( "death" ); flag_set( "btr80_destroyed" ); } higround_minigun_suburban() { self endon( "death" ); level.minigun_suburban = self; // self.dontUnloadOnEnd = true; turret = self.mgturret[0]; turret waittill( "turret_ready" ); mg_guy = turret getturretowner(); flag_wait( "suburban_target_btr80" ); turret = self.mgturret[0]; turret animscripts\hummer_turret\common::set_manual_target( level.btr80, 4, 5 ); flag_wait( "higround_ascend" ); self vehicle_set_health( 200 ); flag_wait( "btr80_target_suburban" ); level.btr80.main_turret_enemies = array_add( level.btr80.main_turret_enemies, self ); } start_ride() { flag_set( "music_boneyard_intro" ); flag_set( "music_boneyard_flyby" ); level.player start_at( GetEnt( "start_ride_player", "targetname" ) ); heli_spawner = getent( "littlebird", "targetname" ); heli_spawner add_spawn_function( ::littlebird_init ); } ride() { ride_vehicle_spawners = getentarray( "ride_vehicle", "script_noteworthy" ); array_thread( ride_vehicle_spawners, ::add_spawn_function, ::ride_vehicle ); getent( "ride_uaz", "script_noteworthy" ) add_spawn_function( ::ride_uaz ); spawner = getent( "runway_suburban", "targetname" ); spawner add_spawn_function( ::ride_runway_suburban ); array_spawn_function_noteworthy( "price", ::ride_uaz_price ); array_spawn_function_noteworthy( "uaz_driver", ::ride_uaz_driver ); array_spawn_function_noteworthy( "ride_minigunner", ::ride_minigunner ); level thread ride_c130(); level thread ride_c130_sound(); level thread ride_tanker_blow(); level thread collapse_wing(); level thread ride_dialogue(); level thread ride_zfar(); level thread ride_littlebird(); level thread suburban_ride_deathfx(); flag_wait( "ride_uaz_arriving" ); autosave_by_name( "ride_arriving_save" ); level thread ramp_sunsample_over_time( .65, 3 ); flag_wait( "ride_enemy_vehicles_spawn" ); // pickup trucks blow up and switch model after in 1 second instead of the default 2. level.vttype = "truck_physics"; level.vtmodel = "vehicle_pickup_roobars"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_body", "smallfire", undefined, undefined, true, 0, true ); maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode", undefined, undefined, undefined, 0.9, true ); maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_fx_tire_right_r", "smallfire", undefined, undefined, true, 1, true ); maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "tag_fx_cab", "smallfire", undefined, undefined, true, 1.01, true ); maps\_vehicle::build_deathfx( "fire/firelp_small_pm_a", "tag_engine_left", "smallfire", undefined, undefined, true, 1.01, true ); level.vehicle_deathmodel_delay[ level.vtmodel ] = 1; // spawn vehicles activate_trigger_with_targetname( "ride_initiate" ); // add ammo to current weapons for the ride. weaponlist = level.player GetWeaponsListPrimaries(); foreach( weapon in weaponlist ) { if ( IsSubStr( tolower( weapon ) , "rpg" ) ) continue; if ( level.player GetFractionMaxAmmo( weapon ) > 0.5 ) continue; level.player GiveStartAmmo( weapon ); } flag_wait( "uaz_mounted" ); set_custom_gameskill_func( ::boneyard_gameskill_ride_settings ); flag_wait( "blow_wing" ); autosave_by_name( "ride2" ); flag_wait( "c130_hatch_open" ); autosave_now(); // should always be safe flag_wait( "ride_driver_death" ); flag_set( "uaz_driver_dialogue" ); level thread ride_uaz_player_viewkick(); wait 2; level.player DisableOffhandWeapons(); wait 1; flag_set( "uaz_player_control" ); } suburban_ride_deathfx() { flag_wait( "ride_uaz_arriving" ); // change sound to scn_boneyard_sub_explode level.vttype = "suburban"; level.vtmodel = "vehicle_suburban"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 ); maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "scn_boneyard_sub_explode" ); flag_wait( "uaz_mounted" ); level.vttype = "suburban"; level.vtmodel = "vehicle_suburban"; typemodel = level.vttype + level.vtmodel; level.vehicle_death_fx[ typemodel ] = []; maps\_vehicle::build_deathfx( "fire/firelp_med_pm", "TAG_CAB_FIRE", "fire_metal_medium", undefined, undefined, true, 0 ); maps\_vehicle::build_deathfx( "explosions/small_vehicle_explosion", undefined, "car_explode" ); } ride_zfar() { flag_wait( "uaz_mounted" ); wait 0.5; //8 SetCullDist( 10000 ); wait 11; //20 SetCullDist( 13000 ); wait 7; //27 SetCullDist( 15500 ); wait 20; //47 SetCullDist( 20000 ); } ride_dialogue() { flag_wait( "ride_uaz_arriving" ); flag_waitopen( "makarov_dialogue" ); level thread ride_uaz_nag(); if ( !flag( "uaz_driver_mount" ) ) { // Captain Price, I'm taking off in one minute! You better hurry if you want a ride out of here! radio_dialogue( "byard_nkl_oneminute" ); // Soap! We don't have much time! Nikolai's not going to wait around for us! Hurry! radio_dialogue( "byard_pri_muchtime" ); } flag_wait( "uaz_driver_mount" ); if ( !flag( "uaz_mounted" ) ) { if ( flag( "uaz_nag" ) ) { // Soap! Get in the jeep! level.price dialogue_queue( "byard_pri_getinjeep" ); } else { // Soap! We are leaving!!! Get in the jeep! level.price dialogue_queue( "byard_pri_weareleaving" ); } } flag_wait( "uaz_driver_dialogue" ); sniper_origin = level.player.origin + (0,0,64); wait 0.8; flag_set( "uaz_driver_dead" ); wait 1; // Soap! Rook is down! Take the wheel!!! level.price dialogue_queue( "byard_pri_takewheel" ); level.price endon( "death" ); flag_wait( "uaz_player_in_control" ); wait 3; // Aim for the ramp!!! level.price dialogue_queue( "byard_pri_aimforramp" ); } ride_uaz_nag() { level.price endon( "death" ); level endon( "uaz_driver_mount" ); wait 20; // Soap! Get in the jeep! level.price dialogue_queue( "byard_pri_getinjeep" ); wait 30; // Soap! We are leaving!!! Get in the jeep! level.price dialogue_queue( "byard_pri_weareleaving" ); flag_set( "uaz_nag" ); } ride_uaz_player_viewkick() { wait 1.3; level.player ViewKick( 256, level.rook geteye() ); } ride_uaz_price() { level.price = self; self.name = "Captain Price"; self.animname = "price"; flag_wait( "uaz_player_in_control" ); self thread ride_uaz_fake_price_fire(); } ride_vehicle() { self thread vehicle_player_induced_death(); self thread vehicle_event_handler(); self VehPhys_DisableCrashing(); array_thread( self.riders, ::ride_rider ); // vehicles damage and death gets handles by level script. self maps\_vehicle::godon(); } ride_runway_suburban() { level.runway_suburban = self; self hidepart( "TAG_GLASS_RIGHT_BACK" ); self hidepart( "TAG_GLASS_LEFT_BACK" ); self hidepart( "TAG_GLASS_RIGHT_FRONT" ); } ride_rider() { // little less easy to kill when on harder difficulties. // if this is "bad" we need some way to reinforce the riders. // don't do minigun guys since they get their health raised elsewhere. difficulty = level.gameskill; if ( difficulty == 0 ) difficulty = 1; self.health *= difficulty; } ride_minigunner() { self endon( "death" ); level.ride_minigunner = self; self add_func( ::waittill_msg, "death" ); self add_func( ::flag_set, "ride_minigun_gunner_dead" ); self thread do_funcs(); wait 1; turret = self GetTurret(); assert( isdefined( turret ) ); turret SetAISpread( 4 ); flag_wait( "uaz_mount_end" ); while( true ) { self.ignoreall = false; wait 0.65; // wait randomfloatrange( 0.25, 0.75 ); self.ignoreall = true; wait 1.75; // wait randomfloatrange( 1.5, 2 ); } } ride_c130() { level.c130 = assemble_c130(); level endon( "uaz_park_crash" ); flag_wait( "uaz_mounted" ); // allow saves. flag_set( "can_save" ); autosave_by_name( "ride" ); spawner = getent( "ride_c130_spawner", "targetname" ); c130_ent = spawner spawn_vehicle(); c130_ent hide(); wait 1; c130_ent maps\_vehicle::lights_off( "running" ); level.c130 linkto( c130_ent, "tag_origin", (0,0,0), (0,0,0) ); flag_set( "obj_ride_c130" ); c130_ent thread maps\_vehicle::gopath(); flag_wait( "uaz_driver_dead" ); c130_ent thread add_player_tractor_beam(); // failsafe in case some other vehicle drivs into the trigger. while( true ) { level.c130.ramp_trigger waittill( "trigger", vehicle ); if ( vehicle == level.uaz ) break; } flag_set( "uaz_park" ); wait( 0.15 ); Earthquake( 0.35, 0.50, level.player.origin, 5000 ); level.player PlayRumbleOnEntity( "damage_heavy" ); SetBlur( 4, 0 ); wait( 0.15 ); setblur( 0, 0.4 ); } add_player_tractor_beam() { if ( !isdefined( level.uaz ) ) return; self endon( "death" ); level.uaz endon( "death" ); back_dist = -260; enter_dist = 1524; for ( ;; ) { forward = anglestoforward( self.angles ); org = self.origin + forward * back_dist; if ( distance( self.origin, level.uaz.origin ) < enter_dist ) break; wait( 0.05 ); } flag_set( "player_loses_control_of_uaz" ); level.control_loss_time = gettime(); } ride_c130_sound() { flag_wait( "c130_takeoff" ); left = getent( "sound_engine_left", "script_noteworthy" ); right = getent( "sound_engine_right", "script_noteworthy" ); center = getent( "sound_c130_center", "script_noteworthy" ); left PlayLoopSound( "veh_c130_left_engine_loop" ); right PlayLoopSound( "veh_c130_right_engine_loop" ); center PlayLoopSound( "veh_c130_main_loop" ); } ride_littlebird() { flag_wait( "obj_ride" ); if ( littlebird_alive() ) { level.heli notify( "reaction_end" ); level.heli notify( "stop_hunt" ); level.heli ClearLookAtEnt(); level.heli ClearTurretTarget(); path = getent( "littlebird_ride_start", "targetname" ); level.heli Vehicle_SetSpeed( 40, 25, 25 ); level.heli thread maps\_vehicle::vehicle_paths( path ); } flag_wait( "littlebird_stage1" ); if ( !littlebird_alive() ) { // if dead respawn path_ent = getent( "littlebird_ride_respawn", "targetname" ); heli_spawner = getent( "littlebird", "targetname" ); level.heli = heli_spawner move_spawn_and_go( path_ent ); } level.heli maps\_vehicle::godon(); repulsor = Missile_CreateRepulsorEnt( level.heli, 5000, 1000 ); path = getent( "littlebird_ride_stage1", "targetname" ); level.heli Vehicle_SetSpeed( 65, 25, 25 ); level.heli SetMaxPitchRoll( 25, 25 ); level.heli thread new_vehicle_path( path ); flag_wait( "blow_tanker_second" ); target_arr = getentarray( "tanker_rocket_target", "targetname" ); target_arr = array_index_by_script_index( target_arr ); level.heli thread fire_missile( target_arr, target_arr.size ); flag_wait( "blow_wing" ); target_arr = getentarray( "tanker_rocket_target_2", "targetname" ); target_arr = array_index_by_script_index( target_arr ); level.heli thread fire_missile( target_arr, target_arr.size ); } ride_track_health() { level endon( "ride_uaz_nodeath" ); self.damage_taken = 0; while ( true ) { self waittill( "damage", damage, attacker ); if ( !isdefined( level.ride_minigunner ) || attacker != level.ride_minigunner ) continue; self.damage_taken += damage; println( "DAMAGE: " + self.damage_taken ); if ( self.damage_taken > 37000 ) break; } self maps\_vehicle::godoff(); self maps\_vehicle::force_kill(); wait 1; level.player kill(); // missionfailedwrapper(); } ride_uaz() { flag_set( "ride_uaz_arriving" ); self thread ride_track_health(); level.uaz = self; self HidePart( "tag_blood" ); self thread uaz_control(); self thread ride_uaz_mount(); self thread ride_uaz_failed_mount(); self thread ride_uaz_player_crash(); self thread ride_uaz_takeoff_missed(); self VehPhys_DisableCrashing(); self.dontunloadonend = true; // hack to get AI to fire when the vehicle is stationary // needs to be fixed so that unload doesn't force people into idle. flag_wait( "wait_for_player" ); self Maps\_vehicle::vehicle_ai_event( "hide_attack_forward" ); flag_wait( "uaz_drive" ); self thread ride_bump(); flag_set( "littlebird_stage1" ); flag_wait( "uaz_mounted" ); wait 2; level thread lerp_fov_overtime( 5, 80 ); level thread maps\_utility::vision_set_fog_changes( "boneyard_ride", 5 ); flag_wait( "uaz_player_in_control" ); level thread maps\_utility::vision_set_fog_changes( "boneyard_steer", 2 ); self VehPhys_EnableCrashing(); } ride_uaz_failed_mount() { level endon( "uaz_mounted" ); flag_wait( "uaz_mount_end" ); setDvar( "ui_deadquote", &"BONEYARD_DEADQUOTE_MOUNT" ); missionfailedwrapper(); } ride_uaz_player_crash() { level endon( "uaz_park" ); level endon( "uaz_park_crash" ); flag_wait( "uaz_player_in_control" ); self thread ride_uaz_player_force_crash(); if ( isdefined( level.use_ent ) ) level.use_ent delete(); crash_limit = 15000; while( true ) { self waittill( "veh_jolt", vector ); force = abs( vector[0] ) + abs( vector[1] ) + abs( vector[2] ); if ( force > crash_limit ) break; } ride_uaz_player_launch(); self maps\_vehicle::godoff(); self maps\_vehicle::force_kill(); wait 1; level.player kill(); // missionfailedwrapper(); } ride_uaz_player_force_crash() { flag_wait( "uaz_force_crash" ); ride_uaz_player_launch(); self maps\_vehicle::godoff(); self maps\_vehicle::force_kill(); level.player kill(); } ride_uaz_takeoff_missed() { level endon( "uaz_park" ); level endon( "uaz_park_crash" ); flag_wait( "c130_takeoff_missed" ); setDvar( "ui_deadquote", &"BONEYARD_DEADQUOTE_TAKEOFF" ); missionfailedwrapper(); } ride_uaz_driver() { self endon( "death" ); level.rook = self; self.name = "Rook"; self disable_pain(); self magic_bullet_shield(); self.animname = "rook"; self thread ride_uaz_driver_attack(); flag_wait( "uaz_driver_mount" ); // stop any save at this point. flag_clear( "can_save" ); flag_wait( "ride_littlebird_dodge" ); level.uaz thread guy_runtovehicle_load( self, level.uaz ); self waittill( "boarding_vehicle" ); self gun_remove(); self stop_magic_bullet_shield(); flag_set_delayed( "ride_enemy_vehicles_spawn", 1 ); flag_wait( "uaz_driver_dead" ); self playsound( "scn_bone_headshot" ); playfxontag( getfx( "blood" ), self, "J_Head" ); playfxontag( getfx( "blood_dashboard_splatter" ), self, "J_Head" ); level.uaz ShowPart( "tag_blood" ); self thread ride_uaz_driver_death(); } ride_uaz_driver_death() { self notify( "newanim" ); self anim_stopanimscripted(); // remove rook from riders array so that he never starts a new idle anim. level.uaz.riders = array_remove( level.uaz.riders, self ); org = level.uaz GetTagOrigin( "tag_driver" ); angles = level.uaz GetTagAngles( "tag_driver" ); level.uaz thread anim_single_solo( self, "boneyard_driver_death", "tag_driver" ); animation = self getanim( "boneyard_driver_death" ); anim_time = GetAnimLength( animation ); wait ( anim_time - 0.15 ); self SetAnim( animation, 1, 0, 0 ); } ride_uaz_driver_attack() { flag_wait( "obj_ride" ); wait 1; self waittill( "jumpedout" ); flag_set( "ride_littlebird_dodge" ); if ( isdefined( level.btr80 ) && isalive( level.btr80 ) ) { etarget = spawn( "script_origin", level.btr80.origin + (0,0,128) ); etarget linkto( level.btr80 ); self SetEntityTarget( etarget, 1 ); attractor = Missile_CreateAttractorEnt( level.btr80, 20000, 512 ); if ( !flag( "uaz_driver_mount" ) ) self waittill( "missile_fire" ); self clearentitytarget(); } if ( littlebird_alive() ) { etarget = spawn( "script_origin", level.heli.origin + (0,0,-128) ); etarget linkto( level.heli ); self SetEntityTarget( etarget, 1 ); if ( !flag( "uaz_driver_mount" ) ) self waittill( "missile_fire" ); self clearentitytarget(); } self.a.rockets = 0; } ride_tanker_blow() { tanker = get_tanker( "tanker_first", true ); flag_wait( "blow_tanker_first" ); wait 0.4; rocket_source = getent( "blow_tanker_first_rocket", "targetname" ); rocket_target = getent( rocket_source.target, "targetname" ); rocket = MagicBullet( "rpg_straight", rocket_source.origin, rocket_target.origin ); damage_types = []; damage_types[ tolower( "MOD_PROJECTILE_SPLASH" ) ] = true; damage_types[ tolower( "MOD_PROJECTILE" ) ] = true; tanker waittill_damage( damage_types ); level.player EnableInvulnerability(); tanker thread destructible_force_explosion(); tanker waittill( "destroyed" ); level.player DisableInvulnerability(); tanker = get_tanker( "tanker_second", true ); tanker waittill_damage( damage_types ); tanker thread destructible_force_Explosion(); } get_tanker( tanker_name, disable_explosion ) { tanker_arr = getentarray( tanker_name, "script_noteworthy" ); tanker = undefined; foreach( tanker in tanker_arr ) { if ( tanker.classname == "script_model" ) break; } if ( isdefined( disable_explosion ) ) tanker destructible_disable_explosion(); return tanker; } start_ride_end() { ride_vehicle_spawners = getentarray( "ride_vehicle", "script_noteworthy" ); array_thread( ride_vehicle_spawners, ::add_spawn_function, ::ride_vehicle ); vnode = getvehiclenode( "ride_end_start", "script_noteworthy" ); spawner = getent( "ride_uaz", "script_noteworthy" ); level.uaz = spawner move_spawn_and_go( vnode ); vnode = getvehiclenode( "ride_end_pickup_start", "targetname" ); spawner = getent( "runway_pickup", "targetname" ); spawner move_spawn_and_go( vnode ); vnode = getvehiclenode( "ride_end_suburban_start", "script_noteworthy" ); spawner = getent( "runway_suburban", "targetname" ); spawner move_spawn_and_go( vnode ); flag_set( "uaz_mounted" ); lerp_fov_overtime( 0.1, 80 ); level.use_ent delete(); flag_wait( "uaz_driver_dead" ); }