iw6-scripts/maps/_helicopter_globals.gsc
2024-02-13 13:20:49 +01:00

693 lines
18 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init_helicopters()
{
level.helicopter_firelinkfunk = ::heli_firelink;
level.chopperturretonfunc = ::chopper_turret_on;
level.chopperturretofffunc = ::chopper_turret_off;
}
chopper_turret_off()
{
self notify( "mg_off" );
}
chopper_turret_on()
{
self endon( "death" );
self endon( "mg_off" );
var_0 = cos( 55 );
while ( self.health > 0 )
{
var_1 = getenemytarget( 16000, var_0, 1, 1 );
if ( isdefined( var_1 ) )
thread shootenemytarget_bullets( var_1 );
wait 2;
}
}
heli_firelink( var_0 )
{
var_1 = getent( var_0.script_linkto, "script_linkname" );
var_2 = !isdefined( var_1 );
if ( !isdefined( var_1 ) )
var_1 = common_scripts\utility::getstruct( var_0.script_linkto, "script_linkname" );
var_3 = var_0.script_firelink;
if ( var_2 )
var_1 = var_1 common_scripts\utility::spawn_tag_origin();
switch ( var_3 )
{
case "zippy_burst":
wait 1;
fire_missile( "hind_zippy", 1, var_1 );
wait 0.1;
fire_missile( "hind_zippy", 1, var_1 );
wait 0.2;
fire_missile( "hind_zippy", 1, var_1 );
wait 0.3;
fire_missile( "hind_zippy", 1, var_1 );
wait 0.3;
fire_missile( "hind_zippy", 1, var_1 );
break;
case "apache_zippy":
var_4 = [ 0.1, 0.2, 0.3 ];
wait 1;
var_1.origin = var_1.origin + ( 0, 0, -150 );
var_1 moveto( var_1.origin + ( 0, 0, 150 ), 0.6, 0, 0 );
foreach ( var_6 in var_4 )
{
if ( !isdefined( self ) )
continue;
fire_missile( "apache_zippy", 1, var_1 );
wait( var_6 );
}
break;
case "hind_rpg":
fire_missile( "hind_rpg", 5, var_1, 0.3 );
break;
default:
if ( self.classname == "script_vehicle_littlebird_armed" || self.classname == "script_vehicle_littlebird_md500" )
vehicle_scripts\_attack_heli::heli_fire_missiles( var_1, 2, 0.25 );
else
fire_missile( "hind_zippy", 5, var_1, 0.3 );
break;
}
if ( var_2 )
var_1 delete();
}
globalthink()
{
if ( !isdefined( self.vehicletype ) )
return;
var_0 = 0;
if ( self.vehicletype == "hind" || self.vehicletype == "hind_blackice" || self.vehicletype == "ny_harbor_hind" )
var_0 = 1;
if ( self.vehicletype == "cobra" || self.vehicletype == "cobra_player" )
{
thread attachmissiles( "chopperpilot_hellfire", "cobra_Sidewinder" );
if ( isdefined( self.fullmodel ) )
self.fullmodel thread attachmissiles( "chopperpilot_hellfire", "cobra_Sidewinder" );
var_0 = 1;
}
if ( !var_0 )
return;
level thread flares_think( self );
level thread maps\_helicopter_ai::evasive_think( self );
if ( getdvar( "cobrapilot_wingman_enabled" ) == "1" )
{
if ( isdefined( self.script_wingman ) )
{
level.wingman = self;
level thread maps\_helicopter_ai::wingman_think( self );
}
}
}
flares_think( var_0 )
{
var_0 endon( "death" );
notifyoncommand( "flare_button", "+frag" );
notifyoncommand( "flare_button", "+usereload" );
notifyoncommand( "flare_button", "+activate" );
while ( var_0.health > 0 )
{
if ( isdefined( var_0.playercontrolled ) )
var_0.pilot waittill( "flare_button" );
else
{
var_0 waittill( "incomming_missile", var_1 );
if ( !isdefined( var_1 ) )
continue;
if ( randomint( 3 ) == 0 )
continue;
wait( randomfloatrange( 0.5, 1.0 ) );
}
thread flares_fire( var_0 );
wait 3.0;
}
}
flares_fire_burst( var_0, var_1, var_2, var_3 )
{
var_4 = 1;
for ( var_5 = 0; var_5 < var_1; var_5++ )
{
playfx( level.flare_fx[var_0.vehicletype], var_0 gettagorigin( "tag_flare" ) );
if ( isdefined( var_0.playercontrolled ) )
{
level.stats["flares_used"]++;
var_0 notify( "dropping_flares" );
if ( var_4 )
var_0 playsound( "cobra_flare_fire" );
var_4 = !var_4;
}
if ( var_5 <= var_2 - 1 )
thread flares_redirect_missiles( var_0, var_3 );
wait 0.1;
}
}
flares_fire( var_0 )
{
var_0 endon( "death" );
var_1 = 5.0;
if ( isdefined( var_0.flare_duration ) )
var_1 = var_0.flare_duration;
flares_fire_burst( var_0, 8, 1, var_1 );
}
create_missileattractor_on_player_chopper()
{
if ( isdefined( self.missileattractor ) )
missile_deleteattractor( self.missileattractor );
self.missileattractor = missile_createattractorent( self.centeraimpoint, 10000, 10000 );
}
flares_redirect_missiles( var_0, var_1 )
{
var_0 notify( "flares_out" );
var_0 endon( "death" );
var_0 endon( "flares_out" );
if ( !isdefined( var_1 ) )
var_1 = 5.0;
var_2 = flares_get_vehicle_velocity( var_0 );
var_3 = spawn( "script_origin", var_0 gettagorigin( "tag_flare" ) );
var_3 movegravity( var_2, var_1 );
var_4 = undefined;
if ( isdefined( var_0.playercontrolled ) )
{
if ( isdefined( var_0.missileattractor ) )
missile_deleteattractor( var_0.missileattractor );
var_4 = missile_createattractorent( var_3, 10000, 10000 );
}
if ( isdefined( var_0.incomming_missiles ) )
{
for ( var_5 = 0; var_5 < var_0.incomming_missiles.size; var_5++ )
var_0.incomming_missiles[var_5] missile_settargetent( var_3 );
}
wait( var_1 );
if ( isdefined( var_0.playercontrolled ) )
{
if ( isdefined( var_4 ) )
missile_deleteattractor( var_4 );
var_0 thread create_missileattractor_on_player_chopper();
}
if ( !isdefined( var_0.script_targetoffset_z ) )
var_0.script_targetoffset_z = 0;
var_6 = ( 0, 0, var_0.script_targetoffset_z );
if ( !isdefined( var_0.incomming_missiles ) )
return;
for ( var_5 = 0; var_5 < var_0.incomming_missiles.size; var_5++ )
var_0.incomming_missiles[var_5] missile_settargetent( var_0, var_6 );
}
flares_get_vehicle_velocity( var_0 )
{
var_1 = var_0.origin;
wait 0.05;
var_2 = var_0.origin - var_1;
return var_2 * 20;
}
missile_deathwait( var_0, var_1 )
{
var_1 endon( "death" );
var_0 waittill( "death" );
if ( !isdefined( var_1.incomming_missiles ) )
return;
var_1.incomming_missiles = common_scripts\utility::array_remove( var_1.incomming_missiles, var_0 );
}
getenemytarget( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
if ( !isdefined( var_2 ) )
var_2 = 0;
if ( !isdefined( var_3 ) )
var_3 = 0;
if ( !isdefined( var_4 ) )
var_4 = 1;
if ( !isdefined( var_5 ) )
var_5 = 0;
var_7 = [];
var_8 = undefined;
var_9 = common_scripts\utility::get_enemy_team( self.script_team );
var_10 = [];
if ( var_4 )
{
for ( var_11 = 0; var_11 < level.vehicles[var_9].size; var_11++ )
var_10[var_10.size] = level.vehicles[var_9][var_11];
}
if ( var_2 )
{
var_12 = getaiarray( var_9 );
for ( var_11 = 0; var_11 < var_12.size; var_11++ )
{
if ( isdefined( var_12[var_11].ignored_by_attack_heli ) )
continue;
var_10[var_10.size] = var_12[var_11];
}
if ( var_9 == "allies" )
{
for ( var_11 = 0; var_11 < level.players.size; var_11++ )
var_10[var_10.size] = level.players[var_11];
}
}
if ( isdefined( var_6 ) )
var_10 = maps\_utility::array_exclude( var_10, var_6 );
if ( var_5 )
var_10 = common_scripts\utility::array_randomize( var_10 );
var_13 = anglestoforward( self.angles );
for ( var_11 = 0; var_11 < var_10.size; var_11++ )
{
if ( issentient( var_10[var_11] ) && issentient( self ) && self getthreatbiasgroup() != "" )
{
var_14 = getthreatbias( var_10[var_11] getthreatbiasgroup(), self getthreatbiasgroup() );
if ( var_14 <= -1000000 )
continue;
}
if ( isdefined( var_0 ) && var_0 > 0 )
{
if ( distance( self.origin, var_10[var_11].origin ) > var_0 )
continue;
}
if ( isdefined( var_1 ) )
{
var_15 = vectornormalize( var_10[var_11].origin - self.origin );
var_16 = vectordot( var_13, var_15 );
if ( var_16 <= var_1 )
continue;
}
if ( var_3 )
{
var_17 = 0;
if ( isai( var_10[var_11] ) )
var_18 = 48;
else
var_18 = 150;
var_17 = sighttracepassed( self.origin, var_10[var_11].origin + ( 0, 0, var_18 ), 0, self );
if ( !var_17 )
continue;
}
var_7[var_7.size] = var_10[var_11];
}
if ( var_7.size == 0 )
{
self notify( "gunner_new_target", var_8 );
return var_8;
}
if ( var_7.size == 1 )
{
self notify( "gunner_new_target", var_7[0] );
return var_7[0];
}
var_19 = common_scripts\utility::getclosest( self.origin, var_7 );
self notify( "gunner_new_target", var_19 );
return var_19;
}
shootenemytarget_bullets( var_0 )
{
self endon( "death" );
self endon( "mg_off" );
var_0 endon( "death" );
self endon( "gunner_new_target" );
if ( isdefined( self.playercontrolled ) )
self endon( "gunner_stop_firing" );
var_1 = ( 0, 0, 0 );
if ( isdefined( var_0.script_targetoffset_z ) )
var_1 = var_1 + ( 0, 0, var_0.script_targetoffset_z );
else if ( issentient( var_0 ) )
var_1 = ( 0, 0, 32 );
self setturrettargetent( var_0, var_1 );
while ( self.health > 0 )
{
var_2 = randomintrange( 1, 25 );
if ( getdvar( "cobrapilot_debug" ) == "1" )
iprintln( "randomShots = " + var_2 );
for ( var_3 = 0; var_3 < var_2; var_3++ )
{
if ( isdefined( self.playercontrolled ) )
{
if ( isdefined( level.cobraweapon ) && level.cobraweapon.size > 0 )
self setvehweapon( level.gunnerweapon );
}
thread shootenemytarget_bullets_debugline( self, "tag_turret", var_0, var_1, ( 1, 1, 0 ), 0.05 );
self fireweapon( "tag_flash" );
if ( isdefined( self.playercontrolled ) )
self setvehweapon( level.cobraweapon[self.pilot.currentweapon].v["weapon"] );
wait 0.05;
}
wait( randomfloatrange( 0.25, 2.5 ) );
}
}
shootenemytarget_bullets_debugline( var_0, var_1, var_2, var_3, var_4, var_5 )
{
if ( getdvar( "cobrapilot_debug" ) != "1" )
return;
if ( !isdefined( var_4 ) )
var_4 = ( 0, 0, 0 );
var_2 endon( "death" );
self endon( "gunner_new_target" );
if ( !isdefined( var_3 ) )
var_3 = ( 0, 0, 0 );
if ( isdefined( var_5 ) )
{
var_5 = gettime() + var_5 * 1000;
while ( gettime() < var_5 )
wait 0.05;
}
else
{
for (;;)
wait 0.05;
}
}
attachmissiles( var_0, var_1, var_2, var_3 )
{
self.hasattachedweapons = 1;
var_4 = [];
var_4[0] = var_0;
if ( isdefined( var_1 ) )
var_4[1] = var_1;
if ( isdefined( var_2 ) )
var_4[2] = var_2;
if ( isdefined( var_3 ) )
var_4[3] = var_3;
for ( var_5 = 0; var_5 < var_4.size; var_5++ )
{
for ( var_6 = 0; var_6 < level.cobra_weapon_tags[var_4[var_5]].size; var_6++ )
self attach( level.cobra_missile_models[var_4[var_5]], level.cobra_weapon_tags[var_4[var_5]][var_6] );
}
}
fire_missile( var_0, var_1, var_2, var_3, var_4 )
{
if ( !isdefined( var_1 ) )
var_1 = 1;
var_5 = undefined;
var_6 = undefined;
var_7 = "cobra_20mm";
var_8 = [];
switch ( var_0 )
{
case "f15_missile":
var_5 = "cobra_Sidewinder";
var_8[0] = "le_side_wing_jnt";
var_8[1] = "ri_side_wing_jnt";
break;
case "mi28_seeker":
var_5 = "cobra_seeker";
var_8[0] = "tag_store_L_1_a";
var_8[1] = "tag_store_R_1_a";
var_8[2] = "tag_store_L_2_a";
var_8[3] = "tag_store_R_2_a";
break;
case "ffar":
var_5 = "cobra_FFAR";
var_8[0] = "tag_store_r_2";
break;
case "seeker":
var_5 = "cobra_seeker";
var_8[0] = "tag_store_r_2";
break;
case "ffar_bog_a_lite":
var_5 = "cobra_FFAR_bog_a_lite";
var_8[0] = "tag_store_r_2";
break;
case "ffar_airlift":
var_5 = "cobra_FFAR_airlift";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "ffar_airlift_nofx":
var_5 = "cobra_FFAR_airlift_nofx";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "cobra_zippy":
var_5 = "zippy_rockets";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "apache_zippy":
var_5 = "zippy_rockets_apache";
var_8[0] = "tag_flash_2";
var_8[1] = "tag_flash_3";
break;
case "apache_zippy_nd":
var_5 = "zippy_rockets_apache_nodamage";
var_8[0] = "tag_flash_2";
var_8[1] = "tag_flash_3";
break;
case "mi28_zippy":
var_5 = "zippy_rockets_apache";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "mi28_zippy_cheap":
var_5 = "zippy_rockets_apache_cheap";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "cobra_turret":
var_5 = "hind_turret_penetration";
var_8[0] = "tag_store_L_wing";
var_8[1] = "tag_store_R_wing";
break;
case "ffar_hind":
var_7 = "hind_turret";
var_5 = "hind_FFAR";
var_8[0] = "tag_missile_left";
var_8[1] = "tag_missile_right";
break;
case "hind_zippy":
var_7 = "hind_turret";
var_5 = "zippy_rockets";
var_8[0] = "tag_missile_left";
var_8[1] = "tag_missile_right";
break;
case "hind_rpg":
var_7 = "hind_turret";
var_5 = "rpg";
var_8[0] = "tag_missile_left";
var_8[1] = "tag_missile_right";
break;
case "hind_rpg_cheap":
var_7 = "hind_turret";
var_5 = "rpg_cheap";
var_8[0] = "tag_missile_left";
var_8[1] = "tag_missile_right";
break;
case "ffar_hind_nodamage":
var_7 = "hind_turret";
var_5 = "hind_FFAR_nodamage";
var_8[0] = "tag_missile_left";
var_8[1] = "tag_missile_right";
break;
case "ffar_mi28_village_assault":
var_7 = "hind_turret";
var_5 = "mi28_ffar_village_assault";
var_8[0] = "tag_store_L_2_a";
var_8[1] = "tag_store_R_2_a";
var_8[2] = "tag_store_L_2_b";
var_8[3] = "tag_store_R_2_b";
var_8[4] = "tag_store_L_2_c";
var_8[5] = "tag_store_R_2_c";
var_8[6] = "tag_store_L_2_d";
var_8[7] = "tag_store_R_2_d";
break;
case "ffar_co_rescue":
var_5 = "cobra_FFAR_bog_a_lite";
var_8[0] = "tag_store_R_2_a";
var_8[1] = "tag_store_L_2_a";
break;
default:
break;
}
var_6 = weaponfiretime( var_5 );
if ( isdefined( self.nextmissiletag ) )
var_9 = self.nextmissiletag;
else
var_9 = -1;
for ( var_10 = 0; var_10 < var_1; var_10++ )
{
var_9++;
var_9 = var_9 % var_8.size;
if ( var_0 == "ffar_mi28_village_assault" )
{
if ( isdefined( var_2 ) && isdefined( var_2.origin ) )
{
magicbullet( var_5, self gettagorigin( var_8[var_9] ), var_2.origin );
if ( isdefined( level._effect["ffar_mi28_muzzleflash"] ) )
playfxontag( common_scripts\utility::getfx( "ffar_mi28_muzzleflash" ), self, var_8[var_9] );
thread delayed_earthquake( 0.1, 0.5, 0.2, var_2.origin, 1600 );
}
}
else
{
self setvehweapon( var_5 );
if ( isdefined( var_2 ) )
{
var_11 = self fireweapon( var_8[var_9], var_2 );
switch ( var_0 )
{
case "ffar_airlift":
case "ffar_bog_a_lite":
case "ffar":
var_11 thread missilelosetarget( 0.1 );
break;
case "apache_zippy_wall":
case "mi28_zippy_cheap":
case "mi28_zippy":
case "apache_zippy_nd":
case "apache_zippy":
if ( !isdefined( var_4 ) )
var_11 thread missilelosetarget( 0.6 );
else
var_11 thread missilelosetarget( var_4 );
break;
default:
break;
}
}
else
var_11 = self fireweapon( var_8[var_9] );
self notify( "missile_fired", var_11 );
}
self.nextmissiletag = var_9;
if ( var_10 < var_1 - 1 )
wait( var_6 );
if ( isdefined( var_3 ) )
wait( var_3 );
}
self setvehweapon( var_7 );
}
delayed_earthquake( var_0, var_1, var_2, var_3, var_4 )
{
wait( var_0 );
earthquake( var_1, var_2, var_3, var_4 );
}
missilelosetarget( var_0 )
{
self endon( "death" );
wait( var_0 );
if ( isdefined( self ) )
self missile_cleartarget();
}