// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool init() { level.killstreakfuncs["littlebird_support"] = ::tryuselbsupport; level.heliguardsettings = []; level.heliguardsettings["littlebird_support"] = spawnstruct(); level.heliguardsettings["littlebird_support"].timeout = 60.0; level.heliguardsettings["littlebird_support"].health = 999999; level.heliguardsettings["littlebird_support"].maxhealth = 2000; level.heliguardsettings["littlebird_support"].streakname = "littlebird_support"; level.heliguardsettings["littlebird_support"].vehicleinfo = "attack_littlebird_mp"; level.heliguardsettings["littlebird_support"].weaponinfo = "littlebird_guard_minigun_mp"; level.heliguardsettings["littlebird_support"].weaponmodelleft = "vehicle_little_bird_minigun_left"; level.heliguardsettings["littlebird_support"].weaponmodelright = "vehicle_little_bird_minigun_right"; level.heliguardsettings["littlebird_support"].weapontagleft = "tag_flash"; level.heliguardsettings["littlebird_support"].weapontagright = "tag_flash_2"; level.heliguardsettings["littlebird_support"].sentrymode = "auto_nonai"; level.heliguardsettings["littlebird_support"].modelbase = level.littlebird_model; level.heliguardsettings["littlebird_support"].teamsplash = "used_littlebird_support"; lbsupport_setairstartnodes(); lbsupport_setairnodemesh(); } tryuselbsupport( var_0, var_1 ) { var_2 = "littlebird_support"; var_3 = 1; if ( isdefined( level.littlebirdguard ) || maps\mp\killstreaks\_helicopter::exceededmaxlittlebirds( var_2 ) ) { self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" ); return 0; } else if ( !level.air_node_mesh.size ) { self iprintlnbold( &"KILLSTREAKS_UNAVAILABLE_IN_LEVEL" ); return 0; } else if ( maps\mp\_utility::currentactivevehiclecount() >= maps\mp\_utility::maxvehiclesallowed() || level.fauxvehiclecount + var_3 >= maps\mp\_utility::maxvehiclesallowed() ) { self iprintlnbold( &"KILLSTREAKS_TOO_MANY_VEHICLES" ); return 0; } maps\mp\_utility::incrementfauxvehiclecount(); var_4 = createlbguard( var_2 ); if ( !isdefined( var_4 ) ) { maps\mp\_utility::decrementfauxvehiclecount(); return 0; } thread startlbsupport( var_4 ); level thread maps\mp\_utility::teamplayercardsplash( level.heliguardsettings[var_2].teamsplash, self, self.team ); return 1; } createlbguard( var_0 ) { var_1 = lbsupport_getcloseststartnode( self.origin ); if ( isdefined( var_1.angles ) ) var_2 = var_1.angles; else var_2 = ( 0, 0, 0 ); var_3 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin ); var_4 = lbsupport_getclosestnode( self.origin ); var_5 = anglestoforward( self.angles ); var_6 = var_4.origin * ( 1, 1, 0 ) + ( 0, 0, 1 ) * var_3 + var_5 * -100; var_7 = var_1.origin; var_8 = spawnhelicopter( self, var_7, var_2, level.heliguardsettings[var_0].vehicleinfo, level.heliguardsettings[var_0].modelbase ); if ( !isdefined( var_8 ) ) return; var_8 maps\mp\killstreaks\_helicopter::addtolittlebirdlist(); var_8 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath(); var_8.health = level.heliguardsettings[var_0].health; var_8.maxhealth = level.heliguardsettings[var_0].maxhealth; var_8.damagetaken = 0; var_8.speed = 100; var_8.followspeed = 40; var_8.owner = self; var_8 setotherent( self ); var_8.team = self.team; var_8 setmaxpitchroll( 45, 45 ); var_8 vehicle_setspeed( var_8.speed, 100, 40 ); var_8 setyawspeed( 120, 60 ); var_8 setneargoalnotifydist( 512 ); var_8.killcount = 0; var_8.helitype = "littlebird"; var_8.heliguardtype = "littlebird_support"; var_8.targettingradius = 2000; var_8 common_scripts\utility::make_entity_sentient_mp( var_8.team ); var_8.targetpos = var_6; var_8.currentnode = var_4; var_9 = spawnturret( "misc_turret", var_8.origin, level.heliguardsettings[var_0].weaponinfo ); var_9 linkto( var_8, level.heliguardsettings[var_0].weapontagleft, ( 0, 0, 0 ), ( 0, 0, 0 ) ); var_9 setmodel( level.heliguardsettings[var_0].weaponmodelleft ); var_9.angles = var_8.angles; var_9.owner = var_8.owner; var_9.team = self.team; var_9 maketurretinoperable(); var_9.vehicle = var_8; var_8.mgturretleft = var_9; var_8.mgturretleft setdefaultdroppitch( 0 ); var_10 = var_8.origin + ( anglestoforward( var_8.angles ) * -100 + anglestoright( var_8.angles ) * -100 ) + ( 0, 0, 50 ); var_9.killcament = spawn( "script_model", var_10 ); var_9.killcament setscriptmoverkillcam( "explosive" ); var_9.killcament linkto( var_8, "tag_origin" ); var_9 = spawnturret( "misc_turret", var_8.origin, level.heliguardsettings[var_0].weaponinfo ); var_9 linkto( var_8, level.heliguardsettings[var_0].weapontagright, ( 0, 0, 0 ), ( 0, 0, 0 ) ); var_9 setmodel( level.heliguardsettings[var_0].weaponmodelright ); var_9.angles = var_8.angles; var_9.owner = var_8.owner; var_9.team = self.team; var_9 maketurretinoperable(); var_9.vehicle = var_8; var_8.mgturretright = var_9; var_8.mgturretright setdefaultdroppitch( 0 ); var_10 = var_8.origin + ( anglestoforward( var_8.angles ) * -100 + anglestoright( var_8.angles ) * 100 ) + ( 0, 0, 50 ); var_9.killcament = spawn( "script_model", var_10 ); var_9.killcament setscriptmoverkillcam( "explosive" ); var_9.killcament linkto( var_8, "tag_origin" ); if ( level.teambased ) { var_8.mgturretleft setturretteam( self.team ); var_8.mgturretright setturretteam( self.team ); } var_8.mgturretleft setmode( level.heliguardsettings[var_0].sentrymode ); var_8.mgturretright setmode( level.heliguardsettings[var_0].sentrymode ); var_8.mgturretleft setsentryowner( self ); var_8.mgturretright setsentryowner( self ); var_8.mgturretleft thread lbsupport_attacktargets(); var_8.mgturretright thread lbsupport_attacktargets(); var_8.attract_strength = 10000; var_8.attract_range = 150; var_8.attractor = missile_createattractorent( var_8, var_8.attract_strength, var_8.attract_range ); var_8.hasdodged = 0; var_8.empgrenaded = 0; var_8 thread lbsupport_handledamage(); var_8 thread lbsupport_watchdeath(); var_8 thread lbsupport_watchtimeout(); var_8 thread lbsupport_watchownerloss(); var_8 thread lbsupport_watchownerdamage(); var_8 thread lbsupport_watchroundend(); var_8 thread lbsupport_lightfx(); level.littlebirdguard = var_8; var_8.owner maps\mp\_matchdata::logkillstreakevent( level.heliguardsettings[var_8.heliguardtype].streakname, var_8.targetpos ); return var_8; } lbsupport_lightfx() { playfxontag( level.chopper_fx["light"]["left"], self, "tag_light_nose" ); wait 0.05; playfxontag( level.chopper_fx["light"]["belly"], self, "tag_light_belly" ); wait 0.05; playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail1" ); wait 0.05; playfxontag( level.chopper_fx["light"]["tail"], self, "tag_light_tail2" ); } startlbsupport( var_0 ) { level endon( "game_ended" ); var_0 endon( "death" ); var_0 setlookatent( self ); var_0 setvehgoalpos( var_0.targetpos ); var_0 waittill( "near_goal" ); var_0 vehicle_setspeed( var_0.speed, 60, 30 ); var_0 waittill( "goal" ); var_0 setvehgoalpos( var_0.currentnode.origin, 1 ); var_0 waittill( "goal" ); var_0 thread lbsupport_followplayer(); var_0 thread maps\mp\killstreaks\_flares::flares_handleincomingsam( ::lbsupport_watchsamproximity ); var_0 thread maps\mp\killstreaks\_flares::flares_handleincomingstinger( ::lbsupport_watchstingerproximity ); } lbsupport_followplayer() { level endon( "game_ended" ); self endon( "death" ); self endon( "leaving" ); if ( !isdefined( self.owner ) ) { thread lbsupport_leave(); return; } self.owner endon( "disconnect" ); self endon( "owner_gone" ); self vehicle_setspeed( self.followspeed, 20, 20 ); for (;;) { if ( isdefined( self.owner ) && isalive( self.owner ) ) { var_0 = lbsupport_getclosestlinkednode( self.owner.origin ); if ( isdefined( var_0 ) && var_0 != self.currentnode ) { self.currentnode = var_0; lbsupport_movetoplayer(); continue; } } wait 1; } } lbsupport_movetoplayer() { level endon( "game_ended" ); self endon( "death" ); self endon( "leaving" ); self.owner endon( "death" ); self.owner endon( "disconnect" ); self endon( "owner_gone" ); self notify( "lbSupport_moveToPlayer" ); self endon( "lbSupport_moveToPlayer" ); self.intransit = 1; self setvehgoalpos( self.currentnode.origin + ( 0, 0, 100 ), 1 ); self waittill( "goal" ); self.intransit = 0; self notify( "hit_goal" ); } lbsupport_watchdeath() { level endon( "game_ended" ); self endon( "gone" ); self waittill( "death" ); thread maps\mp\killstreaks\_helicopter::lbonkilled(); } lbsupport_watchtimeout() { level endon( "game_ended" ); self endon( "death" ); self.owner endon( "disconnect" ); self endon( "owner_gone" ); var_0 = level.heliguardsettings[self.heliguardtype].timeout; maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 ); thread lbsupport_leave(); } lbsupport_watchownerloss() { level endon( "game_ended" ); self endon( "death" ); self endon( "leaving" ); self.owner waittill( "killstreak_disowned" ); self notify( "owner_gone" ); thread lbsupport_leave(); } lbsupport_watchownerdamage() { level endon( "game_ended" ); self endon( "death" ); self endon( "leaving" ); self.owner endon( "disconnect" ); self endon( "owner_gone" ); for (;;) { self.owner waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); if ( isplayer( var_1 ) ) { if ( var_1 != self.owner && distance2d( var_1.origin, self.origin ) <= self.targettingradius && !var_1 maps\mp\_utility::_hasperk( "specialty_blindeye" ) && !( level.hardcoremode && level.teambased && var_1.team == self.team ) ) { self setlookatent( var_1 ); if ( isdefined( self.mgturretleft ) ) self.mgturretleft settargetentity( var_1 ); if ( isdefined( self.mgturretright ) ) self.mgturretright settargetentity( var_1 ); } } } } lbsupport_watchroundend() { self endon( "death" ); self endon( "leaving" ); self.owner endon( "disconnect" ); self endon( "owner_gone" ); level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" ); thread lbsupport_leave(); } lbsupport_leave() { self endon( "death" ); self notify( "leaving" ); level.littlebirdguard = undefined; self clearlookatent(); var_0 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin ); var_1 = self.origin + ( 0, 0, var_0 ); self vehicle_setspeed( self.speed, 60 ); self setmaxpitchroll( 45, 180 ); self setvehgoalpos( var_1 ); self waittill( "goal" ); var_1 = var_1 + anglestoforward( self.angles ) * 15000; var_2 = spawn( "script_origin", var_1 ); if ( isdefined( var_2 ) ) { self setlookatent( var_2 ); var_2 thread wait_and_delete( 3.0 ); } self setvehgoalpos( var_1 ); self waittill( "goal" ); self notify( "gone" ); maps\mp\killstreaks\_helicopter::removelittlebird(); } wait_and_delete( var_0 ) { self endon( "death" ); level endon( "game_ended" ); wait( var_0 ); self delete(); } lbsupport_handledamage() { self endon( "death" ); level endon( "game_ended" ); self setcandamage( 1 ); for (;;) { self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 ); if ( !maps\mp\gametypes\_weapons::friendlyfirecheck( self.owner, var_1 ) ) continue; if ( !isdefined( self ) ) return; if ( isdefined( var_8 ) && var_8 & level.idflags_penetration ) self.wasdamagedfrombulletpenetration = 1; self.wasdamaged = 1; var_10 = var_0; if ( isplayer( var_1 ) ) { if ( var_1 != self.owner && distance2d( var_1.origin, self.origin ) <= self.targettingradius && !var_1 maps\mp\_utility::_hasperk( "specialty_blindeye" ) && !( level.hardcoremode && level.teambased && var_1.team == self.team ) ) { self setlookatent( var_1 ); if ( isdefined( self.mgturretleft ) ) self.mgturretleft settargetentity( var_1 ); if ( isdefined( self.mgturretright ) ) self.mgturretright settargetentity( var_1 ); } var_1 maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" ); if ( var_4 == "MOD_RIFLE_BULLET" || var_4 == "MOD_PISTOL_BULLET" ) { if ( var_1 maps\mp\_utility::_hasperk( "specialty_armorpiercing" ) ) var_10 = var_10 + var_0 * level.armorpiercingmod; } } if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) ) var_1.owner maps\mp\gametypes\_damagefeedback::updatedamagefeedback( "helicopter" ); if ( isdefined( var_9 ) ) { switch ( var_9 ) { case "remotemissile_projectile_mp": case "ac130_40mm_mp": case "ac130_105mm_mp": case "javelin_mp": case "remote_mortar_missile_mp": case "stinger_mp": self.largeprojectiledamage = 1; var_10 = self.maxhealth + 1; break; case "sam_projectile_mp": self.largeprojectiledamage = 1; var_10 = self.maxhealth * 0.25; break; case "emp_grenade_mp": var_10 = 0; thread lbsupport_empgrenaded(); break; case "osprey_player_minigun_mp": self.largeprojectiledamage = 0; var_10 = var_10 * 2; break; } maps\mp\killstreaks\_killstreaks::killstreakhit( var_1, var_9, self ); } self.damagetaken = self.damagetaken + var_10; if ( self.damagetaken >= self.maxhealth ) { if ( isplayer( var_1 ) && ( !isdefined( self.owner ) || var_1 != self.owner ) ) { var_1 notify( "destroyed_helicopter" ); var_1 notify( "destroyed_killstreak", var_9 ); thread maps\mp\_utility::teamplayercardsplash( "callout_destroyed_little_bird", var_1 ); var_1 thread maps\mp\gametypes\_rank::giverankxp( "kill", 300, var_9, var_4 ); var_1 thread maps\mp\gametypes\_rank::xpeventpopup( "destroyed_little_bird" ); thread maps\mp\gametypes\_missions::vehiclekilled( self.owner, self, undefined, var_1, var_0, var_4, var_9 ); } if ( isdefined( self.owner ) ) self.owner thread maps\mp\_utility::leaderdialogonplayer( "lbguard_destroyed" ); self notify( "death" ); return; } } } lbsupport_empgrenaded() { self notify( "lbSupport_EMPGrenaded" ); self endon( "lbSupport_EMPGrenaded" ); self endon( "death" ); self.owner endon( "disconnect" ); level endon( "game_ended" ); self.empgrenaded = 1; if ( isdefined( self.mgturretright ) ) self.mgturretright notify( "stop_shooting" ); if ( isdefined( self.mgturretleft ) ) self.mgturretleft notify( "stop_shooting" ); if ( isdefined( level._effect["ims_sensor_explode"] ) ) { if ( isdefined( self.mgturretright ) ) playfxontag( common_scripts\utility::getfx( "ims_sensor_explode" ), self.mgturretright, "tag_aim" ); if ( isdefined( self.mgturretleft ) ) playfxontag( common_scripts\utility::getfx( "ims_sensor_explode" ), self.mgturretleft, "tag_aim" ); } wait 3.5; self.empgrenaded = 0; if ( isdefined( self.mgturretright ) ) self.mgturretright notify( "turretstatechange" ); if ( isdefined( self.mgturretleft ) ) self.mgturretleft notify( "turretstatechange" ); } lbsupport_watchsamproximity( var_0, var_1, var_2, var_3 ) { level endon( "game_ended" ); var_2 endon( "death" ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) { if ( isdefined( var_3[var_4] ) && !var_2.hasdodged ) { var_2.hasdodged = 1; var_5 = spawn( "script_origin", var_2.origin ); var_5.angles = var_2.angles; var_5 movegravity( anglestoright( var_3[var_4].angles ) * -1000, 0.05 ); var_5 thread maps\mp\killstreaks\_flares::flares_deleteaftertime( 5.0 ); for ( var_6 = 0; var_6 < var_3.size; var_6++ ) { if ( isdefined( var_3[var_6] ) ) var_3[var_6] missile_settargetent( var_5 ); } var_7 = var_2.origin + anglestoright( var_3[var_4].angles ) * 200; var_2 vehicle_setspeed( var_2.speed, 100, 40 ); var_2 setvehgoalpos( var_7, 1 ); wait 2.0; var_2 vehicle_setspeed( var_2.followspeed, 20, 20 ); break; } } } lbsupport_watchstingerproximity( var_0, var_1, var_2 ) { level endon( "game_ended" ); var_2 endon( "death" ); if ( isdefined( self ) && !var_2.hasdodged ) { var_2.hasdodged = 1; var_3 = spawn( "script_origin", var_2.origin ); var_3.angles = var_2.angles; var_3 movegravity( anglestoright( self.angles ) * -1000, 0.05 ); var_3 thread maps\mp\killstreaks\_flares::flares_deleteaftertime( 5.0 ); self missile_settargetent( var_3 ); var_4 = var_2.origin + anglestoright( self.angles ) * 200; var_2 vehicle_setspeed( var_2.speed, 100, 40 ); var_2 setvehgoalpos( var_4, 1 ); wait 2.0; var_2 vehicle_setspeed( var_2.followspeed, 20, 20 ); } } lbsupport_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; } lbsupport_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; } lbsupport_getclosestlinkednode( var_0 ) { var_1 = undefined; var_2 = distance2d( self.currentnode.origin, var_0 ); var_3 = var_2; foreach ( var_5 in self.currentnode.neighbors ) { var_6 = distance2d( var_5.origin, var_0 ); if ( var_6 < var_2 && var_6 < var_3 ) { var_1 = var_5; var_3 = var_6; } } return var_1; } lbsupport_arraycontains( var_0, var_1 ) { if ( var_0.size <= 0 ) return 0; foreach ( var_3 in var_0 ) { if ( var_3 == var_1 ) return 1; } return 0; } lbsupport_getlinkedstructs() { var_0 = []; if ( isdefined( self.script_linkto ) ) { var_1 = common_scripts\utility::get_links(); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { var_3 = common_scripts\utility::getstruct( var_1[var_2], "script_linkname" ); if ( isdefined( var_3 ) ) var_0[var_0.size] = var_3; } } return var_0; } lbsupport_setairstartnodes() { level.air_start_nodes = common_scripts\utility::getstructarray( "chopper_boss_path_start", "targetname" ); foreach ( var_1 in level.air_start_nodes ) var_1.neighbors = var_1 lbsupport_getlinkedstructs(); } lbsupport_setairnodemesh() { level.air_node_mesh = common_scripts\utility::getstructarray( "so_chopper_boss_path_struct", "script_noteworthy" ); foreach ( var_1 in level.air_node_mesh ) { var_1.neighbors = var_1 lbsupport_getlinkedstructs(); foreach ( var_3 in level.air_node_mesh ) { if ( var_1 == var_3 ) continue; if ( !lbsupport_arraycontains( var_1.neighbors, var_3 ) && lbsupport_arraycontains( var_3 lbsupport_getlinkedstructs(), var_1 ) ) var_1.neighbors[var_1.neighbors.size] = var_3; } } } lbsupport_attacktargets() { self.vehicle endon( "death" ); level endon( "game_ended" ); for (;;) { self waittill( "turretstatechange" ); if ( self isfiringturret() && !self.vehicle.empgrenaded ) { thread lbsupport_burstfirestart(); continue; } thread lbsupport_burstfirestop(); } } lbsupport_burstfirestart() { self.vehicle endon( "death" ); self.vehicle endon( "leaving" ); self endon( "stop_shooting" ); level endon( "game_ended" ); var_0 = 0.1; var_1 = 40; var_2 = 80; var_3 = 1.0; var_4 = 2.0; for (;;) { var_5 = randomintrange( var_1, var_2 + 1 ); for ( var_6 = 0; var_6 < var_5; var_6++ ) { var_7 = self getturrettarget( 0 ); if ( isdefined( var_7 ) && ( !isdefined( var_7.spawntime ) || ( gettime() - var_7.spawntime ) / 1000 > 5 ) && ( isdefined( var_7.team ) && var_7.team != "spectator" ) && maps\mp\_utility::isreallyalive( var_7 ) ) { self.vehicle setlookatent( var_7 ); self shootturret(); } wait( var_0 ); } wait( randomfloatrange( var_3, var_4 ) ); } } lbsupport_burstfirestop() { self notify( "stop_shooting" ); if ( isdefined( self.vehicle.owner ) ) self.vehicle setlookatent( self.vehicle.owner ); }