// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool

init()
{
    precachelocationselector( "map_artillery_selector" );
    level.airstrikefx = loadfx( "fx/explosions/clusterbomb" );
    level.airstrikessfx = loadfx( "fx/explosions/clusterbomb_no_fount" );
    level.airstrikeexplosion = loadfx( "fx/explosions/clusterbomb_exp_direct_runner_cheap" );
    level.mortareffect = loadfx( "fx/explosions/clusterbomb_exp_direct_runner_stealth" );
    level.bombstrike = loadfx( "fx/explosions/wall_explosion_pm_a" );
    level.airburstbomb = loadfx( "fx/explosions/airburst" );
    level.harriers = [];
    level.fx_airstrike_afterburner = loadfx( "fx/fire/jet_afterburner" );
    level.fx_airstrike_contrail = loadfx( "fx/smoke/jet_contrail" );
    level.dangermaxradius["stealth_airstrike"] = 900;
    level.dangerminradius["stealth_airstrike"] = 750;
    level.dangerforwardpush["stealth_airstrike"] = 1;
    level.dangerovalscale["stealth_airstrike"] = 6.0;
    level.dangermaxradius["airstrike"] = 550;
    level.dangerminradius["airstrike"] = 300;
    level.dangerforwardpush["airstrike"] = 1.5;
    level.dangerovalscale["airstrike"] = 6.0;
    level.dangermaxradius["precision_airstrike"] = 550;
    level.dangerminradius["precision_airstrike"] = 300;
    level.dangerforwardpush["precision_airstrike"] = 2.0;
    level.dangerovalscale["precision_airstrike"] = 6.0;
    level.dangermaxradius["harrier_airstrike"] = 550;
    level.dangerminradius["harrier_airstrike"] = 300;
    level.dangerforwardpush["harrier_airstrike"] = 1.5;
    level.dangerovalscale["harrier_airstrike"] = 6.0;
    level.artillerydangercenters = [];
    level.killstreakfuncs["airstrike"] = ::tryuseairstrike;
    level.killstreakfuncs["precision_airstrike"] = ::tryuseairstrike;
    level.killstreakfuncs["super_airstrike"] = ::tryuseairstrike;
    level.killstreakfuncs["harrier_airstrike"] = ::tryuseairstrike;
    level.killstreakfuncs["stealth_airstrike"] = ::tryuseairstrike;
    level.planes = [];
}

tryuseairstrike( var_0, var_1 )
{
    switch ( var_1 )
    {
        case "precision_airstrike":
            break;
        case "stealth_airstrike":
            break;
        case "harrier_airstrike":
            if ( isdefined( level.harrier_incoming ) || level.harriers.size >= 1 )
            {
                self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
                return 0;
            }

            break;
        case "super_airstrike":
            break;
    }

    var_2 = selectairstrikelocation( var_0, var_1 );

    if ( !isdefined( var_2 ) || !var_2 )
        return 0;

    return 1;
}

doairstrike( var_0, var_1, var_2, var_3, var_4, var_5 )
{
    if ( var_5 == "harrier_airstrike" )
        level.harrier_incoming = 1;

    if ( isdefined( level.airstrikeinprogress ) )
    {
        while ( isdefined( level.airstrikeinprogress ) )
            level waittill( "begin_airstrike" );

        level.airstrikeinprogress = 1;
        wait 2.0;
    }

    if ( !isdefined( var_3 ) )
    {
        if ( var_5 == "harrier_airstrike" )
            level.harrier_incoming = undefined;

        return;
    }

    level.airstrikeinprogress = 1;
    var_6 = bullettrace( var_1, var_1 + ( 0, 0, -1000000.0 ), 0, undefined );
    var_7 = var_6["position"];
    var_8 = spawnstruct();
    var_8.origin = var_7;
    var_8.forward = anglestoforward( ( 0, var_2, 0 ) );
    var_8.streakname = var_5;
    var_8.team = var_4;
    level.artillerydangercenters[level.artillerydangercenters.size] = var_8;
    callstrike( var_0, var_3, var_7, var_2, var_5 );

    if ( var_5 == "harrier_airstrike" )
        level.harrier_incoming = undefined;

    wait 1.0;
    level.airstrikeinprogress = undefined;
    var_3 notify( "begin_airstrike" );
    level notify( "begin_airstrike" );
    wait 7.5;
    var_9 = 0;
    var_10 = [];

    for ( var_11 = 0; var_11 < level.artillerydangercenters.size; var_11++ )
    {
        if ( !var_9 && level.artillerydangercenters[var_11].origin == var_7 )
        {
            var_9 = 1;
            continue;
        }

        var_10[var_10.size] = level.artillerydangercenters[var_11];
    }

    level.artillerydangercenters = var_10;
}

