514 lines
15 KiB
Plaintext
514 lines
15 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
init()
|
|
{
|
|
level.killstreakfuncs["heli_pilot"] = ::tryusehelipilot;
|
|
level.heli_pilot = [];
|
|
level.helipilotsettings = [];
|
|
level.helipilotsettings["heli_pilot"] = spawnstruct();
|
|
level.helipilotsettings["heli_pilot"].timeout = 60.0;
|
|
level.helipilotsettings["heli_pilot"].maxhealth = 2000;
|
|
level.helipilotsettings["heli_pilot"].streakname = "heli_pilot";
|
|
level.helipilotsettings["heli_pilot"].vehicleinfo = "heli_pilot_mp";
|
|
level.helipilotsettings["heli_pilot"].modelbase = level.littlebird_model;
|
|
level.helipilotsettings["heli_pilot"].teamsplash = "used_heli_pilot";
|
|
helipilot_setairstartnodes();
|
|
level.heli_pilot_mesh = getent( "heli_pilot_mesh", "targetname" );
|
|
|
|
if ( !isdefined( level.heli_pilot_mesh ) )
|
|
{
|
|
|
|
}
|
|
else
|
|
level.heli_pilot_mesh.origin = level.heli_pilot_mesh.origin + maps\mp\_utility::gethelipilotmeshoffset();
|
|
|
|
var_0 = spawnstruct();
|
|
var_0.xppopup = "destroyed_helo_pilot";
|
|
var_0.vodestroyed = undefined;
|
|
var_0.callout = "callout_destroyed_helo_pilot";
|
|
var_0.samdamagescale = 0.09;
|
|
var_0.enginevfxtag = "tag_engine_right";
|
|
level.heliconfigs["heli_pilot"] = var_0;
|
|
}
|
|
|
|
tryusehelipilot( var_0, var_1 )
|
|
{
|
|
var_2 = "heli_pilot";
|
|
var_3 = 1;
|
|
|
|
if ( isdefined( self.underwater ) && self.underwater )
|
|
return 0;
|
|
else if ( exceededmaxhelipilots( self.team ) )
|
|
{
|
|
self iprintlnbold( &"KILLSTREAKS_AIR_SPACE_TOO_CROWDED" );
|
|
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 = createhelipilot( var_2 );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
maps\mp\_utility::decrementfauxvehiclecount();
|
|
return 0;
|
|
}
|
|
|
|
level.heli_pilot[self.team] = var_4;
|
|
var_5 = starthelipilot( var_4 );
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
var_5 = 0;
|
|
|
|
return var_5;
|
|
}
|
|
|
|
exceededmaxhelipilots( var_0 )
|
|
{
|
|
if ( level.gametype == "dm" )
|
|
{
|
|
if ( isdefined( level.heli_pilot[var_0] ) || isdefined( level.heli_pilot[level.otherteam[var_0]] ) )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
else if ( isdefined( level.heli_pilot[var_0] ) )
|
|
return 1;
|
|
else
|
|
return 0;
|
|
}
|
|
|
|
watchhostmigrationfinishedinit( var_0 )
|
|
{
|
|
var_0 endon( "killstreak_disowned" );
|
|
var_0 endon( "disconnect" );
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "host_migration_end" );
|
|
var_0 setclientomnvar( "ui_heli_pilot", 1 );
|
|
}
|
|
}
|
|
|
|
createhelipilot( var_0 )
|
|
{
|
|
var_1 = helipilot_getcloseststartnode( self.origin );
|
|
var_2 = helipilot_getlinkedstruct( var_1 );
|
|
var_3 = vectortoangles( var_2.origin - var_1.origin );
|
|
var_4 = anglestoforward( self.angles );
|
|
var_5 = var_2.origin + var_4 * -100;
|
|
var_6 = var_1.origin;
|
|
var_7 = spawnhelicopter( self, var_6, var_3, level.helipilotsettings[var_0].vehicleinfo, level.helipilotsettings[var_0].modelbase );
|
|
|
|
if ( !isdefined( var_7 ) )
|
|
return;
|
|
|
|
var_7 makevehiclesolidcapsule( 18, -9, 18 );
|
|
var_7 maps\mp\killstreaks\_helicopter::addtolittlebirdlist();
|
|
var_7 thread maps\mp\killstreaks\_helicopter::removefromlittlebirdlistondeath();
|
|
var_7.maxhealth = level.helipilotsettings[var_0].maxhealth;
|
|
var_7.speed = 40;
|
|
var_7.owner = self;
|
|
var_7 setotherent( self );
|
|
var_7.team = self.team;
|
|
var_7.helitype = "littlebird";
|
|
var_7.helipilottype = "heli_pilot";
|
|
var_7 setmaxpitchroll( 45, 45 );
|
|
var_7 vehicle_setspeed( var_7.speed, 40, 40 );
|
|
var_7 setyawspeed( 120, 60 );
|
|
var_7 setneargoalnotifydist( 32 );
|
|
var_7 sethoverparams( 100, 100, 100 );
|
|
var_7 common_scripts\utility::make_entity_sentient_mp( var_7.team );
|
|
var_7.targetpos = var_5;
|
|
var_7.currentnode = var_2;
|
|
var_7.attract_strength = 10000;
|
|
var_7.attract_range = 150;
|
|
var_7.attractor = missile_createattractorent( var_7, var_7.attract_strength, var_7.attract_range );
|
|
var_7 thread maps\mp\killstreaks\_helicopter::heli_damage_monitor( "heli_pilot" );
|
|
var_7 thread helipilot_lightfx();
|
|
var_7 thread helipilot_watchtimeout();
|
|
var_7 thread helipilot_watchownerloss();
|
|
var_7 thread helipilot_watchroundend();
|
|
var_7 thread helipilot_watchobjectivecam();
|
|
var_7 thread helipilot_watchdeath();
|
|
var_7 thread watchhostmigrationfinishedinit( self );
|
|
var_7.owner maps\mp\_matchdata::logkillstreakevent( level.helipilotsettings[var_7.helipilottype].streakname, var_7.targetpos );
|
|
return var_7;
|
|
}
|
|
|
|
helipilot_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" );
|
|
}
|
|
|
|
starthelipilot( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_0 endon( "death" );
|
|
maps\mp\_utility::setusingremote( var_0.helipilottype );
|
|
|
|
if ( getdvarint( "camera_thirdPerson" ) )
|
|
maps\mp\_utility::setthirdpersondof( 0 );
|
|
|
|
self.restoreangles = self.angles;
|
|
var_0 thread maps\mp\killstreaks\_flares::ks_setup_manual_flares( 2, "+smoke", "ui_heli_pilot_flare_ammo", "ui_heli_pilot_warn" );
|
|
thread watchintrocleared( var_0 );
|
|
maps\mp\_utility::freezecontrolswrapper( 1 );
|
|
var_1 = maps\mp\killstreaks\_killstreaks::initridekillstreak( var_0.helipilottype );
|
|
|
|
if ( var_1 != "success" )
|
|
{
|
|
if ( isdefined( self.disabledweapon ) && self.disabledweapon )
|
|
common_scripts\utility::_enableweapon();
|
|
|
|
var_0 notify( "death" );
|
|
return 0;
|
|
}
|
|
|
|
maps\mp\_utility::freezecontrolswrapper( 0 );
|
|
var_2 = maps\mp\_utility::gethelipilottraceoffset();
|
|
var_3 = var_0.currentnode.origin + ( maps\mp\_utility::gethelipilotmeshoffset() + var_2 );
|
|
var_4 = var_0.currentnode.origin + ( maps\mp\_utility::gethelipilotmeshoffset() - var_2 );
|
|
var_5 = bullettrace( var_3, var_4, 0, undefined, 0, 0, 1 );
|
|
|
|
if ( !isdefined( var_5["entity"] ) )
|
|
{
|
|
|
|
}
|
|
|
|
var_6 = var_5["position"] - maps\mp\_utility::gethelipilotmeshoffset() + ( 0, 0, 250 );
|
|
var_7 = spawn( "script_origin", var_6 );
|
|
self remotecontrolvehicle( var_0 );
|
|
var_0 thread heligotostartposition( var_7 );
|
|
var_0 thread helipilot_watchads();
|
|
level thread maps\mp\_utility::teamplayercardsplash( level.helipilotsettings[var_0.helipilottype].teamsplash, self );
|
|
var_0.killcament = spawn( "script_origin", self getvieworigin() );
|
|
return 1;
|
|
}
|
|
|
|
heligotostartposition( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
self remotecontrolvehicletarget( var_0 );
|
|
self waittill( "goal_reached" );
|
|
self remotecontrolvehicletargetoff();
|
|
var_0 delete();
|
|
}
|
|
|
|
watchintrocleared( var_0 )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "joined_team" );
|
|
self endon( "joined_spectators" );
|
|
level endon( "game_ended" );
|
|
var_0 endon( "death" );
|
|
self waittill( "intro_cleared" );
|
|
self setclientomnvar( "ui_heli_pilot", 1 );
|
|
var_1 = maps\mp\_utility::outlineenableforplayer( self, "cyan", self, 0, "killstreak" );
|
|
removeoutline( var_1, var_0 );
|
|
|
|
foreach ( var_3 in level.participants )
|
|
{
|
|
if ( !maps\mp\_utility::isreallyalive( var_3 ) || var_3.sessionstate != "playing" )
|
|
continue;
|
|
|
|
if ( maps\mp\_utility::isenemy( var_3 ) )
|
|
{
|
|
if ( !var_3 maps\mp\_utility::_hasperk( "specialty_noplayertarget" ) )
|
|
{
|
|
var_1 = maps\mp\_utility::outlineenableforplayer( var_3, "orange", self, 0, "killstreak" );
|
|
var_3 removeoutline( var_1, var_0 );
|
|
continue;
|
|
}
|
|
|
|
var_3 thread watchforperkremoval( var_0 );
|
|
}
|
|
}
|
|
|
|
var_0 thread watchplayersspawning();
|
|
thread watchearlyexit( var_0 );
|
|
}
|
|
|
|
watchforperkremoval( var_0 )
|
|
{
|
|
self notify( "watchForPerkRemoval" );
|
|
self endon( "watchForPerkRemoval" );
|
|
self endon( "death" );
|
|
self waittill( "removed_specialty_noplayertarget" );
|
|
var_1 = maps\mp\_utility::outlineenableforplayer( self, "orange", var_0.owner, 0, "killstreak" );
|
|
removeoutline( var_1, var_0 );
|
|
}
|
|
|
|
watchplayersspawning()
|
|
{
|
|
self endon( "leaving" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
level waittill( "player_spawned", var_0 );
|
|
|
|
if ( var_0.sessionstate == "playing" && self.owner maps\mp\_utility::isenemy( var_0 ) )
|
|
var_0 thread watchforperkremoval( self );
|
|
}
|
|
}
|
|
|
|
removeoutline( var_0, var_1 )
|
|
{
|
|
thread heliremoveoutline( var_0, var_1 );
|
|
thread playerremoveoutline( var_0, var_1 );
|
|
}
|
|
|
|
heliremoveoutline( var_0, var_1 )
|
|
{
|
|
self notify( "heliRemoveOutline" );
|
|
self endon( "heliRemoveOutline" );
|
|
self endon( "outline_removed" );
|
|
self endon( "disconnect" );
|
|
level endon( "game_ended" );
|
|
var_2 = [ "leaving", "death" ];
|
|
var_1 common_scripts\utility::waittill_any_in_array_return_no_endon_death( var_2 );
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
maps\mp\_utility::outlinedisable( var_0, self );
|
|
self notify( "outline_removed" );
|
|
}
|
|
}
|
|
|
|
playerremoveoutline( var_0, var_1 )
|
|
{
|
|
self notify( "playerRemoveOutline" );
|
|
self endon( "playerRemoveOutline" );
|
|
self endon( "outline_removed" );
|
|
self endon( "disconnect" );
|
|
level endon( "game_ended" );
|
|
var_2 = [ "death" ];
|
|
common_scripts\utility::waittill_any_in_array_return_no_endon_death( var_2 );
|
|
maps\mp\_utility::outlinedisable( var_0, self );
|
|
self notify( "outline_removed" );
|
|
}
|
|
|
|
helipilot_watchdeath()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "gone" );
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( self.owner ) )
|
|
self.owner helipilot_endride( self );
|
|
|
|
if ( isdefined( self.killcament ) )
|
|
self.killcament delete();
|
|
|
|
thread maps\mp\killstreaks\_helicopter::lbonkilled();
|
|
}
|
|
|
|
helipilot_watchobjectivecam()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "gone" );
|
|
self.owner endon( "disconnect" );
|
|
self.owner endon( "joined_team" );
|
|
self.owner endon( "joined_spectators" );
|
|
level waittill( "objective_cam" );
|
|
thread maps\mp\killstreaks\_helicopter::lbonkilled();
|
|
|
|
if ( isdefined( self.owner ) )
|
|
self.owner helipilot_endride( self );
|
|
}
|
|
|
|
helipilot_watchtimeout()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self.owner endon( "disconnect" );
|
|
self.owner endon( "joined_team" );
|
|
self.owner endon( "joined_spectators" );
|
|
var_0 = level.helipilotsettings[self.helipilottype].timeout;
|
|
maps\mp\gametypes\_hostmigration::waitlongdurationwithhostmigrationpause( var_0 );
|
|
thread helipilot_leave();
|
|
}
|
|
|
|
helipilot_watchownerloss()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self.owner common_scripts\utility::waittill_any( "disconnect", "joined_team", "joined_spectators" );
|
|
thread helipilot_leave();
|
|
}
|
|
|
|
helipilot_watchroundend()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "leaving" );
|
|
self.owner endon( "disconnect" );
|
|
self.owner endon( "joined_team" );
|
|
self.owner endon( "joined_spectators" );
|
|
level common_scripts\utility::waittill_any( "round_end_finished", "game_ended" );
|
|
thread helipilot_leave();
|
|
}
|
|
|
|
helipilot_leave()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "leaving" );
|
|
|
|
if ( isdefined( self.owner ) )
|
|
self.owner helipilot_endride( self );
|
|
|
|
var_0 = maps\mp\killstreaks\_airdrop::getflyheightoffset( self.origin );
|
|
var_1 = self.origin + ( 0, 0, var_0 );
|
|
self vehicle_setspeed( 140, 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();
|
|
}
|
|
|
|
helipilot_endride( var_0 )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
self setclientomnvar( "ui_heli_pilot", 0 );
|
|
var_0 notify( "end_remote" );
|
|
|
|
if ( maps\mp\_utility::isusingremote() )
|
|
maps\mp\_utility::clearusingremote();
|
|
|
|
if ( getdvarint( "camera_thirdPerson" ) )
|
|
maps\mp\_utility::setthirdpersondof( 1 );
|
|
|
|
self remotecontrolvehicleoff( var_0 );
|
|
self setplayerangles( self.restoreangles );
|
|
thread helipilot_freezebuffer();
|
|
}
|
|
}
|
|
|
|
helipilot_freezebuffer()
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
maps\mp\_utility::freezecontrolswrapper( 1 );
|
|
wait 0.5;
|
|
maps\mp\_utility::freezecontrolswrapper( 0 );
|
|
}
|
|
|
|
helipilot_watchads()
|
|
{
|
|
self endon( "leaving" );
|
|
self endon( "death" );
|
|
level endon( "game_ended" );
|
|
var_0 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( isdefined( self.owner ) )
|
|
{
|
|
if ( self.owner adsbuttonpressed() )
|
|
{
|
|
if ( !var_0 )
|
|
{
|
|
self.owner setclientomnvar( "ui_heli_pilot", 2 );
|
|
var_0 = 1;
|
|
}
|
|
}
|
|
else if ( var_0 )
|
|
{
|
|
self.owner setclientomnvar( "ui_heli_pilot", 1 );
|
|
var_0 = 0;
|
|
}
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
helipilot_setairstartnodes()
|
|
{
|
|
level.air_start_nodes = common_scripts\utility::getstructarray( "chopper_boss_path_start", "targetname" );
|
|
}
|
|
|
|
helipilot_getlinkedstruct( var_0 )
|
|
{
|
|
if ( isdefined( var_0.script_linkto ) )
|
|
{
|
|
var_1 = var_0 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 ) )
|
|
return var_3;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
helipilot_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;
|
|
}
|
|
|
|
watchearlyexit( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
var_0 endon( "death" );
|
|
self endon( "leaving" );
|
|
var_0 thread maps\mp\killstreaks\_killstreaks::allowridekillstreakplayerexit();
|
|
var_0 waittill( "killstreakExit" );
|
|
var_0 thread helipilot_leave();
|
|
}
|