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

703 lines
22 KiB
Plaintext

// 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 );
}