//**************************************************************************** // ** // Confidential - (C) Activision Publishing, Inc. 2010 ** // ** //**************************************************************************** // ** // Module: MISSION DESCRIPTION ** // ** // Created: 7/15/2011 - Ken Moodie ** // ** //**************************************************************************** #include maps\_utility; #include maps\_utility_code; #include maps\_nx_objective_util; #include common_scripts\utility; #include maps\_anim; #include maps\_vehicle; #include maps\_nx_utility; #include maps\nx_skyscraper_util; //******************************************************************* // RAPPEL * // * //******************************************************************* rappel_start() { level._player maps\_nx_utility::move_player_to_start_point( "playerstart_rappel" ); thread maps\nx_skyscraper_fx::set_vision_and_fog("exterior_up_high", 0); // set appropriate vision and fog maps\nx_skyscraper_util::player_weapon_init( true ); thread maps\_utility::set_ambient( "amb_skyscraper_office_int" ); maps\nx_skyscraper_util::spawn_baker(); baker_teleport = GetEnt ("baker_rappel_teleport", "targetname"); level.baker ForceTeleport( baker_teleport.origin, baker_teleport.angles); Exploder( "fx_office_inferno" ); // Show cloud ring. thread fx_show_cloud_ring(); flag_set( "flag_vtol_floor_collapse_done" ); wait .1; level notify ("office_enemies_dead"); wait .1; // tagBR< HACK >: Uncomment these to teleport to just before the jump-out point //wait 1; //IPrintLnBold( "teleporting..." ); //level._player SetOrigin( ( -448, -877, 29576 ) ); } rappel_sequence() { level thread uav_reveal_sequence(); level thread retether_sequence(); level thread debris_control(); level thread falling_landing_pad(); level thread baker_rappel_control(); level thread rappel_fx(); //trigger = GetEnt ("rappel_hook_up_point", "targetname"); //trigger = GetEnt ("rappel_start", "targetname"); //trigger waittill ("trigger"); flag_wait("flag_rappel_jump_start"); thread autosave_now(); level thread decoy_heli(); level thread break_jump_glass(); Stop_Exploder( "fx_office_inferno" ); rappel_jumpout_start(); level thread boss_heli_sequence(); level thread washerbot_control(); level thread rappel_slide_slowmo(); level thread rappel_laser_start(); // radial blur - uncomment this line to turn it on. thread maps\nx_skyscraper_fx::player_rappel_blur(); level._player maps\_rappel::rappel_setup( "rappel_tether_pos_and_angles", 1500, 1.5 ); flag_wait ("flag_rappel_swing_done"); } baker_rappel_control() { guys = []; guys["ally_01"] = level.baker; node = getstruct("rappel_bakersign", "script_noteworthy"); flag_wait( "flag_baker_section_01" ); node anim_single(guys, "rappel_baker_section_01"); //flag_wait( "flag_bakersign" ); node anim_single(guys, "rappel_bakersign"); //flag_wait( "flag_baker_section_02" ); node anim_single(guys, "rappel_baker_section_02"); //flag_wait( "flag_bakerwindow" ); node anim_single(guys, "rappel_bakerwindow"); //flag_wait( "flag_baker_section_03" ); node anim_single(guys, "rappel_baker_section_03"); } retether_sequence() { flag_wait("flag_retether2"); retether_position = getstruct("retether_pos2", "targetname"); level._tether_pos = retether_position.origin; } uav_reveal_sequence() { // trigger_wait_targetname( "trigger_rappel_location" ); // spawn Baker and send him to the node by the pillar // rappel_hookup_baker = spawn_targetname( "rappel_hookup_baker", true); level.baker.goalradius = 8; baker_node = GetNode("node_baker_rappel_hookup", "targetname"); wait 0.25; level.baker SetGoalNode( baker_node ); //thread add_dialogue_line( "Baker", "Let's find a place to hook up for our descent.", "g" ); level.baker dialogue_queue( "sky_bak_rappel_findplacehookup" ); // glowing button objective stuff button = GetEnt( "brushmodel_rappel_hookup", "targetname" ); button_active = GetEnt( "brushmodel_rappel_hookup_active", "targetname" ); button_trigger = GetEnt( "trigger_rappel_button_use", "targetname" ); // Enable button objective //trigger_wait_targetname( "trigger_rappel_location" ); level.baker waittill("goal"); //thread add_dialogue_line( "Baker", "All right. Let's hook up here.", "g" ); level.baker dialogue_queue( "sky_bak_rappel_hookuphere" ); button_trigger trigger_on(); button hide(); button_active show(); //button_trigger sethintstring( &"NX_SKYSCRAPER_OBJ_HALON_BUTTON" ); button_trigger sethintstring( "Press X to hook up for rappel" ); button_trigger waittill( "trigger" ); button_trigger trigger_off(); button show(); button_active hide(); level notify ("rappel_hook_up_start"); // Baker play the hookup anim node = GetEnt( "node_baker_hookup_vignette", "script_noteworthy"); baker = level.baker; // baker.animname = "baker"; node anim_reach_solo (baker, "rappel_setup"); node thread anim_single_solo (baker, "rappel_setup" ); // Play the player hookup anim level._player FreezeControls( true ); level._player allowprone( false ); level._player allowcrouch( false ); level._player DisableWeapons( true ); player_rig = spawn_anim_model( "player_rig" ); arc = 15; level._player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1); player_node = GetEnt( "node_player_hookup_vignette", "script_noteworthy" ); player_node anim_single_solo( player_rig, "hookup" ); // reveal the uav wait 1.0; /* level._player.ignoreme = true; level.heli1 = spawn_vehicle_from_targetname_and_drive( "reveal_uav" ); level.heli1 Vehicle_SetSpeed( 15 ); level.heli1 godon(); level.heli1 SetLookAtEnt( level._player ); wait 1.0; thread add_dialogue_line( "Baker", "Shit! UAV! Let's move!", "g" ); wait 3.75; */ thread maps\_utility::set_ambient( "amb_skyscraper_windy_ext" ); flag_set("flag_rappel_jump_start"); } break_jump_glass() { wait 1.5; //glass_triggers = GetEntArray( "jump_glass", "script_noteworthy"); glass_triggers = GetGlassArray( "jump_glass" ); foreach( glass_trigger in glass_triggers ) { DestroyGlass( glass_trigger, (0, 1, 0) ); wait 0.1; //DestroyGlass( glass_trigger ); } } rappel_fx() { PlayFx( level._effect[ "cloud_bank_gulag" ], (-256, -2432, 29440 )); wait 0.25; PlayFx( level._effect[ "cloud_bank_gulag" ], (384, -2560, 28800 )); wait 0.25; PlayFx( level._effect[ "cloud_bank_gulag" ], (-384, -2400, 27840 )); wait 0.25; PlayFx( level._effect[ "cloud_bank_gulag" ], (-48, -2464, 22320 )); } rappel_jumpout_start() { level thread rappel_fov(); //node = getstruct("rappel_jump", "script_noteworthy"); node = getstruct("rappel_jump_new", "script_noteworthy"); // rappel_jump_baker = spawn_targetname( "rappel_jump_baker", true); // rappel_jump_baker.animname = "rappel_jump_baker"; level._player FreezeControls( true ); level._player allowprone( false ); level._player allowcrouch( false ); player_rig = spawn_anim_model( "player_rig" ); guys = []; guys["player_rig"] = player_rig; guys["ally_01"] = level.baker; arc = 5; level._player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1); node anim_single(guys, "rappel_jump"); level._player unlink(); player_rig delete(); level._player FreezeControls( false ); level._player allowprone( true ); level._player allowcrouch( true ); } rappel_fov() { wait 3.5; lerp_fov_overtime( 1, 70 ); } decoy_heli() { level._player.ignoreme = true; heli = spawn_vehicle_from_targetname_and_drive( "decoy_heli" ); heli Vehicle_SetSpeed( 20 ); heli SetLookAtEnt( level._player ); end_heli = spawn_vehicle_from_targetname("end_heli"); } boss_heli_sequence() { //thread physobj_volume_control(); level._player.ignoreme = true; fire_offset = 100; // heli rocket firing sequence flag_wait( "flag_spawn_heli1" ); level.heli1 = spawn_vehicle_from_targetname_and_drive( "placement_heli1" ); level.heli1 Vehicle_SetSpeed( 50 ); level.heli1 godon(); level.heli1 SetLookAtEnt( level._player ); // wait 0.15; heli_target01 = GetEnt("heli_target01", "targetname"); thread heli_target_missile( level.heli1, heli_target01, 0.7, 0 ); wait 0.5; heli_target02 = GetEnt("heli_target02", "targetname"); thread heli_target_missile( level.heli1, heli_target02, 0.7, 0 ); wait 0.5; heli_target03 = GetEnt("heli_target03", "targetname"); thread heli_target_missile_with_fire( level.heli1, heli_target03, 0.8, 0 ); //flag_wait("flag_rappel_incline_end"); wait 0.8; PhysicsExplosionSphere( heli_target03.origin , 2000, 1999, 1 ); wait 0.8; heli_target04 = GetEnt("heli_target04", "targetname"); thread heli_target_missile( level.heli1, heli_target04, 1.25, -100 ); wait 0.20; heli_target05 = GetEnt("heli_target05", "targetname"); heli_target05_debris = GetEnt( "heli_target05_debris", "script_noteworthy" ); thread heli_target_missile_with_fire( level.heli1, heli_target05, 1.25, -100, heli_target05_debris ); wait 0.20; incline_target = GetEnt("incline_target01", "targetname"); incline_target_debris = GetEnt( "incline_target01_debris", "script_noteworthy" ); thread heli_target_missile_with_fire( level.heli1, incline_target, 1.75, -100, incline_target_debris ); wait 0.75; //physics explosions for desks hit by the above rockets. explosion_target = GetEnt("heli_target04", "targetname"); PhysicsExplosionSphere( explosion_target.origin + (0, 60, 0), 2000, 1999, 1 ); wait 0.2; explosion_target = GetEnt("heli_target05", "targetname"); PhysicsExplosionSphere( explosion_target.origin + (0, 60, 0), 2000, 1999, 1 ); // spawn the next helicopter flag_wait( "flag_spawn_heli2" ); level.heli1 kill(); level.heli2 = spawn_vehicle_from_targetname_and_drive( "placement_heli2" ); level.heli2 Vehicle_SetSpeed( 10 ); level.heli2 godon(); level.heli2 SetLookAtEnt( level._player ); wait 0.25; target = GetEnt("heli_target10", "targetname"); MagicBullet( "rpgx_straight", level.heli2.origin+ (0, fire_offset, 0), target.origin); target = GetEnt("heli_target07", "targetname"); MagicBullet( "rpgx_straight", level.heli2.origin+ (0, fire_offset, 0), target.origin); //wait 0.75; // physic push letters explosion_base = GetEnt("explosion_base02", "targetname"); PhysicsExplosionSphere( explosion_base.origin, 2000, 1999, 1 ); PlayFX( level._effect["nx_explosion_skybridge"], explosion_base.origin ); wait 0.5; PlayFX( level._effect["nx_explosion_skybridge"], explosion_base.origin + (0, 0, -400)); wait 0.5; PlayFX( level._effect["nx_explosion_skybridge"], explosion_base.origin + (0, 0, -800)); // //wait 0.05; ledge_target01 = GetEnt( "ledge_target01", "targetname" ); ledge_target01_debris = GetEnt( "ledge_target01_debris", "script_noteworthy" ); thread heli_target_missile_with_fire( level.heli2, ledge_target01, 1.0, -100, ledge_target01_debris ); wait 0.1; ledge_target02 = GetEnt( "ledge_target02", "targetname" ); thread heli_target_missile_with_fire( level.heli2, ledge_target02, 1.25, -100 ); // physics push the building supports wait 0.85; explosion_base = GetEnt("support_target1", "targetname"); PhysicsExplosionSphere( explosion_base.origin, 200, 199, 1 ); wait 0.1; explosion_base = GetEnt("support_target2", "targetname"); PhysicsExplosionSphere( explosion_base.origin, 200, 199, 1 ); // // Spawn the next 2 helicopters flag_wait( "flag_spawn_heli3" ); thread spawn_and_kill_wreckage_chopper(); level.heli2 kill(); level.heli3 = spawn_vehicle_from_targetname_and_drive( "placement_heli3" ); level.heli3 Vehicle_SetSpeed( 50 ); level.heli3 godon(); level.heli3 SetLookAtEnt( level._player ); level.heli4 = spawn_vehicle_from_targetname_and_drive( "placement_heli4" ); level.heli4 Vehicle_SetSpeed( 5 ); level.heli4 godon(); level.heli4 SetLookAtEnt( level._player ); // wait 0.1; target = GetEnt("mid_target01", "targetname"); target_debris = GetEnt( "mid_target01_debris", "script_noteworthy" ); //MagicBullet( "rpgx_straight", level.heli3.origin+ (0, fire_offset, 0), target.origin); thread heli_target_missile_with_fire( level.heli3, target, 1.25, -100, target_debris ); wait 0.7; target = GetEnt("cleanerbot_target01", "targetname"); MagicBullet( "rpgx_straight", level.heli3.origin+ (0, fire_offset, 0), target.origin); wait 1.2; PlayFX( level._effect["nx_explosion_skybridge"], target.origin ); PhysicsExplosionSphere( target.origin, 20, 19, 0.5 ); //physics push the statue //wait 0.95; wait 0.20; // wait 0.5; target = GetEnt("statue_explo02", "targetname"); MagicBullet( "rpgx_straight", level.heli3.origin+ (0, fire_offset, 0), target.origin); //wait 1.25; wait 0.65; PhysicsExplosionSphere( target.origin, 20, 19, 0.5 ); PlayFX( level._effect["nx_explosion_skybridge"], target.origin ); // Shoot at the player for a while //wait 0.1; //MagicBullet( "rpgx_straight", level.heli3.origin + (0, fire_offset, 0), level._player.origin + (0, 0, -1050)); // shoot and make a damaging fire for the player to dodge facade_target = GetEnt("facade_target01", "targetname"); facade_target_debris = GetEnt( "facade_target01_debris", "script_noteworthy" ); thread heli_target_missile_with_fire( level.heli3, facade_target, 1.2, -100, facade_target_debris ); //physics push the 2nd statue /* wait 0.5; target = GetEnt("statue_explo03", "targetname"); MagicBullet( "rpgx_straight", level.heli4.origin+ (0, fire_offset, 0), target.origin); wait 1.25; PlayFX( level._effect["explosion_type_1"], target.origin ); PhysicsExplosionSphere( target.origin, 20, 19, 0.5 ); */ flag_wait( "flag_rappel_big_explosion" ); // fire missiles for the big explosion targets = GetEntArray( "big_explo_target", "script_noteworthy" ); foreach ( target in targets ) { MagicBullet( "rpgx_straight", level.heli4.origin + (0, fire_offset, 0), target.origin); wait 0.25; } // Kick the objects items = GetEntArray("origin_floorexplode5", "targetname"); foreach( item in items ) { playFX( level._effect[ "nx_explosion_skybridge" ], item.origin ); //playFX( level._effect[ "firelp_large_pm_bh1" ], item.origin + (0, -175, 0)); playFX( level._effect[ "nx_smoke_n_fire_plume_preseed" ], item.origin + (0, -175, 0)); PhysicsExplosionSphere( item.origin, 256, 256, 2 ); } // Delete the building pieces pieces = GetEntArray( "building_pieces", "targetname" ); foreach( piece in pieces ) { piece Delete(); } // level thread rappel_slowmo(); // after the slomo sequence blow up the chopper //damage_target = GetEnt( "chopper_kill_spot", "targetname" ); //radiusdamage( damage_target.origin, 500, 5000, 5000 ); level.heli4 kill(); // Spawn the final heli flag_wait( "flag_spawn_heli5" ); level.heli5 = spawn_vehicle_from_targetname_and_drive( "placement_heli5" ); level.heli5 Vehicle_SetSpeed( 30 ); level.heli5 godon(); level.heli5 SetLookAtEnt( level._player ); wait 0.1; // Shoot at the bridge and kick it explosion_base = GetEnt("bridge_explo_base01", "targetname"); explosion_base2 = GetEnt("bridge_explo_base02", "targetname"); explosion_base0 = GetEnt( "bridge_explo_base00", "targetname" ); //MagicBullet( "rpgx_straight", level.heli5.origin + (0, fire_offset, 0), explosion_base.origin); thread heli_target_missile_with_fire( level.heli5, explosion_base0, 1.25, -100 ); wait 1.0; PhysicsExplosionSphere( explosion_base.origin, 2000, 1999, 1 ); PhysicsExplosionSphere( explosion_base2.origin, 2000, 1999, 1 ); PlayFX( level._effect["nx_explosion_skybridge"], explosion_base.origin ); wait 0.25; PlayFX( level._effect["nx_explosion_skybridge"], explosion_base2.origin ); // Shoot at the player some more for (i=0; i < 2; i++) { wait 1.5; side_offset = RandomIntRange(-50, 50); MagicBullet( "rpgx_straight", level.heli5.origin + (0, fire_offset, 0), level._player.origin + (side_offset, 0, -1200)); } // rapid fire rockets to get the player to swing end_target = GetEnt("end_target01", "targetname"); thread heli_target_missile_with_fire( level.heli5, end_target, 1.0, -100 ); wait 0.75; MagicBullet( "rpgx_straight", level.heli5.origin+ (0, fire_offset, 0), (64, -2608, 4176)); wait 0.75; MagicBullet( "rpgx_straight", level.heli5.origin+ (0, fire_offset, 0), (-128, -2624, 4064)); wait 0.75; //MagicBullet( "rpgx_straight", level.heli5.origin+ (0, fire_offset, 0), (-288, -2608, 3936)); //wait 0.75; MagicBullet( "rpgx_straight", level.heli5.origin+ (0, fire_offset, 0), (-480, -2592, 3824)); wait 0.75; } heli_target_missile(heli, target, delay, fire_offset2 ) { fire_offset = 150; MagicBullet( "rpgx_straight", heli.origin + (0, fire_offset, fire_offset2), target.origin); wait( delay ); //PlayFX( level._effect["explosion_type_1"], target.origin ); PlayFX( level._effect["nx_explosion_skybridge"], target.origin ); } heli_target_missile_with_fire(heli, target, delay, fire_offset2, debris) { fire_offset = 150; MagicBullet( "rpgx_straight", heli.origin + (0, fire_offset, fire_offset2), target.origin); wait( delay ); //PlayFX( level._effect["explosion_type_1"], target.origin ); PlayFX( level._effect["nx_explosion_skybridge"], target.origin ); wait 0.2; PlayFX( level._effect["nx_smoke_n_fire_plume_preseed"], target.origin ); if( IsDefined( debris )) { debris show(); } } spawn_and_kill_wreckage_chopper() { wreckage_chopper = spawn_vehicle_from_targetname_and_drive( "wreckage_chopper" ); wreckage_chopper Vehicle_SetSpeed( 5 ); wreckage_chopper godon(); wreckage_chopper SetLookAtEnt( level._player ); wait 0.1; wreckage_chopper kill(); } // Dan - Dyn_model entities do not live server side, so this is not going to work. Commenting out so no one copies it. //physobj_volume_control() //{ // volume = GetEnt( "physobj_kill_volume", "targetname" ); // while(1) // { // physobs = GetEntArray( "dyn_model", "classname"); // foreach( physob in physobs ) // { // if( physob IsTouching( volume )) // physob Delete(); // } // wait 1.0; // } //} rappel_slowmo() { // Don't slomo sounds SoundSetTimeScaleFactor( "Mission", 0 ); SoundSetTimeScaleFactor( "Shellshock", 0 ); SoundSetTimeScaleFactor( "Voice", 0 ); SoundSetTimeScaleFactor( "Menu", 0 ); SoundSetTimeScaleFactor( "Effects1", 0 ); SoundSetTimeScaleFactor( "Effects2", 0 ); SoundSetTimeScaleFactor( "Announcer", 0 ); SoundSetTimeScaleFactor( "Music", 0 ); SoundSetTimeScaleFactor( "vignette3d", 0 ); SoundSetTimeScaleFactor( "vignette2d", 0 ); SoundSetTimeScaleFactor( "ambient", 0 ); SoundSetTimeScaleFactor( "weapon", 0 ); SoundSetTimeScaleFactor( "weapon2d", 0 ); SoundSetTimeScaleFactor( "auto2d", 0 ); SoundSetTimeScaleFactor( "auto", 0 ); SoundSetTimeScaleFactor( "element", 0 ); // Start slo motion slowmo_speed = 0.20; slowmo_setspeed_slow( slowmo_speed ); slowmo_setlerptime_in( 2.0 ); slowmo_lerp_in(); level._player SetMoveSpeedScale( 0.1 ); // Wait slo mo duration real_time = 2.0; wait real_time; // Stop slo motion slowmo_setlerptime_out( 0.65 ); slowmo_lerp_out(); slowmo_end(); level notify( "notify_slomo_end" ); } rappel_slide_slowmo() { flag_wait("flag_swing_slide"); wait 8.0; // Don't slomo sounds SoundSetTimeScaleFactor( "Mission", 0 ); SoundSetTimeScaleFactor( "Shellshock", 0 ); SoundSetTimeScaleFactor( "Voice", 0 ); SoundSetTimeScaleFactor( "Menu", 0 ); SoundSetTimeScaleFactor( "Effects1", 0 ); SoundSetTimeScaleFactor( "Effects2", 0 ); SoundSetTimeScaleFactor( "Announcer", 0 ); SoundSetTimeScaleFactor( "Music", 0 ); SoundSetTimeScaleFactor( "vignette3d", 0 ); SoundSetTimeScaleFactor( "vignette2d", 0 ); SoundSetTimeScaleFactor( "ambient", 0 ); SoundSetTimeScaleFactor( "weapon", 0 ); SoundSetTimeScaleFactor( "weapon2d", 0 ); SoundSetTimeScaleFactor( "auto2d", 0 ); SoundSetTimeScaleFactor( "auto", 0 ); SoundSetTimeScaleFactor( "element", 0 ); // Start slo motion slowmo_speed = 0.20; slowmo_setspeed_slow( slowmo_speed ); slowmo_setlerptime_in( 2.0 ); slowmo_lerp_in(); level._player SetMoveSpeedScale( 0.1 ); // Wait slo mo duration real_time = 4.0; wait real_time; // Stop slo motion slowmo_setlerptime_out( 0.65 ); slowmo_lerp_out(); slowmo_end(); } washerbot_control() { washerbot = GetEnt( "washerbot_mover", "targetname" ); botlight = GetEnt( "washerbot_light", "targetname" ); botlight.origin = ( botlight.origin[0] + 12, botlight.origin[1] + 6, botlight.origin[2] + 6); botlight linkto( washerbot ); washerbot thread washerbot_move( 500, 0, 5 ); wait 5.0; washerbot2 = GetEnt( "washerbot_mover2", "targetname" ); botlight2 = GetEnt( "washerbot_light2", "targetname" ); botlight2.origin = ( botlight2.origin[0] + 12, botlight2.origin[1] + 6, botlight2.origin[2] + 6); botlight2 linkto( washerbot2 ); washerbot2 thread washerbot_move( 0, -5000, 50 ); } washerbot_move(horiz, vert, time ) { //time = 5; while(1) { self MoveTo( self.origin + (horiz, 0, vert), time, 1, 1); wait time; self MoveTo( self.origin - (horiz, 0, vert), time, 1, 1); wait time; } } debris_control() { pieces = GetEntArray( "debris_models", "targetname" ); foreach( piece in pieces) { piece hide(); } } falling_landing_pad() { //explo_base = GetEnt( "landing_pad_explo_base", "targetname" ); landingpad = GetEnt( "falling_landing_pad", "targetname" ); landingpad hide(); chopper_wreckage = GetEnt( "chopper_wreckage", "targetname" ); chopper_wreckage hide(); pieces = GetEntArray( "falling_wreckage", "targetname" ); foreach( piece in pieces) { piece hide(); } flag_wait( "flag_rappel_big_explosion" ); //wait 2.0; // add a huge wait to comment out the landing pad fall // wait 200; landingpad show(); chopper_wreckage show(); //PhysicsExplosionSphere( explo_base.origin, 2000, 1999, 1); landingpad MoveTo( landingpad.origin - ( 0, 0, 20000), 4.5, 0.5, 0.5); landingpad rotateRoll( 10000, 30, 5, 5); chopper_wreckage MoveTo( chopper_wreckage.origin - ( 0, 0, 20000), 5.0, 0.5, 0.5); chopper_wreckage rotateRoll( 10000, 40, 5, 5); foreach( piece in pieces) { piece show(); piece MoveTo( piece.origin - ( 0, 0, 20000), 5.5, 0.5, 0.5); piece rotateRoll( 40000, 40, 5, 5); } // wait and then play the fire FX when the heli hits it wait 1.35; target = GetEnt( "wreckage_fx", "targetname" ); PlayFX( level._effect["nx_explosion_skybridge"], target.origin ); wait 0.25; PlayFX( level._effect["nx_smoke_n_fire_plume_preseed"], target.origin ); } //******************************************************************* // Laser targeted Laser! * // * //******************************************************************* rappel_laser_start() { // Prepare for sat view pip thread maps\nx_skyscraper_util::play_pip_bink( "skyscraper_view_pip2", undefined, "play_orbital_pip_2" ); flag_wait("flag_swing_slide"); // Play sat view pip flag_set ("play_orbital_pip_2"); wait 9; SetSavedDvar( "compass", 1 ); SetSavedDvar( "ammoCounterHide", 0 ); SetSavedDvar( "actionSlotsHide", 0 ); SetSavedDvar( "hud_showStance", 1 ); SetSavedDvar( "hud_drawhud", 1 ); //level waittill( "notify_start_laser" ); level._player FreezeControls( false ); level._player EnableWeapons(); // When the player presses the fire button, send this notify level._player notifyOnPlayerCommand( "fired_laser", "+attack" ); //thread check_for_laser_targeting_device(); thread force_laser_targeting_device(); thread laser_targeting_device_logic(); thread satellite_orbit(); level waittill( "laser_off" ); //level._player LaserForceOff(); //level._player notify ("laser_off"); level._player FreezeControls( true ); level._player DisableWeapons(); } force_laser_targeting_device() { // Give the player the "laser designator" level._player GiveWeapon( "m9" ); level.player_weapon = level._player GetCurrentWeapon(); // Force the player to use the designator level._player SwitchToWeapon( "m9" ); level._player DisableWeaponSwitch(); level._player DisableOffhandWeapons(); //level.lab_vtol godoff(); //level.lab_vtol waittill ("death"); // Back to the regular weapons //level._player EnableOffhandWeapons(); //level._player EnableWeaponSwitch(); //level._player SwitchToWeapon( "lancer_xray" ); //level._player allowFire( true ); } laser_targeting_device_logic() { level endon ("floor_collapsed"); level._player allowFire( false ); while ( 1 ) { level._player waittill ( "fired_laser"); thread laser_code_pattern(); thread lock_on_meter(); level._player laser_designate_target(); //level._player LaserForceOn(); // level notify ("laser_off"); level._player LaserForceOff(); } } laser_code_pattern() { delay = 0.05; level endon ("laser_off"); level endon ("floor_collapsed"); while ( 1 ) { level._player LaserForceOn(); wait (delay + RandomFloat (0.2)); level._player LaserForceOff(); wait delay; } } laser_designate_target() { lock_on_complete = 0.25; lock_on_timer = 0; level endon( "laser_off" ); level endon ( "floor_collapsed" ); trace = self get_laser_designated_trace(); prior_entity = trace[ "entity" ]; // While the player is holding the trigger while( level._player AttackButtonPressed() ) { // Trace to the thing they're pointing at trace = self get_laser_designated_trace(); position = trace[ "position" ]; entity = trace[ "entity" ]; // If an entity was hit, and an entity was hit last time a check was done if ( isdefined ( prior_entity ) && isdefined ( entity ) ) { // and the target is a vehicle if ( entity.code_classname == "script_vehicle") { // and the currently targeted entity is the same one as the previously targeted one if ( prior_entity == entity ) { // set the currently targeted entity as the entity to check against next time prior_entity = entity; level notify ( "lock_on_start" ); // increment the lock-on timer lock_on_timer = (lock_on_timer + .05); // If the timer has exceeded the required amount before a lock is complete if ( lock_on_timer >= lock_on_complete) { iprintlnbold( "LASER COORDINATES RECEIVED" ); thread draw_orbital_laser( entity ); level notify( "laser_coordinates_received" ); break; } // iprintln ("lock-on: " + lock_on_timer); } // Had a target, but lost it. else { // iprintln ("lock-on dropped"); level notify ("lock_on_dropped"); // reset the timer lock_on_timer = 0; } } // Wait a bit and run another check wait .05; } // Have no target at all else { // iprintln ("no target"); level notify ("lock_on_dropped"); // reset the timer lock_on_timer = 0; wait .05; // Check for a new target to check against next time a check is done trace = self get_laser_designated_trace(); prior_entity = trace[ "entity" ]; } } // The player stopped holding the trigger level notify( "laser_off" ); } lock_on_meter() { // Begin when a lock is acquired level waittill ( "lock_on_start" ); lock_on_complete = 0.25; // Create and display the frame for the meter lock_on_frame = NewHudElem( ); lock_on_frame.alignX = "center"; lock_on_frame.alignY = "bottom"; lock_on_frame.horzAlign = "center"; lock_on_frame.vertAlign = "bottom"; lock_on_frame.x = 25; lock_on_frame.y = -120; lock_on_frame setShader( "hud_temperature_gauge", 35, 150 ); lock_on_frame.sort = 4; // Create and display the frame for the fill lock_on_fill = NewHudElem( ); lock_on_fill.alignX = "center"; lock_on_fill.alignY = "bottom"; lock_on_fill.horzAlign = "center"; lock_on_fill.vertAlign = "bottom"; lock_on_fill.x = 25; lock_on_fill.y = -152; lock_on_fill setShader( "white", 10, 1 ); lock_on_fill.color = ( 1, .9, 0 ); lock_on_fill.alpha = 1; lock_on_fill.sort = 1; // Scale the fill element over the lock_on_fill scaleOverTime( lock_on_complete , 10, 120 ); // If the lock is lost, dropped, or complete, get rid of the hud elements level waittill_any ("laser_coordinates_received", "laser_off"); lock_on_frame destroy(); lock_on_fill destroy(); thread lock_on_meter(); } get_laser_designated_trace() { eye = self geteye(); angles = self getplayerangles(); forward = anglestoforward( angles ); end = eye + vector_multiply( forward, 3000 ); trace = bullettrace( eye, end, true, self ); if ( trace ["fraction"] >= 1 ) { trace[ "position" ] = undefined; } entity = trace[ "entity" ]; if ( isdefined( entity ) ) { if ( isdefined( entity.targetname ) && entity.targetname == "fake_uav") { entity = GetEnt ("real_uav", "targetname"); } trace[ "position" ] = entity.origin; } return trace; } draw_orbital_laser( target ) { level waittill ( "laser_coordinates_received" ); wait 1; satellite = GetEnt ("fake_satellite", "targetname"); time = 3; //trace = level._player get_laser_designated_trace(); //if ( isdefined( trace[ "position" ]) ) //{ //target = trace[ "position" ]; // normal = trace[ "normal" ]; xoffset = Randomfloat ( 1 ); yoffset = Randomfloat ( 1 ); direction = (satellite.origin - target.origin); normalized_direction = VectorNormalize( direction ); // thread draw_line_for_time( satellite.origin, (target + (xoffset,yoffset,0 )) , 1, 0, 0, 0.05 ); // time -= 0.05; //PlayFX ( level._effect[ "orbital_laser" ], (target.origin + (xoffset,yoffset, 0)), normalized_direction ); PlayFX ( level._effect[ "nx_laser_orbital_strike" ], (target.origin + (xoffset,yoffset, 0)), normalized_direction ); // PlayFX( level._effect[ "laser_impact" ], (target + (xoffset,yoffset, 0)), normal ); RadiusDamage( target.origin, 100, 1000, 1000, level._player ); //} } satellite_orbit() { level endon ("floor_collapsed"); satellite = GetEnt ("fake_satellite", "targetname"); starting_point = satellite.origin; while ( 1 ) { satellite MoveTo ( satellite.origin + (6000, 24064,0), 24); satellite waittill ("movedone"); satellite.origin = starting_point; } } /* Unused? //******************************************************************* // LOBBY CRASH * // * //******************************************************************* lobby_crash_start() { level._player maps\_nx_utility::move_player_to_start_point( "playerstart_lobby_crash" ); thread maps\_utility::set_ambient( "amb_skyscraper_windy_ext" ); thread maps\nx_skyscraper_fx::set_vision_and_fog("exterior_ground_level", 0); // set appropriate vision and fog lobby_crash_sequence(); } lobby_crash() { } lobby_crash_sequence() { //thread maps\_utility::set_ambient( "amb_skyscraper_lobby_int" ); } */