iw6-scripts/vehicle_scripts/_attack_heli.gsc
2024-02-13 13:20:49 +01:00

1652 lines
41 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
preload()
{
precacheitem( "turret_attackheli" );
precacheitem( "missile_attackheli" );
attack_heli_fx();
thread init();
}
attack_heli_fx()
{
if ( getdvarint( "sm_enable" ) && getdvar( "r_zfeather" ) != "0" )
level._effect["_attack_heli_spotlight"] = loadfx( "fx/misc/hunted_spotlight_model" );
else
level._effect["_attack_heli_spotlight"] = loadfx( "fx/misc/spotlight_large" );
}
init()
{
if ( isdefined( level.attackheliaiburstsize ) )
return;
while ( !isdefined( level.gameskill ) )
wait 0.05;
if ( !isdefined( level.cosine ) )
level.cosine = [];
if ( !isdefined( level.cosine["25"] ) )
level.cosine["25"] = cos( 25 );
if ( !isdefined( level.cosine["35"] ) )
level.cosine["35"] = cos( 35 );
if ( !isdefined( level.attackhelirange ) )
level.attackhelirange = 3500;
if ( !isdefined( level.attackhelikillsai ) )
level.attackhelikillsai = 0;
if ( !isdefined( level.attackhelifov ) )
level.attackhelifov = cos( 30 );
level.attackheliaiburstsize = 1;
level.attackhelimemory = 3;
level.attackhelitargetreaquire = 6;
level.attackhelimovetime = 3;
switch ( level.gameskill )
{
case 0:
level.attackheliplayerbreak = 9;
level.attackhelitimeout = 1;
break;
case 1:
level.attackheliplayerbreak = 7;
level.attackhelitimeout = 2;
break;
case 2:
level.attackheliplayerbreak = 5;
level.attackhelitimeout = 3;
break;
case 3:
level.attackheliplayerbreak = 3;
level.attackhelitimeout = 5;
break;
}
}
start_attack_heli( var_0 )
{
if ( !isdefined( var_0 ) )
var_0 = "kill_heli";
var_1 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( var_0 );
var_1 = begin_attack_heli_behavior( var_1 );
return var_1;
}
begin_attack_heli_behavior( var_0, var_1 )
{
var_0 endon( "death" );
var_0 endon( "heli_players_dead" );
if ( level.gameskill == 0 || level.gameskill == 1 )
{
var_2 = spawn( "script_origin", var_0.origin + ( 0, 0, -20 ) );
var_2 linkto( var_0 );
var_0 thread common_scripts\utility::delete_on_death( var_2 );
var_3 = undefined;
if ( level.gameskill == 0 )
var_3 = 2800;
else
var_3 = 2200;
if ( !isdefined( var_0.no_attractor ) )
{
var_0.attractor = missile_createattractorent( var_2, var_3, 10000, level.player );
if ( maps\_utility::is_coop() )
var_0.attractor2 = missile_createattractorent( var_2, var_3, 10000, level.player2 );
}
}
var_0 enableaimassist();
var_0.startingorigin = spawn( "script_origin", var_0.origin );
var_0 thread common_scripts\utility::delete_on_death( var_0.startingorigin );
if ( !isdefined( var_0.circling ) )
var_0.circling = 0;
var_0.allowshoot = 1;
var_0.firingmissiles = 0;
var_0.moving = 1;
var_0.istakingdamage = 0;
var_0.heli_lastattacker = undefined;
var_0 thread notify_disable();
var_0 thread notify_enable();
thread kill_heli_logic( var_0, var_1 );
var_0.turrettype = undefined;
var_0 heli_default_target_setup();
var_0 thread detect_player_death();
switch ( var_0.vehicletype )
{
case "ny_harbor_hind":
case "hind_blackice":
case "hind":
var_0.turrettype = "default";
break;
case "mi28":
case "nh90":
case "mi17":
var_0.turrettype = "default";
break;
case "apache":
var_0.turrettype = "default";
break;
case "littlebird_spotlight":
case "littlebird":
var_0 setyawspeed( 90, 30, 20 );
var_0 setmaxpitchroll( 40, 40 );
var_0 sethoverparams( 100, 20, 5 );
var_0 setup_miniguns();
break;
default:
break;
}
var_0.etarget = var_0.targetdefault;
if ( isdefined( var_0.script_spotlight ) && var_0.script_spotlight == 1 && !isdefined( var_0.spotlight ) )
var_0 thread heli_spotlight_on( undefined, 1 );
var_0 thread attack_heli_cleanup();
return var_0;
}
detect_player_death()
{
foreach ( var_1 in level.players )
var_1 maps\_utility::add_wait( maps\_utility::waittill_msg, "death" );
maps\_utility::do_wait_any();
self notify( "heli_players_dead" );
}
heli_default_target_setup()
{
var_0 = undefined;
var_1 = undefined;
switch ( self.vehicletype )
{
case "ny_harbor_hind":
case "hind_blackice":
case "hind":
var_1 = 600;
var_0 = -100;
break;
case "mi28":
case "nh90":
case "mi17":
var_1 = 600;
var_0 = -100;
break;
case "apache":
var_1 = 600;
var_0 = -100;
break;
case "littlebird_spotlight":
case "littlebird":
var_1 = 600;
var_0 = -204;
break;
default:
break;
}
self.targetdefault = spawn( "script_origin", self.origin );
self.targetdefault.angles = self.angles;
self.targetdefault.origin = self.origin;
var_2 = spawnstruct();
var_2.entity = self.targetdefault;
var_2.forward = var_1;
var_2.up = var_0;
var_2 maps\_utility::translate_local();
self.targetdefault linkto( self );
self.targetdefault thread heli_default_target_cleanup( self );
}
get_turrets()
{
if ( isdefined( self.turrets ) )
return self.turrets;
setup_miniguns();
return self.turrets;
}
setup_miniguns()
{
self.turrettype = "miniguns";
self.minigunsspinning = 0;
self.firingguns = 0;
if ( !isdefined( self.mgturret ) )
return;
self.turrets = self.mgturret;
common_scripts\utility::array_thread( self.turrets, ::littlebird_turrets_think, self );
}
heli_default_target_cleanup( var_0 )
{
var_0 common_scripts\utility::waittill_either( "death", "crash_done" );
if ( isdefined( self ) )
self delete();
}
start_circling_heli( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
var_0 = "kill_heli";
var_2 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( var_0 );
var_2.startingorigin = spawn( "script_origin", var_2.origin );
var_2 thread common_scripts\utility::delete_on_death( var_2.startingorigin );
var_2.circling = 1;
var_2.allowshoot = 1;
var_2.firingmissiles = 0;
var_2 thread notify_disable();
var_2 thread notify_enable();
thread kill_heli_logic( var_2, var_1 );
return var_2;
}
kill_heli_logic( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
{
var_0 = maps\_vehicle::spawn_vehicle_from_targetname_and_drive( "kill_heli" );
var_0.allowshoot = 1;
var_0.firingmissiles = 0;
var_0 thread notify_disable();
var_0 thread notify_enable();
}
var_2 = undefined;
if ( !isdefined( var_0.script_airspeed ) )
var_2 = 40;
else
var_2 = var_0.script_airspeed;
if ( !isdefined( level.enemy_heli_killed ) )
level.enemy_heli_killed = 0;
if ( !isdefined( level.commander_speaking ) )
level.commander_speaking = 0;
if ( !isdefined( level.enemy_heli_attacking ) )
level.enemy_heli_attacking = 0;
level.attack_heli_safe_volumes = undefined;
var_3 = getentarray( "attack_heli_safe_volume", "script_noteworthy" );
if ( var_3.size > 0 )
level.attack_heli_safe_volumes = var_3;
if ( !level.enemy_heli_killed )
thread dialog_nags_heli( var_0 );
if ( !isdefined( var_0.helicopter_predator_target_shader ) )
{
switch ( var_0.vehicletype )
{
case "mi28":
case "nh90":
case "mi17":
target_set( var_0, ( 0, 0, -80 ) );
break;
case "ny_harbor_hind":
case "hind_blackice":
case "hind":
target_set( var_0, ( 0, 0, -96 ) );
break;
case "apache":
target_set( var_0, ( 0, 0, -96 ) );
break;
case "littlebird_spotlight":
case "littlebird":
target_set( var_0, ( 0, 0, -80 ) );
break;
default:
break;
}
target_setjavelinonly( var_0, 1 );
}
var_0 thread heli_damage_monitor();
var_0 thread heli_death_monitor();
var_0 endon( "death" );
var_0 endon( "heli_players_dead" );
var_0 endon( "returning_home" );
var_0 setvehweapon( "turret_attackheli" );
if ( !isdefined( var_0.circling ) )
var_0.circling = 0;
if ( !var_0.circling )
{
var_0 setneargoalnotifydist( 100 );
if ( !isdefined( var_0.dontwaitforpathend ) )
var_0 waittill( "reached_dynamic_path_end" );
}
else
{
var_0 setneargoalnotifydist( 500 );
var_0 waittill( "near_goal" );
}
var_0 thread heli_shoot_think();
if ( var_0.circling )
var_0 thread heli_circling_think( var_1, var_2 );
else
var_0 thread heli_goal_think( var_2 );
}
heli_circling_think( var_0, var_1 )
{
if ( !isdefined( var_0 ) )
var_0 = "attack_heli_circle_node";
var_2 = getentarray( var_0, "targetname" );
if ( !isdefined( var_2 ) || var_2.size < 1 )
var_2 = common_scripts\utility::getstructarray( var_0, "targetname" );
var_3 = self;
var_3 endon( "stop_circling" );
var_3 endon( "death" );
var_3 endon( "returning_home" );
var_3 endon( "heli_players_dead" );
for (;;)
{
var_3 vehicle_setspeed( var_1, var_1 / 4, var_1 / 4 );
var_3 setneargoalnotifydist( 100 );
var_4 = maps\_utility::get_closest_player_healthy( var_3.origin );
var_5 = var_4.origin;
var_3 setlookatent( var_4 );
var_6 = common_scripts\utility::getclosest( var_5, var_2 );
var_7 = getentarray( var_6.target, "targetname" );
if ( !isdefined( var_7 ) || var_7.size < 1 )
var_7 = common_scripts\utility::getstructarray( var_6.target, "targetname" );
var_8 = var_7[randomint( var_7.size )];
var_3 setvehgoalpos( var_8.origin, 1 );
var_3 waittill( "near_goal" );
if ( !isdefined( var_4.is_controlling_uav ) )
{
wait 1;
wait( randomfloatrange( 0.8, 1.3 ) );
}
}
}
heli_goal_think( var_0 )
{
self endon( "death" );
var_1 = getentarray( "kill_heli_spot", "targetname" );
var_2 = self;
var_3 = common_scripts\utility::getclosest( var_2.origin, var_1 );
var_4 = var_3;
var_2 endon( "death" );
var_2 endon( "returning_home" );
var_2 endon( "heli_players_dead" );
var_5 = undefined;
for (;;)
{
wait 0.05;
var_2 vehicle_setspeed( var_0, var_0 / 2, var_0 / 10 );
var_2 setneargoalnotifydist( 100 );
var_6 = maps\_utility::get_closest_player_healthy( var_2.origin );
var_7 = var_6.origin;
if ( var_3 == var_4 && var_2.istakingdamage )
{
var_8 = get_linked_points( var_2, var_3, var_1, var_6, var_7 );
var_3 = common_scripts\utility::getclosest( var_7, var_8 );
}
var_2 setvehgoalpos( var_3.origin, 1 );
var_2.moving = 1;
var_6 = maps\_utility::get_closest_player_healthy( var_2.origin );
if ( isdefined( self.etarget ) && isdefined( self.etarget.classname ) && self.etarget.classname == "script_origin" )
var_5 = var_6;
else if ( isdefined( self.etarget ) )
var_5 = self.etarget;
else
var_5 = self.targetdefault;
var_2 setlookatent( var_5 );
var_2 waittill( "near_goal" );
var_2.moving = 0;
if ( !maps\_utility::is_coop() )
{
if ( level.gameskill == 0 || level.gameskill == 1 )
{
while ( player_is_aiming_with_rocket( var_2 ) )
wait 0.5;
wait 3;
}
}
var_6 = maps\_utility::get_closest_player_healthy( var_2.origin );
var_7 = var_6.origin;
var_8 = get_linked_points( var_2, var_3, var_1, var_6, var_7 );
var_8[var_8.size] = var_3;
var_4 = var_3;
var_9 = common_scripts\utility::getclosest( var_7, var_1 );
var_10 = common_scripts\utility::getclosest( var_7, var_8 );
foreach ( var_12 in var_8 )
{
if ( var_6 sightconetrace( var_12.origin, var_2 ) != 1 )
{
var_8 = common_scripts\utility::array_remove( var_8, var_12 );
continue;
}
}
var_14 = common_scripts\utility::getclosest( var_7, var_8 );
if ( var_8.size < 2 )
var_3 = var_10;
else if ( var_14 != var_9 )
var_3 = var_14;
else
{
var_15 = [];
var_15[0] = var_14;
var_8 = common_scripts\utility::get_array_of_closest( var_7, var_8, var_15, 2 );
var_16 = randomint( var_8.size );
if ( randomint( 100 ) > 50 )
var_3 = var_8[var_16];
else
var_3 = var_9;
}
var_17 = randomfloatrange( level.attackhelimovetime - 0.5, level.attackhelimovetime + 0.5 );
common_scripts\utility::waittill_notify_or_timeout( "damage_by_player", var_17 );
}
}
player_is_aiming_with_rocket( var_0 )
{
if ( !level.player usingantiairweapon() )
return 0;
if ( !level.player adsbuttonpressed() )
return 0;
var_1 = level.player geteye();
if ( sighttracepassed( var_1, var_0.origin, 0, level.player ) )
return 1;
return 0;
}
heli_shoot_think()
{
self endon( "stop_shooting" );
self endon( "death" );
self endon( "heli_players_dead" );
thread heli_missiles_think();
var_0 = level.attackhelirange * level.attackhelirange;
level.attackheligraceperiod = 0;
while ( isdefined( self ) )
{
wait( randomfloatrange( 0.8, 1.3 ) );
if ( !heli_has_target() || !heli_has_player_target() )
{
var_1 = heli_get_target_player_only();
if ( isplayer( var_1 ) )
self.etarget = var_1;
}
if ( heli_has_player_target() && level.players.size > 1 )
{
var_2 = maps\_utility::get_closest_player_healthy( self.origin );
if ( self.etarget != var_2 )
{
var_1 = heli_get_target_player_only();
if ( isplayer( var_1 ) )
self.etarget = var_1;
}
}
if ( heli_has_player_target() )
{
if ( !heli_can_see_target() || level.attackheligraceperiod == 1 )
{
var_1 = heli_get_target_ai_only();
self.etarget = var_1;
}
}
if ( isdefined( self.heli_lastattacker ) && isplayer( self.heli_lastattacker ) )
self.etarget = self.heli_lastattacker;
else if ( !heli_has_target() )
{
var_1 = heli_get_target_ai_only();
self.etarget = var_1;
}
if ( !heli_has_target() )
continue;
if ( self.etarget is_hidden_from_heli( self ) )
continue;
if ( heli_has_target() && distancesquared( self.etarget.origin, self.origin ) > var_0 )
continue;
if ( self.turrettype == "default" && heli_has_player_target() )
{
miss_player( self.etarget );
wait( randomfloatrange( 0.8, 1.3 ) );
miss_player( self.etarget );
wait( randomfloatrange( 0.8, 1.3 ) );
while ( can_see_player( self.etarget ) && !self.etarget is_hidden_from_heli( self ) )
{
fire_guns();
wait( randomfloatrange( 2.0, 4.0 ) );
}
continue;
}
if ( isplayer( self.etarget ) || isai( self.etarget ) )
fire_guns();
if ( isplayer( self.etarget ) )
thread player_grace_period( self );
common_scripts\utility::waittill_notify_or_timeout( "damage_by_player", level.attackhelitargetreaquire );
}
}
player_grace_period( var_0 )
{
level notify( "player_is_heli_target" );
level endon( "player_is_heli_target" );
level.attackheligraceperiod = 1;
var_0 common_scripts\utility::waittill_notify_or_timeout( "damage_by_player", level.attackheliplayerbreak );
level.attackheligraceperiod = 0;
}
heli_can_see_target()
{
if ( !isdefined( self.etarget ) )
return 0;
var_0 = self.etarget.origin + ( 0, 0, 32 );
if ( isplayer( self.etarget ) )
var_0 = self.etarget geteye();
var_1 = self gettagorigin( "tag_flash" );
var_2 = sighttracepassed( var_1, var_0, 0, self );
return var_2;
}
heli_has_player_target()
{
if ( !isdefined( self.etarget ) )
return 0;
if ( isplayer( self.etarget ) )
return 1;
else
return 0;
}
heli_has_target()
{
if ( !isdefined( self.etarget ) )
return 0;
if ( !isalive( self.etarget ) )
return 0;
if ( self.etarget == self.targetdefault )
return 0;
else
return 1;
}
heli_get_target()
{
var_0 = maps\_helicopter_globals::getenemytarget( level.attackhelirange, level.attackhelifov, 1, 1, 0, 1, level.attackheliexcluders );
if ( isdefined( var_0 ) && isplayer( var_0 ) )
var_0 = self.targetdefault;
if ( !isdefined( var_0 ) )
var_0 = self.targetdefault;
return var_0;
}
heli_get_target_player_only()
{
var_0 = getaiarray( "allies" );
var_1 = maps\_helicopter_globals::getenemytarget( level.attackhelirange, level.attackhelifov, 1, 0, 0, 0, var_0 );
if ( !isdefined( var_1 ) )
var_1 = self.targetdefault;
return var_1;
}
heli_get_target_ai_only()
{
var_0 = maps\_helicopter_globals::getenemytarget( level.attackhelirange, level.attackhelifov, 1, 1, 0, 1, level.players );
if ( !isdefined( var_0 ) )
var_0 = self.targetdefault;
return var_0;
}
heli_missiles_think()
{
if ( !isdefined( self.script_missiles ) )
return;
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "stop_shooting" );
var_0 = undefined;
var_1 = "turret_attackheli";
var_2 = "missile_attackheli";
var_3 = undefined;
var_4 = undefined;
var_5 = [];
switch ( self.vehicletype )
{
case "mi28":
var_0 = 1;
var_3 = 1;
var_4 = 0.5;
var_5[0] = "tag_store_L_2_a";
var_5[1] = "tag_store_R_2_a";
var_5[2] = "tag_store_L_2_b";
var_5[3] = "tag_store_R_2_b";
var_5[4] = "tag_store_L_2_c";
var_5[5] = "tag_store_R_2_c";
var_5[6] = "tag_store_L_2_d";
var_5[7] = "tag_store_R_2_d";
break;
case "littlebird":
case "apache":
var_0 = 1;
var_3 = 1;
var_4 = 0.5;
var_5[0] = "tag_missile_left";
var_5[1] = "tag_missile_right";
break;
default:
break;
}
var_6 = -1;
for (;;)
{
wait 0.05;
self waittill( "fire_missiles", var_7 );
if ( !isplayer( var_7 ) )
continue;
var_8 = var_7;
if ( !player_is_good_missile_target( var_8 ) )
continue;
for ( var_9 = 0; var_9 < var_0; var_9++ )
{
var_6++;
if ( var_6 >= var_5.size )
var_6 = 0;
self setvehweapon( var_2 );
self.firingmissiles = 1;
var_10 = self fireweapon( var_5[var_6], var_8 );
var_10 thread missilelosetarget( var_4 );
var_10 thread missile_earthquake();
if ( var_9 < var_0 - 1 )
wait( var_3 );
}
self.firingmissiles = 0;
self setvehweapon( var_1 );
wait 10;
}
}
player_is_good_missile_target( var_0 )
{
if ( self.moving )
return 0;
else
return 1;
}
missile_earthquake()
{
if ( distancesquared( self.origin, level.player.origin ) > 9000000 )
return;
var_0 = self.origin;
while ( isdefined( self ) )
{
var_0 = self.origin;
wait 0.1;
}
earthquake( 0.7, 1.5, var_0, 1600 );
}
missilelosetarget( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
wait( var_0 );
if ( isdefined( self ) )
self missile_cleartarget();
}
get_different_player( var_0 )
{
for ( var_1 = 0; var_1 < level.players.size; var_1++ )
{
if ( var_0 != level.players[var_1] )
return level.players[var_1];
}
return level.players[0];
}
notify_disable()
{
self notify( "notify_disable_thread" );
self endon( "notify_disable_thread" );
self endon( "death" );
self endon( "heli_players_dead" );
for (;;)
{
self waittill( "disable_turret" );
self.allowshoot = 0;
}
}
notify_enable()
{
self notify( "notify_enable_thread" );
self endon( "notify_enable_thread" );
self endon( "death" );
self endon( "heli_players_dead" );
for (;;)
{
self waittill( "enable_turret" );
self.allowshoot = 1;
}
}
fire_guns()
{
switch ( self.turrettype )
{
case "default":
var_0 = randomintrange( 5, 10 );
var_1 = weaponfiretime( "turret_attackheli" );
turret_default_fire( self.etarget, var_0, var_1 );
break;
case "miniguns":
var_0 = getburstsize( self.etarget );
if ( self.allowshoot && !self.firingmissiles )
turret_minigun_fire( self.etarget, var_0 );
break;
default:
break;
}
}
getburstsize( var_0 )
{
var_1 = undefined;
if ( !isplayer( var_0 ) )
{
var_1 = level.attackheliaiburstsize;
return var_1;
}
switch ( level.gameskill )
{
case 3:
case 2:
case 1:
case 0:
var_1 = randomintrange( 2, 3 );
break;
}
return var_1;
}
fire_missiles( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
wait( var_0 );
if ( !isplayer( self.etarget ) )
return;
self notify( "fire_missiles", self.etarget );
}
turret_default_fire( var_0, var_1, var_2 )
{
thread fire_missiles( randomfloatrange( 0.2, 2 ) );
for ( var_3 = 0; var_3 < var_1; var_3++ )
{
self setturrettargetent( var_0, common_scripts\utility::randomvector( 50 ) + ( 0, 0, 32 ) );
if ( self.allowshoot && !self.firingmissiles )
self fireweapon();
wait( var_2 );
}
}
turret_minigun_fire( var_0, var_1, var_2 )
{
self endon( "death" );
self endon( "heli_players_dead" );
self notify( "firing_miniguns" );
self endon( "firing_miniguns" );
var_3 = get_turrets();
common_scripts\utility::array_thread( var_3, ::turret_minigun_target_track, var_0, self );
if ( !self.minigunsspinning )
{
self.firingguns = 1;
thread maps\_utility::play_sound_on_tag( "littlebird_gatling_spinup", "tag_flash" );
wait 2.1;
thread maps\_utility::play_loop_sound_on_tag( "littlebird_minigun_spinloop", "tag_flash" );
}
self.minigunsspinning = 1;
if ( !isdefined( var_2 ) )
var_2 = 3;
var_4 = 0.5;
if ( var_4 > var_2 )
var_4 = var_2;
if ( var_4 > 0 )
wait( randomfloatrange( var_4, var_2 ) );
minigun_fire( var_0, var_1 );
var_3 = get_turrets();
common_scripts\utility::array_call( var_3, ::stopfiring );
thread minigun_spindown( var_0 );
self notify( "stopping_firing" );
}
minigun_fire( var_0, var_1 )
{
self endon( "death" );
self endon( "heli_players_dead" );
if ( isplayer( var_0 ) )
self endon( "cant_see_player" );
var_2 = get_turrets();
common_scripts\utility::array_call( var_2, ::startfiring );
wait( randomfloatrange( 1, 2 ) );
if ( isplayer( var_0 ) )
thread target_track( var_0 );
if ( isplayer( var_0 ) )
{
var_3 = randomfloatrange( 0.5, 3 );
thread fire_missiles( var_3 );
}
wait( var_1 );
}
target_track( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "stopping_firing" );
self notify( "tracking_player" );
self endon( "tracking_player" );
for (;;)
{
if ( !can_see_player( var_0 ) )
break;
wait 0.5;
}
wait( level.attackhelitimeout );
self notify( "cant_see_player" );
}
turret_minigun_target_track( var_0, var_1 )
{
var_1 endon( "death" );
var_1 endon( "heli_players_dead" );
self notify( "miniguns_have_new_target" );
self endon( "miniguns_have_new_target" );
if ( !isplayer( var_0 ) && isai( var_0 ) && level.attackhelikillsai == 0 )
{
var_2 = spawn( "script_origin", var_0.origin + ( 0, 0, 100 ) );
var_2 linkto( var_0 );
thread minigun_ai_target_cleanup( var_2 );
var_0 = var_2;
}
for (;;)
{
wait 0.5;
self settargetentity( var_0 );
}
}
minigun_ai_target_cleanup( var_0 )
{
common_scripts\utility::waittill_either( "death", "miniguns_have_new_target" );
var_0 delete();
}
minigun_spindown( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "firing_miniguns" );
if ( isplayer( var_0 ) )
wait( randomfloatrange( 3, 4 ) );
else
wait( randomfloatrange( 1, 2 ) );
thread minigun_spindown_sound();
self.firingguns = 0;
}
minigun_spindown_sound()
{
self notify( "stop soundlittlebird_minigun_spinloop" );
self.minigunsspinning = 0;
maps\_utility::play_sound_on_tag( "littlebird_gatling_cooldown", "tag_flash" );
}
miss_player( var_0 )
{
var_1 = anglestoforward( level.player.angles );
var_2 = var_1 * 400;
var_3 = var_2 + common_scripts\utility::randomvector( 50 );
var_4 = randomintrange( 10, 20 );
var_5 = weaponfiretime( "turret_attackheli" );
for ( var_6 = 0; var_6 < var_4; var_6++ )
{
var_3 = var_2 + common_scripts\utility::randomvector( 50 );
self setturrettargetent( var_0, var_3 );
if ( self.allowshoot )
self fireweapon();
wait( var_5 );
}
}
can_see_player( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
var_1 = self gettagorigin( "tag_flash" );
var_2 = ( 0, 0, 0 );
if ( isplayer( var_0 ) )
var_2 = var_0 geteye();
else
var_2 = var_0.origin;
if ( sighttracepassed( var_1, var_2, 0, undefined ) )
return 1;
else
return 0;
}
get_linked_points( var_0, var_1, var_2, var_3, var_4 )
{
var_5 = [];
var_6 = strtok( var_1.script_linkto, " " );
for ( var_7 = 0; var_7 < var_2.size; var_7++ )
{
for ( var_8 = 0; var_8 < var_6.size; var_8++ )
{
if ( var_2[var_7].script_linkname == var_6[var_8] )
var_5[var_5.size] = var_2[var_7];
}
}
foreach ( var_10 in var_5 )
{
if ( var_10.origin[2] < var_4[2] )
{
var_5 = common_scripts\utility::array_remove( var_5, var_10 );
continue;
}
}
return var_5;
}
heli_damage_monitor()
{
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "crashing" );
self endon( "leaving" );
self.damagetaken = 0;
self.seen_attacker = undefined;
for (;;)
{
self waittill( "damage", var_0, var_1, var_2, var_3, var_4 );
if ( !isdefined( var_1 ) || !isplayer( var_1 ) )
continue;
self notify( "damage_by_player" );
thread heli_damage_update();
thread can_see_attacker_for_a_bit( var_1 );
if ( maps\_utility::is_damagefeedback_enabled() )
var_1 thread updatedamagefeedback();
}
}
heli_damage_update()
{
self notify( "taking damage" );
self endon( "taking damage" );
self endon( "death" );
self endon( "heli_players_dead" );
self.istakingdamage = 1;
wait 1;
self.istakingdamage = 0;
}
can_see_attacker_for_a_bit( var_0 )
{
self notify( "attacker_seen" );
self endon( "attacker_seen" );
self.seen_attacker = var_0;
self.heli_lastattacker = var_0;
wait( level.attackhelimemory );
self.heli_lastattacker = undefined;
self.seen_attacker = undefined;
}
is_hidden_from_heli( var_0 )
{
if ( isdefined( var_0.seen_attacker ) )
{
if ( var_0.seen_attacker == self )
return 0;
}
if ( isdefined( level.attack_heli_safe_volumes ) )
{
foreach ( var_2 in level.attack_heli_safe_volumes )
{
if ( self istouching( var_2 ) )
return 1;
}
}
return 0;
}
updatedamagefeedback()
{
if ( !isplayer( self ) )
return;
self.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
self playlocalsound( "player_feedback_hit_alert" );
self.hud_damagefeedback.alpha = 1;
self.hud_damagefeedback fadeovertime( 1 );
self.hud_damagefeedback.alpha = 0;
}
damage_feedback_setup()
{
for ( var_0 = 0; var_0 < level.players.size; var_0++ )
{
var_1 = level.players[var_0];
var_1.hud_damagefeedback = newclienthudelem( var_1 );
var_1.hud_damagefeedback.horzalign = "center";
var_1.hud_damagefeedback.vertalign = "middle";
var_1.hud_damagefeedback.x = -12;
var_1.hud_damagefeedback.y = -12;
var_1.hud_damagefeedback.alpha = 0;
var_1.hud_damagefeedback.archived = 1;
var_1.hud_damagefeedback setshader( "damage_feedback", 24, 48 );
}
}
heli_death_monitor()
{
self waittill( "death" );
level notify( "attack_heli_destroyed" );
level.enemy_heli_killed = 1;
wait 15;
level.enemy_heli_attacking = 0;
}
dialog_nags_heli( var_0 )
{
var_0 endon( "death" );
var_0 endon( "heli_players_dead" );
wait 30;
if ( !level.enemy_heli_attacking )
return;
commander_dialog( "co_cf_cmd_heli_small_fire" );
if ( !level.enemy_heli_attacking )
return;
commander_dialog( "co_cf_cmd_rpg_stinger" );
wait 30;
if ( !level.enemy_heli_attacking )
return;
commander_dialog( "co_cf_cmd_heli_wonders" );
}
commander_dialog( var_0 )
{
while ( level.commander_speaking )
wait 1;
level.commander_speaking = 1;
level.player playsound( var_0, "sounddone" );
level.player waittill( "sounddone" );
wait 0.5;
level.commander_speaking = 0;
}
usingantiairweapon()
{
var_0 = self getcurrentweapon();
if ( !isdefined( var_0 ) )
return 0;
if ( issubstr( tolower( var_0 ), "rpg" ) )
return 1;
if ( issubstr( tolower( var_0 ), "stinger" ) )
return 1;
if ( issubstr( tolower( var_0 ), "at4" ) )
return 1;
return 0;
}
heli_spotlight_cleanup( var_0 )
{
common_scripts\utility::waittill_any( "death", "crash_done", "turn_off_spotlight" );
self.spotlight = undefined;
if ( isdefined( self ) )
stopfxontag( common_scripts\utility::getfx( "_attack_heli_spotlight" ), self, var_0 );
}
heli_spotlight_create_default_targets( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
var_1 = self.targetdefault;
if ( isdefined( var_0 ) )
var_1 = var_0;
var_1.targetname = "original_ent";
self.left_ent = spawn( "script_origin", var_1.origin );
self.left_ent.origin = var_1.origin;
self.left_ent.angles = var_1.angles;
self.left_ent.targetname = "left_ent";
self.right_ent = spawn( "script_origin", var_1.origin );
self.right_ent.origin = var_1.origin;
self.right_ent.angles = var_1.angles;
self.right_ent.targetname = "right_ent";
var_2 = spawnstruct();
var_2.entity = self.left_ent;
var_2.right = 250;
var_2 maps\_utility::translate_local();
self.left_ent linkto( self );
var_3 = spawnstruct();
var_3.entity = self.right_ent;
var_3.right = -250;
var_3 maps\_utility::translate_local();
self.right_ent linkto( self );
var_4 = [];
var_4[0] = var_1;
var_4[1] = self.left_ent;
var_4[2] = self.right_ent;
level.spotlight_aim_ents = var_4;
self.spottarget = var_1;
}
heli_spotlight_destroy_default_targets()
{
if ( isdefined( level.spotlight_aim_ents ) )
{
foreach ( var_1 in level.spotlight_aim_ents )
{
if ( isdefined( var_1 ) )
var_1 delete();
}
}
}
heli_spotlight_aim( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
if ( self.vehicletype != "littlebird" )
return;
thread heli_spotlight_think( var_0 );
var_1 = undefined;
for (;;)
{
wait 0.05;
switch ( self.vehicletype )
{
case "littlebird_spotlight":
case "littlebird":
var_1 = self.spottarget;
break;
default:
var_1 = self.etarget;
break;
}
if ( isdefined( var_1 ) )
self setturrettargetent( var_1, ( 0, 0, 0 ) );
}
}
heli_spotlight_think( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
heli_spotlight_create_default_targets();
common_scripts\utility::array_thread( level.spotlight_aim_ents, ::heli_spotlight_aim_ents_cleanup, self );
if ( isdefined( var_0 ) )
self thread [[ var_0 ]]();
else
{
for (;;)
{
wait( randomfloatrange( 1, 3 ) );
if ( heli_has_player_target() && !within_player_fov() )
{
self.spottarget = self.etarget;
continue;
}
var_1 = randomint( level.spotlight_aim_ents.size );
self.targetdefault = level.spotlight_aim_ents[var_1];
self.spottarget = self.targetdefault;
}
}
}
within_player_fov()
{
self endon( "death" );
self endon( "heli_players_dead" );
if ( !isdefined( self.etarget ) )
return 0;
if ( !isplayer( self.etarget ) )
return 0;
var_0 = self.etarget;
var_1 = common_scripts\utility::within_fov( var_0 geteye(), var_0 getplayerangles(), self.origin, level.cosine["35"] );
return var_1;
}
heli_spotlight_aim_ents_cleanup( var_0 )
{
var_0 common_scripts\utility::waittill_either( "death", "crash_done" );
if ( isdefined( self ) )
self delete();
}
littlebird_turrets_think( var_0 )
{
var_1 = self;
var_1 maps\_vehicle_code::turret_set_default_on_mode( "manual" );
if ( isdefined( var_0.targetdefault ) )
var_1 settargetentity( var_0.targetdefault );
var_1 setmode( "manual" );
var_0 waittill( "death" );
if ( isdefined( var_0.firingguns ) && var_0.firingguns == 1 )
thread minigun_spindown_sound();
}
attack_heli_cleanup()
{
common_scripts\utility::waittill_either( "death", "crash_done" );
if ( isdefined( self.attractor ) )
missile_deleteattractor( self.attractor );
if ( isdefined( self.attractor2 ) )
missile_deleteattractor( self.attractor2 );
}
heli_default_missiles_on( var_0 )
{
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "stop_default_heli_missiles" );
self.preferredtarget = undefined;
while ( isdefined( self ) )
{
wait 0.05;
var_1 = undefined;
var_2 = undefined;
var_3 = undefined;
self.preferredtarget = undefined;
var_4 = undefined;
if ( isdefined( self.currentnode ) && isdefined( self.currentnode.target ) )
var_4 = maps\_utility::getent_or_struct( self.currentnode.target, "targetname" );
if ( isdefined( var_4 ) && isdefined( var_4.script_linkto ) )
self.preferredtarget = maps\_utility::getent_or_struct( var_4.script_linkto, "script_linkname" );
if ( isdefined( self.preferredtarget ) )
{
var_1 = self.preferredtarget;
var_2 = var_1.script_shotcount;
var_3 = var_1.script_delay;
var_4 waittill( "trigger" );
}
else
common_scripts\utility::waittill_any( "near_goal", "goal" );
if ( isdefined( var_1 ) )
thread heli_fire_missiles( var_1, var_2, var_3, var_0 );
}
}
heli_default_missiles_off()
{
self notify( "stop_default_heli_missiles" );
}
heli_spotlight_on( var_0, var_1, var_2 )
{
if ( !isdefined( var_0 ) )
var_0 = "tag_barrel";
if ( !isdefined( var_1 ) )
var_1 = 0;
if ( !isdefined( var_2 ) )
var_2 = 0;
playfxontag( common_scripts\utility::getfx( "_attack_heli_spotlight" ), self, var_0 );
self.spotlight = 1;
thread heli_spotlight_cleanup( var_0 );
if ( var_2 )
self setturrettargetent( level.player );
else if ( var_1 )
{
self endon( "death" );
self endon( "heli_players_dead" );
var_3 = self gettagorigin( "tag_origin" );
if ( !isdefined( self.targetdefault ) )
heli_default_target_setup();
self setturrettargetent( self.targetdefault );
thread heli_spotlight_aim();
}
}
heli_spotlight_off()
{
self notify( "turn_off_spotlight" );
}
heli_spotlight_random_targets_on()
{
self endon( "death" );
self endon( "heli_players_dead" );
self endon( "stop_spotlight_random_targets" );
if ( !isdefined( self.targetdefault ) )
thread heli_default_target_setup();
if ( !isdefined( self.left_ent ) )
thread heli_spotlight_think();
while ( isdefined( self ) )
{
wait 0.05;
self setturrettargetent( self.targetdefault, ( 0, 0, 0 ) );
}
}
heli_spotlight_random_targets_off()
{
self notify( "stop_spotlight_random_targets" );
}
heli_fire_missiles( var_0, var_1, var_2, var_3 )
{
self endon( "death" );
self endon( "heli_players_dead" );
if ( isdefined( self.defaultweapon ) )
var_4 = self.defaultweapon;
else
var_4 = "turret_attackheli";
var_5 = "missile_attackheli";
if ( isdefined( var_3 ) )
var_5 = var_3;
var_6 = undefined;
var_7 = [];
self setvehweapon( var_4 );
if ( !isdefined( var_1 ) )
var_1 = 1;
if ( !isdefined( var_2 ) )
var_2 = 1;
if ( !isdefined( var_0.classname ) )
{
if ( !isdefined( self.dummytarget ) )
{
self.dummytarget = spawn( "script_origin", var_0.origin );
thread common_scripts\utility::delete_on_death( self.dummytarget );
}
self.dummytarget.origin = var_0.origin;
var_0 = self.dummytarget;
}
switch ( self.vehicletype )
{
case "mi28":
var_6 = 0.5;
var_7[0] = "tag_store_L_2_a";
var_7[1] = "tag_store_R_2_a";
var_7[2] = "tag_store_L_2_b";
var_7[3] = "tag_store_R_2_b";
var_7[4] = "tag_store_L_2_c";
var_7[5] = "tag_store_R_2_c";
var_7[6] = "tag_store_L_2_d";
var_7[7] = "tag_store_R_2_d";
break;
case "littlebird":
case "apache":
var_6 = 0.5;
var_7[0] = "tag_missile_left";
var_7[1] = "tag_missile_right";
break;
case "hind_battle":
var_7[0] = "tag_missile_left";
var_7[1] = "tag_missile_right";
break;
default:
break;
}
var_8 = -1;
for ( var_9 = 0; var_9 < var_1; var_9++ )
{
var_8++;
if ( var_8 >= var_7.size )
var_8 = 0;
self setvehweapon( var_5 );
self.firingmissiles = 1;
var_10 = self fireweapon( var_7[var_8], var_0 );
var_10 thread missile_earthquake();
if ( var_9 < var_1 - 1 )
wait( var_2 );
}
self.firingmissiles = 0;
self setvehweapon( var_4 );
}
boneyard_style_heli_missile_attack()
{
self waittill( "trigger", var_0 );
var_1 = common_scripts\utility::getstructarray( self.target, "targetname" );
var_1 = maps\_utility::array_index_by_script_index( var_1 );
boneyard_fire_at_targets( var_0, var_1 );
}
boneyard_style_heli_missile_attack_linked()
{
self waittill( "trigger", var_0 );
var_1 = maps\_utility::get_linked_structs();
var_1 = maps\_utility::array_index_by_script_index( var_1 );
boneyard_fire_at_targets( var_0, var_1 );
}
boneyard_fire_at_targets( var_0, var_1 )
{
var_2 = [];
var_2[0] = "tag_missile_right";
var_2[1] = "tag_missile_left";
if ( var_0.vehicletype == "cobra" )
{
var_2[0] = "tag_store_L_1_a";
var_2[1] = "tag_store_R_1_a";
}
var_3 = [];
for ( var_4 = 0; var_4 < var_1.size; var_4++ )
{
var_3[var_4] = spawn( "script_origin", var_1[var_4].origin );
var_0 setvehweapon( "littlebird_FFAR" );
var_0 setturrettargetent( var_3[var_4] );
var_5 = var_0 fireweapon( var_2[var_4 % var_2.size], var_3[var_4], ( 0, 0, 0 ) );
var_5 common_scripts\utility::delaycall( 1, ::missile_cleartarget );
wait( randomfloatrange( 0.2, 0.3 ) );
}
wait 2;
foreach ( var_7 in var_3 )
var_7 delete();
}