clearprogress( var_0 )
{
    wait 2.0;
    level.airstrikeinprogress = undefined;
}

getairstrikedanger( var_0 )
{
    var_1 = 0;

    for ( var_2 = 0; var_2 < level.artillerydangercenters.size; var_2++ )
    {
        var_3 = level.artillerydangercenters[var_2].origin;
        var_4 = level.artillerydangercenters[var_2].forward;
        var_5 = level.artillerydangercenters[var_2].streakname;
        var_1 = var_1 + getsingleairstrikedanger( var_0, var_3, var_4, var_5 );
    }

    return var_1;
}

getsingleairstrikedanger( var_0, var_1, var_2, var_3 )
{
    var_4 = var_1 + level.dangerforwardpush[var_3] * level.dangermaxradius[var_3] * var_2;
    var_5 = var_0 - var_4;
    var_5 = ( var_5[0], var_5[1], 0 );
    var_6 = vectordot( var_5, var_2 ) * var_2;
    var_7 = var_5 - var_6;
    var_8 = var_7 + var_6 / level.dangerovalscale[var_3];
    var_9 = lengthsquared( var_8 );

    if ( var_9 > level.dangermaxradius[var_3] * level.dangermaxradius[var_3] )
        return 0;

    if ( var_9 < level.dangerminradius[var_3] * level.dangerminradius[var_3] )
        return 1;

    var_10 = sqrt( var_9 );
    var_11 = ( var_10 - level.dangerminradius[var_3] ) / ( level.dangermaxradius[var_3] - level.dangerminradius[var_3] );
    return 1 - var_11;
}

pointisinairstrikearea( var_0, var_1, var_2, var_3 )
{
    return distance2d( var_0, var_1 ) <= level.dangermaxradius[var_3] * 1.25;
}

losradiusdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
    var_7 = maps\mp\gametypes\_weapons::getdamageableents( var_0, var_1, 1 );
    glassradiusdamage( var_0, var_1, var_2, var_3 );

    for ( var_8 = 0; var_8 < var_7.size; var_8++ )
    {
        if ( var_7[var_8].entity == self )
            continue;

        var_9 = distance( var_0, var_7[var_8].damagecenter );

        if ( var_7[var_8].isplayer || isdefined( var_7[var_8].issentry ) && var_7[var_8].issentry )
        {
            var_10 = !bullettracepassed( var_7[var_8].entity.origin, var_7[var_8].entity.origin + ( 0, 0, 130 ), 0, undefined );

            if ( var_10 )
            {
                var_10 = !bullettracepassed( var_7[var_8].entity.origin + ( 0, 0, 130 ), var_0 + ( 0, 0, 114 ), 0, undefined );

                if ( var_10 )
                {
                    var_9 = var_9 * 4;

                    if ( var_9 > var_1 )
                        continue;
                }
            }
        }

        var_7[var_8].damage = int( var_2 + ( var_3 - var_2 ) * var_9 / var_1 );
        var_7[var_8].pos = var_0;
        var_7[var_8].damageowner = var_4;
        var_7[var_8].einflictor = var_5;
        level.airstrikedamagedents[level.airstrikedamagedentscount] = var_7[var_8];
        level.airstrikedamagedentscount++;
    }

    thread airstrikedamageentsthread( var_6 );
}

