// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool init() { maps\mp\killstreaks\_helicopter_guard::lbsupport_setairstartnodes(); maps\mp\killstreaks\_helicopter_guard::lbsupport_setairnodemesh(); level.killstreakweildweapons["iw6_cabehemothminigun_mp"] = "heli_gunner"; } tryuseheligunner( var_0, var_1 ) { var_2 = spawnstruct(); var_2.xppopup = "destroyed_heli_gunner"; var_2.callout = "callout_destroyed_heli_gunner"; var_2.samdamagescale = 0.09; var_2.enginevfxtag = "tag_engine_right"; var_2.helicopter_model = "vehicle_ca_blackhawk"; level.heliconfigs["heli_gunner"] = var_2; level.killstreakweildweapons["iw6_cabehemothminigun_mp"] = "heli_gunner"; var_3 = getcloseststartnode( self.origin ); var_4 = getclosestnode( self.origin ); var_5 = vectortoangles( var_4.origin - var_3.origin ); if ( isdefined( self.underwater ) && self.underwater ) return 0; else if ( !isdefined( level.air_node_mesh ) || !isdefined( var_3 ) || !isdefined( var_4 ) ) { self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LEVEL" ); return 0; } var_6 = 1; if ( exceededmaxhelisnipers() ) { self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" ); return 0; } if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_6 >= maps\mp\_utility::maxvehiclesallowed() ) { self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" ); return 0; } if ( isdefined( self.iscapturingcrate ) && self.iscapturingcrate ) return 0; if ( isdefined( self.isreviving ) && self.isreviving ) return 0; var_7 = createheli( self, var_3, var_4, var_5, var_1, var_0 ); if ( !isdefined( var_7 ) ) return 0; var_8 = helipickup( var_7, var_1 ); if ( isdefined( var_8 ) && var_8 == "fail" ) return 0; return 1; } exceededmaxhelisnipers() { return isdefined( level.lbsniper ); } getcloseststartnode( var_0 ) { var_1 = undefined; var_2 = 999999; foreach ( var_4 in level.air_start_nodes ) { var_5 = distance( var_4.origin, var_0 ); if ( var_5 < var_2 ) { var_1 = var_4; var_2 = var_5; } } return var_1; } createheli( var_0, var_1, var_2, var_3, var_4, var_5 ) { var_6 = getent( "airstrikeheight", "targetname" ); var_7 = var_2.origin; var_8 = anglestoforward( var_3 ); var_9 = var_1.origin; var_10 = level.heliconfigs[var_4]; var_11 = spawnhelicopter( var_0, var_9, var_8, "attack_littlebird_mp", var_10.helicopter_model ); if ( !isdefined( var_11 ) ) return; var_12 = maps\mp\_utility::gethelipilottraceoffset(); var_13 = var_7 + ( maps\mp\_utility::gethelipilotmeshoffset() + var_12 ); var_14 = var_7 + ( maps\mp\_utility::gethelipilotmeshoffset() - var_12 ); var_15 = bullettrace( var_13, var_14, 0, 0, 0, 0, 1 ); if ( isdefined( var_15["entity"] ) && var_15["normal"][2] > 0.1 ) var_7 = var_15["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, 384 ); var_11 maps\mp\killstreaks\_helicopter::addtolittlebirdlist( "heli_gunner" ); var_11 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath(); var_11 thread waitfordeath(); var_11.lifeid = var_5; var_11.forward = var_8; var_11.pathstart = var_9; var_11.pathgoal = var_7; var_11.pathend = var_1.origin; var_11.flyheight = var_7[2]; var_11.maxheight = var_6.origin; var_11.ongroundpos = var_1.origin; var_11.pickuppos = var_11.ongroundpos + ( 0, 0, 300 ); var_11.hoverpos = var_11.ongroundpos + ( 0, 0, 600 ); var_11.forwardyaw = var_8[1]; var_11.backwardyaw = var_8[1] + 180; if ( var_11.backwardyaw > 360 ) var_11.backwardyaw = var_11.backwardyaw - 360; var_11.helitype = "littlebird"; var_11.heli_type = "littlebird"; var_11.locindex = var_1.orgin; var_11.allowsafeeject = 1; var_11.streakname = "heli_gunner"; var_11.owner = var_0; var_11.team = var_0.team; var_11 thread leaveonownerdisconnect(); var_11.attractor = missile_createattractorent( var_11, level.heli_attract_strength, level.heli_attract_range ); var_11.isdestroyed = 0; var_11.maxhealth = 10000; var_11 thread maps\mp\killstreaks\_flares::flares_monitor( 1 ); var_11 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( "heli_gunner", 1 ); var_11 thread helideathcleanup( "heli_gunner" ); var_11.speed = 100; var_11.ammo = 100; var_11.followspeed = 40; var_11 setcandamage( 1 ); var_11 setmaxpitchroll( 45, 45 ); var_11 vehicle_setspeed( var_11.speed, 100, 40 ); var_11 setyawspeed( 120, 60 ); var_11 sethoverparams( 10, 10, 60 ); var_11 setneargoalnotifydist( 512 ); var_11.killcount = 0; var_11.allowboard = 0; var_11.ownerboarded = 1; return var_11; } getbestheight( var_0 ) { self endon( "death" ); self endon( "crashing" ); self endon( "helicopter_removed" ); self endon( "heightReturned" ); var_1 = getent( "airstrikeheight", "targetname" ); if ( isdefined( var_1 ) ) var_2 = var_1.origin[2]; else if ( isdefined( level.airstrikeheightscale ) ) var_2 = 850 * level.airstrikeheightscale; else var_2 = 850; var_3 = bullettrace( var_0, var_0 - ( 0, 0, 10000 ), 0, self, 0, 0, 0, 0 ); var_4 = var_3["position"][2]; var_5 = 0; var_6 = 0; for ( var_7 = 0; var_7 < 30; var_7++ ) { wait 0.05; var_8 = var_7 % 8; var_9 = var_7 * 7; switch ( var_8 ) { case 0: var_5 = var_9; var_6 = var_9; break; case 1: var_5 = var_9 * -1; var_6 = var_9 * -1; break; case 2: var_5 = var_9 * -1; var_6 = var_9; break; case 3: var_5 = var_9; var_6 = var_9 * -1; break; case 4: var_5 = 0; var_6 = var_9 * -1; break; case 5: var_5 = var_9 * -1; var_6 = 0; break; case 6: var_5 = var_9; var_6 = 0; break; case 7: var_5 = 0; var_6 = var_9; break; default: break; } var_10 = bullettrace( var_0 + ( var_5, var_6, 1000 ), var_0 - ( var_5, var_6, 10000 ), 0, self, 0, 0, 0, 0, 0 ); if ( isdefined( var_10["entity"] ) ) continue; if ( var_10["position"][2] + 145 > var_4 ) var_4 = var_10["position"][2] + 145; } return var_4; } helipickup( var_0, var_1 ) { level endon( "game_ended" ); var_0 endon( "death" ); var_0 endon( "crashing" ); var_0 endon( "owner_disconnected" ); var_0 endon( "killstreakExit" ); var_2 = getcloseststartnode( self.origin ); level thread maps\mp\_utility::teamplayercardsplash( "used_heli_gunner", self, self.team ); if ( isdefined( var_2.angles ) ) var_3 = var_2.angles; else var_3 = ( 0, 0, 0 ); common_scripts\utility::_disableusability(); var_4 = var_0.flyheight; if ( isdefined( var_2.neighbors[0] ) ) var_5 = var_2.neighbors[0]; else var_5 = getclosestnode( self.origin ); var_6 = anglestoforward( self.angles ); var_7 = var_5.origin * ( 1, 1, 0 ) + ( 0, 0, 1 ) * var_4 + var_6 * -100; var_0.targetpos = var_7; var_0.currentnode = var_5; var_8 = moveplayertochopper( var_0 ); if ( isdefined( var_8 ) && var_8 == "fail" ) { var_0 thread helileave(); return var_8; } else { thread onheli( var_0 ); return var_8; } } chopperselfdamagewatchter() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "owner_disconnected" ); self endon( "killstreakExit" ); for (;;) { self waittill( "damage", var_0, var_1, var_2, var_3, var_4 ); if ( var_1 == self.owner ) { self.owner iprintlnbold( "stop hitting yourself!" ); self.health = self.health + var_0; } } } onheli( var_0 ) { level endon( "game_ended" ); var_0 endon( "death" ); var_0 endon( "crashing" ); var_0 endon( "owner_disconnected" ); var_0 endon( "killstreakExit" ); if ( isdefined( self.imslist ) ) destroycarriedims(); var_0 thread givecoolassgun(); var_0 setyawspeed( 1, 1, 1, 0.1 ); var_0 notify( "picked_up_passenger" ); common_scripts\utility::_enableusability(); var_0 vehicle_setspeed( var_0.speed, 100, 40 ); self.onhelisniper = 1; self.helisniper = var_0; var_0 endon( "owner_death" ); var_0 thread pushcorpseonownerdeath(); var_0 thread leaveonownerdeath(); var_0.owner thermalvisionfofoverlayon(); var_0 setvehgoalpos( var_0.targetpos, 1 ); var_0 thread helicreatelookatent(); givegunnerperks(); var_0 thread restockplayerhealth(); var_0 waittill( "near_goal" ); var_0 thread helimovementcontrol(); thread watchearlyexit( var_0 ); wait 45; self notify( "heli_sniper_timeout" ); dodropff( var_0 ); takegunnerperks(); } restockplayerhealth() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "owner_disconnected" ); self endon( "killstreakExit" ); self endon( "dropping" ); for (;;) { self.owner waittill( "damage" ); self.owner.health = 100; } } givegunnerperks() { var_0 = []; var_0[0] = "specialty_quickdraw"; var_0[1] = "specialty_fastreload"; var_0[2] = "specialty_holdbreath"; var_0[3] = "specialty_autospot"; var_0[4] = "specialty_bulletpenetration"; var_0[5] = "specialty_marksman"; var_0[6] = "specialty_sharp_focus"; var_0[7] = "specialty_armorpiercing"; var_0[8] = "specialty_blindeye"; var_0[9] = "specialty_incog"; self.givenperks = []; self thermalvisionfofoverlayon(); for ( var_1 = 0; var_1 < var_0.size; var_1++ ) { if ( !maps\mp\_utility::_hasperk( var_0[var_1] ) ) { maps\mp\_utility::giveperk( var_0[var_1], 0 ); self.givenperks[self.givenperks.size] = var_0[var_1]; } } } takegunnerperks() { self thermalvisionfofoverlayoff(); for ( var_0 = 0; var_0 < self.givenperks.size; var_0++ ) maps\mp\_utility::_unsetperk( self.givenperks[var_0] ); self.givenperks = []; } dodropff( var_0 ) { var_0 notify( "dropping" ); var_0 thread helireturntodropsite(); var_0 waittill( "at_dropoff" ); var_0 vehicle_setspeed( 60 ); var_0 setyawspeed( 180, 180, 180, 0.3 ); wait 1; if ( !maps\mp\_utility::isreallyalive( self ) ) return; thread settempnofalldamage(); self stopridingvehicle(); self allowjump( 1 ); self setstance( "stand" ); self.onhelisniper = 0; self.helisniper = undefined; var_0.ownerboarded = 0; self takeweapon( level.heli_gunner_weapon ); self enableweaponswitch(); takegunnerperks(); var_0.owner notify( "dropping" ); var_1 = common_scripts\utility::getlastweapon(); if ( !self hasweapon( var_1 ) ) var_1 = maps\mp\killstreaks\_killstreaks::getfirstprimaryweapon(); maps\mp\_utility::switch_to_last_weapon( var_1 ); wait 1; var_0 thread helileave(); } watchearlyexit( var_0 ) { self endon( "heli_sniper_timeout" ); var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit( "dropping" ); var_0 waittill( "killstreakExit" ); dodropff( var_0 ); } moveplayertochopper( var_0 ) { self endon( "disconnect" ); self visionsetnakedforplayer( "black_bw", 0.5 ); maps\mp\_utility::set_visionset_for_watching_players( "black_bw", 0.5, 1.0 ); var_1 = common_scripts\utility::waittill_any_timeout( 0.5, "death" ); maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); if ( var_1 == "death" ) { thread maps\mp\killstreaks\_killstreaks::clearrideintro( 1.0 ); return "fail"; } self cancelmantle(); if ( var_1 != "disconnect" ) { thread maps\mp\killstreaks\_killstreaks::clearrideintro( 1.0, 0.75 ); if ( self.team == "spectator" ) return "fail"; } var_0 attachplayertochopper(); if ( !isalive( self ) ) return "fail"; level.helisnipereyeson = var_0; level notify( "update_uplink" ); } destroycarriedims() { foreach ( var_1 in self.imslist ) { if ( isdefined( var_1.carriedby ) && var_1.carriedby == self ) { self forceusehintoff(); self.iscarrying = undefined; self.carrieditem = undefined; if ( isdefined( var_1.bombsquadmodel ) ) var_1.bombsquadmodel delete(); var_1 delete(); self enableweapons(); } } } helicreatelookatent() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "leaving" ); self.owner endon( "death" ); var_0 = self.origin + anglestoright( self.owner.angles ) * 1000; self.lookatent = spawn( "script_origin", var_0 ); self setlookatent( self.lookatent ); self setyawspeed( 360, 120 ); for (;;) { wait 0.25; var_0 = self.origin + anglestoright( self.owner.angles ) * 1000; self.lookatent.origin = var_0; } } attachplayertochopper() { self.owner notify( "force_cancel_sentry" ); self.owner notify( "force_cancel_ims" ); self.owner notify( "force_cancel_placement" ); self.owner notify( "cancel_carryRemoteUAV" ); self.owner setplayerangles( self gettagangles( "TAG_RIDER" ) ); self.owner ridevehicle( self, 40, 70, 5, 70, 1 ); self.owner setstance( "crouch" ); self.owner allowjump( 0 ); thread reequiplightarmor(); self.ownerboarded = 1; self notify( "boarded" ); self.owner.chopper = self; } helireturntodropsite() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "owner_disconnected" ); self endon( "owner_death" ); var_0 = undefined; var_1 = undefined; var_2 = undefined; var_3 = 0; foreach ( var_5 in level.air_node_mesh ) { if ( !isdefined( var_5.script_parameters ) || !issubstr( var_5.script_parameters, "pickupNode" ) ) continue; var_6 = distancesquared( var_5.origin, self.origin ); if ( !isdefined( var_2 ) || var_6 < var_2 ) { var_1 = var_5; var_2 = var_6; if ( var_5.script_parameters == "pickupNodehigh" ) { var_3 = 1; continue; } var_3 = 0; } } if ( maps\mp\_utility::getmapname() == "mp_chasm" ) { if ( var_1.origin == ( -224, -1056, 2376 ) ) var_1.origin = ( -304, -896, 2376 ); } if ( var_3 && !bullettracepassed( self.origin, var_1.origin, 0, self ) ) { self setvehgoalpos( self.origin + ( 0, 0, 2300 ), 1 ); waittill_msg_or_timeout( "near_goal", "goal", 5 ); var_8 = var_1.origin; var_8 = var_8 + ( 0, 0, 1500 ); } else if ( var_1.origin[2] > self.origin[2] ) var_8 = var_1.origin; else { var_8 = var_1.origin * ( 1, 1, 0 ); var_8 = var_8 + ( 0, 0, self.origin[2] ); } self setvehgoalpos( var_8, 1 ); var_9 = getbestheight( var_8 ); var_10 = var_8 * ( 1, 1, 0 ); var_11 = var_10 + ( 0, 0, var_9 ); waittill_msg_or_timeout( "near_goal", "goal", 5 ); self.movedlow = 0; self setvehgoalpos( var_11 + ( 0, 0, 200 ), 1 ); self.droppingoff = 1; waittill_msg_or_timeout( "near_goal", "goal", 5 ); self.movedlow = 1; self notify( "at_dropoff" ); } waittill_msg_or_timeout( var_0, var_1, var_2 ) { level endon( "game_ended" ); self endon( var_0 ); self endon( var_1 ); wait( var_2 ); } helimovementcontrol() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "dropping" ); self vehicle_setspeed( 60, 45, 20 ); self setneargoalnotifydist( 8 ); for (;;) { var_0 = self.owner getnormalizedmovement(); if ( var_0[0] >= 0.15 || var_0[1] >= 0.15 || var_0[0] <= -0.15 || var_0[1] <= -0.15 ) thread manualmove( var_0 ); wait 0.05; } } helifreemovementcontrol() { self vehicle_setspeed( 80, 60, 20 ); self setneargoalnotifydist( 8 ); for (;;) { var_0 = self.owner getnormalizedmovement(); if ( var_0[0] >= 0.15 || var_0[1] >= 0.15 || var_0[0] <= -0.15 || var_0[1] <= -0.15 ) thread manualmovefree( var_0 ); wait 0.05; } } manualmovefree( var_0 ) { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "dropping" ); self notify( "manualMove" ); self endon( "manualMove" ); var_1 = anglestoforward( self.owner.angles ) * ( 350 * var_0[0] ); var_2 = anglestoright( self.owner.angles ) * ( 250 * var_0[1] ); var_3 = var_1 + var_2; var_4 = self.origin + var_3; var_4 = var_4 * ( 1, 1, 0 ); var_4 = var_4 + ( 0, 0, self.maxheight[2] ); if ( distance2dsquared( ( 0, 0, 0 ), var_4 ) > 8000000 ) return; self setvehgoalpos( var_4, 1 ); self waittill( "goal" ); } manualmove( var_0 ) { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "dropping" ); self notify( "manualMove" ); self endon( "manualMove" ); var_1 = anglestoforward( self.owner.angles ) * ( 250 * var_0[0] ); var_2 = anglestoright( self.owner.angles ) * ( 250 * var_0[1] ); var_3 = var_1 + var_2; var_4 = 256; var_5 = self.origin + var_3; var_6 = maps\mp\_utility::gethelipilottraceoffset(); var_7 = var_5 + ( maps\mp\_utility::gethelipilotmeshoffset() + var_6 ); var_8 = var_5 + ( maps\mp\_utility::gethelipilotmeshoffset() - var_6 ); var_9 = bullettrace( var_7, var_8, 0, 0, 0, 0, 1 ); if ( isdefined( var_9["entity"] ) && var_9["normal"][2] > 0.1 ) { var_5 = var_9["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, var_4 ); var_10 = var_5[2] - self.origin[2]; if ( var_10 > 1000 ) return; self setvehgoalpos( var_5, 1 ); self waittill( "goal" ); } } helileave() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self notify( "end_disconnect_check" ); self notify( "end_death_check" ); self notify( "leaving" ); if ( isdefined( self.ladder ) ) self.ladder delete(); if ( isdefined( self.trigger ) ) self.trigger delete(); if ( isdefined( self.turret ) ) self.turret delete(); if ( isdefined( self.msg ) ) self.msg maps\mp\gametypes\_hud_util::destroyelem(); if ( isdefined( self.switchmsg ) ) self.switchmsg maps\mp\gametypes\_hud_util::destroyelem(); if ( isdefined( self.movemsg ) ) self.movemsg maps\mp\gametypes\_hud_util::destroyelem(); self clearlookatent(); level.helisnipereyeson = undefined; level notify( "update_uplink" ); self setyawspeed( 220, 220, 220, 0.3 ); self vehicle_setspeed( 120, 60 ); self setvehgoalpos( self.origin + ( 0, 0, 1200 ), 1 ); self waittill( "goal" ); var_0 = ( self.pathend - self.pathgoal ) * 5000; self setvehgoalpos( var_0, 1 ); self vehicle_setspeed( 300, 75 ); self.leaving = 1; common_scripts\utility::waittill_any_timeout( 5, "goal" ); if ( isdefined( level.lbsniper ) && level.lbsniper == self ) level.lbsniper = undefined; self notify( "delete" ); self delete(); } helideathcleanup( var_0 ) { level endon( "game_ended" ); self endon( "leaving" ); self waittill( "death" ); maps\mp\gametypes\_hostmigration::waittillhostmigrationdone(); thread maps\mp\killstreaks\_helicopter::lbonkilled(); if ( isdefined( self.ladder ) ) self.ladder delete(); if ( isdefined( self.trigger ) ) self.trigger delete(); if ( isdefined( self.turret ) ) self.turret delete(); if ( isdefined( self.msg ) ) self.msg maps\mp\gametypes\_hud_util::destroyelem(); if ( isdefined( self.switchmsg ) ) self.switchmsg maps\mp\gametypes\_hud_util::destroyelem(); if ( isdefined( self.movemsg ) ) self.movemsg maps\mp\gametypes\_hud_util::destroyelem(); if ( isdefined( self.owner ) && isalive( self.owner ) && self.ownerboarded == 1 ) { self.owner stopridingvehicle(); var_1 = undefined; var_2 = undefined; if ( isdefined( self.attackers ) ) { var_3 = 0; foreach ( var_6, var_5 in self.attackers ) { if ( var_5 >= var_3 ) { var_3 = var_5; var_1 = var_6; } } } if ( isdefined( var_1 ) ) { foreach ( var_8 in level.participants ) { if ( var_8 maps\mp\_utility::getuniqueid() == var_1 ) var_2 = var_8; } } var_10 = getdvarint( "scr_team_fftype" ); if ( isdefined( var_2 ) && var_10 != 2 ) radiusdamage( self.owner.origin, 200, 2600, 2600, var_2 ); else if ( var_10 == 2 && isdefined( var_2 ) && maps\mp\_utility::attackerishittingteam( var_2, self.owner ) ) { radiusdamage( self.owner.origin, 200, 2600, 2600, var_2 ); radiusdamage( self.owner.origin, 200, 2600, 2600 ); } else radiusdamage( self.owner.origin, 200, 2600, 2600 ); self.owner.onhelisniper = 0; self.owner.helisniper = undefined; } } settempnofalldamage() { if ( !maps\mp\_utility::_hasperk( "specialty_falldamage" ) ) { level endon( "game_ended" ); self endon( "death" ); self endon( "disconnect" ); maps\mp\_utility::giveperk( "specialty_falldamage", 0 ); wait 2; maps\mp\_utility::_unsetperk( "specialty_falldamage" ); } } reequiplightarmor() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "dropping" ); var_0 = 0; for (;;) { wait 0.05; if ( !isdefined( self.owner.lightarmorhp ) && !self.owner maps\mp\_utility::isjuggernaut() ) { self.owner maps\mp\perks\_perkfunctions::setlightarmor(); var_0++; if ( var_0 >= 2 ) break; } } } keepcrouched() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "dropping" ); for (;;) { if ( self.owner getstance() != "crouch" ) self.owner setstance( "crouch" ); wait 0.05; } } givecoolassgun() { level.heli_gunner_weapon = "iw6_cabehemothminigun_mp"; level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "dropping" ); self.owner endon( "disconnect" ); var_0 = 0; var_1 = 0; while ( self.owner getcurrentprimaryweapon() != level.heli_gunner_weapon ) { if ( !isalive( self.owner ) ) return "fail"; if ( self.owner getcurrentprimaryweapon() != level.heli_gunner_weapon ) { self.owner giveweapon( level.heli_gunner_weapon ); self.owner switchtoweaponimmediate( level.heli_gunner_weapon ); self.owner disableweaponswitch(); self.owner givemaxammo( level.heli_gunner_weapon ); self.owner thread restockownerammo(); var_0 = 1; var_1 = var_1 + 1; } wait 0.05; } } restockownerammo() { level endon( "game_ended" ); self endon( "death" ); self endon( "disconnect" ); self endon( "dropping" ); for (;;) { self waittill( "weapon_fired" ); self givestartammo( level.heli_gunner_weapon ); } } update_hit_fx() { self endon( "a10_cannon_stop" ); for (;;) { var_0 = self geteye(); var_1 = self getplayerangles(); var_2 = anglestoforward( var_1 ); var_3 = var_0 + var_2 * 7000; var_4 = bullettrace( var_0, var_3, 1, self ); playfx( level._effect["vfx_heli_gunner_impact"], var_4["position"] ); wait 0.15; } } monitor_gun_audio() { level endon( "game_ended" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self.owner endon( "dropping" ); self endon( "crashing" ); self.owner notifyonplayercommand( "a10_cannon_start", "+attack" ); self.owner notifyonplayercommand( "a10_cannon_stop", "-attack" ); thread gun_audio_cutoff_master(); var_0 = "veh_a10_npc_fire_gatling_lp"; for (;;) { if ( !self.owner attackbuttonpressed() ) self.owner waittill( "a10_cannon_start" ); self.owner thread update_hit_fx(); self playloopsound( var_0 ); self.owner waittill( "a10_cannon_stop" ); self stoploopsound( var_0 ); } } gun_audio_cutoff_master() { thread gun_audio_cutoff( "death", self.owner ); thread gun_audio_cutoff( "game_ended", level ); thread gun_audio_cutoff( "disconnect", self.owner ); thread gun_audio_cutoff( "dropping", self.owner ); thread gun_audio_cutoff( "crashing", self ); } gun_audio_cutoff( var_0, var_1 ) { self endon( "audio_end" ); var_1 waittill( var_0 ); self notify( "audio_end" ); } pushcorpseonownerdeath() { level endon( "game_ended" ); self.owner endon( "disconnect" ); self endon( "death" ); self endon( "crashing" ); self.owner waittill( "death" ); self.owner.onhelisniper = 0; self.owner.helisniper = undefined; self.ownerboarded = 0; if ( isdefined( self.origin ) ) physicsexplosionsphere( self.origin, 200, 200, 1 ); } leaveonownerdisconnect() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "end_disconnect_check" ); self.owner waittill( "disconnect" ); self notify( "owner_disconnected" ); thread helileave(); } leaveonownerdeath() { level endon( "game_ended" ); self endon( "death" ); self endon( "crashing" ); self endon( "end_death_check" ); self.owner waittill( "death" ); self notify( "owner_death" ); thread helileave(); } getclosestnode( var_0 ) { var_1 = undefined; var_2 = 999999; foreach ( var_4 in level.air_node_mesh ) { var_5 = distance( var_4.origin, var_0 ); if ( var_5 < var_2 ) { var_1 = var_4; var_2 = var_5; } } return var_1; } waitfordeath() { var_0 = self getentitynumber(); self waittill( "death" ); level.lbsniper = undefined; if ( isdefined( level.helisnipereyeson ) ) { level.helisnipereyeson = undefined; level notify( "update_uplink" ); } }