1378 lines
44 KiB
Plaintext
1378 lines
44 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
start()
|
|
{
|
|
maps\black_ice_util::player_start( "player_start_swim" );
|
|
level.player setclienttriggeraudiozone( "blackice_camera", 0 );
|
|
maps\_utility::battlechatter_off( "allies" );
|
|
maps\_utility::battlechatter_off( "axis" );
|
|
thread underwater_sfx();
|
|
thread maps\black_ice_audio::sfx_camera_intro();
|
|
thread swim_godrays();
|
|
maps\_utility::music_play( "mus_blackice_intro" );
|
|
level.const_expected_num_swim_allies = 2;
|
|
level._allies_swim = maps\black_ice_util::spawn_allies_swim();
|
|
|
|
foreach ( var_1 in level._allies )
|
|
var_1 hide();
|
|
}
|
|
|
|
main()
|
|
{
|
|
level.g_friendlynamedist_old = getdvarint( "g_friendlyNameDist" );
|
|
setsaveddvar( "g_friendlyNameDist", 0 );
|
|
level.breach_anim_node = common_scripts\utility::getstruct( "breach_anim_node", "script_noteworthy" );
|
|
level.allies_breach_anim_node = common_scripts\utility::getstruct( "vignette_introbreach_allies", "script_noteworthy" );
|
|
level.snake_cam_anim_node = common_scripts\utility::getstruct( "Intro_Snake", "script_noteworthy" );
|
|
ally_setup();
|
|
player_setup();
|
|
enemy_setup();
|
|
props_setup();
|
|
snake_cam_logic();
|
|
thread swim_godrays();
|
|
player_swim_setup();
|
|
enemy_swim_setup();
|
|
thread maps\black_ice_anim::swim_intro_anims();
|
|
swim_detonate_logic();
|
|
}
|
|
|
|
section_post_inits()
|
|
{
|
|
common_scripts\utility::array_call( getentarray( "opt_hide_swim", "script_noteworthy" ), ::hide );
|
|
}
|
|
|
|
swim_check_node_distance()
|
|
{
|
|
var_0 = 10000;
|
|
var_1 = cos( 45 );
|
|
|
|
while ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
{
|
|
var_2 = distancesquared( level.player geteye(), level.breach_pos );
|
|
|
|
if ( var_2 < var_0 )
|
|
{
|
|
if ( maps\_utility::within_fov_2d( level.player geteye(), level.player.angles, level.breach_pos, var_1 ) )
|
|
{
|
|
common_scripts\utility::flag_set( "flag_swim_player_drop_tank" );
|
|
level notify( "notify_begin_camp_logic" );
|
|
}
|
|
}
|
|
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
section_flag_inits()
|
|
{
|
|
common_scripts\utility::flag_init( "flag_detonate_fail" );
|
|
common_scripts\utility::flag_init( "flag_underwater_sfx" );
|
|
common_scripts\utility::flag_init( "flag_outofwater_sfx" );
|
|
common_scripts\utility::flag_init( "flag_swim_player_drop_tank" );
|
|
common_scripts\utility::flag_init( "flag_swim_breach_detonate" );
|
|
common_scripts\utility::flag_init( "flag_all_enemies_dead" );
|
|
common_scripts\utility::flag_init( "flag_player_breaching" );
|
|
common_scripts\utility::flag_init( "flag_player_clear_to_breach" );
|
|
common_scripts\utility::flag_init( "flag_intro_above_ice" );
|
|
common_scripts\utility::flag_init( "flag_snake_cam_below_water" );
|
|
}
|
|
|
|
section_precache()
|
|
{
|
|
maps\_utility::add_hint_string( "detonate_string", &"BLACK_ICE_SWIM_DETONATE", ::detonate_string_func );
|
|
precacheshader( "dogcam_frame_bot" );
|
|
precacheshader( "dogcam_frame_top" );
|
|
precacheshader( "dogcam_bracket_l" );
|
|
precacheshader( "dogcam_bracket_r_nd" );
|
|
precacheshader( "dogcam_center" );
|
|
precacheshader( "dogcam_timestamp_no_record" );
|
|
precacheshader( "scubamask_overlay_delta" );
|
|
precacheshader( "black" );
|
|
}
|
|
|
|
ally_setup()
|
|
{
|
|
for ( var_0 = 0; var_0 < level.const_expected_num_swim_allies; var_0++ )
|
|
{
|
|
level._allies_swim[var_0].animname = "scuba_ally";
|
|
level._allies_swim[var_0] thread maps\_underwater::friendly_bubbles();
|
|
level._allies_swim[var_0] thread maps\black_ice_fx::fx_intro_friendly_glowsticks();
|
|
level._allies_swim[var_0].launcher = maps\_utility::spawn_anim_model( "ascend_launcher_non_anim" );
|
|
level._allies_swim[var_0].launcher linkto( level._allies_swim[var_0], "TAG_STOWED_BACK", ( 0, 1, 5 ), ( 0, 0, 30 ) );
|
|
}
|
|
}
|
|
|
|
enemy_setup()
|
|
{
|
|
var_0 = getentarray( "snake_cam_enemy", "script_noteworthy" );
|
|
var_1 = maps\_utility::array_spawn( var_0 );
|
|
|
|
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
|
{
|
|
var_3 = var_1[var_2];
|
|
var_3 maps\_utility::set_battlechatter( 0 );
|
|
var_3.combatmode = "no_cover";
|
|
var_3.ignoreall = 1;
|
|
var_3.ignoreme = 1;
|
|
var_3.newenemyreactiondistsq_old = self.newenemyreactiondistsq;
|
|
var_3.newenemyreactiondistsq = 0;
|
|
var_3.grenadeammo = 0;
|
|
var_3.animname = "snake_cam_enemy";
|
|
}
|
|
|
|
level.snake_cam_enemies = var_1;
|
|
}
|
|
|
|
player_setup()
|
|
{
|
|
level.snake_cam_dummy = getent( "snake_terrain_cam", "targetname" );
|
|
level.snake_cam_dummy.animname = "snake_cam";
|
|
level.snake_cam_dummy maps\_anim::setanimtree();
|
|
maps\black_ice_util::player_animated_sequence_restrictions();
|
|
level.player playerlinkweaponviewtodelta( level.snake_cam_dummy, "tag_player", 1, 0, 0, 0, 0, 1 );
|
|
level.player playerlinkedsetviewznear( 0 );
|
|
level.player thread snake_cam_hud();
|
|
thread maps\black_ice_fx::snake_cam_fx();
|
|
thread snake_cam_vision_flicker();
|
|
level.player lerpfov( 45, level.timestep );
|
|
}
|
|
|
|
snake_cam_hud()
|
|
{
|
|
maps\black_ice_util::black_ice_hide_hud();
|
|
level.player takeweapon( "fraggrenade" );
|
|
level.player takeweapon( "flash_grenade" );
|
|
self.hud_elements = [];
|
|
var_0 = maps\_hud_util::create_client_overlay( "nightvision_overlay_goggles", 0.3 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = maps\_hud_util::createclienticon( "dogcam_center", 600, 300 );
|
|
var_0 maps\_hud_util::setpoint( "CENTER", undefined, 0, 0, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclienticon( "dogcam_frame_top", 600, 40 );
|
|
var_0 maps\_hud_util::setpoint( "TOP", "TOP", 0, -20, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclienticon( "dogcam_frame_bot", 600, 80 );
|
|
var_0 maps\_hud_util::setpoint( "BOTTOM", "BOTTOM", 0, 32, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclienticon( "dogcam_bracket_r_nd", 60, 400 );
|
|
var_0 maps\_hud_util::setpoint( "RIGHT", "RIGHT", 0, 0, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclienticon( "dogcam_bracket_l", 69, 400 );
|
|
var_0 maps\_hud_util::setpoint( "LEFT", "LEFT", 0, 0, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclienticon( "dogcam_timestamp_no_record", 200, 25 );
|
|
var_0 maps\_hud_util::setpoint( "LEFT BOTTOM", "LEFT BOTTOM", 14, -25, 0 );
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
var_0 = level.player maps\_hud_util::createclientfontstring( "default", 0.8 );
|
|
var_0 maps\_hud_util::setpoint( "RIGHT BOTTOM", "LEFT BOTTOM", 188.5, -34, 0 );
|
|
var_0 settext( "00 : 00 00" );
|
|
var_0.alpha = 0.4;
|
|
var_0 thread snake_cam_time_countup();
|
|
self.hud_elements[self.hud_elements.size] = var_0;
|
|
}
|
|
|
|
snake_cam_time_countup()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = gettime();
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = "";
|
|
var_2 = "";
|
|
var_3 = "";
|
|
var_4 = gettime();
|
|
var_5 = int( var_4 / 60000 );
|
|
var_4 = var_4 - var_5 * 60000;
|
|
|
|
if ( var_5 < 10 )
|
|
var_1 = "0";
|
|
|
|
var_6 = int( var_4 / 1000 );
|
|
var_4 = var_4 - var_6 * 1000;
|
|
|
|
if ( var_6 < 10 )
|
|
var_2 = "0";
|
|
|
|
var_7 = int( var_4 / 10 );
|
|
|
|
if ( var_7 < 10 )
|
|
var_3 = "0";
|
|
|
|
self settext( var_1 + var_5 + " : " + var_2 + var_6 + " " + var_3 + var_7 );
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
snake_cam_hud_cleanup()
|
|
{
|
|
foreach ( var_1 in level.player.hud_elements )
|
|
{
|
|
var_1 destroy();
|
|
var_1 = undefined;
|
|
}
|
|
|
|
level.player.hud_elements = undefined;
|
|
}
|
|
|
|
snake_cam_vision_flicker()
|
|
{
|
|
var_0 = 0.06;
|
|
var_1 = 0;
|
|
level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam", 0 );
|
|
|
|
while ( !common_scripts\utility::flag( "flag_snake_cam_below_water" ) )
|
|
{
|
|
if ( !common_scripts\utility::flag( "flag_snake_cam_below_water" ) )
|
|
{
|
|
if ( var_1 )
|
|
{
|
|
level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam", var_0 );
|
|
var_1 = 0;
|
|
}
|
|
else
|
|
{
|
|
level.player maps\_utility::vision_set_fog_changes( "black_ice_snakecam_dark", var_0 );
|
|
var_1 = 1;
|
|
}
|
|
}
|
|
|
|
wait( var_0 );
|
|
}
|
|
|
|
level.player maps\_utility::vision_set_fog_changes( "black_ice_infil_dark", 0.2 );
|
|
}
|
|
|
|
snake_cam_logic()
|
|
{
|
|
thread set_snakecam_dof();
|
|
thread black_fade( 0, 7, 0.1, 1 );
|
|
wait 1;
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_wereinposition" );
|
|
wait 2;
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_rogeractual" );
|
|
wait 3;
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_eyescomingup" );
|
|
wait 1;
|
|
thread snake_cam_dialogue();
|
|
thread swim_intro_dialogue();
|
|
thread maps\black_ice_anim::snake_cam_enemy_anims();
|
|
thread maps\black_ice_anim::swim_props_first_frame_anims();
|
|
thread maps\black_ice_anim::swim_vehicles_snake_cam_anims();
|
|
thread snake_cam_shake_rumble();
|
|
thread snake_cam_input_logic();
|
|
level waittill( "notify_underwater_transition" );
|
|
snake_cam_transition_to_underwater();
|
|
}
|
|
|
|
snake_cam_dialogue()
|
|
{
|
|
level waittill( "notify_snake_cam_dialogue_line2_1" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_lastpatrolisinbound" );
|
|
level waittill( "notify_snake_cam_dialogue_line2_2" );
|
|
maps\_utility::smart_radio_dialogue( "black_ice_mrk_copybravo" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_isthatallof" );
|
|
level waittill( "notify_snake_cam_dialogue_line2_3" );
|
|
maps\_utility::smart_radio_dialogue( "black_ice_hsh_rogeritsafullhouse" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_seeyoutopside" );
|
|
level waittill( "notify_snake_cam_dialogue_line2_4" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_adamletsgo" );
|
|
}
|
|
|
|
swim_intro_dialogue()
|
|
{
|
|
level waittill( "notify_snake_cam_dialogue_line3_1" );
|
|
maps\_utility::smart_radio_dialogue( "black_ice_mrk_chargesaresetand" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_letsintroduceourselveson" );
|
|
level waittill( "notify_swim_dialog5_1" );
|
|
thread maps\_utility::smart_radio_dialogue( "blackice_bkr_markdropthem" );
|
|
wait 1;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
maps\_utility::display_hint( "detonate_string" );
|
|
|
|
wait 3.0;
|
|
var_0 = 2.0;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
maps\_utility::smart_radio_dialogue( "blackice_bkr_dropthemrook" );
|
|
|
|
wait( var_0 );
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
maps\_utility::smart_radio_dialogue( "blackice_bkr_setoffcharges" );
|
|
|
|
wait( var_0 );
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
maps\_utility::smart_radio_dialogue( "blackice_bkr_windowsclosing" );
|
|
|
|
wait( var_0 );
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
maps\_utility::smart_radio_dialogue( "blackice_bkr_theyremoving" );
|
|
|
|
wait( var_0 );
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_breach_detonate" ) )
|
|
{
|
|
setdvar( "ui_deadquote", &"BLACK_ICE_SWIM_DETONATE_FAIL" );
|
|
common_scripts\utility::flag_set( "flag_detonate_fail" );
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|
|
}
|
|
|
|
snake_cam_shake_rumble()
|
|
{
|
|
level.player_rumble_ent = maps\black_ice_util::get_rumble_ent_linked( level.snake_cam_dummy );
|
|
wait 0.05;
|
|
level.player_rumble_ent.intensity = 0;
|
|
level waittill( "notify_rumble_snowmobile_1" );
|
|
thread player_rumble_bump( 0.08, 0.0, 0.2, 0, 0.5 );
|
|
level waittill( "notify_rumble_snowmobile_2" );
|
|
thread player_rumble_bump( 0.13, 0.0, 0.2, 0, 0.5 );
|
|
level waittill( "notify_rumble_truck_1" );
|
|
thread player_rumble_bump( 0.18, 0.0, 0.2, 0, 1.15 );
|
|
level waittill( "notify_rumble_truck_2" );
|
|
thread player_rumble_bump( 0.6, 0.0, 0.3, 0, 0.75 );
|
|
level waittill( "notify_rumble_truck_3" );
|
|
thread player_rumble_bump( 0.6, 0.0, 0.6, 0, 1.25 );
|
|
level waittill( "notify_rumble_truck_off" );
|
|
thread player_rumble_bump( 0.0, 0.0, 0.75, 0, 0.01 );
|
|
level waittill( "notify_rumble_cam_1" );
|
|
thread player_rumble_bump( 0.22, 0.0, 0.01, 0, 0.3 );
|
|
level waittill( "notify_rumble_cam_2" );
|
|
thread player_rumble_bump( 0.21, 0.0, 0.1, 0, 0.4 );
|
|
level waittill( "notify_rumble_cam_3" );
|
|
thread player_rumble_bump( 0.18, 0.0, 0.1, 0, 0.55 );
|
|
level waittill( "notify_rumble_cam_4" );
|
|
thread player_rumble_bump( 0.21, 0.0, 0.1, 0, 0.75 );
|
|
wait 4;
|
|
level.player_rumble_ent delete();
|
|
}
|
|
|
|
player_rumble_bump( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
level notify( "notify_new_rumble_bump" );
|
|
level endon( "notify_new_rumble_bump" );
|
|
level.player_rumble_ent maps\_utility::rumble_ramp_to( var_0, var_2 );
|
|
wait( var_2 + var_3 );
|
|
level.player_rumble_ent maps\_utility::rumble_ramp_to( var_1, var_4 );
|
|
}
|
|
|
|
snake_cam_noise( var_0 )
|
|
{
|
|
level endon( "notify_underwater_transition" );
|
|
level notify( "snake_cam_noise" );
|
|
var_1 = level.snake_cam_dummy.noise_amplitude;
|
|
var_2 = 0.1;
|
|
var_3 = 150;
|
|
var_4 = gettime();
|
|
|
|
while ( gettime() - var_4 < var_3 )
|
|
{
|
|
var_5 = ( randomfloatrange( -1 * var_1, var_1 ), randomfloatrange( -1 * var_1, var_1 ), randomfloatrange( -1 * var_1, var_1 ) );
|
|
level.snake_cam_dummy.angles = level.snake_cam_dummy.angles + var_5;
|
|
wait( var_2 );
|
|
}
|
|
|
|
thread snake_cam_noise_falloff( var_1 );
|
|
}
|
|
|
|
snake_cam_noise_falloff( var_0 )
|
|
{
|
|
level endon( "notify_underwater_transition" );
|
|
level endon( "snake_cam_noise" );
|
|
var_1 = level.snake_cam_dummy.noise_min_amplitude;
|
|
var_2 = 0.1;
|
|
var_3 = 100;
|
|
var_4 = 0.75;
|
|
|
|
for (;;)
|
|
{
|
|
var_5 = gettime();
|
|
|
|
while ( gettime() - var_5 < var_3 )
|
|
{
|
|
var_6 = ( randomfloatrange( -1 * var_0, var_0 ), randomfloatrange( -1 * var_0, var_0 ), randomfloatrange( -1 * var_0, var_0 ) );
|
|
level.snake_cam_dummy.angles = level.snake_cam_dummy.angles + var_6;
|
|
wait( var_2 );
|
|
}
|
|
|
|
var_0 = var_0 * var_4;
|
|
|
|
if ( var_0 < var_1 )
|
|
var_0 = var_1;
|
|
}
|
|
}
|
|
|
|
snake_cam_input_logic()
|
|
{
|
|
level endon( "notify_underwater_transition" );
|
|
var_0 = 0;
|
|
var_1 = level.snake_cam_dummy.angles;
|
|
var_2 = 45;
|
|
var_3 = var_1[1] - var_2;
|
|
var_4 = var_1[1] + var_2;
|
|
var_5 = 12;
|
|
var_6 = var_1[0] - var_5;
|
|
var_7 = var_1[0] + var_5 / 2;
|
|
var_8 = var_1[1];
|
|
var_9 = var_1[1];
|
|
var_10 = var_1[0];
|
|
var_11 = var_1[0];
|
|
var_12 = 0.075;
|
|
var_13 = var_12 * ( var_2 / var_5 );
|
|
var_14 = 0;
|
|
var_15 = 0;
|
|
var_16 = 0;
|
|
var_17 = 0;
|
|
var_18 = 1000;
|
|
var_19 = undefined;
|
|
var_20 = 0.6;
|
|
var_21 = 0.48;
|
|
level.snake_cam_dummy.noise_min_amplitude = 0.09;
|
|
level.snake_cam_dummy.noise_amplitude = level.snake_cam_dummy.noise_min_amplitude;
|
|
thread snake_cam_noise( level.snake_cam_dummy.angles );
|
|
|
|
if ( !level.console && !level.player common_scripts\utility::is_player_gamepad_enabled() )
|
|
level.player enablemousesteer( 1 );
|
|
|
|
for (;;)
|
|
{
|
|
var_22 = level.player getnormalizedcameramovement();
|
|
|
|
if ( !level.console && !level.player common_scripts\utility::is_player_gamepad_enabled() )
|
|
var_22 = ( var_22[0], var_22[1] * -1, var_22[2] );
|
|
|
|
if ( var_22[1] || var_22[0] )
|
|
{
|
|
var_14 = common_scripts\utility::ter_op( var_22[1] > 0, 1, -1 );
|
|
var_16 = common_scripts\utility::ter_op( var_22[0] > 0, 1, -1 );
|
|
|
|
if ( !var_0 || var_14 != var_15 || var_16 != var_17 )
|
|
{
|
|
if ( !isdefined( var_19 ) || gettime() - var_19 > var_18 )
|
|
{
|
|
var_19 = gettime();
|
|
level.snake_cam_dummy.noise_amplitude = var_20;
|
|
}
|
|
else
|
|
level.snake_cam_dummy.noise_amplitude = var_21;
|
|
|
|
var_0 = 1;
|
|
thread snake_cam_noise( level.snake_cam_dummy.angles );
|
|
thread maps\black_ice_audio::sfx_camera_mvmt();
|
|
}
|
|
|
|
var_9 = common_scripts\utility::ter_op( var_22[1] > 0, var_3, var_4 );
|
|
var_11 = common_scripts\utility::ter_op( var_22[0] > 0, var_6, var_7 );
|
|
var_8 = var_8 + ( var_9 - var_8 ) * var_12 * abs( var_22[1] );
|
|
var_10 = var_10 + ( var_11 - var_10 ) * var_13 * abs( var_22[0] );
|
|
level.snake_cam_dummy.angles = ( var_10, var_8, var_1[2] );
|
|
var_15 = var_14;
|
|
var_17 = var_16;
|
|
}
|
|
else
|
|
{
|
|
var_15 = 0;
|
|
var_17 = 0;
|
|
var_0 = 0;
|
|
}
|
|
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
snake_cam_transition_to_underwater()
|
|
{
|
|
var_0 = 0.5;
|
|
var_1 = 0;
|
|
var_2 = 1.0;
|
|
thread black_fade( var_0, var_1, var_2 );
|
|
wait( var_0 );
|
|
thread snake_cam_hud_cleanup();
|
|
level.player visionsetnakedforplayer( "", 0 );
|
|
level.player lerpfov( 60, level.timestep );
|
|
level.player unlink();
|
|
thread borescope_pip();
|
|
level notify( "snake_cam_transition_to_underwater_complete" );
|
|
}
|
|
|
|
black_fade( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = maps\_hud_util::create_client_overlay( "black", 0, level.player );
|
|
|
|
if ( var_0 > 0 )
|
|
var_4 fadeovertime( var_0 );
|
|
|
|
var_4.alpha = 1;
|
|
|
|
if ( isdefined( var_3 ) )
|
|
var_4.foreground = 0;
|
|
|
|
wait( var_0 );
|
|
wait( var_1 );
|
|
level notify( "notify_snakecam_on" );
|
|
|
|
if ( var_2 > 0 )
|
|
var_4 fadeovertime( var_2 );
|
|
|
|
var_4.alpha = 0;
|
|
wait( var_2 );
|
|
var_4 destroy();
|
|
}
|
|
|
|
borescope_pip()
|
|
{
|
|
level.pip = level.player newpip();
|
|
level.pip.rendertotexture = 1;
|
|
level.pip.entity = spawn( "script_model", level.borescope gettagorigin( "tag_camera" ) );
|
|
level.pip.entity setmodel( "tag_origin" );
|
|
level.pip.entity.origin = level.borescope gettagorigin( "tag_camera" );
|
|
level.pip.entity.angles = level.borescope gettagangles( "tag_camera" );
|
|
level.pip.visionsetnaked = "black_ice_snakecam";
|
|
level.pip.entity linkto( level.borescope, "tag_camera", ( 0, 0, 5 ), ( 0, 0, 0 ) );
|
|
wait( level.timestep );
|
|
level.pip.tag = "tag_origin";
|
|
level.pip.fov = 45;
|
|
level.pip.freecamera = 1;
|
|
level.pip.enableshadows = 0;
|
|
level.pip.x = 300;
|
|
level.pip.y = 240;
|
|
level.pip.width = 240;
|
|
level.pip.height = 135;
|
|
level.pip.enable = 1;
|
|
level.borescope waittill( "death" );
|
|
level.pip.enable = 0;
|
|
level.pip.entity delete();
|
|
level.pip = undefined;
|
|
}
|
|
|
|
player_swim_setup()
|
|
{
|
|
level.spring_cam_max_clamp = 30;
|
|
level.spring_cam_min_clamp = 20;
|
|
level.breach_pt = common_scripts\utility::getstruct( "breach_point", "script_noteworthy" );
|
|
level.breach_pos = level.breach_pt.origin + ( 0, 0, 0 );
|
|
maps\black_ice_util::setup_player_for_animated_sequence( 0, undefined, undefined, level.player.angles, 0 );
|
|
var_0 = maps\_utility::spawn_anim_model( "player_scuba", level.player_rig.origin );
|
|
level.player_scuba = var_0;
|
|
level.player allowswim( 1 );
|
|
level.player enableslowaim( 0.5, 0.5 );
|
|
setsaveddvar( "player_swimSpeed", 0.0 );
|
|
setsaveddvar( "player_swimVerticalSpeed", 0.0 );
|
|
level.player playerlinktodelta( level.player_rig, "tag_player", 1, 0, 0, 0, 0, 1 );
|
|
level.player.hud_scubamask = level.player maps\_hud_util::create_client_overlay( "scubamask_overlay_delta", 1, level.player );
|
|
level.player.hud_scubamask.foreground = 0;
|
|
level.player.hud_scubamask.sort = -99;
|
|
level.player.hud_scubamask.enablehudlighting = 1;
|
|
level.player thread maps\_underwater::player_scuba();
|
|
level.player maps\_underwater::underwater_hud_enable( 1 );
|
|
init_swim_vars();
|
|
init_swim();
|
|
thread player_weapon_hack();
|
|
maps\black_ice_util::player_animated_sequence_restrictions();
|
|
wait( level.timestep );
|
|
level.player lerpviewangleclamp( 0, 0, 0, level.spring_cam_min_clamp, level.spring_cam_min_clamp, level.spring_cam_min_clamp, level.spring_cam_min_clamp );
|
|
}
|
|
|
|
player_weapon_hack()
|
|
{
|
|
level.player giveweapon( "test_detonator_black_ice" );
|
|
level.player setweaponammoclip( "test_detonator_black_ice", 0 );
|
|
level.player giveweapon( "aps_underwater+swim" );
|
|
level.player switchtoweapon( "aps_underwater+swim" );
|
|
wait 1.3;
|
|
level.player switchtoweapon( "test_detonator_black_ice" );
|
|
}
|
|
|
|
player_swim_rubberband()
|
|
{
|
|
level endon( "notify_swim_end" );
|
|
var_0 = 80.0;
|
|
var_1 = 40.0;
|
|
var_2 = 130000.0;
|
|
var_3 = 35000.0;
|
|
var_4 = 500000.0;
|
|
var_5 = 0.0;
|
|
var_6 = 0.0;
|
|
var_7 = 0.0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( level._allies_swim[0].origin ) )
|
|
{
|
|
var_6 = distancesquared( level._allies_swim[0].origin, level.breach_pos );
|
|
var_7 = distancesquared( level.player geteye(), level.breach_pos );
|
|
var_5 = var_7 - var_6;
|
|
|
|
if ( var_5 > var_4 )
|
|
{
|
|
setdvar( "ui_deadquote", &"BLACK_ICE_SWIM_FAIL_DISTANCE" );
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|
|
}
|
|
|
|
var_8 = maps\black_ice_util::normalize_value( var_3, var_2, var_5 );
|
|
var_9 = maps\black_ice_util::factor_value_min_max( var_1, var_0, var_8 );
|
|
level.player.target_swim_speed = var_9;
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
player_swim_water_current_logic()
|
|
{
|
|
level endon( "notify_swim_end" );
|
|
var_0 = [];
|
|
var_0[0] = [ -200.0, 4400 ];
|
|
var_0[1] = [ -150.0, 3200 ];
|
|
var_0[2] = [ -100.0, 2000 ];
|
|
|
|
for (;;)
|
|
{
|
|
if ( level.player.origin[2] < var_0[0][0] )
|
|
{
|
|
level.player.target_water_current = ( 0, 0, 1 ) * var_0[0][1];
|
|
level.player.water_current_delta = 0.2;
|
|
}
|
|
else if ( level.player.origin[2] < var_0[1][0] )
|
|
{
|
|
level.player.target_water_current = ( 0, 0, 1 ) * var_0[1][1];
|
|
level.player.water_current_delta = 0.2;
|
|
}
|
|
else if ( level.player.origin[2] < var_0[2][0] )
|
|
{
|
|
level.player.target_water_current = ( 0, 0, 1 ) * var_0[2][1];
|
|
level.player.water_current_delta = 0.2;
|
|
}
|
|
else
|
|
{
|
|
level.player.target_water_current = ( 0, 0, 0 );
|
|
level.player.water_current_delta = 0.1;
|
|
}
|
|
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
init_swim_vars()
|
|
{
|
|
level.player.target_swim_speed = 0.0;
|
|
level.player.swim_speed_delta = 0.03;
|
|
level.player.target_water_current = ( 0, 0, 0 );
|
|
level.player.water_current_delta = 0.1;
|
|
}
|
|
|
|
init_swim()
|
|
{
|
|
common_scripts\utility::flag_set( "flag_underwater_sfx" );
|
|
maps\_utility::vision_set_fog_changes( "black_ice_infil", 0 );
|
|
setsaveddvar( "r_snowAmbientColor", ( 0.035, 0.04, 0.04 ) );
|
|
thread infil_lights_and_vision();
|
|
common_scripts\utility::exploder( "underwater_amb" );
|
|
level.player.hint_active = 0;
|
|
thread swim_check_node_distance();
|
|
}
|
|
|
|
player_lerp_swim_vars()
|
|
{
|
|
level endon( "notify_swim_end" );
|
|
var_0 = self.target_swim_speed;
|
|
var_1 = self.target_water_current;
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = var_0 + ( self.target_swim_speed - var_0 ) * self.swim_speed_delta;
|
|
setsaveddvar( "player_swimSpeed", var_0 );
|
|
var_1 = var_1 + ( self.target_water_current - var_1 ) * self.water_current_delta;
|
|
setsaveddvar( "player_swimWaterCurrent", var_1 );
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
enemy_swim_setup()
|
|
{
|
|
level.ice_breach_enemies = [];
|
|
var_0 = getentarray( "ice_breach_enemy", "script_noteworthy" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = var_2 dospawn();
|
|
var_3.swimmer = 1;
|
|
var_3.noragdoll = 1;
|
|
var_3.deathfunction = maps\black_ice_anim::swim_enemy_death_anim_override;
|
|
var_3 maps\_utility::set_battlechatter( 0 );
|
|
var_3.combatmode = "no_cover";
|
|
var_3.ignoreall = 1;
|
|
var_3.ignoreme = 1;
|
|
var_3.nodrop = 1;
|
|
var_3.disablearrivals = 1;
|
|
var_3.newenemyreactiondistsq_old = self.newenemyreactiondistsq;
|
|
var_3.newenemyreactiondistsq = 0;
|
|
var_3.grenadeammo = 0;
|
|
var_3 allowedstances( "stand", "crouch" );
|
|
var_3 hidepart_allinstances( "tag_weapon" );
|
|
var_3 hidepart_allinstances( "tag_clip" );
|
|
var_3 maps\_utility::disable_pain();
|
|
var_3 thread maps\_utility::magic_bullet_shield();
|
|
var_3.animname = "ice_breach_enemy";
|
|
level.ice_breach_enemies[level.ice_breach_enemies.size] = var_3;
|
|
}
|
|
|
|
thread maps\_swim_ai_common::override_water_footsteps();
|
|
maps\black_ice_anim::swim_enemies_first_frame_anims();
|
|
}
|
|
|
|
props_setup()
|
|
{
|
|
level.breach_props = [];
|
|
create_persistent_ice_breach_props();
|
|
level.breach_vehicles["gaz71"] = maps\_utility::spawn_anim_model( "gaz71" );
|
|
level.breach_vehicles["gaztiger"] = maps\_utility::spawn_anim_model( "gaztiger" );
|
|
level.breach_vehicles["bm21_2"] = maps\_utility::spawn_anim_model( "bm21_2" );
|
|
level.vehicles_no_breach["bm21_3"] = maps\_utility::spawn_anim_model( "bm21_3" );
|
|
level.vehicles_no_breach["gaztiger_2"] = maps\_utility::spawn_anim_model( "gaztiger_2" );
|
|
level.vehicles_no_breach["snowmobile_1"] = maps\_utility::spawn_anim_model( "snowmobile_1" );
|
|
level.vehicles_no_breach["snowmobile_2"] = maps\_utility::spawn_anim_model( "snowmobile_2" );
|
|
thread maps\black_ice_fx::intro_turn_on_vehicle_drive_in_treadfx();
|
|
level.breach_mines = getentarray( "limpet_mine", "targetname" );
|
|
level.borescope = maps\_utility::spawn_anim_model( "borescope" );
|
|
thread mine_blink_fx();
|
|
level.breach_props["ice_chunks1"] hide();
|
|
level.breach_props["ice_chunks2"] hide();
|
|
level.breach_props["breach_water"] hide();
|
|
}
|
|
|
|
prop_attach_coll()
|
|
{
|
|
var_0 = getent( self.coll, "targetname" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_1 = ( 0, 0, 0 );
|
|
|
|
switch ( self.model )
|
|
{
|
|
case "ch_crate64x64":
|
|
var_1 = ( 0, 0, 36 );
|
|
break;
|
|
case "com_ammo_pallet":
|
|
var_1 = ( 0, 0, 28 );
|
|
break;
|
|
case "oil_barrel":
|
|
var_1 = ( 0, 0, 22 );
|
|
break;
|
|
case "bi_basecamp_tire":
|
|
break;
|
|
case "com_plasticcase_green_big_idf_iw6":
|
|
var_1 = ( 0, 0, 16 );
|
|
break;
|
|
case "com_pallet_2_snow":
|
|
var_1 = ( 0, 0, 4 );
|
|
break;
|
|
}
|
|
|
|
var_0.origin = self.origin + var_1;
|
|
var_0.angles = self.angles;
|
|
var_0 linkto( self );
|
|
}
|
|
}
|
|
|
|
create_persistent_ice_breach_props( var_0 )
|
|
{
|
|
if ( !isdefined( level.breach_props ) )
|
|
level.breach_props = [];
|
|
|
|
if ( !isdefined( level.tag_anim_rig_models ) )
|
|
level.tag_anim_rig_models = [];
|
|
|
|
var_1 = maps\black_ice_util::setup_tag_anim_rig( "introbreach_props", "introbreach_props", 4, 1 );
|
|
|
|
for ( var_2 = 0; var_2 < level.tag_anim_rig_models.size; var_2++ )
|
|
{
|
|
if ( isdefined( level.tag_anim_rig_models[var_2].coll ) )
|
|
level.tag_anim_rig_models[var_2] prop_attach_coll();
|
|
}
|
|
|
|
level.breach_props["introbreach_props"] = var_1;
|
|
level.breach_props["ice_chunks1"] = getent( "ice_chunks1", "targetname" );
|
|
level.breach_props["ice_chunks1"].animname = "ice_chunks1";
|
|
level.breach_props["ice_chunks1"] maps\_utility::assign_animtree();
|
|
level.breach_props["ice_chunks2"] = getent( "ice_chunks2", "targetname" );
|
|
level.breach_props["ice_chunks2"].animname = "ice_chunks2";
|
|
level.breach_props["ice_chunks2"] maps\_utility::assign_animtree();
|
|
level.breach_props["breach_water"] = maps\_utility::spawn_anim_model( "breach_water" );
|
|
level.breach_props["breach_water"] thread retarget_breach_water();
|
|
level.breach_vehicles = [];
|
|
level.breach_vehicles["bm21_1"] = maps\_utility::spawn_anim_model( "bm21_1" );
|
|
|
|
if ( isdefined( var_0 ) && var_0 )
|
|
{
|
|
level.breach_anim_node thread maps\_anim::anim_loop_solo( level.breach_props["ice_chunks1"], "intro_breach_loop", "stop_loop" );
|
|
level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_props["introbreach_props"], "intro_breach" );
|
|
level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_props["breach_water"], "intro_breach" );
|
|
level.breach_anim_node maps\_anim::anim_last_frame_solo( level.breach_vehicles["bm21_1"], "intro_breach" );
|
|
}
|
|
}
|
|
|
|
mine_blink_fx()
|
|
{
|
|
foreach ( var_1 in level.breach_mines )
|
|
{
|
|
wait( level.timestep );
|
|
playfxontag( common_scripts\utility::getfx( "mine_light" ), var_1, "tag_fx" );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
destroy_breach_mines_and_fx()
|
|
{
|
|
foreach ( var_1 in level.breach_mines )
|
|
{
|
|
wait( level.timestep );
|
|
stopfxontag( common_scripts\utility::getfx( "mine_light" ), var_1, "tag_fx" );
|
|
var_1 delete();
|
|
}
|
|
}
|
|
|
|
swim_detonate_logic()
|
|
{
|
|
level waittill( "notify_pullout_detonator" );
|
|
level.player enableweapons();
|
|
level.player switchtoweapon( "test_detonator_black_ice" );
|
|
level.player allowfire( 0 );
|
|
wait 2.0;
|
|
swim_wait_for_detonate();
|
|
thread swim_player_start_breach();
|
|
wait 0.5;
|
|
thread swim_breach_dialog();
|
|
ice_breach_logic();
|
|
}
|
|
|
|
swim_breach_dialog()
|
|
{
|
|
wait 0.2;
|
|
maps\_utility::radio_dialogue_stop();
|
|
|
|
if ( common_scripts\utility::flag( "flag_player_clear_to_breach" ) )
|
|
{
|
|
wait 0.4;
|
|
thread maps\_utility::smart_radio_dialogue( "blackice_bkr_takeemout" );
|
|
}
|
|
else
|
|
{
|
|
wait 0.1;
|
|
thread maps\_utility::smart_radio_dialogue( "blackice_bkr_toosoon" );
|
|
}
|
|
}
|
|
|
|
swim_player_start_breach()
|
|
{
|
|
var_0 = weaponfiretime( "test_detonator_black_ice" );
|
|
wait( var_0 );
|
|
level.player switchtoweapon( "aps_underwater+swim" );
|
|
setsaveddvar( "player_swimCombatTimer", 5000 );
|
|
setsaveddvar( "g_friendlyNameDist", level.g_friendlynamedist_old );
|
|
level.g_friendlynamedist_old = undefined;
|
|
wait 1.4;
|
|
level.player takeweapon( "test_detonator_black_ice" );
|
|
|
|
if ( isdefined( level.black_ice_hud_ammocounterhide ) )
|
|
setsaveddvar( "ammoCounterHide", level.black_ice_hud_ammocounterhide );
|
|
|
|
level.player allowfire( 1 );
|
|
}
|
|
|
|
swim_surface_dialog()
|
|
{
|
|
thread maps\_utility::smart_radio_dialogue( "blackice_bkr_wereclear" );
|
|
wait 2.0;
|
|
level waittill( "notify_swim_dialog7_1" );
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_dropyourtanksand" );
|
|
wait 5.0;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_mrk_doubletimeit" );
|
|
|
|
wait 2.5;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_takingfire" );
|
|
|
|
wait 3.5;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_getuphere" );
|
|
|
|
wait 5;
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
thread maps\_utility::smart_radio_dialogue( "black_ice_hsh_whereareyoualpha" );
|
|
|
|
wait 6;
|
|
var_0 = [ &"BLACK_ICE_HESH_KILLED", &"BLACK_ICE_KEEGAN_KILLED" ];
|
|
|
|
if ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
{
|
|
setdvar( "ui_deadquote", var_0[randomint( var_0.size - 1 )] );
|
|
maps\_utility::missionfailedwrapper();
|
|
}
|
|
}
|
|
|
|
swim_wait_for_detonate()
|
|
{
|
|
level.player allowfire( 1 );
|
|
|
|
while ( !level.player attackbuttonpressed() )
|
|
wait( level.timestep );
|
|
|
|
level.player allowfire( 0 );
|
|
thread maps\black_ice_audio::sfx_breach_detonate();
|
|
common_scripts\utility::flag_set( "flag_swim_breach_detonate" );
|
|
}
|
|
|
|
detonate_string_func()
|
|
{
|
|
return common_scripts\utility::ter_op( level.player attackbuttonpressed() || common_scripts\utility::flag( "flag_detonate_fail" ), 1, 0 );
|
|
}
|
|
|
|
ice_breach_logic()
|
|
{
|
|
thread maps\black_ice_fx::intro_detonation_sequence_fx();
|
|
earthquake( 0.6, 1.5, level.player.origin, 100 );
|
|
level.player shellshock( "default_nosound", 1.5 );
|
|
wait 0.75;
|
|
handle_ice_plugs();
|
|
thread destroy_breach_mines_and_fx();
|
|
level.breach_props["ice_chunks1"] show();
|
|
level.breach_props["breach_water"] show();
|
|
level.breach_props["introbreach_props"] thread ice_breach_process_prop_fx();
|
|
thread maps\black_ice_anim::swim_breach_anims();
|
|
thread props_cleanup();
|
|
|
|
for ( var_0 = 0; var_0 < level.ice_breach_enemies.size; var_0++ )
|
|
{
|
|
level.ice_breach_enemies[var_0] thread ice_breach_process_enemy( var_0 );
|
|
wait( level.timestep );
|
|
level.ice_breach_enemies[var_0] thread ice_breach_process_enemy_fx();
|
|
}
|
|
|
|
wait_till_breach_end_conditions();
|
|
maps\_utility::autosave_by_name( "swim_forward" );
|
|
thread maps\black_ice_anim::swim_allies_swim_forward();
|
|
thread player_surface_logic();
|
|
thread swim_surface_dialog();
|
|
thread scuba_ally_swap();
|
|
level waittill( "notify_begin_camp_logic" );
|
|
}
|
|
|
|
handle_ice_plugs()
|
|
{
|
|
var_0 = getentarray( "ice_plug", "script_noteworthy" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_2 hide();
|
|
var_2 delete();
|
|
}
|
|
|
|
common_scripts\utility::array_call( getentarray( "opt_hide_swim", "script_noteworthy" ), ::show );
|
|
level notify( "icehole_open" );
|
|
}
|
|
|
|
ice_breach_process_prop_fx()
|
|
{
|
|
wait 1.0;
|
|
var_0 = self.model;
|
|
var_1 = getnumparts( var_0 );
|
|
|
|
for ( var_2 = 0; var_2 < var_1; var_2++ )
|
|
{
|
|
var_3 = getpartname( var_0, var_2 );
|
|
|
|
switch ( var_3 )
|
|
{
|
|
case "tag_origin_new_props":
|
|
break;
|
|
case "mdl_ch_crate64x64_snow_001":
|
|
break;
|
|
default:
|
|
wait( level.timestep );
|
|
playfxontag( level._effect["water_bubble_cloud_descent_med"], self, var_3 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
ice_breach_process_enemy_fx()
|
|
{
|
|
wait 0.25;
|
|
playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "j_mainroot" );
|
|
playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "J_Ankle_ri" );
|
|
playfxontag( level._effect["water_bubble_cloud_descent_med"], self, "J_Ankle_LE" );
|
|
}
|
|
|
|
infil_lights_and_vision()
|
|
{
|
|
common_scripts\utility::flag_wait( "flag_swim_breach_detonate" );
|
|
|
|
if ( maps\_utility::is_gen4() && !level.ps4 )
|
|
setsaveddvar( "r_mbEnable", 2 );
|
|
|
|
wait 1;
|
|
maps\_utility::vision_set_fog_changes( "black_ice_infil_bright", 1.3 );
|
|
var_0 = getentarray( "light_infil_script_top", "targetname" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
thread light_brighten( var_2, 0.7 );
|
|
|
|
var_4 = getentarray( "light_infil_script_top2", "targetname" );
|
|
|
|
foreach ( var_2 in var_4 )
|
|
thread light_brighten( var_2, 0.4 );
|
|
|
|
level waittill( "notify_icehole_godrays" );
|
|
common_scripts\utility::exploder( "intro_icehole_godray" );
|
|
level waittill( "player_water_breach" );
|
|
maps\_utility::stop_exploder( "intro_icehole_godray" );
|
|
}
|
|
|
|
light_brighten( var_0, var_1 )
|
|
{
|
|
var_2 = var_0 getlightintensity();
|
|
var_3 = var_1;
|
|
var_4 = 0.12;
|
|
|
|
while ( var_2 < var_3 )
|
|
{
|
|
var_2 = var_2 + var_4;
|
|
var_0 setlightintensity( var_2 );
|
|
wait( level.timestep );
|
|
}
|
|
}
|
|
|
|
player_surface_logic()
|
|
{
|
|
level waittill( "notify_swim_allow_movement" );
|
|
level.player.target_swim_speed = 40;
|
|
setsaveddvar( "player_swimVerticalSpeed", 40.0 );
|
|
level.player thread player_lerp_swim_vars();
|
|
thread player_swim_rubberband();
|
|
thread player_swim_water_current_logic();
|
|
thread maps\black_ice_anim::swim_truck_surface_anim();
|
|
|
|
while ( !common_scripts\utility::flag( "flag_swim_player_drop_tank" ) )
|
|
wait( level.timestep );
|
|
|
|
common_scripts\utility::flag_set( "flag_player_breaching" );
|
|
|
|
if ( !isdefined( level._bravo ) || level._bravo.size < 2 )
|
|
maps\black_ice_util::spawn_bravo();
|
|
|
|
surface_breach();
|
|
common_scripts\utility::flag_clear( "flag_underwater_sfx" );
|
|
common_scripts\utility::flag_set( "flag_outofwater_sfx" );
|
|
thread player_post_swim();
|
|
|
|
if ( isdefined( level.breach_anim_node ) )
|
|
level.breach_anim_node notify( "stop_loop" );
|
|
|
|
if ( isdefined( level.allies_breach_anim_node ) )
|
|
level.allies_breach_anim_node notify( "stop_loop" );
|
|
}
|
|
|
|
surface_breach()
|
|
{
|
|
thread maps\black_ice_anim::swim_ally_surface_anim();
|
|
level.player.disablereload = 1;
|
|
level.player disableweapons();
|
|
level.player disableoffhandweapons();
|
|
level.player disableweaponswitch();
|
|
level.player.hint_active = undefined;
|
|
level notify( "notify_swim_end" );
|
|
thread player_water_breach_moment();
|
|
thread maps\black_ice_audio::sfx_player_exits_water();
|
|
thread maps\black_ice_audio::sfx_heli_over();
|
|
maps\black_ice_anim::swim_player_surface_anim();
|
|
}
|
|
|
|
scuba_ally_swap()
|
|
{
|
|
level waittill( "notify_ally_swim_surface_anims_done" );
|
|
level.launchers_attached = 1;
|
|
|
|
if ( isdefined( level._allies_swim ) )
|
|
{
|
|
level._allies_swim = [];
|
|
maps\_utility::array_delete( level._allies_swim );
|
|
}
|
|
}
|
|
|
|
scuba_surface( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = var_3.animname;
|
|
var_3.animname = "scuba_ally";
|
|
var_3 maps\_utility::ent_flag_init( "flag_camp_move_ally" );
|
|
wait( var_0 );
|
|
thread maps\_anim::anim_single_solo( var_1, var_2 );
|
|
common_scripts\utility::flag_wait( "player_water_breach" );
|
|
var_3 forceteleport( var_1.origin, var_1.angles );
|
|
var_3 attach( level.scr_model["ascend_launcher_non_anim"], "TAG_STOWED_BACK" );
|
|
var_6 = var_1 getanimtime( var_1 maps\_utility::getanim( var_2 ) );
|
|
|
|
if ( isdefined( var_1.launcher ) )
|
|
{
|
|
var_1.launcher unlink();
|
|
var_1.launcher delete();
|
|
}
|
|
|
|
var_1 delete();
|
|
var_3 show();
|
|
thread maps\_anim::anim_single_solo( var_3, var_2, undefined, 0.1 );
|
|
wait 0.05;
|
|
var_3 setanimtime( var_3 maps\_utility::getanim( var_2 ), var_6 );
|
|
wait( getanimlength( var_3 maps\_utility::getanim( var_2 ) ) * ( 1.0 - var_6 ) );
|
|
var_3.animname = var_5;
|
|
|
|
if ( !isdefined( var_4 ) || var_3 maps\_utility::ent_flag( "flag_camp_move_ally" ) )
|
|
return;
|
|
|
|
var_7 = var_3.newenemyreactiondistsq;
|
|
var_3.newenemyreactiondistsq = 0;
|
|
var_3 maps\_utility::disable_ai_color();
|
|
var_3 thread maps\_utility::follow_path( getnode( var_4, "targetname" ) );
|
|
var_3 maps\_utility::ent_flag_wait( "flag_camp_move_ally" );
|
|
var_3 notify( "stop_going_to_node" );
|
|
var_3 maps\_utility::enable_ai_color();
|
|
|
|
for (;;)
|
|
{
|
|
var_8 = maps\_utility::get_closest_ai( var_3.origin, "axis" );
|
|
|
|
if ( isdefined( var_8 ) )
|
|
{
|
|
var_9 = distancesquared( var_3.origin, var_8.origin );
|
|
|
|
if ( var_9 > var_7 )
|
|
{
|
|
var_3.newenemyreactiondistsq = var_7;
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
bravo_post_snake_cam( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_1 maps\_utility::ent_flag_init( "flag_camp_move_ally" );
|
|
wait( var_0 );
|
|
var_4 = getnode( var_2, "targetname" );
|
|
var_1 forceteleport( var_4.origin, var_4.angles );
|
|
var_1 attach( level.scr_model["ascend_launcher_non_anim"], "TAG_STOWED_BACK" );
|
|
var_1 show();
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
var_5 = var_1.animname;
|
|
var_1.animname = "scuba_ally";
|
|
thread maps\_anim::anim_single_solo( var_1, var_3 );
|
|
wait( getanimlength( var_1 maps\_utility::getanim( var_3 ) ) );
|
|
var_1.animname = var_5;
|
|
}
|
|
|
|
if ( !isdefined( var_2 ) || var_1 maps\_utility::ent_flag( "flag_camp_move_ally" ) )
|
|
return;
|
|
|
|
var_6 = var_1.newenemyreactiondistsq;
|
|
var_1.newenemyreactiondistsq = 0;
|
|
var_1 maps\_utility::disable_ai_color();
|
|
var_1 thread maps\_utility::follow_path( var_4 );
|
|
var_1 maps\_utility::ent_flag_wait( "flag_camp_move_ally" );
|
|
var_1 notify( "stop_going_to_node" );
|
|
var_1 maps\_utility::enable_ai_color();
|
|
|
|
for (;;)
|
|
{
|
|
var_7 = maps\_utility::get_closest_ai( var_1.origin, "axis" );
|
|
|
|
if ( isdefined( var_7 ) )
|
|
{
|
|
var_8 = distancesquared( var_1.origin, var_7.origin );
|
|
|
|
if ( var_8 > var_6 )
|
|
{
|
|
var_1.newenemyreactiondistsq = var_6;
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
wait_till_breach_end_conditions()
|
|
{
|
|
level waittill( "notify_swim_end_breach" );
|
|
}
|
|
|
|
player_water_breach_moment()
|
|
{
|
|
while ( !common_scripts\utility::flag( "player_water_breach" ) )
|
|
wait( level.timestep );
|
|
}
|
|
|
|
player_post_swim()
|
|
{
|
|
maps\black_ice_util::player_animated_sequence_cleanup();
|
|
level.player allowswim( 0 );
|
|
level.player disableslowaim();
|
|
|
|
if ( isdefined( level.player_scuba ) )
|
|
{
|
|
level.player_scuba delete();
|
|
level.player_scuba = undefined;
|
|
}
|
|
}
|
|
|
|
ice_breach_process_enemy( var_0 )
|
|
{
|
|
thread ice_breach_process_enemy_anim( var_0 );
|
|
thread ice_breach_process_enemy_dmg( var_0 );
|
|
}
|
|
|
|
ice_breach_process_enemy_anim( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
while ( !maps\black_ice_util::check_anim_time( self.animname, "introbreach_opfor" + var_0, 1.0 ) )
|
|
wait( level.timestep );
|
|
|
|
if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield )
|
|
maps\_utility::stop_magic_bullet_shield();
|
|
|
|
self.allowdeath = 1;
|
|
self kill();
|
|
}
|
|
|
|
ice_breach_process_enemy_dmg( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self waittill( "damage", var_1, var_2, var_3, var_4, var_5 );
|
|
|
|
if ( var_5 != "MOD_EXPLOSIVE" )
|
|
{
|
|
if ( var_3 != ( 0, 0, 0 ) )
|
|
playfx( common_scripts\utility::getfx( "swim_ai_blood_impact" ), var_4, var_3 );
|
|
}
|
|
|
|
if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield )
|
|
maps\_utility::stop_magic_bullet_shield();
|
|
|
|
self.allowdeath = 1;
|
|
self kill();
|
|
}
|
|
|
|
props_cleanup()
|
|
{
|
|
level.breach_vehicles["gaztiger"] thread prop_destroy( level.breach_anim_node, "intro_breach", maps\black_ice_fx::turn_off_gaztiger_underwater_lights_fx );
|
|
level.breach_vehicles["bm21_2"] thread prop_destroy( level.breach_anim_node, "intro_breach", maps\black_ice_fx::turn_off_bm21_2_underwater_lights_fx );
|
|
}
|
|
|
|
prop_destroy( var_0, var_1, var_2 )
|
|
{
|
|
var_0 waittill( var_1 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
[[ var_2 ]]();
|
|
|
|
self delete();
|
|
}
|
|
|
|
destroy_persistent_ice_breach_props()
|
|
{
|
|
if ( isdefined( level.tag_anim_rig_models ) )
|
|
{
|
|
for ( var_0 = 0; var_0 < level.tag_anim_rig_models.size; var_0++ )
|
|
level.tag_anim_rig_models[var_0] delete();
|
|
}
|
|
|
|
if ( isdefined( level.breach_props ) )
|
|
{
|
|
if ( isdefined( level.breach_props["introbreach_props"] ) )
|
|
level.breach_props["introbreach_props"] delete();
|
|
}
|
|
|
|
if ( isdefined( level.breach_vehicles ) )
|
|
{
|
|
if ( isdefined( level.breach_vehicles["bm21_1"] ) )
|
|
level.breach_vehicles["bm21_1"] delete();
|
|
}
|
|
|
|
if ( isdefined( level.surface_truck ) )
|
|
maps\black_ice_anim::swim_truck_surface_destroy();
|
|
}
|
|
|
|
underwater_sfx()
|
|
{
|
|
wait 1;
|
|
common_scripts\utility::flag_wait( "flag_outofwater_sfx" );
|
|
maps\_utility::battlechatter_on( "allies" );
|
|
maps\_utility::battlechatter_on( "axis" );
|
|
}
|
|
|
|
player_heartbeat()
|
|
{
|
|
level endon( "stop_player_heartbeat" );
|
|
|
|
for (;;)
|
|
{
|
|
self playlocalsound( "breathing_heartbeat" );
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
check_analog_movement()
|
|
{
|
|
var_0 = level.player getnormalizedmovement();
|
|
|
|
if ( var_0[0] == 0 && var_0[1] == 0 )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
retarget_breach_water()
|
|
{
|
|
self retargetscriptmodellighting( getent( "infil_lighttarget", "targetname" ) );
|
|
}
|
|
|
|
set_snakecam_dof()
|
|
{
|
|
maps\_art::dof_enable_script( 0, 211.65, 8, 10000, 30000, 0.3, 2.0 );
|
|
level waittill( "flag_snake_cam_below_water" );
|
|
|
|
if ( maps\_utility::is_gen4() )
|
|
setsaveddvar( "r_mbEnable", 0 );
|
|
|
|
maps\_art::dof_disable_script( 1 );
|
|
common_scripts\utility::flag_wait( "player_water_breach" );
|
|
thread maps\black_ice_camp::camp_mblur_changes();
|
|
maps\_art::dof_enable_script( 0, 100, 3, 5000, 7000, 0.4, 0 );
|
|
wait 2;
|
|
maps\_art::dof_enable_script( 0, 1, 1, 500, 7000, 10, 1 );
|
|
wait 3;
|
|
maps\_art::dof_disable_script( 1 );
|
|
}
|
|
|
|
swim_godrays()
|
|
{
|
|
var_0 = getent( "swim_gr_origin", "targetname" );
|
|
|
|
if ( maps\_utility::is_gen4() )
|
|
maps\black_ice_util::god_rays_from_world_location( var_0.origin, "flag_swim_breach_detonate", "player_water_breach", undefined, undefined );
|
|
}
|