airstrikedamageentsthread( var_0 )
{
    self notify( "airstrikeDamageEntsThread" );
    self endon( "airstrikeDamageEntsThread" );

    while ( level.airstrikedamagedentsindex < level.airstrikedamagedentscount )
    {
        if ( !isdefined( level.airstrikedamagedents[level.airstrikedamagedentsindex] ) )
        {

        }
        else
        {
            var_1 = level.airstrikedamagedents[level.airstrikedamagedentsindex];

            if ( !isdefined( var_1.entity ) )
            {

            }
            else if ( !var_1.isplayer || isalive( var_1.entity ) )
            {
                var_1 maps\mp\gametypes\_weapons::damageent( var_1.einflictor, var_1.damageowner, var_1.damage, "MOD_PROJECTILE_SPLASH", var_0, var_1.pos, vectornormalize( var_1.damagecenter - var_1.pos ) );
                level.airstrikedamagedents[level.airstrikedamagedentsindex] = undefined;

                if ( var_1.isplayer )
                    wait 0.05;
            }
            else
                level.airstrikedamagedents[level.airstrikedamagedentsindex] = undefined;
        }

        level.airstrikedamagedentsindex++;
    }
}

radiusartilleryshellshock( var_0, var_1, var_2, var_3, var_4 )
{
    var_5 = level.players;

    foreach ( var_7 in level.players )
    {
        if ( !isalive( var_7 ) )
            continue;

        if ( var_7.team == var_4 || var_7.team == "spectator" )
            continue;

        var_8 = var_7.origin + ( 0, 0, 32 );
        var_9 = distance( var_0, var_8 );

        if ( var_9 > var_1 )
            continue;

        var_10 = int( var_2 + ( var_3 - var_2 ) * var_9 / var_1 );
        var_7 thread artilleryshellshock( "default", var_10 );
    }
}

artilleryshellshock( var_0, var_1 )
{
    self endon( "disconnect" );

    if ( isdefined( self.beingartilleryshellshocked ) && self.beingartilleryshellshocked )
        return;

    self.beingartilleryshellshocked = 1;
    self shellshock( var_0, var_1 );
    wait( var_1 + 1 );
    self.beingartilleryshellshocked = 0;
}

dobomberstrike( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
    if ( !isdefined( var_1 ) )
        return;

    var_10 = 100;
    var_11 = 150;
    var_12 = var_4 + ( ( randomfloat( 2 ) - 1 ) * var_10, ( randomfloat( 2 ) - 1 ) * var_10, 4000 );
    var_13 = var_5 + ( ( randomfloat( 2 ) - 1 ) * var_11, ( randomfloat( 2 ) - 1 ) * var_11, 4000 );
    var_14 = spawnplane( var_1, "script_model", var_12, "compass_objpoint_b2_airstrike_friendly", "compass_objpoint_b2_airstrike_enemy" );
    addplanetolist( var_14 );
    var_14 thread handledeath();
    var_14 playloopsound( "veh_b2_dist_loop" );
    var_14 setmodel( "vehicle_b2_bomber" );
    var_14 thread handleemp( var_1 );
    var_14.lifeid = var_0;
    var_14.angles = var_8;
    var_15 = anglestoforward( var_8 );
    var_14 moveto( var_13, var_7, 0, 0 );
    thread stealthbomber_killcam( var_14, var_13, var_7, var_9 );
    thread bomberdropbombs( var_14, var_3, var_1 );
    var_14 endon( "death" );
    wait( var_7 * 0.65 );
    removeplanefromlist( var_14 );
    var_14 notify( "delete" );
    var_14 delete();
}

bomberdropbombs( var_0, var_1, var_2 )
{
    var_0 endon( "death" );

    while ( !targetisclose( var_0, var_1, 5000 ) )
        wait 0.05;

    var_3 = 1;
    var_4 = 0;
    var_0 notify( "start_bombing" );
    var_5 = 0;

    for ( var_6 = targetgetdist( var_0, var_1 ); var_6 < 5000; var_6 = targetgetdist( var_0, var_1 ) )
    {
        if ( var_6 < 1500 && !var_4 )
        {
            var_0 playsoundonmovingent( "veh_b2_sonic_boom" );
            var_4 = 1;
        }

        if ( var_6 < 3000 && var_5 < 4 )
        {
            var_0 thread dropparachutebomb( var_0, var_2 );
            var_5++;
            wait( randomfloatrange( 0.15, 0.3 ) );
        }

        wait 0.1;
    }

    var_0 notify( "stop_bombing" );
}

