mirror of
https://github.com/reaaLx/nx1-gsc-dump.git
synced 2025-04-23 17:45:47 +00:00
2014 lines
64 KiB
Plaintext
2014 lines
64 KiB
Plaintext
//****************************************************************************
|
|
// **
|
|
// Confidential - (C) Activision Publishing, Inc. 2010 **
|
|
// **
|
|
//****************************************************************************
|
|
// **
|
|
// Module: nx_hithard_parachutee.gsc **
|
|
// NOTE: called from nx_hithard.gsc **
|
|
// **
|
|
// Created: 1/13/2011 - Brian Marvin **
|
|
// **
|
|
//****************************************************************************
|
|
|
|
#include maps\_utility;
|
|
#include common_scripts\utility;
|
|
#include maps\_anim;
|
|
#include maps\_vehicle;
|
|
#include maps\_nx_objective_util;
|
|
#include maps\_hud_util;
|
|
|
|
CONST_MPHCONVERSION = 17.6;
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Objective-specific PreCache calls
|
|
// NOTE: for any assets other than strings that require precaching, please place them in "nx_hithard::mission_precache()"
|
|
precache_strings()
|
|
{
|
|
|
|
}
|
|
|
|
// Objective specific flag_init() calls
|
|
flag_inits()
|
|
{
|
|
// "Parachute"
|
|
flag_init( "flag_vnode_parasecure_parachute_player_start" );
|
|
flag_init( "flag_parasecure_parachute_landed_player" );
|
|
flag_init( "flag_parasecure_parachute_oob" );
|
|
flag_init( "flag_hint_parachute_falling_behind" );
|
|
flag_init( "flag_node_hint_right" );
|
|
flag_init( "flag_node_hint_avoid_smoke" );
|
|
flag_init( "flag_node_hint_left" );
|
|
flag_init( "flag_parasecure_library_enemies_spawn" );
|
|
flag_init( "flag_origin_anim_parachute_land_ally_01" );
|
|
flag_init( "flag_origin_anim_parachute_land_ally_02" );
|
|
flag_init( "flag_parachute_landed_ally_01" );
|
|
flag_init( "flag_parachute_landed_ally_02" );
|
|
flag_init( "flag_parachute_hurt_smoke" );
|
|
flag_init( "flag_parachute_objective_failed" );
|
|
flag_init( "flag_building2_slow_fall" );
|
|
flag_init( "flag_creating_enemy_UGVs" );
|
|
|
|
// Parachute buffeting / explosion (building 3)
|
|
flag_init( "flag_parachute_building3_explosion_left" );
|
|
flag_init( "flag_parachute_building3_explosion_right" );
|
|
|
|
// Allow rubber banding checks
|
|
flag_init( "flag_parachute_player_rb_fail_allow" );
|
|
|
|
// LZ display Control
|
|
flag_init( "flag_turn_on_lz" );
|
|
|
|
// Skybridge
|
|
flag_init( "flag_skybridge_exp_1" );
|
|
flag_init( "flag_skybridge_exp_2" );
|
|
|
|
// Enemy VTOL plane for rooftop section
|
|
flag_init( "flag_vtol_flyin_go" );
|
|
|
|
thread audionodesparachute();
|
|
}
|
|
|
|
audionodesparachute()
|
|
{
|
|
|
|
|
|
siren4 = spawn( "sound_emitter", ( 11966, -10786, -76 ) );
|
|
siren3 = spawn( "sound_emitter", ( 6677, -17073, -76 ) );
|
|
siren2 = spawn( "sound_emitter", ( 17000, -19036, 113 ) );
|
|
siren2 PlaySound( "hithard_moving_siren2" ); //play sound on ent
|
|
siren3 PlayloopSound( "hithard_moving_siren3" ); //play sound on ent
|
|
siren4 PlayloopSound( "hithard_moving_siren4" ); //play sound on ent
|
|
siren2 moveto( ( 16982, -10960, 113 ), 3.0, .5, .5 );
|
|
streetfight = spawn( "sound_emitter", ( 6764, -14800, -34 ) );
|
|
streetfight PlayloopSound( "hithard_street_battle" ); //play sound on ent
|
|
wait 5;
|
|
bomber = spawn( "sound_emitter", ( 17010, -19066, 66 ) ); //spawn ent
|
|
bomber PlaySound( "hithard_moving_siren" ); //play sound on ent
|
|
wait 15;
|
|
siren2 stopsounds();
|
|
bomber stopsounds();
|
|
wait 0.1;
|
|
siren2 delete();
|
|
bomber delete();
|
|
wait 15;
|
|
streetfight stopsounds();
|
|
siren4 stopsounds();
|
|
siren3 stopsounds();
|
|
wait 0.1;
|
|
streetfight delete();
|
|
siren3 delete();
|
|
siren4 delete();
|
|
|
|
}
|
|
|
|
// Objective specific add_hint_string() calls
|
|
hint_string_inits()
|
|
{
|
|
// Parachute hints
|
|
add_hint_string( "hint_parachute_smoke", &"NX_HITHARD_PARACHUTE_HINT_SMOKE", ::hint_parachute_smoke );
|
|
if( level._ps3 || level._xenon )
|
|
{
|
|
add_hint_string( "hint_parachute_left", &"NX_HITHARD_PARACHUTE_HINT_TURN_LEFT", ::hint_will_timeout );
|
|
add_hint_string( "hint_parachute_flare", &"NX_HITHARD_PARACHUTE_HINT_FLARE", ::hint_will_timeout );
|
|
}
|
|
else
|
|
{
|
|
add_hint_string( "hint_parachute_left", &"NX_HITHARD_PARACHUTE_HINT_TURN_LEFT_PC", ::hint_will_timeout );
|
|
add_hint_string( "hint_parachute_flare", &"NX_HITHARD_PARACHUTE_HINT_FLARE_PC", ::hint_will_timeout );
|
|
}
|
|
add_hint_string( "hint_parachute_right", &"NX_HITHARD_PARACHUTE_HINT_TURN_RIGHT", ::hint_will_timeout );
|
|
add_hint_string( "hint_parachute_falling_behind", &"NX_HITHARD_PARACHUTE_HINT_FALLING_BEHIND", ::hint_parachute_falling_behind );
|
|
}
|
|
|
|
hint_will_timeout()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// HINT FUNCTIONS *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// PARACHUTE: Turn left instruction --> LT
|
|
hint_parachute_smoke()
|
|
{
|
|
return !flag( "flag_parachute_hurt_smoke" );
|
|
}
|
|
|
|
// PARACHUTE: Turn left instruction --> LT
|
|
hint_parachute_left()
|
|
{
|
|
return flag( "_chute.gsc_flag_LT_pressed" ) || flag( "_chute.gsc_flag_RT_pressed") || flag( "flag_parachute_objective_failed" );
|
|
}
|
|
|
|
// PARACHUTE: Turn right instruction --> RT
|
|
hint_parachute_right()
|
|
{
|
|
return flag( "_chute.gsc_flag_RT_pressed" ) || flag( "flag_parachute_objective_failed" );
|
|
}
|
|
|
|
// PARACHUTE: Flare (slow down) instruction --> LT & RT
|
|
hint_parachute_flare()
|
|
{
|
|
return (flag( "_chute.gsc_flag_LT_pressed" ) && flag( "_chute.gsc_flag_RT_pressed" )) || flag( "flag_parachute_objective_failed" );
|
|
}
|
|
|
|
// PARACHUTE: Player is too far from squad
|
|
hint_parachute_falling_behind()
|
|
{
|
|
return !flag( "flag_hint_parachute_falling_behind" ) || flag( "flag_parachute_objective_failed" );
|
|
}
|
|
|
|
//***************************************************************************************************************************************************************
|
|
// *
|
|
// MAINS *
|
|
// *
|
|
//***************************************************************************************************************************************************************
|
|
|
|
// Main parachute objective
|
|
main_osprey()
|
|
{
|
|
//playing ambient
|
|
level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_hh_osprey_intro", 0.01 );
|
|
|
|
//music cue for intro - set a flag
|
|
flag_set( "music_osprey_intro" );
|
|
|
|
// Intro Dialog
|
|
level thread maps\nx_hithard_util::intro_dialog();
|
|
|
|
level waittill( "introscreen_complete" );
|
|
|
|
thread audio_play_osprey_intro();
|
|
hide_intro_ai_names();
|
|
|
|
// set vision and fog
|
|
thread maps\nx_hithard_fx::apply_vision_and_fog_osprey();
|
|
|
|
// Disable all parachute section triggers
|
|
// The osprey flys through them
|
|
thread maps\nx_hithard_util::all_triggers_off( "parachute_trigger" );
|
|
|
|
// Create the initial AA UGVs that bring down the VTOL
|
|
thread spawn_vtol_ride_enemy_UGVs();
|
|
|
|
//trigger ambient cloud fx
|
|
exploder("osprey_clouds");
|
|
|
|
// Lock elements to osprey
|
|
squad_osprey = GetEnt( "squad_osprey", "script_noteworthy" );
|
|
squad_osprey thread magic_bullet_shield();
|
|
|
|
player_jump_node = GetEnt( "vehicle_node_anim_player_jump", "script_noteworthy" );
|
|
player_jump_node LinkTo( squad_osprey );
|
|
|
|
thread parachute_hud_logic();
|
|
|
|
// Start the parachute ride billboard binks
|
|
thread parachute_billboard_binks();
|
|
|
|
level Osprey_Intro();
|
|
|
|
//level._player SetOrigin( player_jump_node.origin );
|
|
//level._player SetPlayerAngles( player_jump_node.angles );
|
|
|
|
// Ambient UGV spawn and logic
|
|
thread parachute_enemy_UGVs();
|
|
|
|
level notify( "notify_parachute_start" );
|
|
|
|
squad_osprey stop_magic_bullet_shield();
|
|
squad_osprey delete();
|
|
}
|
|
|
|
audio_play_osprey_intro()
|
|
{
|
|
thread parachute_audio_settings();
|
|
wait 3;
|
|
mynodeEntity4 = spawn( "sound_emitter", ( 4380, -283, -1566 ) );
|
|
mynodeEntity4 PlaySound( "scn_hh_osprey_intro", "scn_hh_osprey_intro", true );
|
|
mynodeEntity4 waittill( "scn_hh_osprey_intro" );
|
|
mynodeEntity4 delete();
|
|
}
|
|
|
|
// Don't show the friendly name popups for the Osprey AI
|
|
hide_intro_ai_names()
|
|
{
|
|
intro_ai_noteworthies = [];
|
|
|
|
// List of all ai used in intro
|
|
intro_ai_noteworthies =
|
|
[
|
|
"hithard_intro_pilot1",
|
|
"hithard_intro_pilot2",
|
|
"hithard_intro_ally1",
|
|
"hithard_intro_ally2",
|
|
"hithard_intro_ally3",
|
|
"hithard_intro_ally4",
|
|
"hithard_intro_ally5"
|
|
];
|
|
|
|
foreach( ainoteworthy in intro_ai_noteworthies )
|
|
{
|
|
ai = getent( ainoteworthy, "script_noteworthy");
|
|
ai.name = "";
|
|
}
|
|
}
|
|
|
|
parachute_hud_logic()
|
|
{
|
|
level._player waittill("intro_aa_start");
|
|
|
|
wait 1.75;
|
|
|
|
maps\_chute::parachute_hud_bootup();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
main_parachute_jump()
|
|
{
|
|
// apply the vision set for being outside parachuting
|
|
if ( level._start_point == "default" || level._start_point == "osprey" )
|
|
{
|
|
// regular play through
|
|
// thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(2.0);
|
|
} else {
|
|
// we're jumping to this point ("parachute")
|
|
thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(0.0);
|
|
|
|
level.squad[0] thread parachute_ally_start( level.parachute_landing_zone, 1 );
|
|
level.squad[1] thread parachute_ally_start( level.parachute_landing_zone, 1 );
|
|
}
|
|
|
|
// Make sure allies dont die
|
|
//level.squad[0] magic_bullet_shield();
|
|
//level.squad[1] magic_bullet_shield();
|
|
|
|
|
|
// blinking lights on your parachuting buddies
|
|
PlayFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[0], "tag_effect");
|
|
PlayFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[1], "tag_effect");
|
|
|
|
// PlayFXOnTag(level.squad[0])
|
|
// Add objectives
|
|
maps\nx_hithard_util::objective_start( "obj_parachute_follow_ally", &"NX_HITHARD_PARACHUTE_OBJ_FOLLOW" );
|
|
Objective_onentity( level.objective["obj_parachute_follow_ally"], level.squad[0] );
|
|
Objective_onadditionalentity( level.objective["obj_parachute_follow_ally"], 1, level.squad[1] );
|
|
|
|
// Re-enable all the triggers - They needed to be turned off
|
|
// because the osprey flies through them
|
|
thread para_clear_flags();
|
|
thread maps\nx_hithard_util::all_triggers_on( "parachute_trigger" );
|
|
|
|
// Start parachute sequence dialogue and helper tips
|
|
thread parachute_dialogue();
|
|
|
|
// JR - Temp: Teleport player to correct position
|
|
// This is temporary. The animation controls where the player
|
|
// gets spawned, so the anim needs to be modified
|
|
// Untill then, the player is teleported to the correct spot
|
|
//level._player maps\_nx_utility::move_player_to_start_point( "playerstart_parachute_jump" );
|
|
|
|
thread maps\nx_hithard_anim::bomber_flyby_sfx();
|
|
|
|
//IPrintLnBold( "setting springy cam" );
|
|
//thread maps\_nx_utility::set_springy_cam_pitch_offset( 30, 4 );
|
|
|
|
// Trigger building 1 explosion
|
|
thread maps\nx_hithard_anim::building01_missile_exp_fx();
|
|
|
|
/**** Parachute ride start ****/
|
|
|
|
//set the flag for music to start after the first line is said and the missle hits the building
|
|
flag_set( "music_parachute_start" );
|
|
|
|
// Start parachute
|
|
maps\_chute::chute_start();
|
|
|
|
level._player notify( "notify_player_jump_anim_complete" );
|
|
|
|
// We need to wait until the relink is complete before saving
|
|
level waittill( "player_relink_complete" );
|
|
thread autosave_now();
|
|
|
|
// Changes the players fall speed depending on where he is
|
|
thread player_descent_watcher();
|
|
|
|
//Spawn civilian panic
|
|
thread parachute_civilian_panic();
|
|
|
|
// Spawns vtols that can be seen while parachuting
|
|
thread parachute_periph_vtols();
|
|
|
|
// Sky bridge explosion
|
|
thread parachute_bridge_explosion_01();
|
|
thread parachute_bridge_explosion_02();
|
|
thread skybridge_magic_bullets_01();
|
|
thread skybridge_magic_bullets_02();
|
|
|
|
//level thread skybridge_civies_panic();
|
|
//level thread skybridge2_civies_panic();
|
|
level thread maps\nx_hithard_rooftop::vtol_flyin_logic();
|
|
|
|
// Enable smoke kill planes
|
|
level._player thread parachute_hurt_smoke();
|
|
//level._player thread parachute_deserter_killplanes();
|
|
|
|
level.squad maps\nx_hithard_util::ignore_all_on();
|
|
|
|
// Buffeting Explosion force
|
|
level._explosion_force = 25;
|
|
thread parachute_buffeting( "flag_parachute_building3_explosion_left", "origin_parachute_building3_explosion_left" );
|
|
thread parachute_buffeting( "flag_parachute_building3_explosion_right", "origin_parachute_building3_explosion_right" );
|
|
|
|
// Thread wait function for parachute landing objective / library rooftop preparation
|
|
thread watcher_parachute_land_objective();
|
|
|
|
// Parachute landing bink
|
|
thread maps\nx_hithard_rooftop::rooftop_landing_bink();
|
|
|
|
// Thread out of bounds watcher it until player hinds landing flag
|
|
thread watcher_parachute_outofbounds();
|
|
flag_wait( "flag_parasecure_parachute_landed_player" );
|
|
level._player playsound( "scn_hithard_para_land" );
|
|
thread audio_jetpass();
|
|
|
|
|
|
/**** Parachute ride end ****/
|
|
|
|
flag_set( "music_parachute_ends" );
|
|
|
|
// tagBR< note >: This is just a failsafe, but for some reason it was not getting killed off sometimes
|
|
maps\nx_hithard_fx::hide_lz();
|
|
|
|
// Kill the parachute
|
|
maps\_chute::chute_end();
|
|
|
|
|
|
// Undo all the invulnerability that was applied during the ride
|
|
thread squad_prepare_for_fire( 1 );
|
|
|
|
maps\nx_hithard_util::objective_end( "obj_parachute_land" );
|
|
thread maps\_utility::set_ambient( "nx_hithard_ext" );
|
|
|
|
level notify( "notify_parachute_objective_complete" );
|
|
|
|
// Give the player weapons
|
|
level._player GiveWeapon( level._main_gun );
|
|
foreach( weapon in level.weapons )
|
|
{
|
|
level._player giveWeapon( weapon );
|
|
}
|
|
|
|
level._player SwitchToWeapon( level._main_gun );
|
|
|
|
// stop the blinking lights on your squadmates
|
|
StopFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[0], "tag_effect");
|
|
StopFXOnTag(level._effect[ "aircraft_light_white_blink" ], level.squad[1], "tag_effect");
|
|
|
|
// This teleport should be removed when the parachute outro anims work
|
|
ally_start_noteworthies = [ "origin_parachute_land_ally_01_start", "origin_parachute_land_ally_02_start" ];
|
|
level.squad maps\nx_hithard_util::moveAlliesToStartPoint( ally_start_noteworthies );
|
|
level.squad maps\nx_hithard_util::ignore_all_off();
|
|
|
|
maps\_threatid::threat_id_enable_toggling();
|
|
}
|
|
|
|
audio_jetpass()
|
|
{
|
|
|
|
wait 2;
|
|
level._player playsound( "elm_hh_jet_pass" );
|
|
|
|
}
|
|
|
|
|
|
// Makes double extra certain all the flags are cleared
|
|
// at the start of the rooftop section
|
|
para_clear_flags()
|
|
{
|
|
flag_clear ( "flag_parachute_hurt_smoke" );
|
|
|
|
flag_clear ( "flag_parachute_section_02" );
|
|
flag_clear ( "flag_building2_slow_fall" );
|
|
flag_clear ( "hanging_guys_delete" );
|
|
|
|
flag_clear ( "flag_parachute_section_03" );
|
|
flag_clear ( "flag_building3_slow_fall" );
|
|
|
|
flag_clear ( "flag_parachute_section_04" );
|
|
|
|
flag_clear ( "flag_vtol_flyin_go" );
|
|
flag_clear ( "flag_parasecure_library_enemies_spawn" );
|
|
flag_clear ( "flag_prepare_for_landing" );
|
|
flag_clear ( "flag_parasecure_parachute_landed_player" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
watcher_parachute_outofbounds()
|
|
{
|
|
level endon( "notify_parachute_objective_complete" );
|
|
|
|
while ( 1 )
|
|
{
|
|
if (( level._player.origin[2] <= 156 ) && ( !flag( "flag_parachute_objective_failed" )))
|
|
{
|
|
maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_LOW" );
|
|
}
|
|
if( flag( "flag_parasecure_parachute_oob" ) && ( !flag( "flag_parachute_objective_failed" )))
|
|
{
|
|
maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_LOW" );
|
|
}
|
|
|
|
wait 0.01;
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Controls player fall speed at certain points along the chute path
|
|
player_descent_watcher()
|
|
{
|
|
default_descent_acceleration = 0.0;
|
|
default_descent_velocity = 77;
|
|
default_forward_brake_deceleration = 0.0;
|
|
|
|
starting_target_height = 2900;
|
|
building_2_target_height = 2200;
|
|
building_3_target_height = 650;
|
|
building_4_target_height = 600;
|
|
|
|
// JR TODO - Swoop turned off for now
|
|
//default_forward_velocity = 890;
|
|
//swoop_forward_velocity = 950;
|
|
|
|
// Fall faster at very start of sequence
|
|
// to counter starting higher in the air
|
|
level._descent_acceleration = 175.0;
|
|
level._max_descent_velocity = 225;
|
|
|
|
//level._player SetSpringyCamPitchOffset( 25 );
|
|
//wait( 1.5 );
|
|
//level._player SetSpringyCamPitchOffset( 0 );
|
|
|
|
// Until target height
|
|
while( level._player.origin[2] > starting_target_height )
|
|
{
|
|
wait( 1.0 );
|
|
}
|
|
|
|
// Reset normal descent params
|
|
level._descent_acceleration = default_descent_acceleration;
|
|
level._max_descent_velocity = 55;
|
|
level._min_descent_velocity = 55;
|
|
|
|
// Building 2
|
|
// Force the player down a bit to see the moment
|
|
flag_wait( "flag_building2_slow_fall" );
|
|
|
|
// Fall faster
|
|
level._descent_acceleration = 90.0;
|
|
level._max_descent_velocity = 150;
|
|
level._forward_acceleration = 300.0;
|
|
//level._max_forward_velocity = swoop_forward_velocity;
|
|
|
|
// Until target height
|
|
while( level._player.origin[2] > building_2_target_height )
|
|
{
|
|
wait( 1.0 );
|
|
}
|
|
|
|
// Reset normal descent params
|
|
level._descent_acceleration = default_descent_acceleration;
|
|
level._max_descent_velocity = default_descent_velocity;
|
|
level._forward_acceleration = 200.0;
|
|
//level._max_forward_velocity = default_forward_velocity;
|
|
|
|
|
|
// Building 3
|
|
// Force the player down a bit to see the moment
|
|
flag_wait( "flag_building3_slow_fall" );
|
|
|
|
level._descent_acceleration = 65.0;
|
|
level._max_descent_velocity = 185;
|
|
//level._max_forward_velocity = swoop_forward_velocity;
|
|
|
|
// Until target height
|
|
while( level._player.origin[2] > building_3_target_height && !flag( "flag_parasecure_library_enemies_spawn" ))
|
|
{
|
|
wait( 0.25 );
|
|
}
|
|
|
|
|
|
// Building 4
|
|
// Force the player down a bit to see the moment
|
|
flag_wait( "flag_parasecure_library_enemies_spawn" );
|
|
|
|
thread parachute_display_flare();
|
|
|
|
level._descent_acceleration = 90.0;
|
|
level._max_descent_velocity = 400;
|
|
//level._max_forward_velocity = swoop_forward_velocity;
|
|
|
|
// Until target height
|
|
while( level._player.origin[2] > building_4_target_height )
|
|
{
|
|
wait( 0.25 );
|
|
}
|
|
|
|
|
|
// Straight away towards landing zone
|
|
// Dont let the player fall much anymore
|
|
level._descent_acceleration = 0.0;
|
|
level._min_descent_velocity = 0;
|
|
level._max_descent_velocity = 25.0;
|
|
//level._max_forward_velocity = default_forward_velocity;
|
|
|
|
|
|
// Landing sequence
|
|
// Increase the players braking power,
|
|
// and make the player fall faster
|
|
flag_wait( "flag_prepare_for_landing" );
|
|
|
|
level._descent_acceleration = 2.0;
|
|
level._max_forward_velocity = 800.0;
|
|
level._min_forward_velocity = 15.0;
|
|
level._forward_acceleration = 12.0;
|
|
|
|
//level._player display_hint_timeout( "hint_parachute_flare", 4.0 );
|
|
// self thread parachute_display_flare();
|
|
|
|
// This loop makes the players brake more powerful while the brake is pressed
|
|
// Stops when the player lands
|
|
while( !flag( "flag_parasecure_parachute_landed_player" ))
|
|
{
|
|
// While brake is on, slow down much faster
|
|
if( flag( "_chute.gsc_flag_LT_pressed" ) && flag( "_chute.gsc_flag_RT_pressed" ))
|
|
{
|
|
level._forward_brake_deceleration = -150.0;
|
|
level._descent_acceleration = 128.0;
|
|
level._max_descent_velocity = 2100;
|
|
level._min_descent_velocity = 200;
|
|
}
|
|
else
|
|
{
|
|
level._forward_brake_deceleration = -10.0;
|
|
}
|
|
wait 1.0;
|
|
}
|
|
|
|
// Reset just in case
|
|
level._forward_brake_deceleration = 0.0;
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Player flies on side of building 3 (explosion causes buffeting to player)
|
|
parachute_buffeting( flag_explosion, origin_explosion )
|
|
{
|
|
level endon( "notify_parachute_objective_complete");
|
|
|
|
explosion_trigger = GetEnt( flag_explosion, "targetname" );
|
|
|
|
//flag_wait( flag_explosion );
|
|
while ( 1 )
|
|
{
|
|
if ( level._player IsTouching( explosion_trigger ) )
|
|
{
|
|
// Stop player from falling too much during buffet
|
|
level._min_descent_velocity = 0;
|
|
level._max_descent_velocity = 25.0;
|
|
|
|
explosion_point = getent( origin_explosion, "script_noteworthy" );
|
|
thread maps\_chute::parachute_buffeting( explosion_point.origin, explosion_trigger.animation );
|
|
|
|
Earthquake( .7, 1.2, level._player.origin, 5000 );
|
|
quakeobj = spawn( "script_origin", level._player.origin );
|
|
quakeobj PlayRumbleOnEntity( "artillery_rumble" );
|
|
|
|
return;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Waits for player to hit a flag in order to prepare the library rooftops and change to parachute landing objective
|
|
watcher_parachute_land_objective()
|
|
{
|
|
flag_wait( "flag_parasecure_library_enemies_spawn" );
|
|
|
|
// Prepare rooftop section
|
|
//thread maps\nx_hithard_rooftop::prep_parachute_library_rooftop();
|
|
|
|
// Update Objective
|
|
maps\nx_hithard_util::objective_end( "obj_parachute_follow_ally" );
|
|
maps\nx_hithard_util::objective_start( "obj_parachute_land", &"NX_HITHARD_PARACHUTE_OBJ_LAND" );
|
|
|
|
landing_node = GetEnt( "rooftop_landing_node", "script_noteworthy" );
|
|
Objective_Position( level.objective["obj_parachute_land"], landing_node.origin );
|
|
Objective_Icon( level.objective["obj_parachute_land"], "chute_landing_marker" );
|
|
|
|
waittillframeend;
|
|
|
|
originalWidth = getdvarfloat( "waypointIconWidth" );
|
|
originalHeight = getdvarfloat( "waypointIconHeight" );
|
|
originalScaleSmallest = getdvarfloat( "waypointDistScaleSmallest" );
|
|
SetSavedDvar( "waypointIconWidth", 32.0 );
|
|
SetSavedDvar( "waypointIconHeight", 16.0 );
|
|
SetSavedDvar( "waypointDistScaleSmallest", 1.0 );
|
|
|
|
level waittill( "notify_parachute_objective_complete" );
|
|
|
|
SetSavedDvar( "waypointIconWidth", originalWidth );
|
|
SetSavedDvar( "waypointIconHeight", originalHeight );
|
|
SetSavedDvar( "waypointDistScaleSmallest", originalScaleSmallest );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
Osprey_Intro()
|
|
{
|
|
node = getstruct("hithard_intro_cinematic", "script_noteworthy");
|
|
|
|
hithard_osprey_01 = get_vehicle("hithard_osprey_01","targetname");
|
|
hithard_osprey_01.animname = "hithard_osprey_01";
|
|
hithard_osprey_01 StartUsingHeroOnlyLighting();
|
|
level.hithard_osprey_01 = hithard_osprey_01;
|
|
|
|
hithard_osprey_02 = get_vehicle("hithard_osprey_02","targetname");
|
|
hithard_osprey_02.animname = "hithard_osprey_02";
|
|
level.hithard_osprey_02 = hithard_osprey_02;
|
|
|
|
hithard_osprey_03 = get_vehicle("hithard_osprey_03","targetname");
|
|
hithard_osprey_03.animname = "hithard_osprey_03";
|
|
level.hithard_osprey_03 = hithard_osprey_03;
|
|
|
|
hithard_osprey_04 = get_vehicle("hithard_osprey_04","targetname");
|
|
hithard_osprey_04.animname = "hithard_osprey_04";
|
|
level.hithard_osprey_04 = hithard_osprey_04;
|
|
|
|
osprey_damaged = spawn_anim_model("osprey_damaged");
|
|
osprey_damaged StartUsingHeroOnlyLighting();
|
|
level.osprey_damaged = osprey_damaged;
|
|
|
|
vehicle_osprey_door_intro = spawn_anim_model("vehicle_osprey_door_intro");
|
|
level.vehicle_osprey_door_intro = vehicle_osprey_door_intro;
|
|
|
|
player_body = getent("hithard_intro_player_body", "script_noteworthy");
|
|
player_body vehicle_guy_attach( hithard_osprey_01, "tag_guy2" );
|
|
player_body.animname = "player_body";
|
|
level.player_body = player_body;
|
|
|
|
ally01 = getent("hithard_intro_ally1", "script_noteworthy");
|
|
ally01 vehicle_guy_attach( hithard_osprey_01, "tag_guy2" );
|
|
ally01.animname = "ally01";
|
|
level.ally01 = ally01;
|
|
|
|
ally02 = getent("hithard_intro_ally2", "script_noteworthy");
|
|
ally02 vehicle_guy_attach( hithard_osprey_01, "tag_guy3" );
|
|
ally02.animname = "ally02";
|
|
level.ally02 = ally02;
|
|
|
|
ally03 = getent("hithard_intro_ally3", "script_noteworthy");
|
|
ally03 vehicle_guy_attach( hithard_osprey_01, "tag_guy4" );
|
|
ally03.animname = "ally03";
|
|
level.ally03 = ally03;
|
|
|
|
ally04 = getent("hithard_intro_ally4", "script_noteworthy");
|
|
ally04 vehicle_guy_attach( hithard_osprey_01, "tag_guy5" );
|
|
ally04.animname = "ally04";
|
|
level.ally04 = ally04;
|
|
|
|
ally05 = getent("hithard_intro_ally5", "script_noteworthy");
|
|
ally05 vehicle_guy_attach( hithard_osprey_01, "tag_guy6" );
|
|
ally05.animname = "ally05";
|
|
level.ally05 = ally05;
|
|
|
|
pilot01 = getent("hithard_intro_pilot1", "script_noteworthy");
|
|
pilot01 vehicle_guy_attach( hithard_osprey_01, "tag_passenger" );
|
|
pilot01.animname = "pilot01";
|
|
level.pilot01 = pilot01;
|
|
|
|
pilot02 = getent("hithard_intro_pilot2", "script_noteworthy");
|
|
pilot02 vehicle_guy_attach( hithard_osprey_01, "tag_driver" );
|
|
pilot02.animname = "pilot02";
|
|
level.pilot02 = pilot02;
|
|
|
|
// set up the rig
|
|
player_rig = spawn_anim_model( "player_rig" );
|
|
player_rig StartUsingHeroOnlyLighting();
|
|
|
|
player_rig LinkTo( hithard_osprey_01, "tag_guy5" );
|
|
//arc = 15;
|
|
//level._player PlayerLinkToDelta( player_rig, "tag_player", 1, arc, arc, arc, arc, 1);
|
|
|
|
// animate the rig
|
|
player_rig Show();
|
|
|
|
hithard_osprey_01 suspend_drive_anims_for_vignette();
|
|
hithard_osprey_02 suspend_drive_anims_for_vignette();
|
|
hithard_osprey_03 suspend_drive_anims_for_vignette();
|
|
hithard_osprey_04 suspend_drive_anims_for_vignette();
|
|
|
|
passengers = [ ally01, ally02, ally03, ally04, ally05, pilot01, pilot02, player_rig, player_body, osprey_damaged, vehicle_osprey_door_intro ];
|
|
passengers_org = spawn_tag_origin();
|
|
osprey_rot = hithard_osprey_01.angles[ 1 ];
|
|
passengers_org.origin = hithard_osprey_01.origin + ( cos( osprey_rot ) * 112, sin( osprey_rot ) * 112, -120 );
|
|
passengers_org LinkTo( hithard_osprey_01 );
|
|
osprey_damaged LinkTo( hithard_osprey_01, "tag_origin", (0,0,0), (0,0,0) );
|
|
vehicle_osprey_door_intro LinkTo( hithard_osprey_01, "tag_origin", (0,0,0), (0,0,0) );
|
|
|
|
planes = [];
|
|
planes["hithard_osprey_01"] = hithard_osprey_01;
|
|
planes["hithard_osprey_02"] = hithard_osprey_02;
|
|
planes["hithard_osprey_03"] = hithard_osprey_03;
|
|
planes["hithard_osprey_04"] = hithard_osprey_04;
|
|
|
|
|
|
osprey_damaged Hide();
|
|
|
|
// Wait for bink.
|
|
//level waittill( "osprey_intro_bink_01_complete" );
|
|
|
|
//thread autosave_now();
|
|
|
|
//start osprey missile, AA, and flak FX
|
|
thread osprey_missilehits_periph();
|
|
|
|
horizontal_arc = 0;
|
|
vertical_arc = 0;
|
|
level._player PlayerLinkToDelta( player_rig, "tag_player", 1, horizontal_arc, horizontal_arc, vertical_arc, vertical_arc, 1);
|
|
|
|
// This starts the ally logic...they will spawn at the appropriate time
|
|
level.squad[0] thread parachute_ally_start( level.parachute_landing_zone );
|
|
level.squad[1] thread parachute_ally_start( level.parachute_landing_zone );
|
|
|
|
// iPrintLnBold("--- windshield light on ---");
|
|
playFXOnTag(level._effect[ "nx_light_hhh_osprey_intro_windshield" ], hithard_osprey_01, "tag_osprey_windshield"); // light from the outside coming into the osprey
|
|
|
|
level._player AllowCrouch( false );
|
|
|
|
passengers_org thread anim_single( passengers, "Osprey_Intro" );
|
|
player_rig thread player_rig_on_intro_end( passengers_org, "Osprey_Intro" );
|
|
|
|
// light blinking on the dudes
|
|
thread maps\nx_hithard_fx::parachute_guys_blink_lights(ally01, ally05);
|
|
|
|
// light on the back door opening in the osprey
|
|
thread maps\nx_hithard_fx::fx_ospreyintro_backdoor_open_light_on(osprey_damaged);
|
|
|
|
thread wait_and_cleanup_intro();
|
|
|
|
node anim_single( planes, "Osprey_Intro" );
|
|
|
|
// Remove intro entities
|
|
level.osprey_damaged thread safe_delete();
|
|
level.ally01 thread safe_delete();
|
|
level.ally02 thread safe_delete();
|
|
level.ally03 thread safe_delete();
|
|
level.ally04 thread safe_delete();
|
|
level.ally05 thread safe_delete();
|
|
level.player_body thread safe_delete();
|
|
level.pilot01 thread safe_delete();
|
|
level.pilot02 thread safe_delete();
|
|
|
|
level._player AllowCrouch( true );
|
|
}
|
|
|
|
osprey_damaged_unhide( osprey_damaged )
|
|
{
|
|
osprey_damaged Show();
|
|
// playFXOnTag(level._effect[ "nx_light_hhh_osprey_intro_windshield" ], osprey_damaged, "tag_osprey_windshield"); // light from the outside coming into the osprey
|
|
stop_exploder( "osprey_clouds" );
|
|
|
|
}
|
|
|
|
intro_explosion_hide( hithard_osprey_01 )
|
|
{
|
|
hithard_osprey_01 Hide();
|
|
}
|
|
|
|
wait_and_cleanup_intro()
|
|
{
|
|
// Wait for the intro AA notetrack
|
|
level._player waittill( "intro_aa_start" );
|
|
|
|
// Anim is done
|
|
level.hithard_osprey_02 thread safe_delete();
|
|
level.hithard_osprey_03 thread safe_delete();
|
|
level.hithard_osprey_04 thread safe_delete();
|
|
}
|
|
|
|
safe_delete()
|
|
{
|
|
if( isDefined( self ))
|
|
{
|
|
self delete();
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
osprey_missilehits_periph()
|
|
{
|
|
//iPrintLnBold("--- got fx osprey start ---");
|
|
wait 18.5;
|
|
exploder("osprey_missiles");
|
|
}
|
|
|
|
player_rig_on_intro_end( node, scene_name )
|
|
{
|
|
node waittill( scene_name );
|
|
self Hide();
|
|
//self unlink();
|
|
level._player Unlink();
|
|
self delete();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
vehicle_guy_attach( vehicle, tag_name )
|
|
{
|
|
tag_org = vehicle GetTagOrigin( tag_name );
|
|
tag_angles = vehicle GetTagAngles( tag_name );
|
|
|
|
self ForceTeleport( tag_org, tag_angles );
|
|
|
|
self LinkTo( vehicle, tag_name );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Removes the "brush" door on the osprey (debug / placeholder until we have a real osprey door and anims)
|
|
osprey_door_remove()
|
|
{
|
|
// Wait for when allies are ready to jump
|
|
//wait 12.5;
|
|
wait 114;
|
|
|
|
// different vision set when the door opens on the osprey
|
|
thread maps\nx_hithard_fx::apply_vision_and_fog_osprey_door_open();
|
|
|
|
self delete();
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Animations for player's squad jumping out of plane
|
|
parachute_ally_jump_MAJOR_CHANGE( jump_anim_group, squad_osprey )
|
|
{
|
|
level endon( "notify_parachute_start" );
|
|
|
|
// Variables
|
|
jump_anim_node_name = "node_anim_parachute_jump_" + self.script_noteworthy;
|
|
rubber_banding_object = "";
|
|
jump_anim_node = GetEnt( jump_anim_node_name, "script_noteworthy" );
|
|
|
|
// PJ: Plane setup
|
|
jump_anim_node LinkTo( squad_osprey );
|
|
|
|
// Perform jump animation
|
|
self.animname = "anim_parachute_jump_" + self.script_noteworthy;
|
|
guys[0] = self;
|
|
|
|
level waittill( "osprey_intro_bink_01_complete" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Rubber-banding for squad mates parachuting in with player
|
|
parachute_rubber_banding( guy_1, guy_2 )
|
|
{
|
|
level endon( "notify_parachute_objective_complete" );
|
|
level endon( "parachute_path_complete" );
|
|
level endon( "parachute_approach_start" );
|
|
|
|
falling_behind_vo_timeout = false;
|
|
|
|
// Distance between allies
|
|
distance_between_allies = 0;
|
|
|
|
if( self == level.squad[ 0 ] )
|
|
{
|
|
self vehicle_SetSpeedImmediate( 30 );
|
|
}
|
|
else
|
|
{
|
|
self vehicle_SetSpeedImmediate( 30 );
|
|
}
|
|
|
|
while ( 1 )
|
|
{
|
|
distance_between_allies = Distance( self.origin, guy_2.origin );
|
|
|
|
// Adjust speed of vehicle based on distance from rubber bander
|
|
if ( distance_between_allies < 1200 ) // 1400
|
|
{
|
|
self Vehicle_SetSpeed( 70, 60 );
|
|
}
|
|
else if( distance_between_allies > 2750 ) // 3500
|
|
{
|
|
self Vehicle_SetSpeed( 30, 29);
|
|
}
|
|
else
|
|
{
|
|
self Vehicle_SetSpeed( 50, 40 );
|
|
}
|
|
|
|
// Check for player fail (too far from squad mates)
|
|
if ( ( guy_2 == level._player ) && flag( "flag_parachute_player_rb_fail_allow" ))
|
|
{
|
|
// Maximum follow distance in units before "too far" message displayed
|
|
warning_distance = undefined;
|
|
|
|
// Distance at which player will fail
|
|
fail_distance = undefined;
|
|
|
|
//iprintlnbold( distance_between_allies );
|
|
|
|
// If the player is at the start, allow for a larger follow distance
|
|
if( flag( "flag_parachute_section_01b" ))
|
|
{
|
|
warning_distance = 3000;
|
|
fail_distance = 4000;
|
|
}
|
|
else
|
|
{
|
|
warning_distance = 3000;
|
|
fail_distance = 4000;
|
|
}
|
|
|
|
if ( distance_between_allies < warning_distance )
|
|
{
|
|
flag_clear( "flag_hint_parachute_falling_behind" );
|
|
}
|
|
else if ( distance_between_allies >= fail_distance )
|
|
{
|
|
// Failed
|
|
maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_FOLLOW" );
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
if ( !flag( "flag_hint_parachute_falling_behind" ))
|
|
{
|
|
// Captain Baker: "Spectre, you're falling behind!"
|
|
thread radio_dialogue( "hithard_bak_para_01" );
|
|
|
|
//falling_behind_vo_timeout = true;
|
|
//falling_behind_vo_timeout = thread falling_behind_vo_timeout();
|
|
}
|
|
|
|
flag_set( "flag_hint_parachute_falling_behind" );
|
|
display_hint( "hint_parachute_falling_behind" );
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
// Controls crowds of civilians
|
|
// JR TODO - Add start/stop flag functionality
|
|
parachute_civilian_panic()
|
|
{
|
|
thread parachute_civilian_panic_logic( "civies_01a", "flag_parachute_section_01b" );
|
|
thread parachute_civilian_panic_logic( "civies_01b", "flag_parachute_section_01b" );
|
|
|
|
thread parachute_civilian_panic_logic( "civies_03a", "flag_parachute_section_01b" );
|
|
thread parachute_civilian_panic_logic( "civies_03b", "flag_parachute_section_01b" );
|
|
|
|
flag_wait( "flag_parachute_section_01b" );
|
|
|
|
flag_wait( "flag_parachute_section_02" );
|
|
|
|
// Skybridge civilians
|
|
skybridge_civilians = GetEntArray( "parachute_civies_04_spawner", "script_noteworthy" );
|
|
array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_1" );
|
|
thread parachute_civilian_panic_logic( "civies_04", "flag_skybridge_exp_1" );
|
|
|
|
skybridge_civilians = GetEntArray( "parachute_civies_04b_spawner", "script_noteworthy" );
|
|
array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_2" );
|
|
thread parachute_civilian_panic_logic( "civies_04b", "flag_skybridge_exp_2" );
|
|
|
|
// Office park civvies
|
|
thread parachute_civilian_panic_logic( "civies_5", "flag_parachute_section_04" );
|
|
|
|
// Spawn final civilian panic
|
|
thread parachute_civilian_panic_logic( "civies_10a", "flag_prepare_for_landing" );
|
|
thread parachute_civilian_panic_logic( "civies_10b", "flag_prepare_for_landing" );
|
|
thread parachute_civilian_panic_logic( "civies_10c", "flag_prepare_for_landing" );
|
|
|
|
flag_wait( "flag_parachute_section_03" );
|
|
//iprintln( "flag_parachute_section_03" );
|
|
|
|
// tagJW<NOTE>: Clean up animated wind turbines to free up animinfos
|
|
wind_turbines = GetEntArray( "wind_turbine", "script_noteworthy" );
|
|
foreach ( wind_turbine in wind_turbines )
|
|
{
|
|
wind_turbine delete();
|
|
}
|
|
|
|
// Cleanup
|
|
|
|
flag_wait( "flag_parachute_section_04" );
|
|
//iprintln( "flag_parachute_section_04" );
|
|
|
|
flag_wait( "flag_prepare_for_landing" );
|
|
//iprintln( "flag_prepare_for_landing" );
|
|
|
|
}
|
|
|
|
|
|
// Wrapper to make infinite streaming civies
|
|
// JR - The crowd system should have this functionality built-in
|
|
parachute_civilian_panic_logic( group, kill_flag )
|
|
{
|
|
spawner = "parachute_" + group + "_spawner";
|
|
solo_spawner = "parachute_" + group + "_solo_spawner";
|
|
start = "parachute_" + group + "_start";
|
|
end = "parachute_" + group + "_end";
|
|
|
|
// Create the crowd
|
|
crowd = maps\nx_crowd_controller::new_crowd( group, 8,
|
|
GetEntArray( spawner, "script_noteworthy"),
|
|
GetEntArray( start, "script_noteworthy"),
|
|
GetEntArray( end, "script_noteworthy"),
|
|
0.3, 0.7 );
|
|
|
|
// Spawn the solo guys
|
|
solo_spawned_array = spawn_noteworthy_and_return_array( solo_spawner );
|
|
|
|
// Keep spawning untill player lands
|
|
while( !flag( "flag_parasecure_parachute_landed_player" ) )
|
|
{
|
|
if ( isdefined( kill_flag ) && flag( kill_flag ) )
|
|
{
|
|
level notify( kill_flag );
|
|
break;
|
|
}
|
|
|
|
maps\nx_crowd_controller::spawn_crowd( group, kill_flag );
|
|
level waittill( group );
|
|
//wait( 4.0 );
|
|
}
|
|
|
|
// Kill the solo guys
|
|
foreach ( solo_drone in solo_spawned_array )
|
|
{
|
|
solo_drone delete();
|
|
}
|
|
|
|
// No need to kill crowd controller guys, they should expire at end of their path
|
|
}
|
|
|
|
// tagJW<NOTE>: Keeping this out of nx_utility since I don't want it to set count - using to spawn drones
|
|
spawn_noteworthy_and_return_array( noteworthy )
|
|
{
|
|
spawners = GetEntArray( noteworthy, "script_noteworthy" );
|
|
guys = [];
|
|
foreach ( spawner in spawners )
|
|
{
|
|
guy = spawner spawn_ai();
|
|
if ( IsDefined( guy ) && IsAlive( guy ) )
|
|
{
|
|
guys[ guys.size ] = guy;
|
|
}
|
|
}
|
|
return guys;
|
|
}
|
|
|
|
|
|
// JR - I think this might be run on level load
|
|
// Should delay it to start with a trigger,
|
|
// and make sure it cleans itself up
|
|
skybridge_civies_panic()
|
|
{
|
|
crowd = maps\nx_crowd_controller::new_crowd( "skybridge_civies",
|
|
10,
|
|
GetEntArray( "skybridge_civies_spawner", "script_noteworthy" ),
|
|
GetEntArray( "skybridge_civies_start", "script_noteworthy"),
|
|
GetEntArray( "skybridge_civies_end", "script_noteworthy"));
|
|
|
|
wait 4.0;
|
|
//while( 1 )
|
|
while( !flag( "flag_parasecure_parachute_landed_player" ))
|
|
{
|
|
maps\nx_crowd_controller::spawn_crowd( "skybridge_civies" );
|
|
wait 10.0;
|
|
}
|
|
}
|
|
|
|
// JR - I think this might be run on level load
|
|
// Should delay it to start with a trigger,
|
|
// and make sure it cleans itself up
|
|
skybridge2_civies_panic()
|
|
{
|
|
crowd = maps\nx_crowd_controller::new_crowd( "skybridge2_civies",
|
|
10,
|
|
GetEntArray( "skybridge2_civies_spawner", "script_noteworthy" ),
|
|
GetEntArray( "skybridge2_civies_start", "script_noteworthy"),
|
|
GetEntArray( "skybridge2_civies_end", "script_noteworthy"));
|
|
|
|
wait 4.0;
|
|
//while( 1 )
|
|
while( !flag( "flag_parasecure_parachute_landed_player" ))
|
|
{
|
|
maps\nx_crowd_controller::spawn_crowd( "skybridge2_civies" );
|
|
wait 10.0;
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
// Controls enemy UGV during parachute ride
|
|
// JR TODO - Remove actual vehicles and use static models firing magic bullets
|
|
// rocket = MagicBullet( "rpg_straight", rocket_source.origin, rocket_target.origin );
|
|
parachute_enemy_UGVs()
|
|
{
|
|
flag_set( "flag_creating_enemy_UGVs" );
|
|
wait( .10 );
|
|
|
|
// Prepare squad mates to be fired at
|
|
squad_prepare_for_fire();
|
|
|
|
// These two die after building 1
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_01a", "flag_parachute_section_01b", level.squad[1] );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_01b", "flag_parachute_section_01b", level.squad[0] );
|
|
|
|
waittillframeend;
|
|
|
|
// JR - The target node GetEnt could be baked down into the parachute_enemy_ugv_logic() script
|
|
target_node = GetEnt( "parachute_ugv_02a_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_02a", "flag_building2_slow_fall", target_node ); // Old target: level.squad[0]
|
|
//thread parachute_enemy_UGV_logic( "parachute_ugv_02b", "flag_building2_slow_fall", level.squad[1] );
|
|
|
|
waittillframeend;
|
|
|
|
target_node = GetEnt( "parachute_ugv_03a_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_03a", "flag_building2_slow_fall", target_node ); // Old target: level.squad[0]
|
|
//thread parachute_enemy_UGV_logic( "parachute_ugv_03b", "flag_building2_slow_fall", level.squad[0] );
|
|
|
|
flag_wait( "flag_parachute_section_01b" );
|
|
|
|
target_node = GetEnt( "parachute_ugv_03c_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_03c", "flag_parachute_section_03", target_node ); // Old target: level.squad[1]
|
|
|
|
flag_wait( "flag_parachute_section_02" );
|
|
|
|
target_node = GetEnt( "parachute_ugv_04a_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_04a", "flag_building3_slow_fall", target_node ); // Old target: level.squad[0]
|
|
|
|
target_node = GetEnt( "parachute_ugv_04b_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_04b", "flag_building3_slow_fall", target_node ); // Old target: level.squad[0]
|
|
|
|
//flag_wait( "flag_parachute_drones_03" );
|
|
|
|
target_node = GetEnt( "parachute_ugv_05a_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_05a", "flag_parachute_section_04", target_node ); // Old target: level.squad[0]
|
|
|
|
target_node = GetEnt( "parachute_ugv_05b_target_node", "script_noteworthy" );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_05b", "flag_parachute_section_04", target_node ); // Old target: level.squad[0]
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
// These should fire during the intro and deploy anims
|
|
spawn_vtol_ride_enemy_UGVs()
|
|
{
|
|
level._player waittill( "intro_aa_start" );
|
|
|
|
// Get the target nodes to fire at
|
|
node_00a = GetEnt( "vtol_aa_target_node_00a", "script_noteworthy" );
|
|
node_00b = GetEnt( "vtol_aa_target_node_00b", "script_noteworthy" );
|
|
node_00c = GetEnt( "vtol_aa_target_node_00c", "script_noteworthy" );
|
|
|
|
// Spawn the UGVs, and start firing
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_00a", "flag_creating_enemy_UGVs", node_00a );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_00b", "flag_creating_enemy_UGVs", node_00b );
|
|
thread parachute_enemy_UGV_logic( "parachute_ugv_00c", "flag_creating_enemy_UGVs", node_00c );
|
|
}
|
|
|
|
|
|
// Spawn and control each UGV
|
|
parachute_enemy_UGV_logic( targetname, delete_flag, fire_target, wide )
|
|
{
|
|
ugv_spawner = GetEnt( targetname, "targetname" );
|
|
ugv = vehicle_spawn( ugv_spawner );
|
|
ugv set_cheap_turret();
|
|
|
|
ugv endon( "death" );
|
|
|
|
//ugv mgoff();
|
|
//ugv.mgturret[0] SetMode( "manual" );
|
|
ugv.mgturret[1] SetMode( "manual" );
|
|
ugv.mgturret[2] SetMode( "manual" );
|
|
|
|
thread gopath( ugv );
|
|
|
|
|
|
if( isDefined( fire_target ))
|
|
{
|
|
ugv thread vehicle_fire_around_entity( fire_target, RandomFloatRange( 1, 2 ), wide );
|
|
}
|
|
|
|
ugv flag_wait( delete_flag );
|
|
ugv Delete();
|
|
|
|
//IPrintLnBold( "UGV deleted" );
|
|
}
|
|
|
|
squad_prepare_for_fire( undo )
|
|
{
|
|
if( !isDefined( undo ))
|
|
{
|
|
// Create the player_lead dummy object
|
|
level._player EnableInvulnerability();
|
|
|
|
// Squad shouldnt get hit or take pain
|
|
level.squad[0] godon();
|
|
level.squad[1] godon();
|
|
|
|
level.squad[0].disableBulletWhizByReactions = true;
|
|
level.squad[1].disableBulletWhizByReactions = true;
|
|
|
|
level.squad[0] disable_pain();
|
|
level.squad[1] disable_pain();
|
|
|
|
level.squad[0].ignoreall = true;
|
|
level.squad[1].ignoreall = true;
|
|
|
|
level.squad[0].ignoresuppresion = true;
|
|
level.squad[1].ignoresuppresion = true;
|
|
}
|
|
else
|
|
{
|
|
level._player DisableInvulnerability();
|
|
|
|
level.squad[0].disableBulletWhizByReactions = false;
|
|
level.squad[1].disableBulletWhizByReactions = false;
|
|
|
|
level.squad[0] enable_pain();
|
|
level.squad[1] enable_pain();
|
|
|
|
level.squad[0].ignoreall = false;
|
|
level.squad[1].ignoreall = false;
|
|
|
|
level.squad[0].ignoresuppresion = false;
|
|
level.squad[1].ignoresuppresion = false;
|
|
}
|
|
}
|
|
|
|
// taken from hit hard b
|
|
vehicle_fire_around_entity( e, interval, wide )
|
|
{
|
|
self endon( "death" );
|
|
if( !IsDefined( self.mgturret ) )
|
|
return;
|
|
|
|
turret = self.mgturret[0];
|
|
|
|
turret StartBarrelSpin();
|
|
|
|
while( 1 )
|
|
{
|
|
r = RandomFloat( 360 );
|
|
s = RandomFloatRange( 120.0, 240.0 );
|
|
|
|
// Wider cone of fire
|
|
if( isDefined( wide ))
|
|
{
|
|
s = RandomFloatRange( 210.0, 340.0 );
|
|
}
|
|
|
|
|
|
targetPos = e.origin + ( cos(r)*s, sin(r)*s, 0);
|
|
turret SetTurretTargetPosition( targetPos );
|
|
|
|
// Although technically the turret needs a frame to move,
|
|
// it feels better if it fires before moving.
|
|
// It makes the shots lag behind a bit and get in the players face
|
|
//waittillframeend;
|
|
|
|
turret ShootTurret();
|
|
|
|
wait interval;
|
|
}
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Spawn ally parachute vehicles, start path, and rubber band
|
|
parachute_lz_init()
|
|
{
|
|
// hidden to start with
|
|
thread maps\nx_hithard_fx::hide_lz();
|
|
parachute_lz_sequence();
|
|
}
|
|
|
|
parachute_lz_sequence()
|
|
{
|
|
// wait to hit the first trigger
|
|
flag_wait( "flag_turn_on_lz" );
|
|
thread maps\nx_hithard_fx::lz_flicker_on();
|
|
|
|
// wait to land, then turn it off
|
|
flag_wait("flag_parasecure_parachute_landed_player");
|
|
// wait 1.0;
|
|
thread maps\nx_hithard_fx::lz_flicker_off();
|
|
|
|
thread disable_ride_effects();
|
|
}
|
|
|
|
|
|
// JR TODO
|
|
// Cleanup for effects, drones, and vehicles shown during the ride
|
|
disable_ride_effects()
|
|
{
|
|
// kill smoke
|
|
//delete_exploder();
|
|
// kill AA
|
|
//delete_exploder();
|
|
|
|
// kill UGVs
|
|
//GetEntArray( "parachute_scenary_ugvs", "script_noteworthy" );
|
|
|
|
// kill drones
|
|
//GetEntArray( "parachute_scenary_drones", "script_noteworthy" );
|
|
|
|
// kill drone cars
|
|
//GetEntArray( "parachute_scenary_cars", "script_noteworthy" );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
parachute_audio_settings()
|
|
{
|
|
wait 45;
|
|
level._player deactivatechannelvolumes( "snd_channelvolprio_pain", 1 );
|
|
}
|
|
|
|
// Spawn ally parachute vehicles, start path, and rubber band
|
|
parachute_ally_start( node_landing_location, immediate )
|
|
{
|
|
if ( !IsDefined( immediate ) )
|
|
{
|
|
level._player waittill( "ally_parachute_spawn" );
|
|
}
|
|
|
|
level._player PlaySound( "hithard_para_jump" );
|
|
level._player PlaySound( "hithard_para_ospfade" );
|
|
thread maps\_utility::set_ambient( "nx_hithard_chute" );
|
|
// Variables
|
|
vehicle_targetname = "parachute_" + self.script_noteworthy;
|
|
|
|
// Choose who to have the ally rubber band with
|
|
if ( self.script_noteworthy == "ally_01" )
|
|
{
|
|
rubber_banding_object = level.squad[1];
|
|
|
|
}
|
|
else
|
|
{
|
|
rubber_banding_object = level._player;
|
|
}
|
|
|
|
self.ignoreall = true;
|
|
|
|
self Hide();
|
|
|
|
parachute_vehicle = spawn_vehicle_from_targetname_and_drive( vehicle_targetname );
|
|
parachute_vehicle godon();
|
|
|
|
if ( !IsDefined( immediate ) )
|
|
{
|
|
parachute_vehicle Vehicle_SetSpeedImmediate( 20, 1, 1 );
|
|
|
|
level._player waittill( "notify_player_jump_anim_complete" );
|
|
}
|
|
|
|
parachute_vehicle Vehicle_SetSpeedImmediate( 70, 10000, 10000 );//really high accell and decell
|
|
|
|
parachute_vehicle set_heli_move( "faster" );
|
|
parachute_vehicle SetTurningAbility( 1.0 );
|
|
|
|
self forceteleport( parachute_vehicle.origin, parachute_vehicle.angles );
|
|
|
|
if ( !isdefined( parachute_vehicle ))
|
|
{
|
|
AssertMsg( vehicle_targetname + " did not spawn correctly!" );
|
|
}
|
|
|
|
//parachute_vehicle Vehicle_Teleport( self.origin, parachute_vehicle.angles );
|
|
wait 0.033;
|
|
self linkto( parachute_vehicle, "tag_driver", (0,0,0), (0,0,0) );
|
|
self Show();
|
|
parachute_vehicle guy_enter_vehicle( self );
|
|
|
|
// Start rubber banding
|
|
parachute_vehicle thread parachute_rubber_banding( self, rubber_banding_object );
|
|
|
|
// Run landing sequence
|
|
self thread parachute_ally_landing( parachute_vehicle, node_landing_location );
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
// Controls dialogue and tutorial hint text
|
|
parachute_dialogue()
|
|
{
|
|
waittillframeend;
|
|
|
|
//=================================================================
|
|
// From start to building 2
|
|
//=================================================================
|
|
flag_wait( "flag_parachute_section_01" );
|
|
|
|
// Captain Baker: "Plotted a route to Patriot. On me."
|
|
wait_play_dialogue_wait( 0.1, "hithard_bak_para_05" );
|
|
|
|
//level._player display_hint( "hint_parachute_left" );
|
|
thread display_hint_timeout( "hint_parachute_left", 4 );
|
|
|
|
// Captain Baker: "Shit! Swinging left!"
|
|
wait_play_dialogue_wait( 2.8, "hithard_bak_para_08", undefined, undefined, "flag_parachute_player_rb_fail_allow" );
|
|
|
|
// Captain Baker: "Follow me."
|
|
//wait_play_dialogue_wait( 4.5, "hithard_bak_para_10" );
|
|
|
|
// Duke: "Fuck me!"
|
|
wait_play_dialogue_wait( 4.5, "hithard_gyp_para_01" );
|
|
|
|
// Captain Baker: "Left! Left!"
|
|
//wait_play_dialogue_wait( 1.0, "hithard_bak_para_03" );
|
|
|
|
// Captain Baker: "Steer clear of the smoke!"
|
|
//wait_play_dialogue_wait( 3.0, "hithard_bak_para_02" );
|
|
|
|
//level._player display_hint( "hint_parachute_smoke" );
|
|
//display_hint_timeout( "hint_parachute_smoke", 3 );
|
|
|
|
//=================================================================
|
|
// Building 2
|
|
//=================================================================
|
|
flag_wait( "flag_building2_slow_fall" );
|
|
|
|
// Captain Baker: "Damn - going through!"
|
|
wait_play_dialogue_wait( 0.5, "hithard_bak_para_03" );
|
|
|
|
// Duke: "Holy shit..."
|
|
wait_play_dialogue_wait( 3.5, "hithard_gyp_para_02" );
|
|
|
|
|
|
//level._player display_hint( "hint_parachute_right" );
|
|
|
|
|
|
//=================================================================
|
|
// Y intersection
|
|
//=================================================================
|
|
|
|
flag_wait( "flag_parachute_section_03" );
|
|
|
|
// Captain Baker: "They're everywhere!"
|
|
wait_play_dialogue_wait( 5.2, "hithard_bak_para_11" );
|
|
|
|
// Captain Baker: "Go around!"
|
|
//wait_play_dialogue_wait( 4.5, "hithard_bak_para_14" );
|
|
|
|
|
|
//=================================================================
|
|
// Building 3 explosion
|
|
//=================================================================
|
|
flag_wait_any( "flag_parachute_building3_explosion_left", "flag_parachute_building3_explosion_right" );
|
|
|
|
// Captain Baker: "Watch out!"
|
|
wait_play_dialogue_wait( 0.35, "hithard_bak_para_13" );
|
|
|
|
|
|
//=================================================================
|
|
// From building 4 to landing
|
|
//=================================================================
|
|
flag_wait( "flag_parachute_section_04" );
|
|
|
|
// Captain Baker: "LZ. Eleven o'clock!"
|
|
wait_play_dialogue_wait( 1.1, "hithard_bak_para_16" );
|
|
|
|
|
|
// Captain Baker: "Contacts, top of the parking structure."
|
|
wait_play_dialogue_wait( 4.0, "hithard_bak_snipe_02" );
|
|
|
|
// Captain Baker: "Theres the LZ. Prep for hard landing."
|
|
//wait_play_dialogue_wait( 4.0, "hithard_bak_para_16" );
|
|
|
|
// Captain Baker: "We have tangos at the LZ. Cut your chutes and engage."
|
|
//wait_play_dialogue_wait( 4.0, "hithard_bak_para_20" );
|
|
}
|
|
|
|
|
|
// Helper script for timing dialogue
|
|
wait_play_dialogue_wait( wait_in, dialogue1, dialogue2, wait_out, flag )
|
|
{
|
|
wait( wait_in );
|
|
|
|
if( cointoss() || !isDefined( dialogue2 ))
|
|
{
|
|
thread radio_dialogue( dialogue1 );
|
|
}
|
|
else
|
|
{
|
|
thread radio_dialogue_flag_set( dialogue2, flag );
|
|
}
|
|
|
|
if( isDefined( flag ))
|
|
{
|
|
flag_set( flag );
|
|
}
|
|
|
|
if( isDefined( wait_out ))
|
|
{
|
|
wait( wait_out );
|
|
}
|
|
}
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// plays a radio dialogue and then sets a flag
|
|
radio_dialogue_flag_set( dialogue, flag )
|
|
{
|
|
radio_dialogue( dialogue );
|
|
flag_set( flag );
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Tell player to flare ( brake ) for landing
|
|
parachute_display_flare()
|
|
{
|
|
level endon( "flag_parasecure_parachute_landed_player" );
|
|
level endon( "notify_parachute_objective_complete" );
|
|
//while( level._player.origin[2] > 350 )
|
|
//{
|
|
// level._player display_hint( "hint_parachute_flare" );
|
|
// wait 0.01;
|
|
//}
|
|
|
|
// Small delay so the tip doesnt come up too early.
|
|
wait( 2.0 );
|
|
|
|
display_hint_timeout( "hint_parachute_flare", 3 );
|
|
}
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Player gets hurt while in smoke
|
|
parachute_hurt_smoke()
|
|
{
|
|
// Stop this script when the chute section is done
|
|
level endon( "notify_parachute_objective_complete" );
|
|
|
|
// While in Parachute sequence
|
|
while( !flag( "flag_parasecure_parachute_landed_player" ))
|
|
{
|
|
// Wait for player to be in smoke
|
|
flag_wait( "flag_parachute_hurt_smoke" );
|
|
|
|
// While in the smoke
|
|
while ( flag( "flag_parachute_hurt_smoke" ) )
|
|
{
|
|
// Slow them down and prevent dropping
|
|
// This gives the player some time to get out of the smoke
|
|
level._forward_brake_deceleration = -150.0;
|
|
level._descent_acceleration = 0.0;
|
|
level._max_descent_velocity = 15;
|
|
level._min_descent_velocity = 0;
|
|
level._max_forward_velocity = 400;
|
|
|
|
level._player display_hint( "hint_parachute_smoke" );
|
|
|
|
//if( cointoss())
|
|
//{
|
|
// radio_dialogue( "hithard_bak_para_02" ); // JR - Line was cut
|
|
//}
|
|
//else
|
|
//{
|
|
//radio_dialogue( "hithard_bak_para_13" );
|
|
//}
|
|
|
|
//PlayFX( LoadFX( "smoke/thick_dark_smoke_giant_dcburning" ), self.origin );
|
|
self PlayRumbleOnEntity( "grenade_rumble" );
|
|
self StunPlayer( 1.5 );
|
|
self thread play_sound_on_entity( "breathing_hurt" );
|
|
if ( self.health <= 45 )
|
|
{
|
|
if ( !flag( "flag_parachute_objective_failed" ))
|
|
{
|
|
maps\nx_hithard_util::objective_failed( "parachute", &"NX_HITHARD_PARACHUTE_FAIL_SMOKE" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self.health = self.health - 30;
|
|
}
|
|
|
|
wait 1.25;
|
|
}
|
|
|
|
level._forward_brake_deceleration = 0.0;
|
|
level._descent_acceleration = 0.0;
|
|
level._max_descent_velocity = 1200;
|
|
level._min_descent_velocity = 77;
|
|
level._max_forward_velocity = 890;
|
|
|
|
// Not in smoke anymore
|
|
}
|
|
}
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Ally landing sequence
|
|
parachute_ally_landing( parachute_vehicle, node_landing_location )
|
|
{
|
|
flag_wait( "flag_node_parachute_approach_" + self.script_noteworthy );
|
|
|
|
parachute_vehicle set_heli_move( "approach" );//make the pitch and roll less, also make the yaw tighter. needed to get things to line up.
|
|
|
|
level notify ( "parachute_approach_start" );
|
|
|
|
flag_wait( "flag_origin_path_parachute_land_" + self.script_noteworthy );
|
|
level notify ( "parachute_path_complete" );
|
|
|
|
// Vars
|
|
flag_node_anim_name = "origin_begin_land_" + self.script_noteworthy;
|
|
|
|
// Get the node that will initiate the landing anim
|
|
flag_node_ally_land = GetStruct( flag_node_anim_name, "script_noteworthy" );
|
|
|
|
// flag_wait( flag_node_anim_name );
|
|
|
|
// Squad leader only
|
|
// if ( self.script_noteworthy == level.squad_noteworthies[0] )
|
|
// {
|
|
// // Dialogue: "Snipers on the roof. Northwest corner. Take 'em out."
|
|
// thread radio_dialogue( "hithard_bak_secure_01" );
|
|
// //objective_setpointertextoverride( 1, &"" ); //Clear the pointer text
|
|
// //objective_onentity( 1, node_landing_location );
|
|
// }
|
|
|
|
//now we need to move the parachute and the actor together to the node for animation lerping their angles
|
|
//and position.
|
|
|
|
|
|
level notify( "notify_ally_parachute_complete" );
|
|
|
|
//reached the end of the path sort of. Where we want to end is right before the last node so there is no speed drop.
|
|
parachute_vehicle vehicle_stoppath();
|
|
|
|
parachute_vehicle suspend_drive_anims_for_vignette();
|
|
|
|
//... but that means were not gauranteed to be on the node, so instead lets use a mover to lerp our orientation
|
|
// and position at the same speed as the vehicle was moving to the correct location.
|
|
dist = Distance( flag_node_ally_land.origin, parachute_vehicle.origin );
|
|
time = dist / ( parachute_vehicle.veh_speed * CONST_MPHCONVERSION );
|
|
|
|
actor_anim_name = "anim_parachute_land_" + self.script_noteworthy; //anim_parachute_land_ally_02
|
|
vehicle_anim_name = "anim_parachute_" + self.script_noteworthy; //anim_parachute_ally_02
|
|
|
|
self unlink();
|
|
parachute_vehicle guy_exit_vehicle( self );
|
|
parachute_vehicle hide();
|
|
|
|
parachute = spawn( "script_model", parachute_vehicle.origin );
|
|
parachute.angles = parachute_vehicle.angles;
|
|
parachute SetModel( level._scr_model[ vehicle_anim_name ] );
|
|
parachute UseAnimTree( level._scr_animtree[ vehicle_anim_name ] );
|
|
self LinkTo( parachute, "tag_driver" );
|
|
|
|
//also need to play the idle anim in the same spot as the vehicle.
|
|
parachute_anim = level._vehicle_DriveIdle[ "vehicle_parachute" ];
|
|
idle_time = parachute_vehicle GetAnimTime( parachute_anim );
|
|
parachute SetAnim( parachute_anim, 1, 0 );
|
|
parachute SetAnimTime( parachute_anim, idle_time );
|
|
|
|
parachute MoveTo( flag_node_ally_land.origin, time, 0, 0 );//do not accelerate.
|
|
parachute RotateTo( flag_node_ally_land.angles, time );
|
|
|
|
wait time;
|
|
|
|
self unlink();
|
|
|
|
//now that we're at the right location, play the animation for the landing.
|
|
land_group = [];
|
|
land_group["parachute" + self.script_noteworthy] = parachute;
|
|
land_group["ally" + self.script_noteworthy] = self;
|
|
|
|
parachute.animname = vehicle_anim_name;
|
|
self.animname = actor_anim_name;
|
|
parachute UseAnimTree( level._scr_animtree[ vehicle_anim_name ] );
|
|
|
|
flag_node_ally_land anim_single( land_group, "anim_parachute_land" );
|
|
|
|
self.ignoreall = false;
|
|
}
|
|
|
|
// Loads and plays the animated billboard binks
|
|
parachute_billboard_binks( from_playerstart )
|
|
{
|
|
// Only wait for this flag when playing natural progression
|
|
if( !isDefined( from_playerstart ))
|
|
{
|
|
level._player waittill("intro_aa_start");
|
|
}
|
|
|
|
// preload the movie
|
|
SetSavedDvar( "cg_cinematicFullScreen", "0" );
|
|
CinematicInGameLoopResident( "HHAH_Ads" );
|
|
|
|
level waittill( "flag_prepare_for_landing" );
|
|
|
|
StopCinematicInGame();
|
|
}
|
|
|
|
|
|
|
|
//*******************************************************************
|
|
// *
|
|
// *
|
|
//*******************************************************************
|
|
|
|
// Triggers the 2 vtols that fly in after building 2
|
|
parachute_periph_vtols()
|
|
{
|
|
flag_wait( "flag_parachute_section_02" );
|
|
wait( 0.3 );
|
|
vtol = spawn_vehicles_from_targetname_and_drive ( "periph_vtols" );
|
|
}
|
|
|
|
parachute_bridge_explo_sfx()
|
|
{
|
|
level._player setchannelvolumes( "snd_channelvolprio_pain", "nx_hithard_skybridge_explo", 1.7 );
|
|
wait( 1.71 );
|
|
skybridge_explo = getent("parachute_bridge_exp1_01", "targetname");
|
|
skybridge_explo playsound("hithard_skybridge_destroy");
|
|
|
|
wait 4.0;
|
|
level._player deactivatechannelvolumes( "snd_channelvolprio_pain", 1 );
|
|
|
|
}
|
|
|
|
// Triggers a series of explosions across skybridge 1
|
|
parachute_bridge_explosion_01()
|
|
{
|
|
flag_wait( "flag_parachute_section_03" );
|
|
thread parachute_bridge_explo_sfx();
|
|
|
|
wait( 2.25 );
|
|
|
|
// Stop spawning civilians
|
|
flag_set( "flag_skybridge_exp_1" );
|
|
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp1_01", "targetname" ));
|
|
wait( 0.16 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp1_02", "targetname" ));
|
|
wait( 0.11 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp1_03", "targetname" ));
|
|
wait( 0.22 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp1_04", "targetname" ));
|
|
wait( 0.35 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp1_05", "targetname" ));
|
|
}
|
|
|
|
// Triggers a series of explosions across skybridge 2
|
|
parachute_bridge_explosion_02()
|
|
{
|
|
flag_wait( "flag_parachute_section_03" );
|
|
wait( 2.8 );
|
|
|
|
// Stop spawning civilians
|
|
flag_set( "flag_skybridge_exp_2" );
|
|
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp2_01", "targetname" ));
|
|
wait( 0.50 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp2_02", "targetname" ));
|
|
wait( 0.15 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp2_03", "targetname" ));
|
|
wait( 0.18 );
|
|
skybridge_single_explosion( getEnt( "parachute_bridge_exp2_04", "targetname" ));
|
|
wait( 0.12 );
|
|
}
|
|
|
|
// Causes 1 skybridge explosion with physics force
|
|
skybridge_single_explosion( origin )
|
|
{
|
|
forward = AnglesToForward( origin.angles );
|
|
up = AnglesToUp( origin.angles );
|
|
playFX( level._effect[ "nx_explosion_skybridge" ], origin.origin, forward, up );
|
|
//playFX( level._effect[ "osprey_missle_hit_explosion_l" ], origin.origin, forward, up );
|
|
radiusDamage( origin.origin, origin.radius, 9000, 9000 );
|
|
wait( 0.05 );
|
|
PhysicsExplosionSphere( origin.origin, origin.radius * 2, ( origin.radius * 2 ), 5 );
|
|
}
|
|
|
|
// Skybridge civilians ragdoll when dead
|
|
skybridge_civilian_logic( stop_flag )
|
|
{
|
|
level endon( stop_flag );
|
|
self.skipDeathAnim = true;
|
|
|
|
self waittill( "death" );
|
|
if( isDefined( self ))
|
|
{
|
|
self StartRagdoll();
|
|
}
|
|
}
|
|
|
|
|
|
// JR - Playerstart debug point for testing the skybridge explosion
|
|
playerstart_skybridge_debug()
|
|
{
|
|
maps\nx_crowd_controller::main();
|
|
|
|
// teleport player
|
|
level._player maps\_nx_utility::move_player_to_start_point( "playerstart_skybridge_debug" );
|
|
thread maps\nx_hithard_fx::apply_vision_and_fog_parachute_jump(0.0);
|
|
|
|
// Start civilians
|
|
skybridge_civilians = GetEntArray( "parachute_civies_04_spawner", "script_noteworthy" );
|
|
array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_1" );
|
|
thread parachute_civilian_panic_logic( "civies_04", "flag_skybridge_exp_1" );
|
|
|
|
skybridge_civilians = GetEntArray( "parachute_civies_04b_spawner", "script_noteworthy" );
|
|
array_spawn_function( skybridge_civilians, ::skybridge_civilian_logic, "flag_skybridge_exp_2" );
|
|
thread parachute_civilian_panic_logic( "civies_04b", "flag_skybridge_exp_2" );
|
|
|
|
thread parachute_bridge_explosion_01();
|
|
thread parachute_bridge_explosion_02();
|
|
thread skybridge_magic_bullets_01();
|
|
thread skybridge_magic_bullets_02();
|
|
|
|
// Wait here forever
|
|
flag_wait( "flag_parachute_section_04" );
|
|
}
|
|
|
|
// JR - This is only used with the skybridge debug start
|
|
skybridge_debug()
|
|
{
|
|
// wait here forever
|
|
flag_wait( "flag_parachute_section_04" );
|
|
}
|
|
|
|
|
|
// JR - This needs to be timed up in synch with the bridge explosions
|
|
skybridge_magic_bullets_01()
|
|
{
|
|
flag_wait( "flag_parachute_section_03" );
|
|
|
|
wait( 0.4 );
|
|
|
|
// Get the origin node
|
|
magic_bullet_node = GetEnt( "skybridge_magic_bullet", "targetname" );
|
|
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_01", "targetname" ).origin );
|
|
wait 0.4;
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_02", "targetname" ).origin );
|
|
wait 0.65;
|
|
//magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_03", "targetname" ).origin );
|
|
//wait 0.5;
|
|
//magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_04", "targetname" ).origin );
|
|
wait 0.45;
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp1_05", "targetname" ).origin );
|
|
}
|
|
|
|
// Upper skybridge bullets
|
|
skybridge_magic_bullets_02()
|
|
{
|
|
flag_wait( "flag_parachute_section_03" );
|
|
wait( 0.25 );
|
|
|
|
// Get the origin node
|
|
magic_bullet_node = GetEnt( "skybridge_magic_bullet", "targetname" );
|
|
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_02", "targetname" ).origin );
|
|
wait( 0.75 );
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_03", "targetname" ).origin );
|
|
wait( 0.45 );
|
|
magicbullet( "rpgx_straight", magic_bullet_node.origin, getEnt( "parachute_bridge_exp2_04", "targetname" ).origin );
|
|
}
|