1560 lines
44 KiB
Plaintext
1560 lines
44 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init_escape()
|
|
{
|
|
if ( !maps\mp\alien\_utility::alien_mode_has( "airdrop" ) )
|
|
return;
|
|
|
|
if ( !common_scripts\utility::flag_exist( "hives_cleared" ) )
|
|
common_scripts\utility::flag_init( "hives_cleared" );
|
|
|
|
if ( !common_scripts\utility::flag_exist( "nuke_countdown" ) )
|
|
common_scripts\utility::flag_init( "nuke_countdown" );
|
|
|
|
if ( !common_scripts\utility::flag_exist( "escape_conditions_met" ) )
|
|
common_scripts\utility::flag_init( "escape_conditions_met" );
|
|
|
|
common_scripts\utility::flag_init( "nuke_went_off" );
|
|
init_fx();
|
|
init_chaos_airdrop();
|
|
}
|
|
|
|
init_fx()
|
|
{
|
|
level._effect["alien_heli_spotlight"] = loadfx( "vfx/gameplay/alien/vfx_alien_spotlight_heli_model" );
|
|
level._effect["cockpit_blue_cargo01"] = loadfx( "fx/misc/aircraft_light_cockpit_red" );
|
|
level._effect["cockpit_blue_cockpit01"] = loadfx( "fx/misc/aircraft_light_cockpit_blue" );
|
|
level._effect["white_blink"] = loadfx( "fx/misc/aircraft_light_white_blink" );
|
|
level._effect["white_blink_tail"] = loadfx( "fx/misc/aircraft_light_red_blink" );
|
|
level._effect["wingtip_green"] = loadfx( "fx/misc/aircraft_light_wingtip_green" );
|
|
level._effect["wingtip_red"] = loadfx( "fx/misc/aircraft_light_wingtip_red" );
|
|
level._effect["spot"] = loadfx( "fx/misc/aircraft_light_hindspot" );
|
|
level._effect["harrier_heavy_smoke"] = loadfx( "fx/smoke/smoke_trail_black_heli_emitter" );
|
|
level._effect["escape_zone_ring"] = loadfx( "vfx/gameplay/alien/vfx_alien_chopper_escape_ring" );
|
|
}
|
|
|
|
escape()
|
|
{
|
|
level endon( "game_ended" );
|
|
setup_special_spawn_trigs();
|
|
maps\mp\alien\_spawnlogic::escape_choke_init();
|
|
var_0 = spawn( "script_model", ( -4606.2, 3258.7, 307.7 ) );
|
|
var_0 setmodel( "tag_origin" );
|
|
var_0 makeusable();
|
|
wait 0.05;
|
|
var_1 = newhudelem();
|
|
var_1 setshader( "waypoint_bomb", 14, 14 );
|
|
var_1.alpha = 1;
|
|
var_1.color = ( 1, 1, 1 );
|
|
var_1 setwaypoint( 1, 1 );
|
|
var_1.x = var_0.origin[0];
|
|
var_1.y = var_0.origin[1];
|
|
var_1.z = var_0.origin[2];
|
|
var_0 setcursorhint( "HINT_ACTIVATE" );
|
|
level thread players_use_nuke_monitor( var_0 );
|
|
|
|
if ( isdefined( level.players ) && level.players.size > 1 )
|
|
{
|
|
var_0 sethintstring( &"ALIEN_COLLECTIBLES_ACTIVATE_NUKE" );
|
|
iprintlnbold( &"ALIEN_COLLECTIBLES_NUKE_ACTIVATE_USE" );
|
|
}
|
|
else
|
|
{
|
|
var_0 sethintstring( &"ALIEN_COLLECTIBLES_ACTIVATE_NUKE_SOLO" );
|
|
iprintlnbold( &"ALIEN_COLLECTIBLES_NUKE_ACTIVATE_USE_SOLO" );
|
|
}
|
|
|
|
wait_for_all_player_use();
|
|
level thread maps\mp\alien\_spawnlogic::escape_spawning( level.escape_cycle );
|
|
level thread maps\mp\alien\_music_and_dialog::playvofornukearmed();
|
|
var_2 = getent( "escape_zone", "targetname" );
|
|
|
|
if ( isdefined( level.rescue_waypoint ) )
|
|
level.rescue_waypoint destroy();
|
|
|
|
level.rescue_waypoint = newhudelem();
|
|
level.rescue_waypoint setshader( "waypoint_alien_beacon", 14, 14 );
|
|
level.rescue_waypoint.alpha = 0;
|
|
level.rescue_waypoint.color = ( 1, 1, 1 );
|
|
level.rescue_waypoint setwaypoint( 1, 1 );
|
|
level.rescue_waypoint.x = var_2.origin[0];
|
|
level.rescue_waypoint.y = var_2.origin[1];
|
|
level.rescue_waypoint.z = var_2.origin[2];
|
|
common_scripts\utility::flag_set( "nuke_countdown" );
|
|
common_scripts\utility::flag_clear( "alien_music_playing" );
|
|
level thread maps\mp\alien\_music_and_dialog::play_nuke_set_music();
|
|
var_1 destroy();
|
|
var_0 makeunusable();
|
|
var_0 setcursorhint( "HINT_ACTIVATE" );
|
|
var_0 sethintstring( "" );
|
|
var_0 delete();
|
|
var_3 = gettime();
|
|
level thread nuke_countdown();
|
|
level thread rescue_think( var_3 );
|
|
level thread infinite_mode_events();
|
|
}
|
|
|
|
players_use_nuke_monitor( var_0 )
|
|
{
|
|
level endon( "all_players_using_nuke" );
|
|
|
|
foreach ( var_2 in level.players )
|
|
var_2 thread watch_for_use_nuke_trigger( var_0 );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "connected", var_2 );
|
|
var_2 thread watch_for_use_nuke_trigger( var_0 );
|
|
}
|
|
}
|
|
|
|
rescue_think( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_1 = getent( "escape_zone", "targetname" );
|
|
var_2 = common_scripts\utility::getstruct( var_1.target, "targetname" );
|
|
var_3 = var_2.origin;
|
|
var_4 = var_2.angles;
|
|
level.escape_loc = var_1.origin;
|
|
thread call_in_rescue_heli( var_3, var_4, 10 );
|
|
|
|
while ( !isdefined( level.rescue_heli ) )
|
|
wait 0.05;
|
|
|
|
level.rescue_heli maps\mp\_utility::delaythread( 5, maps\mp\alien\_music_and_dialog::play_pilot_vo, "so_alien_plt_comeon" );
|
|
level.rescue_heli thread heli_leave_on_nuke();
|
|
level.rescue_heli thread fly_to_extraction_on_trigger();
|
|
level.rescue_heli waittill_either_in_position_or_nuke();
|
|
thread watch_player_escape( var_1, var_0 );
|
|
}
|
|
|
|
waittill_either_in_position_or_nuke()
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
self waittill( "in_position" );
|
|
level.rescue_heli thread maps\mp\alien\_music_and_dialog::play_pilot_vo( "so_alien_plt_exfil" );
|
|
level thread get_on_chopper_nag();
|
|
}
|
|
|
|
get_on_chopper_nag()
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
level endon( "escape_conditions_met" );
|
|
var_0 = [ "so_alien_plt_getonchopper", "so_alien_plt_hurryup", "so_alien_plt_comeon" ];
|
|
|
|
for (;;)
|
|
{
|
|
wait( randomintrange( 10, 15 ) );
|
|
level.rescue_heli thread maps\mp\alien\_music_and_dialog::play_pilot_vo( common_scripts\utility::random( var_0 ) );
|
|
}
|
|
}
|
|
|
|
heli_leave_on_nuke()
|
|
{
|
|
self endon( "death" );
|
|
self waittill( "rescue_chopper_exit" );
|
|
self setneargoalnotifydist( 200 );
|
|
self.near_goal = 1;
|
|
var_0 = self.exit_path[0];
|
|
|
|
for ( var_1 = 0; var_1 < self.exit_path.size; var_1++ )
|
|
{
|
|
var_2 = self.exit_path[var_1];
|
|
heli_fly_to( var_2.origin, int( min( 35, 20 + var_1 * 5 ) ) );
|
|
}
|
|
}
|
|
|
|
fly_to_extraction_on_trigger()
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
self endon( "death" );
|
|
var_0 = getent( "fly_to_extraction_trig", "targetname" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 waittill( "trigger", var_1 );
|
|
|
|
if ( isplayer( var_1 ) )
|
|
{
|
|
self notify( "fly_to_extraction" );
|
|
return;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
watch_player_escape( var_0, var_1 )
|
|
{
|
|
level.rescue_heli endon( "death" );
|
|
var_2 = var_0.origin;
|
|
var_3 = var_0.radius;
|
|
var_4 = 128;
|
|
var_5 = spawnfx( level._effect["escape_zone_ring"], var_2 );
|
|
triggerfx( var_5 );
|
|
var_6 = spawn( "trigger_radius", var_2, 0, var_3, var_4 );
|
|
wait_for_escape_conditions_met( var_6 );
|
|
var_5 delete();
|
|
common_scripts\utility::flag_set( "escape_conditions_met" );
|
|
|
|
if ( isdefined( level.rescue_waypoint ) )
|
|
level.rescue_waypoint destroy();
|
|
|
|
level.rescue_heli notify( "extract" );
|
|
var_7 = [];
|
|
var_8 = [];
|
|
|
|
foreach ( var_10 in level.players )
|
|
{
|
|
if ( var_10 istouching( var_6 ) && isalive( var_10 ) && !( isdefined( var_10.laststand ) && var_10.laststand ) )
|
|
{
|
|
var_7[var_7.size] = var_10;
|
|
|
|
if ( !maps\mp\alien\_utility::is_casual_mode() )
|
|
var_10 maps\mp\alien\_persistence::set_player_escaped();
|
|
|
|
var_10.nuke_escaped = 1;
|
|
continue;
|
|
}
|
|
|
|
var_8[var_8.size] = var_10;
|
|
var_10.nuke_escaped = 0;
|
|
}
|
|
|
|
foreach ( var_10 in level.players )
|
|
{
|
|
if ( 1 == var_10.nuke_escaped )
|
|
var_10 maps\mp\alien\_persistence::award_completion_tokens();
|
|
}
|
|
|
|
level.num_players_left = level.players.size - var_7.size;
|
|
level.num_players_escaped = var_7.size;
|
|
|
|
foreach ( var_10 in var_8 )
|
|
var_10 iprintlnbold( &"ALIEN_COLLECTIBLES_YOU_DIDNT_MAKE_IT" );
|
|
|
|
if ( var_7.size == 0 )
|
|
{
|
|
var_16 = maps\mp\alien\_hud::get_end_game_string_index( "fail_escape" );
|
|
level maps\mp\_utility::delaythread( 15, maps\mp\gametypes\aliens::alienendgame, "axis", var_16 );
|
|
level.rescue_heli notify( "rescue_chopper_exit" );
|
|
return;
|
|
}
|
|
|
|
var_17 = get_escape_time_remains( var_1 );
|
|
var_18 = common_scripts\utility::getstruct( "player_teleport_loc", "targetname" );
|
|
var_19 = var_18.origin;
|
|
|
|
foreach ( var_10 in var_7 )
|
|
var_10 thread player_blend_to_chopper();
|
|
|
|
wait 1.6;
|
|
|
|
if ( level.players.size == 1 )
|
|
level.rescue_heli maps\mp\_utility::delaythread( 2, maps\mp\alien\_music_and_dialog::play_pilot_vo, "so_alien_plt_itsjustyou" );
|
|
else if ( level.players.size > level.num_players_escaped )
|
|
level.rescue_heli maps\mp\_utility::delaythread( 2, maps\mp\alien\_music_and_dialog::play_pilot_vo, "so_alien_plt_wherestherest" );
|
|
|
|
level thread maps\mp\alien\_music_and_dialog::play_exfil_music();
|
|
thread sfx_rescue_heli_escape( level.rescue_heli );
|
|
wait 0.5;
|
|
level.rescue_heli notify( "rescue_chopper_exit" );
|
|
wait 4;
|
|
level notify( "force_nuke_detonate" );
|
|
var_22 = [ "so_alien_plt_sourceofinvasion", "so_alien_plt_squashmorebugs" ];
|
|
level.rescue_heli maps\mp\_utility::delaythread( 2, maps\mp\alien\_music_and_dialog::play_pilot_vo, common_scripts\utility::random( var_22 ) );
|
|
level.rescue_heli thread play_nuke_rumble( 4.5 );
|
|
maps\mp\alien\_alien_matchdata::set_escape_time_remaining( var_17 );
|
|
maps\mp\alien\_achievement::update_escape_achievements( var_7, var_17 );
|
|
maps\mp\alien\_gamescore::process_end_game_score_escaped( var_17, var_7 );
|
|
maps\mp\alien\_unlock::update_escape_item_unlock( var_7 );
|
|
maps\mp\alien\_persistence::update_lb_aliensession_escape( var_7, var_17 );
|
|
wait 2;
|
|
|
|
if ( var_7.size == level.players.size )
|
|
var_23 = maps\mp\alien\_hud::get_end_game_string_index( "all_escape" );
|
|
else
|
|
var_23 = maps\mp\alien\_hud::get_end_game_string_index( "some_escape" );
|
|
|
|
level maps\mp\_utility::delaythread( 10, maps\mp\gametypes\aliens::alienendgame, "allies", var_23 );
|
|
}
|
|
|
|
player_blend_to_chopper()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
if ( self isusingturret() && isdefined( self.current_sentry ) )
|
|
{
|
|
self.current_sentry notify( "death" );
|
|
wait 0.5;
|
|
}
|
|
|
|
self notify( "force_cancel_placement" );
|
|
self.playerlinkedtochopper = 1;
|
|
self notify( "dpad_cancel" );
|
|
self disableusability();
|
|
fade_black_screen();
|
|
self.escape_overlay fadeovertime( 0.5 );
|
|
self.escape_overlay.alpha = 1;
|
|
wait 0.5;
|
|
self playerhide();
|
|
maps\mp\_utility::freezecontrolswrapper( 1 );
|
|
var_0 = "TAG_ALIEN_P1";
|
|
self playerlinktoblend( level.rescue_heli, var_0, 0.6, 0.2, 0.2 );
|
|
wait 0.6;
|
|
self playerlinkto( level.rescue_heli, var_0, 1, 50, 50, 18, 30, 0 );
|
|
thread force_crouch( 1 );
|
|
self allowjump( 0 );
|
|
self.escape_overlay fadeovertime( 0.5 );
|
|
self.escape_overlay.alpha = 0;
|
|
wait 0.5;
|
|
self.escape_overlay destroy();
|
|
}
|
|
|
|
fade_black_screen()
|
|
{
|
|
self.escape_overlay = newclienthudelem( self );
|
|
self.escape_overlay.x = 0;
|
|
self.escape_overlay.y = 0;
|
|
self.escape_overlay setshader( "black", 640, 480 );
|
|
self.escape_overlay.alignx = "left";
|
|
self.escape_overlay.aligny = "top";
|
|
self.escape_overlay.sort = 1;
|
|
self.escape_overlay.horzalign = "fullscreen";
|
|
self.escape_overlay.vertalign = "fullscreen";
|
|
self.escape_overlay.alpha = 0;
|
|
self.escape_overlay.foreground = 1;
|
|
}
|
|
|
|
play_nuke_rumble( var_0 )
|
|
{
|
|
wait( var_0 );
|
|
|
|
foreach ( var_2 in level.players )
|
|
{
|
|
earthquake( 0.33, 4, var_2.origin, 1000 );
|
|
var_2 playrumbleonentity( "heavy_3s" );
|
|
}
|
|
}
|
|
|
|
force_crouch( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "remove_force_crouch" );
|
|
|
|
if ( isdefined( var_0 ) && var_0 == 0 )
|
|
self notify( "remove_force_crouch" );
|
|
else
|
|
{
|
|
for (;;)
|
|
{
|
|
if ( self getstance() != "crouch" )
|
|
self setstance( "crouch" );
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
}
|
|
|
|
wait_for_escape_conditions_met( var_0 )
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
|
|
if ( common_scripts\utility::flag( "nuke_went_off" ) )
|
|
return;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = [];
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.players )
|
|
{
|
|
if ( !isalive( var_4 ) || isdefined( var_4.laststand ) && var_4.laststand )
|
|
continue;
|
|
|
|
if ( var_4 istouching( var_0 ) )
|
|
{
|
|
var_1[var_1.size] = var_4;
|
|
continue;
|
|
}
|
|
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
if ( var_1.size == 0 )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
else if ( var_2.size == 0 )
|
|
return;
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
wait_for_all_player_use()
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
while ( !are_all_players_using_nuke() )
|
|
wait 0.05;
|
|
|
|
level notify( "all_players_using_nuke" );
|
|
}
|
|
|
|
are_all_players_using_nuke()
|
|
{
|
|
var_0 = 1;
|
|
|
|
foreach ( var_2 in level.players )
|
|
{
|
|
if ( !isdefined( var_2.player_using_nuke ) || !var_2.player_using_nuke )
|
|
var_0 = 0;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
watch_for_use_nuke_trigger( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "all_players_using_nuke" );
|
|
self endon( "disconnect" );
|
|
self notify( "watch_for_use_nuke" );
|
|
self endon( "watch_for_use_nuke" );
|
|
self.player_using_nuke = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( self usebuttonpressed() && distancesquared( self.origin, var_0.origin ) < 16900 )
|
|
{
|
|
self.player_using_nuke = 1;
|
|
self notify( "using_nuke" );
|
|
thread reset_nuke_usage();
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
reset_nuke_usage()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "all_players_using_nuke" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
self endon( "using_nuke" );
|
|
wait 0.5;
|
|
self.player_using_nuke = 0;
|
|
}
|
|
|
|
nuke_countdown()
|
|
{
|
|
var_0 = 240;
|
|
level.nukeloc = ( -9068, 5883, 600 );
|
|
level.nukeangles = ( 0, -60, 90 );
|
|
setomnvar( "ui_alien_nuke_timer", gettime() + 240000 );
|
|
level thread hide_timer_on_game_end();
|
|
wait_for_nuke_detonate( var_0, "force_nuke_detonate" );
|
|
level.nuketimer = 3.35;
|
|
level.players[0] thread maps\mp\alien\_nuke::donukesimple();
|
|
common_scripts\utility::flag_clear( "nuke_countdown" );
|
|
setomnvar( "ui_alien_nuke_timer", 0 );
|
|
common_scripts\utility::flag_set( "nuke_went_off" );
|
|
var_1 = 0;
|
|
level thread track_survived_time( var_1 );
|
|
wait 2;
|
|
level.fx_crater_plume delete();
|
|
}
|
|
|
|
hide_timer_on_game_end()
|
|
{
|
|
level waittill( "game_ended" );
|
|
setomnvar( "ui_alien_nuke_timer", 0 );
|
|
}
|
|
|
|
get_escape_time_remains( var_0 )
|
|
{
|
|
var_1 = gettime() - var_0;
|
|
var_2 = 240000 - var_1;
|
|
var_2 = max( 0, var_2 );
|
|
return var_2;
|
|
}
|
|
|
|
wait_for_nuke_detonate( var_0, var_1 )
|
|
{
|
|
level endon( var_1 );
|
|
|
|
if ( !isdefined( level.nuke_clockobject ) )
|
|
{
|
|
level.nuke_clockobject = spawn( "script_origin", ( 0, 0, 0 ) );
|
|
level.nuke_clockobject hide();
|
|
}
|
|
|
|
for ( var_0 = int( var_0 ); var_0 > 0; var_0-- )
|
|
{
|
|
if ( var_0 == 10 )
|
|
level thread maps\mp\alien\_music_and_dialog::playvofor10seconds();
|
|
|
|
if ( var_0 == 30 )
|
|
level thread maps\mp\alien\_music_and_dialog::playvofor30seconds();
|
|
|
|
if ( var_0 == 120 )
|
|
level thread maps\mp\alien\_music_and_dialog::playvoforgettolz();
|
|
|
|
if ( var_0 <= 30 )
|
|
level.nuke_clockobject playsound( "ui_mp_nukebomb_timer" );
|
|
|
|
wait 1.0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
track_survived_time( var_0 )
|
|
{
|
|
var_1 = gettime();
|
|
level waittill( "game_ended" );
|
|
var_2 = gettime();
|
|
level.survived_time = var_2 - var_1;
|
|
}
|
|
|
|
infinite_mode_events()
|
|
{
|
|
level endon( "game_ended" );
|
|
level notify( "force_cycle_start" );
|
|
level.infinite_event_index = 1;
|
|
level.infinite_event_interval = 60;
|
|
|
|
for (;;)
|
|
{
|
|
wait_for_special_spawn();
|
|
var_0 = "chaos_event_2";
|
|
level notify( var_0 );
|
|
level.last_special_event_spawn_time = gettime();
|
|
maps\mp\alien\_spawn_director::activate_spawn_event( var_0 );
|
|
level.infinite_event_index++;
|
|
}
|
|
}
|
|
|
|
wait_for_special_spawn()
|
|
{
|
|
level endon( "force_chaos_event" );
|
|
|
|
if ( level.infinite_event_index == 1 )
|
|
wait 5;
|
|
else
|
|
wait( level.infinite_event_interval );
|
|
}
|
|
|
|
setup_special_spawn_trigs()
|
|
{
|
|
level.special_spawn_trigs = getentarray( "force_special_spawn_trig", "targetname" );
|
|
|
|
foreach ( var_1 in level.special_spawn_trigs )
|
|
var_1 thread watch_special_spawn_trig();
|
|
}
|
|
|
|
watch_special_spawn_trig()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "nuke_went_off" );
|
|
self endon( "death" );
|
|
|
|
if ( !common_scripts\utility::flag_exist( "nuke_countdown" ) )
|
|
return;
|
|
|
|
if ( !common_scripts\utility::flag( "nuke_countdown" ) )
|
|
common_scripts\utility::flag_wait( "nuke_countdown" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( isdefined( var_0 ) && isplayer( var_0 ) && isalive( var_0 ) )
|
|
break;
|
|
else
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if ( isdefined( level.last_special_event_spawn_time ) )
|
|
{
|
|
var_1 = 15;
|
|
|
|
if ( ( gettime() - level.last_special_event_spawn_time ) / 1000 > var_1 )
|
|
level notify( "force_chaos_event" );
|
|
}
|
|
else
|
|
level notify( "force_chaos_event" );
|
|
|
|
if ( isdefined( level.special_spawn_trigs ) && level.special_spawn_trigs.size )
|
|
level.special_spawn_trigs = common_scripts\utility::array_remove( level.special_spawn_trigs, self );
|
|
|
|
self delete();
|
|
}
|
|
|
|
call_in_rescue_heli( var_0, var_1, var_2 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "nuke_went_off" );
|
|
level.heli_fly_height = 1200;
|
|
level.heli_loop_radius = 1200;
|
|
var_3 = get_center_of_players();
|
|
var_4 = var_3 + ( 0, 0, level.heli_fly_height );
|
|
var_5 = var_0 + ( 0, 0, level.heli_fly_height );
|
|
var_6 = level.heli_loop_radius * ( 0, 1, 0 );
|
|
var_7 = ( 0, 8000, 0 );
|
|
var_8 = var_4 + var_6;
|
|
var_9 = var_4 + var_7;
|
|
|
|
if ( isdefined( level.attack_heli ) )
|
|
{
|
|
level.attack_heli notify( "convert_to_hive_heli" );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.attack_heli, "tag_flash" );
|
|
wait 0.5;
|
|
level.rescue_heli = level.attack_heli;
|
|
}
|
|
else
|
|
{
|
|
level.rescue_heli = heli_setup( level.players[0], var_9, var_8 );
|
|
level.rescue_heli thread heli_fx_setup();
|
|
}
|
|
|
|
level.rescue_heli hide_doors();
|
|
level.rescue_heli.drop_loc = var_0;
|
|
level.rescue_heli.exit_path = [];
|
|
var_10 = common_scripts\utility::getstruct( "heli_extraction_start", "targetname" );
|
|
|
|
for ( level.rescue_heli.exit_path[0] = var_10; isdefined( var_10.target ); level.rescue_heli.exit_path[level.rescue_heli.exit_path.size] = var_10 )
|
|
var_10 = common_scripts\utility::getstruct( var_10.target, "targetname" );
|
|
|
|
level.rescue_heli thread heli_turret_think();
|
|
level.rescue_heli heli_fly_to( var_8, 60 );
|
|
wait 1;
|
|
level.rescue_heli notify( "weapons_free" );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.rescue_heli, "tag_flash" );
|
|
level.rescue_heli heli_loop( var_2, 0, ::get_player_loop_center, "fly_to_extraction" );
|
|
level.rescue_heli thread maps\mp\alien\_music_and_dialog::play_pilot_vo( "so_alien_plt_exfil" );
|
|
level.rescue_heli notify( "stop_turret" );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.rescue_heli, "tag_flash" );
|
|
level.rescue_heli heli_fly_to( var_5, 30 );
|
|
thread sfx_rescue_heli_flyin( level.rescue_heli );
|
|
level.rescue_heli heli_fly_to( var_0, 30 );
|
|
level.rescue_heli notify( "in_position" );
|
|
level.rescue_heli setgoalyaw( var_1[1] );
|
|
level.rescue_heli thread heli_turret_think();
|
|
wait 0.05;
|
|
level.rescue_heli notify( "weapons_free" );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.rescue_heli, "tag_flash" );
|
|
}
|
|
|
|
hide_doors()
|
|
{
|
|
self hidepart( "door_l" );
|
|
self hidepart( "door_l_handle" );
|
|
self hidepart( "door_l_lock" );
|
|
self hidepart( "door_r" );
|
|
self hidepart( "door_r_handle" );
|
|
self hidepart( "door_r_lock" );
|
|
}
|
|
|
|
call_in_attack_heli( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level.heli_fly_height = 1200;
|
|
level.heli_loop_radius = 1200;
|
|
var_2 = get_center_of_players();
|
|
var_3 = var_2 + ( 0, 0, level.heli_fly_height );
|
|
var_4 = level.heli_loop_radius * ( 0, 1, 0 );
|
|
var_5 = ( 0, 8000, 0 );
|
|
var_6 = var_3 + var_4;
|
|
var_7 = var_3 + var_5;
|
|
level.attack_heli = heli_setup( level.players[0], var_7, var_6 );
|
|
level.attack_heli endon( "convert_to_hive_heli" );
|
|
level.attack_heli thread heli_turret_think();
|
|
level.attack_heli thread heli_fx_setup();
|
|
|
|
if ( isdefined( var_1 ) )
|
|
level.attack_heli.reward_pool = var_1;
|
|
|
|
level.attack_heli heli_fly_to( var_6, 60 );
|
|
level.attack_heli maps\mp\alien\_music_and_dialog::playvoforattackchopperincoming();
|
|
wait 1;
|
|
level.attack_heli notify( "weapons_free" );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.attack_heli, "tag_flash" );
|
|
level.attack_heli heli_loop( var_0, 0, ::get_player_loop_center, undefined, 28 );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.attack_heli, "tag_flash" );
|
|
level.attack_heli thread heli_exit( var_7 );
|
|
}
|
|
|
|
call_in_hive_heli( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
common_scripts\utility::flag_init( "evade" );
|
|
var_1 = var_0.origin;
|
|
level.heli_fly_height = 2200;
|
|
level.heli_loop_radius = 1200;
|
|
var_2 = get_center_of_players();
|
|
var_3 = var_2 + ( 0, 0, 1200 );
|
|
var_4 = level.heli_loop_radius * ( 0, 1, 0 );
|
|
var_5 = ( 0, 8000, 0 );
|
|
var_6 = var_3 + var_4;
|
|
var_7 = var_3 + var_5;
|
|
var_8 = 60;
|
|
|
|
if ( isdefined( level.attack_heli ) )
|
|
{
|
|
level.attack_heli notify( "convert_to_hive_heli" );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.attack_heli, "tag_flash" );
|
|
var_8 = 40;
|
|
wait 0.5;
|
|
level.hive_heli = level.attack_heli;
|
|
}
|
|
else
|
|
{
|
|
level.hive_heli = heli_setup( level.players[0], var_7, var_6 );
|
|
level.hive_heli makevehiclesolidsphere( 192 );
|
|
level.hive_heli thread heli_fx_setup();
|
|
}
|
|
|
|
if ( level.hive_heli maps\mp\alien\_utility::ent_flag_exist( "assault_ready" ) )
|
|
level.hive_heli maps\mp\alien\_utility::ent_flag_clear( "assault_ready" );
|
|
else
|
|
level.hive_heli maps\mp\alien\_utility::ent_flag_init( "assault_ready" );
|
|
|
|
level.hive_heli sethoverparams( 60, 30, 20 );
|
|
level.hive_heli setyawspeed( 50, 50 );
|
|
level.hive_heli.no_gas_cloud_attack = 1;
|
|
level.hive_heli.health = 5000000;
|
|
level.hive_heli.maxhealth = 5000000;
|
|
level.hive_heli.evasive_damage = 350;
|
|
level.hive_heli setcandamage( 1 );
|
|
level.hive_heli thread heli_hp_monitor();
|
|
level.hive_heli makeentitysentient( "allies" );
|
|
level.hive_heli setthreatbiasgroup( "hive_heli" );
|
|
level.hive_heli.damagecallback = ::callback_vehicledamage;
|
|
level.hive_heli thread maps\mp\alien\_hud::blocker_hive_chopper_hp_bar();
|
|
var_9 = missile_createattractorent( level.hive_heli, 1000, 8000 );
|
|
level.hive_heli heli_fly_to( var_6, var_8 );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.hive_heli, "tag_flash" );
|
|
|
|
foreach ( var_11 in level.players )
|
|
{
|
|
if ( !isalive( var_11 ) )
|
|
continue;
|
|
|
|
var_12 = randomfloatrange( 2.5, 4 );
|
|
|
|
while ( var_12 >= 0 && isdefined( var_11 ) && isalive( var_11 ) )
|
|
{
|
|
level.hive_heli setturrettargetvec( var_11.origin );
|
|
var_12 = var_12 - 0.05;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
level.hive_heli maps\mp\alien\_utility::ent_flag_set( "assault_ready" );
|
|
level.hive_heli thread heli_turret_think( var_0, 3 );
|
|
level.hive_heli notify( "weapons_free" );
|
|
level.hive_heli thread face_hive( var_0 );
|
|
level.hive_heli hive_heli_assault_loop();
|
|
|
|
if ( common_scripts\utility::flag( "evade" ) )
|
|
{
|
|
common_scripts\utility::flag_clear( "evade" );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.hive_heli, "tag_flash" );
|
|
}
|
|
|
|
level.hive_heli clearlookatent();
|
|
|
|
if ( level.hive_heli.health < 1 )
|
|
{
|
|
|
|
}
|
|
else
|
|
{
|
|
level.hive_heli maps\mp\alien\_music_and_dialog::playvoforblockerhivereward();
|
|
level.hive_heli heli_fly_to( var_1 + ( 0, 0, 600 ), 20 );
|
|
thread spawn_hive_heli_reward( var_1 );
|
|
level.hive_heli heli_fly_to( var_1 + ( 0, 0, 1200 ), 20 );
|
|
}
|
|
|
|
level.hive_heli heli_loop( 2, 0, ::get_player_loop_center, "alien_cycle_started", 28 );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.hive_heli, "tag_flash" );
|
|
level.hive_heli thread heli_exit( var_7 );
|
|
wait 3;
|
|
level.hive_heli maps\mp\alien\_music_and_dialog::playvoforattackchopperleaving();
|
|
}
|
|
|
|
hive_heli_assault_loop()
|
|
{
|
|
self endon( "death" );
|
|
level endon( "blocker_hive_destroyed" );
|
|
var_0 = [];
|
|
var_0 = common_scripts\utility::getstructarray( "assault_hover_" + maps\mp\alien\_hive::get_blocker_hive_index(), "targetname" );
|
|
var_1 = 10;
|
|
var_2 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
setthreatbias( "hive_heli", "spitters", 10000 );
|
|
|
|
if ( var_2 < 4 )
|
|
{
|
|
var_2++;
|
|
var_3 = var_0[randomint( var_0.size )].origin;
|
|
heli_fly_to( var_3, 20 );
|
|
}
|
|
else
|
|
{
|
|
var_2 = 0;
|
|
heli_loop( 1, 0, ::get_assault_loop_loc, "blocker_hive_destroyed", 35 );
|
|
|
|
if ( !common_scripts\utility::flag( "evade" ) )
|
|
continue;
|
|
}
|
|
|
|
if ( !common_scripts\utility::flag( "evade" ) )
|
|
common_scripts\utility::waittill_any_timeout( var_1, "evade" );
|
|
|
|
if ( common_scripts\utility::flag( "evade" ) )
|
|
{
|
|
setignoremegroup( "hive_heli", "spitters" );
|
|
stopfxontag( level._effect["alien_heli_spotlight"], level.hive_heli, "tag_flash" );
|
|
|
|
if ( !maps\mp\alien\_utility::is_hardcore_mode() )
|
|
heli_loop( 4, 0, ::get_assault_loop_loc, "blocker_hive_destroyed", 35 );
|
|
else
|
|
heli_loop( 6, 0, ::get_assault_loop_loc, "blocker_hive_destroyed", 35 );
|
|
|
|
common_scripts\utility::flag_clear( "evade" );
|
|
playfxontag( level._effect["alien_heli_spotlight"], level.hive_heli, "tag_flash" );
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
heli_hp_monitor()
|
|
{
|
|
level endon( "blocker_hive_destroyed" );
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_0 = self.health;
|
|
var_1 = 0;
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = var_1 + ( var_0 - self.health );
|
|
|
|
if ( self.health != var_0 )
|
|
{
|
|
var_4 = var_0 - self.health;
|
|
maps\mp\alien\_alien_matchdata::inc_drill_heli_damages( var_4 );
|
|
var_0 = self.health;
|
|
var_2++;
|
|
|
|
if ( var_2 >= 4 )
|
|
{
|
|
maps\mp\alien\_music_and_dialog::playvoforchoppertakingdamage();
|
|
var_2 = 0;
|
|
self notify( "evade" );
|
|
wait 2;
|
|
}
|
|
}
|
|
|
|
if ( var_1 >= self.evasive_damage )
|
|
{
|
|
maps\mp\alien\_music_and_dialog::playvoforchoppertakingtoomuchdamage();
|
|
var_1 = 0;
|
|
common_scripts\utility::flag_set( "evade" );
|
|
self notify( "evade" );
|
|
self notify( "new_flight_path" );
|
|
}
|
|
|
|
if ( common_scripts\utility::flag( "evade" ) )
|
|
common_scripts\utility::flag_waitopen( "evade" );
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
face_hive( var_0 )
|
|
{
|
|
level endon( "blocker_hive_destroyed" );
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
wait 3;
|
|
|
|
while ( isdefined( var_0 ) && isdefined( self ) )
|
|
{
|
|
if ( !common_scripts\utility::flag( "evade" ) )
|
|
{
|
|
var_1 = var_0.origin - self.origin;
|
|
var_2 = vectortoangles( var_1 );
|
|
self setlookatent( var_0 );
|
|
}
|
|
else
|
|
self clearlookatent();
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
get_assault_loop_loc()
|
|
{
|
|
var_0 = "assault_loop_" + maps\mp\alien\_hive::get_blocker_hive_index();
|
|
var_1 = common_scripts\utility::getstruct( var_0, "targetname" );
|
|
|
|
if ( common_scripts\utility::flag_exist( "evade" ) && common_scripts\utility::flag( "evade" ) )
|
|
return var_1.origin + ( 0, 0, 600 );
|
|
else
|
|
return var_1.origin;
|
|
}
|
|
|
|
spawn_hive_heli_reward( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "new_chaos_airdrop" );
|
|
var_0 = common_scripts\utility::drop_to_ground( var_0, 32, -128 );
|
|
|
|
if ( maps\mp\alien\_hive::get_blocker_hive_index() == 1 )
|
|
{
|
|
var_1 = "deployable_currency";
|
|
var_2 = 1;
|
|
}
|
|
else
|
|
{
|
|
var_1 = "deployable_currency";
|
|
var_2 = 2;
|
|
}
|
|
|
|
var_3 = level.players[randomint( level.players.size )];
|
|
var_3.team_currency_rank = var_2;
|
|
var_4 = maps\mp\alien\_deployablebox::createboxforplayer( var_1, var_0, var_3 );
|
|
var_4.upgrade_rank = var_2;
|
|
var_4.air_dropped = 1;
|
|
wait 0.05;
|
|
var_4 thread maps\mp\alien\_deployablebox::box_setactive( 1 );
|
|
}
|
|
|
|
face_players()
|
|
{
|
|
self endon( "extract" );
|
|
level endon( "game_ended" );
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = get_center_of_players();
|
|
var_1 = var_0 - self.origin;
|
|
var_2 = vectortoangles( var_1 );
|
|
self setgoalyaw( var_2[1] );
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
heli_exit( var_0, var_1 )
|
|
{
|
|
self notify( "new_flight_path" );
|
|
self notify( "heli_exiting" );
|
|
self endon( "heli_exiting" );
|
|
self endon( "convert_to_hive_heli" );
|
|
wait 0.05;
|
|
self notify( "stop_turret" );
|
|
heli_fly_to( var_0, 60 );
|
|
|
|
if ( !isdefined( var_1 ) || !var_1 )
|
|
self delete();
|
|
}
|
|
|
|
heli_setup( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = vectortoangles( var_2 - var_1 );
|
|
var_4 = spawnhelicopter( var_0, var_1, var_3, "nh90_alien", "vehicle_nh90_interior2" );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
return;
|
|
|
|
var_4.health = 999999;
|
|
var_4.maxhealth = 500;
|
|
var_4.damagetaken = 0;
|
|
var_4.team = "allies";
|
|
var_4 setcandamage( 0 );
|
|
var_4 setyawspeed( 80, 60 );
|
|
var_4 setmaxpitchroll( 30, 30 );
|
|
var_4 sethoverparams( 10, 10, 60 );
|
|
var_4 setvehweapon( "cobra_20mm_alien" );
|
|
var_4.fire_time = weaponfiretime( "cobra_20mm_alien" );
|
|
return var_4;
|
|
}
|
|
|
|
heli_fx_setup()
|
|
{
|
|
playfxontag( level._effect["cockpit_blue_cargo01"], self, "tag_light_cargo01" );
|
|
playfxontag( level._effect["cockpit_blue_cockpit01"], self, "tag_light_cockpit01" );
|
|
wait 0.05;
|
|
playfxontag( level._effect["white_blink"], self, "tag_light_belly" );
|
|
playfxontag( level._effect["white_blink_tail"], self, "tag_light_tail" );
|
|
wait 0.05;
|
|
playfxontag( level._effect["wingtip_green"], self, "tag_light_L_wing" );
|
|
playfxontag( level._effect["wingtip_red"], self, "tag_light_R_wing" );
|
|
}
|
|
|
|
heli_turret_think( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self endon( "stop_turret" );
|
|
self endon( "convert_to_hive_heli" );
|
|
self waittill( "weapons_free" );
|
|
|
|
while ( isdefined( self ) && isalive( self ) )
|
|
{
|
|
var_2 = get_primary_target( var_0, var_1 );
|
|
|
|
if ( !isdefined( var_2 ) || !isalive( var_2 ) )
|
|
{
|
|
setomnvar( "ui_alien_chopper_state", 0 );
|
|
wait 1;
|
|
continue;
|
|
}
|
|
|
|
if ( common_scripts\utility::flag_exist( "evade" ) && common_scripts\utility::flag( "evade" ) )
|
|
{
|
|
setomnvar( "ui_alien_chopper_state", 1 );
|
|
wait 1;
|
|
continue;
|
|
}
|
|
|
|
self setturrettargetvec( var_2.origin + ( 0, 0, 16 ) );
|
|
common_scripts\utility::waittill_notify_or_timeout( "turret_on_target", 4 );
|
|
|
|
if ( isdefined( var_2 ) && isdefined( var_0 ) && var_2 == var_0 )
|
|
{
|
|
setomnvar( "ui_alien_chopper_state", 2 );
|
|
setomnvar( "ui_alien_boss_status", 2 );
|
|
}
|
|
|
|
var_3 = 30 + ( randomintrange( 0, 20 ) - 5 );
|
|
|
|
for ( var_4 = 0; var_4 < var_3; var_4++ )
|
|
{
|
|
if ( !isdefined( var_2 ) || !isalive( var_2 ) )
|
|
break;
|
|
|
|
var_5 = ( 0, 0, 16 );
|
|
self setturrettargetvec( var_2.origin + var_5 );
|
|
self fireweapon( "tag_flash", var_2, ( 0, 0, 0 ) );
|
|
wait( self.fire_time );
|
|
}
|
|
|
|
wait( randomfloatrange( 1, 3.5 ) );
|
|
}
|
|
}
|
|
|
|
get_primary_target( var_0, var_1 )
|
|
{
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.agentarray )
|
|
{
|
|
if ( !isdefined( var_4.allowvehicledamage ) )
|
|
var_4.allowvehicledamage = 1;
|
|
|
|
if ( var_4.team != "axis" )
|
|
continue;
|
|
|
|
if ( !isalive( var_4 ) )
|
|
continue;
|
|
|
|
if ( distance( var_4.origin, self.origin ) > 2500 )
|
|
continue;
|
|
|
|
var_5 = gettime() - var_4.birthtime;
|
|
|
|
if ( var_5 < 4000 )
|
|
continue;
|
|
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
if ( var_2.size > 0 )
|
|
{
|
|
var_2 = sortbydistance( var_2, self.origin );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
var_7 = distance( var_2[0].origin, self.origin );
|
|
var_8 = distance( var_0.origin, self.origin );
|
|
|
|
if ( var_7 >= var_8 / var_1 )
|
|
return var_0;
|
|
}
|
|
|
|
return var_2[0];
|
|
}
|
|
else
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
return var_0;
|
|
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
heli_fly_to( var_0, var_1, var_2 )
|
|
{
|
|
self notify( "new_flight_path" );
|
|
self endon( "new_flight_path" );
|
|
self endon( "convert_to_hive_heli" );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
level endon( var_2 );
|
|
|
|
self vehicle_setspeed( var_1, var_1 * 0.75, var_1 * 0.75 );
|
|
self setvehgoalpos( var_0, 1 );
|
|
debug_line( self.origin, var_0, ( 0, 0.5, 1 ), 200 );
|
|
|
|
if ( isdefined( self.near_goal ) && self.near_goal )
|
|
self waittill( "near_goal" );
|
|
else
|
|
self waittill( "goal" );
|
|
}
|
|
|
|
heli_loop( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
self notify( "new_flight_path" );
|
|
self endon( "new_flight_path" );
|
|
self endon( "death" );
|
|
self endon( "convert_to_hive_heli" );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
level endon( var_3 );
|
|
self endon( var_3 );
|
|
}
|
|
|
|
var_5 = 12;
|
|
|
|
if ( isdefined( var_1 ) && var_1 )
|
|
var_5 = var_5 * -1;
|
|
|
|
var_6 = 0;
|
|
var_7 = ( 0, level.heli_loop_radius, 0 );
|
|
var_8 = 30;
|
|
|
|
if ( isdefined( var_4 ) )
|
|
var_8 = var_4;
|
|
|
|
var_9 = self.origin;
|
|
var_10 = var_9;
|
|
var_11 = [[ var_2 ]]();
|
|
|
|
while ( var_0 > 0 && self.health > 0 )
|
|
{
|
|
var_12 = rotatevector( var_7, ( 0, var_6, 0 ) );
|
|
var_6 = var_6 + var_5;
|
|
|
|
if ( var_6 >= 360 )
|
|
{
|
|
var_11 = [[ var_2 ]]();
|
|
var_6 = 0;
|
|
var_0--;
|
|
}
|
|
|
|
var_9 = var_10;
|
|
var_10 = var_11 + var_12;
|
|
self vehicle_setspeed( var_8, var_8, var_8 );
|
|
self setvehgoalpos( var_10, 0 );
|
|
debug_line( var_9, var_10, ( 0, 0.5, 1 ), 100 );
|
|
var_13 = abs( level.heli_loop_radius * sin( var_5 ) );
|
|
var_14 = get_travel_time( var_13, var_8 );
|
|
var_15 = 0.1;
|
|
wait( var_14 * ( 1 - var_15 ) );
|
|
}
|
|
}
|
|
|
|
get_drop_loop_center()
|
|
{
|
|
return self.drop_loc + ( 0, 0, level.heli_fly_height );
|
|
}
|
|
|
|
get_drop_loop_crater()
|
|
{
|
|
return ( -10251, 6937, level.heli_fly_height + 400 );
|
|
}
|
|
|
|
get_player_loop_center()
|
|
{
|
|
var_0 = get_center_of_players();
|
|
return var_0 + ( 0, 0, level.heli_fly_height );
|
|
}
|
|
|
|
get_travel_time( var_0, var_1 )
|
|
{
|
|
var_2 = var_1 * 17.6;
|
|
var_3 = var_0 / var_2;
|
|
return var_3;
|
|
}
|
|
|
|
debug_line( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 && !isdefined( var_3 ) )
|
|
thread draw_line( var_0, var_1, var_2 );
|
|
else if ( isdefined( level.heli_debug ) && level.heli_debug == 1.0 )
|
|
thread draw_line( var_0, var_1, var_2, var_3 );
|
|
}
|
|
|
|
draw_line( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
for ( var_4 = 0; var_4 < var_3; var_4++ )
|
|
wait 0.05;
|
|
}
|
|
else
|
|
{
|
|
for (;;)
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
is_weight_a_less_than_b( var_0, var_1 )
|
|
{
|
|
return var_0.weight < var_1.weight;
|
|
}
|
|
|
|
get_center_of_players( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 0;
|
|
|
|
var_1 = 0;
|
|
var_2 = 0;
|
|
var_3 = 0;
|
|
|
|
foreach ( var_5 in level.players )
|
|
{
|
|
var_1 = var_1 + var_5.origin[0];
|
|
var_2 = var_2 + var_5.origin[1];
|
|
var_3 = var_3 + ( var_5.origin[2] + var_0 );
|
|
}
|
|
|
|
var_7 = max( 1, level.players.size );
|
|
var_8 = ( var_1 / var_7, var_2 / var_7, var_3 / var_7 );
|
|
return var_8;
|
|
}
|
|
|
|
register_sub_item( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( level.chaos_sub_items ) )
|
|
level.chaos_sub_items = [];
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 1;
|
|
|
|
for ( var_3 = 0; var_3 < var_2; var_3++ )
|
|
{
|
|
var_4 = level.chaos_sub_items.size;
|
|
level.chaos_sub_items[var_4] = [];
|
|
level.chaos_sub_items[var_4][0] = var_0;
|
|
level.chaos_sub_items[var_4][1] = var_1;
|
|
}
|
|
}
|
|
|
|
get_random_airdrop_sub_item()
|
|
{
|
|
return level.chaos_sub_items[randomint( level.chaos_sub_items.size )];
|
|
}
|
|
|
|
callback_vehicledamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 )
|
|
{
|
|
if ( !isplayer( var_1 ) && isdefined( var_1.owner ) && isplayer( var_1.owner ) )
|
|
var_1 = var_1.owner;
|
|
|
|
if ( var_1 == self || isdefined( var_1.pers ) && var_1.pers["team"] == self.team && level.teambased )
|
|
return;
|
|
|
|
if ( self.health <= 0 )
|
|
return;
|
|
|
|
if ( isdefined( self.evasive_damage ) && self.health - var_2 <= self.evasive_damage && ( !isdefined( self.smoking ) || !self.smoking ) )
|
|
{
|
|
thread playdamageefx();
|
|
self.smoking = 1;
|
|
}
|
|
|
|
self vehicle_finishdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11 );
|
|
}
|
|
|
|
playdamageefx()
|
|
{
|
|
self endon( "death" );
|
|
wait 0.15;
|
|
playfxontag( level._effect["harrier_heavy_smoke"], self, "tag_engine_left" );
|
|
}
|
|
|
|
airdrop_reward()
|
|
{
|
|
if ( !isdefined( level.chaos_airdrop_locs ) || level.chaos_airdrop_locs.size == 0 )
|
|
return;
|
|
|
|
level notify( "new_chaos_airdrop" );
|
|
var_0 = get_chaos_airdrop_loc();
|
|
thread start_supply_drop_sequence( var_0.sub_locs[0] );
|
|
thread spawn_random_airdrop_sub_items( var_0.sub_locs );
|
|
var_0.weight++;
|
|
}
|
|
|
|
set_chaos_airdrop_icon( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "new_chaos_airdrop" );
|
|
|
|
if ( isdefined( level.airdrop_icon ) )
|
|
level.airdrop_icon destroy();
|
|
|
|
level.airdrop_icon = newhudelem();
|
|
level.airdrop_icon setshader( "waypoint_ammo", 14, 14 );
|
|
level.airdrop_icon.alpha = 1;
|
|
level.airdrop_icon.color = ( 1, 1, 1 );
|
|
level.airdrop_icon setwaypoint( 1, 1 );
|
|
level.airdrop_icon.x = var_0[0];
|
|
level.airdrop_icon.y = var_0[1];
|
|
level.airdrop_icon.z = var_0[2];
|
|
wait( var_1 );
|
|
|
|
if ( isdefined( level.airdrop_icon ) )
|
|
level.airdrop_icon destroy();
|
|
}
|
|
|
|
get_chaos_airdrop_loc()
|
|
{
|
|
var_0 = 3000;
|
|
var_1 = get_center_of_players();
|
|
var_2 = level.chaos_airdrop_locs;
|
|
var_2 = sortbydistance( var_2, var_1 );
|
|
var_3 = [];
|
|
|
|
foreach ( var_5 in var_2 )
|
|
{
|
|
if ( distance( var_5.origin, var_1 ) > var_0 )
|
|
var_3[var_3.size] = var_5;
|
|
}
|
|
|
|
var_7 = 4;
|
|
var_8 = [];
|
|
|
|
for ( var_9 = 0; var_9 < 4; var_9++ )
|
|
{
|
|
if ( !isdefined( var_3[var_9] ) )
|
|
break;
|
|
|
|
var_8[var_9] = var_3[var_9];
|
|
}
|
|
|
|
var_10 = common_scripts\utility::array_sort_with_func( var_8, ::is_weight_a_less_than_b );
|
|
return var_10[0];
|
|
}
|
|
|
|
start_supply_drop_sequence( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "new_chaos_airdrop" );
|
|
call_in_airdrop_heli( var_0, 3, 3 );
|
|
wait 2;
|
|
level notify( "chaos_airdrop_landed" );
|
|
}
|
|
|
|
spawn_random_airdrop_sub_items( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "new_chaos_airdrop" );
|
|
level waittill( "chaos_airdrop_landed" );
|
|
var_1 = 0;
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( var_1 >= level.chaos_sub_items.size )
|
|
var_1 = 0;
|
|
|
|
var_4 = level.chaos_sub_items[var_1][0];
|
|
var_5 = level.chaos_sub_items[var_1][1];
|
|
var_6 = level.players[randomint( level.players.size )];
|
|
var_6.team_currency_rank = var_5;
|
|
|
|
if ( var_4 == "deployable_currency" )
|
|
var_3 = var_3 + ( 0, 0, 16 );
|
|
|
|
var_7 = maps\mp\killstreaks\_deployablebox::createboxforplayer( var_4, var_3, var_6 );
|
|
var_7.upgrade_rank = var_5;
|
|
var_7.air_dropped = 1;
|
|
wait 0.05;
|
|
var_7 thread maps\mp\killstreaks\_deployablebox::box_setactive( 1 );
|
|
var_1++;
|
|
}
|
|
}
|
|
|
|
call_in_airdrop_heli( var_0, var_1, var_2 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level.heli_fly_height = 1500;
|
|
level.heli_loop_radius = 1200;
|
|
var_3 = get_center_of_players();
|
|
var_4 = var_3 + ( 0, 0, level.heli_fly_height );
|
|
var_5 = var_0 + ( 0, 0, level.heli_fly_height );
|
|
var_6 = level.heli_loop_radius * ( 0, 1, 0 );
|
|
var_7 = ( 0, 8000, 0 );
|
|
var_8 = var_4 + var_6;
|
|
var_9 = var_4 + var_7;
|
|
level.airdrop_heli = heli_setup( level.players[0], var_9, var_8 );
|
|
level.airdrop_heli thread heli_turret_think();
|
|
level.airdrop_heli thread heli_fx_setup();
|
|
level.airdrop_heli.drop_loc = var_0;
|
|
level.airdrop_heli heli_fly_to( var_8, 60 );
|
|
wait 1;
|
|
level.airdrop_heli notify( "weapons_free" );
|
|
level.airdrop_heli heli_loop( var_1, 0, ::get_player_loop_center );
|
|
level.airdrop_heli heli_loop( var_2, 0, ::get_drop_loop_center );
|
|
level.airdrop_heli heli_fly_to( var_5, 30 );
|
|
var_10 = var_0 + ( 0, 0, 450 );
|
|
level.airdrop_heli heli_fly_to( var_10, 30 );
|
|
level.airdrop_heli thread heli_exit( var_9 );
|
|
}
|
|
|
|
init_chaos_airdrop()
|
|
{
|
|
level.chaos_airdrop_locs = common_scripts\utility::getstructarray( "chaos_airdrop", "targetname" );
|
|
|
|
if ( !isdefined( level.chaos_airdrop_locs ) || level.chaos_airdrop_locs.size == 0 )
|
|
return;
|
|
|
|
foreach ( var_1 in level.chaos_airdrop_locs )
|
|
{
|
|
var_1.sub_locs = [];
|
|
var_1.sub_locs[0] = var_1.origin;
|
|
var_2 = common_scripts\utility::getstructarray( var_1.target, "targetname" );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
var_1.sub_locs[var_1.sub_locs.size] = var_4.origin;
|
|
|
|
var_1.weight = 0;
|
|
}
|
|
|
|
register_airdrop_sub_items();
|
|
}
|
|
|
|
test_supply_drop()
|
|
{
|
|
level.heli_debug = 1;
|
|
wait 5;
|
|
level thread airdrop_reward();
|
|
}
|
|
|
|
test_attack_heli()
|
|
{
|
|
level.heli_debug = 1;
|
|
wait 5;
|
|
level thread call_in_attack_heli( 10 );
|
|
}
|
|
|
|
register_airdrop_sub_items()
|
|
{
|
|
register_sub_item( "deployable_currency", 4, 1 );
|
|
register_sub_item( "deployable_ammo", 4, 1 );
|
|
}
|
|
|
|
sfx_rescue_heli_flyin( var_0 )
|
|
{
|
|
var_0 playsound( "alien_heli_rescue_dz_flyin" );
|
|
wait 1;
|
|
var_0 vehicle_turnengineoff();
|
|
wait 1.6;
|
|
level.heli_lp = spawn( "script_origin", var_0.origin );
|
|
level.heli_lp linkto( var_0 );
|
|
level.heli_lp playloopsound( "alien_heli_rescue_dz_engine_lp" );
|
|
}
|
|
|
|
sfx_rescue_heli_escape( var_0 )
|
|
{
|
|
level.player playsound( "alien_heli_rescue_exfil_lr" );
|
|
wait 1;
|
|
level.heli_lp stoploopsound( "alien_heli_rescue_dz_engine_lp" );
|
|
wait 5;
|
|
level.heli_exfil_lp = spawn( "script_origin", var_0.origin );
|
|
level.heli_exfil_lp linkto( var_0 );
|
|
level.heli_exfil_lp playloopsound( "alien_heli_exfil_engine_lp" );
|
|
wait 18;
|
|
level.heli_exfil_lp stoploopsound( "alien_heli_exfil_engine_lp" );
|
|
}
|
|
|
|
inbound_chopper_text()
|
|
{
|
|
foreach ( var_1 in level.players )
|
|
{
|
|
var_1 thread show_blocker_hive_hint_text( &"ALIENS_BLOCKER_HIVE_HINT" );
|
|
var_1 thread show_drill_hint();
|
|
}
|
|
}
|
|
|
|
show_blocker_hive_hint_text( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
while ( isdefined( self.usebartext ) )
|
|
wait 0.1;
|
|
|
|
var_1 = 1.5;
|
|
var_2 = "objective";
|
|
|
|
if ( level.splitscreen )
|
|
var_1 = 1.2;
|
|
|
|
self.usebartext = maps\mp\gametypes\_hud_util::createprimaryprogressbartext( 0, -50, var_1, var_2 );
|
|
self.usebartext settext( var_0 );
|
|
self.usebartext setpulsefx( 50, 5000, 800 );
|
|
wait 6;
|
|
self.usebartext maps\mp\gametypes\_hud_util::destroyelem();
|
|
self.usebartext = undefined;
|
|
}
|
|
|
|
show_drill_hint()
|
|
{
|
|
self endon( "disconnect" );
|
|
var_0 = 122500;
|
|
|
|
while ( is_blocker_alive() )
|
|
{
|
|
if ( isdefined( level.current_blocker_hive ) && isdefined( level.drill_carrier ) && level.drill_carrier == self )
|
|
{
|
|
if ( distancesquared( self.origin, level.current_blocker_hive.origin ) < var_0 && isdefined( level.drill_carrier ) && level.drill_carrier == self )
|
|
maps\mp\_utility::setlowermessage( "hive_drill_hint", &"ALIENS_BLOCKER_HIVE_DRILL_HINT" );
|
|
|
|
while ( is_blocker_alive() && ( distancesquared( self.origin, level.current_blocker_hive.origin ) < var_0 && isdefined( level.drill_carrier ) && level.drill_carrier == self ) )
|
|
wait 0.25;
|
|
|
|
maps\mp\_utility::clearlowermessage( "hive_drill_hint" );
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
is_blocker_alive()
|
|
{
|
|
if ( !common_scripts\utility::flag_exist( "blocker_hive_destroyed" ) )
|
|
return 0;
|
|
|
|
return !common_scripts\utility::flag( "blocker_hive_destroyed" ) && isdefined( level.current_blocker_hive );
|
|
}
|