dropparachutebomb( var_0, var_1 )
{
    self endon( "stop_bombing" );
    self endon( "death" );
    var_2 = spawn( "script_model", self.origin );
    var_2 setmodel( "parachute_cargo_static" );
    var_2.team = var_1.team;
    var_2.owner = var_1;
    var_2 setcandamage( 1 );
    var_3 = bullettrace( var_2.origin, var_2.origin - ( 0, 0, 20000 ), 0, var_2, 0, 0 );
    var_4 = var_3["position"];
    var_2 moveto( var_4, randomintrange( 8, 14 ) );
    var_2 thread bombdamagewatcher( var_0, var_4 );
    var_2 thread bombwatcher( var_0, var_4 );
}

bombdamagewatcher( var_0, var_1 )
{
    var_2 = self;
    self endon( "death" );
    self setcandamage( 1 );
    self.health = 999999;
    self.maxhealth = 200;
    self.damagetaken = 0;

    for (;;)
    {
        self waittill( "damage", var_3, var_4, var_5, var_6, var_7, var_8, var_9, var_10, var_11, var_12 );

        if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_4 ) )
            continue;

        if ( !isdefined( self ) )
            return;

        self.wasdamaged = 1;
        self.damagetaken = self.damagetaken + var_3;

        if ( isplayer( var_4 ) )
            var_4 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "tactical_insertion" );

        if ( self.damagetaken >= self.maxhealth )
        {
            radiusdamage( var_2.origin, 1024, 600, 65, var_2.owner, "MOD_EXPLOSIVE", "stealth_bomb_mp" );
            playfx( level.airburstbomb, var_2.origin, anglestoforward( var_2.angles ), var_2.origin - var_1 );

            if ( isdefined( var_2 ) )
                var_2 delete();

            self notify( "death" );
        }
    }
}

bombwatcher( var_0, var_1 )
{
    var_2 = self;
    var_2 endon( "death" );

    while ( var_2.origin[2] > var_1[2] + 600 )
        wait 0.1;

    radiusdamage( var_1 + ( 0, 0, 64 ), 1024, 600, 65, var_0.owner, "MOD_EXPLOSIVE", "stealth_bomb_mp" );
    playfx( level.airburstbomb, var_2.origin, anglestoforward( var_2.angles ), var_2.origin - var_1 );
    var_2 delete();
}

playbombfx()
{
    self endon( "stop_bombing" );
    self endon( "death" );

    for (;;)
    {
        playfxontag( level.stealthbombfx, self, "tag_left_alamo_missile" );
        playfxontag( level.stealthbombfx, self, "tag_right_alamo_missile" );
        wait 0.5;
    }
}

stealthbomber_killcam( var_0, var_1, var_2, var_3 )
{
    var_0 waittill( "start_bombing" );
    var_4 = anglestoforward( var_0.angles );
    var_5 = spawn( "script_model", var_0.origin + ( 0, 0, 100 ) - var_4 * 200 );
    var_0.killcament = var_5;
    var_0.killcament setscriptmoverkillcam( "airstrike" );
    var_0.airstriketype = var_3;
    var_5.starttime = gettime();
    var_5 thread deleteaftertime( 15.0 );
    var_5 linkto( var_0, "tag_origin", ( -256, 768, 768 ), ( 0, 0, 0 ) );
}

callstrike_bomb( var_0, var_1, var_2, var_3 )
{
    if ( !isdefined( var_1 ) || var_1 maps\mp\_utility::iskillstreakdenied() )
    {
        self notify( "stop_bombing" );
        return;
    }

    var_4 = 512;
    var_5 = ( 0, randomint( 360 ), 0 );
    var_6 = var_0 + anglestoforward( var_5 ) * randomfloat( var_4 );
    var_7 = bullettrace( var_6, var_6 + ( 0, 0, -10000 ), 0, undefined );
    var_6 = var_7["position"];
    var_8 = distance( var_0, var_6 );

    if ( var_8 > 5000 )
        return;

    wait( 0.85 * ( var_8 / 2000 ) );

    if ( !isdefined( var_1 ) || var_1 maps\mp\_utility::iskillstreakdenied() )
    {
        self notify( "stop_bombing" );
        return;
    }

    if ( var_3 )
    {
        playfx( level.mortareffect, var_6 );
        level thread maps\mp\gametypes\_shellshock::stealthairstrike_earthquake( var_6 );
    }

    thread maps\mp\_utility::playsoundinspace( "exp_airstrike_bomb", var_6 );
    radiusartilleryshellshock( var_6, 512, 8, 4, var_1.team );
    losradiusdamage( var_6 + ( 0, 0, 16 ), 896, 300, 50, var_1, self, "stealth_bomb_mp" );
}

