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

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