handleharrierairstrikeobjectiveicons()
{
    self endon( "death" );
    self.owner endon( "disconnect" );
    wait 2;
    maps\mp\killstreaks\_plane::setobjectiveicons( "hud_minimap_harrier_green", "hud_minimap_harrier_red" );
    thread cleanupharrierairstrikeobjectiveicons();
}

cleanupharrierairstrikeobjectiveicons()
{
    var_0 = self.friendlyteamid;
    var_1 = self.enemyteamid;
    common_scripts\utility::waittill_any_timeout( 3.5, "death" );

    if ( isdefined( var_0 ) )
    {
        maps\mp\_utility::_objective_delete( var_0 );
        maps\mp\_utility::_objective_delete( var_1 );
    }
}

doplanestrike( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
    if ( !isdefined( var_1 ) )
        return;

    var_10 = 100;
    var_11 = 150;
    var_12 = var_4 + ( ( randomfloat( 2 ) - 1 ) * var_10, ( randomfloat( 2 ) - 1 ) * var_10, 0 );
    var_13 = var_5 + ( ( randomfloat( 2 ) - 1 ) * var_11, ( randomfloat( 2 ) - 1 ) * var_11, 0 );
    var_14 = spawn( "script_model", var_12 );
    var_14.owner = var_1;
    var_14.origin = var_12;
    var_14.angles = var_8;
    var_14.team = var_1.team;
    var_14 thread handledeath();

    if ( var_9 == "harrier_airstrike" )
    {
        var_14 setmodel( "vehicle_av8b_harrier_jet_mp" );
        var_14 playloopsound( "harrier_fly_in" );
    }
    else
    {
        var_14 setmodel( "vehicle_a10_warthog_iw6_mp" );
        var_14 playloopsound( "veh_mig29_dist_loop" );
    }

    var_14 thread handleemp( var_1 );
    var_14.lifeid = var_0;
    var_14.angles = var_8;
    var_15 = anglestoforward( var_8 );
    var_14 thread playplanefx();
    var_14 moveto( var_13, var_7, 0, 0 );

    if ( var_9 == "harrier_airstrike" )
        var_14 thread handleharrierairstrikeobjectiveicons();

    thread callstrike_bombeffect( var_14, var_13, var_7, var_6 - 1.0, var_1, var_2, var_9 );
    wait( var_6 - 0.75 );
    var_14 scriptmodelplayanimdeltamotion( "airstrike_mp_roll" );
    var_14 endon( "death" );
    wait( var_7 - var_6 );
    removeplanefromlist( var_14 );
    var_14 notify( "delete" );
    var_14 delete();
}

handledeath()
{
    level endon( "game_ended" );
    self endon( "delete" );
    self waittill( "death" );
    var_0 = anglestoforward( self.angles ) * 200;
    playfx( level.harrier_deathfx, self.origin, var_0 );
    removeplanefromlist( self );
    self delete();
}

addplanetolist( var_0 )
{
    level.planes[level.planes.size] = var_0;
}

removeplanefromlist( var_0 )
{
    for ( var_1 = 0; var_1 < level.planes.size; var_1++ )
    {
        if ( isdefined( level.planes[var_1] ) && level.planes[var_1] == var_0 )
            level.planes[var_1] = undefined;
    }
}

callstrike_bombeffect( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
    var_0 endon( "death" );
    wait( var_3 );

    if ( !isdefined( var_4 ) || var_4 maps\mp\_utility::iskillstreakdenied() )
        return;

    if ( var_6 == "harrier_airstrike" )
        var_0 playsoundonmovingent( "harrier_sonic_boom" );
    else
        var_0 playsoundonmovingent( "veh_mig29_sonic_boom" );

    var_7 = anglestoforward( var_0.angles );
    var_8 = spawnbomb( var_0.origin, var_0.angles );
    var_8 movegravity( anglestoforward( var_0.angles ) * 4666.67, 3.0 );
    var_8.lifeid = var_5;
    var_9 = spawn( "script_model", var_0.origin + ( 0, 0, 100 ) - var_7 * 200 );
    var_8.killcament = var_9;
    var_8.killcament setscriptmoverkillcam( "airstrike" );
    var_8.airstriketype = var_6;
    var_9.starttime = gettime();
    var_9 thread deleteaftertime( 15.0 );
    var_9.angles = var_7;
    var_9 moveto( var_1 + ( 0, 0, 100 ), var_2, 0, 0 );
    wait 0.4;
    var_9 moveto( var_9.origin + var_7 * 4000, 1, 0, 0 );
    wait 0.45;
    var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.2 ) ) * 3500, 2, 0, 0 );
    wait 0.15;
    var_10 = spawn( "script_model", var_8.origin );
    var_10 setmodel( "tag_origin" );
    var_10.origin = var_8.origin;
    var_10.angles = var_8.angles;
    var_8 setmodel( "tag_origin" );
    wait 0.1;
    var_11 = var_10.origin;
    var_12 = var_10.angles;

    if ( level.splitscreen )
        playfxontag( level.airstrikessfx, var_10, "tag_origin" );
    else
        playfxontag( level.airstrikefx, var_10, "tag_origin" );

    wait 0.05;
    var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.25 ) ) * 2500, 2, 0, 0 );
    wait 0.25;
    var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.35 ) ) * 2000, 2, 0, 0 );
    wait 0.2;
    var_9 moveto( var_9.origin + ( var_7 + ( 0, 0, -0.45 ) ) * 1500, 2, 0, 0 );
    wait 0.5;
    var_13 = 12;
    var_14 = 5;
    var_15 = 55;
    var_16 = ( var_15 - var_14 ) / var_13;
    var_17 = ( 0, 0, 0 );

    for ( var_18 = 0; var_18 < var_13; var_18++ )
    {
        var_19 = anglestoforward( var_12 + ( var_15 - var_16 * var_18, randomint( 10 ) - 5, 0 ) );
        var_20 = var_11 + var_19 * 10000;
        var_21 = bullettrace( var_11, var_20, 0, undefined );
        var_22 = var_21["position"];
        var_17 = var_17 + var_22;
        playfx( level.airstrikeexplosion, var_22 );
        thread losradiusdamage( var_22 + ( 0, 0, 16 ), 512, 200, 30, var_4, var_8, "artillery_mp" );

        if ( var_18 % 3 == 0 )
        {
            thread maps\mp\_utility::playsoundinspace( "exp_airstrike_bomb", var_22 );
            level thread maps\mp\gametypes\_shellshock::airstrike_earthquake( var_22 );
        }

        wait 0.05;
    }

    var_17 = var_17 / var_13 + ( 0, 0, 128 );
    var_9 moveto( var_8.killcament.origin * 0.35 + var_17 * 0.65, 1.5, 0, 0.5 );
    wait 5.0;
    var_10 delete();
    var_8 delete();
}

spawnbomb( var_0, var_1 )
{
    var_2 = spawn( "script_model", var_0 );
    var_2.angles = var_1;
    var_2 setmodel( "projectile_cbu97_clusterbomb" );
    return var_2;
}

deleteaftertime( var_0 )
{
    self endon( "death" );
    wait 10.0;
    self delete();
}

playplanefx()
{
    self endon( "death" );
    wait 0.5;
    playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_right" );
    wait 0.5;
    playfxontag( level.fx_airstrike_afterburner, self, "tag_engine_left" );
    wait 0.5;
    playfxontag( level.fx_airstrike_contrail, self, "tag_right_wingtip" );
    wait 0.5;
    playfxontag( level.fx_airstrike_contrail, self, "tag_left_wingtip" );
}

callstrike( var_0, var_1, var_2, var_3, var_4 )
{
    var_5 = undefined;
    var_6 = 0;
    var_7 = ( 0, var_3, 0 );
    var_5 = getent( "airstrikeheight", "targetname" );

    if ( var_4 == "stealth_airstrike" )
    {
        thread maps\mp\_utility::teamplayercardsplash( "used_stealth_airstrike", var_1, var_1.team );
        var_8 = 12000;
        var_9 = 4000;

        if ( !isdefined( var_5 ) )
        {
            var_10 = 950;
            var_6 = 1500;

            if ( isdefined( level.airstrikeheightscale ) )
                var_10 = var_10 * level.airstrikeheightscale;
        }
        else
        {
            var_10 = var_5.origin[2];

            if ( getdvar( "mapname" ) == "mp_exchange" )
                var_10 = var_10 + 1024;

            var_6 = getexplodedistance( var_10 );
        }
    }
    else
    {
        if ( var_4 == "harrier_airstrike" )
            thread maps\mp\_utility::teamplayercardsplash( "used_harrier", var_1 );

        var_8 = 24000;
        var_9 = 7000;

        if ( !isdefined( var_5 ) )
        {
            var_10 = 850;
            var_6 = 1500;

            if ( isdefined( level.airstrikeheightscale ) )
                var_10 = var_10 * level.airstrikeheightscale;
        }
        else
        {
            var_10 = var_5.origin[2];
            var_6 = getexplodedistance( var_10 );
        }
    }

    var_1 endon( "disconnect" );
    var_11 = var_0;
    level.airstrikedamagedents = [];
    level.airstrikedamagedentscount = 0;
    level.airstrikedamagedentsindex = 0;

    if ( var_4 == "harrier_airstrike" )
    {
        var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 500 ) ), var_12["endPoint"] + ( 0, 0, randomint( 500 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        wait( randomfloatrange( 1.5, 2.5 ) );
        maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        wait( randomfloatrange( 1.5, 2.5 ) );
        maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        wait( randomfloatrange( 1.5, 2.5 ) );
        maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
        var_13 = maps\mp\killstreaks\_harrier::beginharrier( var_0, var_12["startPoint"], var_2 );
        var_1 thread maps\mp\killstreaks\_harrier::defendlocation( var_13 );
    }
    else if ( var_4 == "stealth_airstrike" )
    {
        var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
        level thread dobomberstrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 1000 ) ), var_12["endPoint"] + ( 0, 0, randomint( 1000 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
    }
    else
    {
        var_12 = getflightpath( var_2, var_7, var_8, var_5, var_10, var_9, var_6, var_4 );
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 500 ) ), var_12["endPoint"] + ( 0, 0, randomint( 500 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        wait( randomfloatrange( 1.5, 2.5 ) );
        maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        wait( randomfloatrange( 1.5, 2.5 ) );
        maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
        level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );

        if ( var_4 == "super_airstrike" )
        {
            wait( randomfloatrange( 2.5, 3.5 ) );
            maps\mp\gametypes\_hostmigration::waittillhostmigrationdone();
            level thread doplanestrike( var_0, var_1, var_11, var_2, var_12["startPoint"] + ( 0, 0, randomint( 200 ) ), var_12["endPoint"] + ( 0, 0, randomint( 200 ) ), var_12["bombTime"], var_12["flyTime"], var_7, var_4 );
        }
    }
}

getflightpath( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7 )
{
    var_8 = var_0 + anglestoforward( var_1 ) * ( -1 * var_2 );

    if ( isdefined( var_3 ) )
        var_8 = var_8 * ( 1, 1, 0 );

    var_8 = var_8 + ( 0, 0, var_4 );

    if ( var_7 == "stealth_airstrike" )
        var_9 = var_0 + anglestoforward( var_1 ) * ( var_2 * 4 );
    else
        var_9 = var_0 + anglestoforward( var_1 ) * var_2;

    if ( isdefined( var_3 ) )
        var_9 = var_9 * ( 1, 1, 0 );

    var_9 = var_9 + ( 0, 0, var_4 );
    var_10 = length( var_8 - var_9 );
    var_11 = var_10 / var_5;
    var_10 = abs( var_10 / 2 + var_6 );
    var_12 = var_10 / var_5;
    var_13["startPoint"] = var_8;
    var_13["endPoint"] = var_9;
    var_13["bombTime"] = var_12;
    var_13["flyTime"] = var_11;
    return var_13;
}

getexplodedistance( var_0 )
{
    var_1 = 850;
    var_2 = 1500;
    var_3 = var_1 / var_0;
    var_4 = var_3 * var_2;
    return var_4;
}

targetgetdist( var_0, var_1 )
{
    var_2 = targetisinfront( var_0, var_1 );

    if ( var_2 )
        var_3 = 1;
    else
        var_3 = -1;

    var_4 = common_scripts\utility::flat_origin( var_0.origin );
    var_5 = var_4 + anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) ) * ( var_3 * 100000 );
    var_6 = pointonsegmentnearesttopoint( var_4, var_5, var_1 );
    var_7 = distance( var_4, var_6 );
    return var_7;
}

targetisclose( var_0, var_1, var_2 )
{
    if ( !isdefined( var_2 ) )
        var_2 = 3000;

    var_3 = targetisinfront( var_0, var_1 );

    if ( var_3 )
        var_4 = 1;
    else
        var_4 = -1;

    var_5 = common_scripts\utility::flat_origin( var_0.origin );
    var_6 = var_5 + anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) ) * ( var_4 * 100000 );
    var_7 = pointonsegmentnearesttopoint( var_5, var_6, var_1 );
    var_8 = distance( var_5, var_7 );

    if ( var_8 < var_2 )
        return 1;
    else
        return 0;
}

targetisinfront( var_0, var_1 )
{
    var_2 = anglestoforward( common_scripts\utility::flat_angle( var_0.angles ) );
    var_3 = vectornormalize( common_scripts\utility::flat_origin( var_1 ) - var_0.origin );
    var_4 = vectordot( var_2, var_3 );

    if ( var_4 > 0 )
        return 1;
    else
        return 0;
}

waitforairstrikecancel()
{
    self waittill( "cancel_location" );
    self setblurforplayer( 0, 0.3 );
}

selectairstrikelocation( var_0, var_1 )
{
    var_2 = level.mapsize / 6.46875;

    if ( level.splitscreen )
        var_2 = var_2 * 1.5;

    var_3 = 0;

    switch ( var_1 )
    {
        case "precision_airstrike":
            var_3 = 1;
            self playlocalsound( game["voice"][self.team] + "KS_hqr_airstrike" );
            break;
        case "stealth_airstrike":
            var_3 = 1;
            self playlocalsound( game["voice"][self.team] + "KS_hqr_bomber" );
            break;
    }

    if ( var_1 != "harrier_airstrike" )
    {
        maps\mp\_utility::_beginlocationselection( var_1, "map_artillery_selector", var_3, var_2 );
        self endon( "stop_location_selection" );
        self waittill( "confirm_location", var_4, var_5 );
    }
    else
    {
        var_6 = [];

        foreach ( var_8 in level.players )
        {
            if ( !isdefined( var_8 ) )
                continue;

            if ( !isdefined( var_8.team ) )
                continue;

            if ( var_8.team == self.team )
                continue;

            var_6[var_6.size] = var_8.origin;
        }

        if ( var_6.size )
            var_10 = averagepoint( var_6 );
        else
            var_10 = ( 0, 0, 0 );

        var_4 = var_10;
        var_5 = randomint( 360 );
    }

    if ( !var_3 )
        var_5 = randomint( 360 );

    self setblurforplayer( 0, 0.3 );

    if ( var_1 == "harrier_airstrike" && ( isdefined( level.harrier_incoming ) || level.harriers.size > 1 ) )
    {
        self notify( "cancel_location" );
        self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
        return 0;
    }

    thread airstrikemadeselectionvo( var_1 );
    maps\mp\_matchdata::logkillstreakevent( var_1, var_4 );
    thread finishairstrikeusage( var_0, var_4, var_5, var_1 );
    return 1;
}

finishairstrikeusage( var_0, var_1, var_2, var_3 )
{
    self notify( "used" );
    var_4 = bullettrace( level.mapcenter + ( 0, 0, 1000000.0 ), level.mapcenter, 0, undefined );
    var_1 = ( var_1[0], var_1[1], var_4["position"][2] - 514 );
    thread doairstrike( var_0, var_1, var_2, self, self.pers["team"], var_3 );
}

useairstrike( var_0, var_1, var_2 )
{

}

handleemp( var_0 )
{
    self endon( "death" );

    if ( var_0 maps\mp\_utility::isemped() )
    {
        self notify( "death" );
        return;
    }

    for (;;)
    {
        level waittill( "emp_update" );

        if ( !var_0 maps\mp\_utility::isemped() )
            continue;

        self notify( "death" );
    }
}

airstrikemadeselectionvo( var_0 )
{
    self endon( "death" );
    self endon( "disconnect" );

    switch ( var_0 )
    {
        case "precision_airstrike":
            self playlocalsound( game["voice"][self.team] + "KS_ast_inbound" );
            break;
        case "stealth_airstrike":
            self playlocalsound( game["voice"][self.team] + "KS_bmb_inbound" );
            break;
    }
}