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

492 lines
14 KiB
Plaintext

// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
lgm_init( var_0, var_1 )
{
level._effect["laser_guided_launcher_missile_split"] = loadfx( var_0 );
level._effect["laser_guided_launcher_missile_spawn_homing"] = loadfx( var_1 );
}
lgm_update_launcherusage( var_0, var_1 )
{
self endon( "death" );
self endon( "disconnect" );
self endon( "faux_spawn" );
thread lgm_monitorlaser();
var_2 = self getcurrentweapon();
for (;;)
{
while ( var_2 != var_0 )
self waittill( "weapon_change", var_2 );
childthread lgm_firing_monitormissilefire( var_2, var_1 );
self waittill( "weapon_change", var_2 );
lgm_firing_endmissilefire();
}
}
lgm_monitorlaser()
{
self endon( "LGM_player_endMonitorFire" );
common_scripts\utility::waittill_any( "death", "disconnect" );
if ( isdefined( self ) )
lgm_disablelaser();
}
lgm_firing_endmissilefire()
{
lgm_disablelaser();
self notify( "LGM_player_endMonitorFire" );
}
lgm_firing_monitormissilefire( var_0, var_1, var_2 )
{
self endon( "LGM_player_endMonitorFire" );
lgm_enablelaser();
var_3 = undefined;
for (;;)
{
var_4 = undefined;
self waittill( "missile_fire", var_4, var_5 );
if ( isdefined( var_4.ismagicbullet ) && var_4.ismagicbullet )
continue;
if ( var_5 != var_0 )
continue;
if ( !isdefined( var_3 ) )
var_3 = lgm_requestmissileguideent( self );
thread lgm_firing_delayspawnchildren( var_0, var_1, var_2, 0.35, 0.1, var_4, var_3 );
}
}
lgm_firing_delayspawnchildren( var_0, var_1, var_2, var_3, var_4, var_5, var_6 )
{
self notify( "monitor_laserGuidedMissile_delaySpawnChildren" );
self endon( "monitor_laserGuidedMissile_delaySpawnChildren" );
self endon( "death" );
self endon( "LGM_player_endMonitorFire" );
lgm_missilesnotifyandrelease( var_6 );
wait( var_3 );
if ( !isvalidmissile( var_5 ) )
return;
var_7 = var_5.origin;
var_8 = anglestoforward( var_5.angles );
var_9 = anglestoup( var_5.angles );
var_10 = anglestoright( var_5.angles );
var_5 delete();
playfx( level._effect["laser_guided_launcher_missile_split"], var_7, var_8, var_9 );
var_11 = [];
for ( var_12 = 0; var_12 < 2; var_12++ )
{
var_13 = 20;
var_14 = 0;
if ( var_12 == 0 )
var_14 = 20;
else if ( var_12 == 1 )
var_14 = -20;
else if ( var_12 == 2 )
{
}
var_15 = rotatepointaroundvector( var_10, var_8, var_13 );
var_15 = rotatepointaroundvector( var_9, var_15, var_14 );
var_16 = magicbullet( var_1, var_7, var_7 + var_15 * 180, self );
var_16.ismagicbullet = 1;
var_11[var_11.size] = var_16;
common_scripts\utility::waitframe();
}
wait( var_4 );
var_11 = lgm_removeinvalidmissiles( var_11 );
if ( var_11.size > 0 )
{
foreach ( var_18 in var_11 )
{
var_6.missileschasing[var_6.missileschasing.size] = var_18;
var_18 missile_settargetent( var_6 );
thread lgm_onmissilenotifies( var_6, var_18 );
}
thread lgm_firing_monitorplayeraim( var_6, var_2 );
}
}
lgm_onmissilenotifies( var_0, var_1 )
{
var_1 common_scripts\utility::waittill_any( "death", "missile_pairedWithFlare", "LGM_missile_abandoned" );
if ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
{
var_0.missileschasing = common_scripts\utility::array_remove( var_0.missileschasing, var_1 );
var_0.missileschasing = lgm_removeinvalidmissiles( var_0.missileschasing );
}
if ( !isdefined( var_0.missileschasing ) || var_0.missileschasing.size == 0 )
self notify( "LGM_player_allMissilesDestroyed" );
}
lgm_firing_monitorplayeraim( var_0, var_1 )
{
self notify( "LGM_player_newMissilesFired" );
self endon( "LGM_player_newMissilesFired" );
self endon( "LGM_player_allMissilesDestroyed" );
self endon( "LGM_player_endMonitorFire" );
self endon( "death" );
self endon( "disconnect" );
var_2 = undefined;
var_3 = undefined;
var_4 = undefined;
var_5 = 0;
var_6 = gettime() + 400;
while ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
{
var_7 = lgm_targetfind();
if ( !isdefined( var_7 ) )
{
if ( isdefined( var_3 ) )
{
self notify( "LGM_player_targetLost" );
var_3 = undefined;
foreach ( var_9 in var_0.missileschasing )
var_9 notify( "missile_targetChanged" );
}
var_4 = undefined;
var_5 = 0;
var_11 = common_scripts\utility::ter_op( gettime() > var_6, 8000, 800 );
var_12 = anglestoforward( self getplayerangles() );
var_13 = self geteye() + var_12 * 12;
var_14 = bullettrace( var_13, var_13 + var_12 * var_11, 1, self, 0, 0, 0 );
var_2 = var_14["position"];
}
else
{
var_2 = var_7.origin;
var_15 = !isdefined( var_3 ) || var_7 != var_3;
var_3 = var_7;
if ( var_15 || !isdefined( var_4 ) )
{
var_4 = gettime() + 1500;
level thread lgm_locking_think( var_3, self );
}
else if ( gettime() >= var_4 )
{
var_5 = 1;
self notify( "LGM_player_lockedOn" );
}
if ( var_5 )
{
waittillframeend;
if ( var_0.missileschasing.size > 0 )
{
var_16 = [];
foreach ( var_9 in var_0.missileschasing )
{
if ( !isvalidmissile( var_9 ) )
continue;
var_16[var_16.size] = var_9.origin;
var_9 notify( "missile_targetChanged" );
var_9 notify( "LGM_missile_abandoned" );
var_9 delete();
}
if ( var_16.size > 0 )
level thread lgm_locked_think( var_3, self, var_1, var_16 );
var_0.missileschasing = [];
}
else
break;
}
else if ( var_15 )
lgm_targetnotifymissiles( var_3, self, var_0.missileschasing );
}
var_0.origin = var_2;
common_scripts\utility::waitframe();
}
}
lgm_requestmissileguideent( var_0 )
{
if ( !isdefined( level.laserguidedmissileents_inuse ) )
level.laserguidedmissileents_inuse = [];
if ( !isdefined( level.laserguidedmissileents_ready ) )
level.laserguidedmissileents_ready = [];
var_1 = undefined;
if ( level.laserguidedmissileents_ready.size )
{
var_1 = level.laserguidedmissileents_ready[0];
level.laserguidedmissileents_ready = common_scripts\utility::array_remove( level.laserguidedmissileents_ready, var_1 );
}
else
var_1 = spawn( "script_origin", var_0.origin );
level.laserguidedmissileents_inuse[level.laserguidedmissileents_inuse.size] = var_1;
level thread lgm_monitorlaserentcleanup( var_1, var_0 );
var_1.missileschasing = [];
return var_1;
}
lgm_monitorlaserentcleanup( var_0, var_1 )
{
var_1 common_scripts\utility::waittill_any( "death", "disconnect", "LGM_player_endMonitorFire" );
foreach ( var_3 in var_0.missileschasing )
{
if ( isvalidmissile( var_3 ) )
var_3 missile_cleartarget();
}
var_0.missileschasing = undefined;
level.laserguidedmissileents_inuse = common_scripts\utility::array_remove( level.laserguidedmissileents_inuse, var_0 );
if ( level.laserguidedmissileents_ready.size + level.laserguidedmissileents_inuse.size < 4 )
level.laserguidedmissileents_ready[level.laserguidedmissileents_ready.size] = var_0;
else
var_0 delete();
}
lgm_locking_think( var_0, var_1 )
{
var_2 = maps\mp\_utility::outlineenableforplayer( var_0, "orange", var_1, 1, "killstreak_personal" );
level thread lgm_locking_loopsound( var_1, "maaws_reticle_tracking", 1.5, "LGM_player_lockingDone" );
level thread lgm_locking_notifyontargetdeath( var_0, var_1 );
var_1 common_scripts\utility::waittill_any( "death", "disconnect", "LGM_player_endMonitorFire", "LGM_player_newMissilesFired", "LGM_player_targetLost", "LGM_player_lockedOn", "LGM_player_allMissilesDestroyed", "LGM_player_targetDied" );
if ( isdefined( var_0 ) )
maps\mp\_utility::outlinedisable( var_2, var_0 );
if ( isdefined( var_1 ) )
{
var_1 notify( "LGM_player_lockingDone" );
var_1 stoplocalsound( "maaws_reticle_tracking" );
}
}
lgm_locked_missileondeath( var_0, var_1, var_2 )
{
var_1 endon( "death" );
var_0 waittill( "death" );
var_1.lg_missileslocked[var_2] = common_scripts\utility::array_remove( var_1.lg_missileslocked[var_2], var_0 );
if ( var_1.lg_missileslocked[var_2].size == 0 )
{
var_1.lg_missileslocked[var_2] = undefined;
var_1 notify( "LGM_target_lockedMissilesDestroyed" );
}
}
lgm_locking_notifyontargetdeath( var_0, var_1 )
{
var_1 endon( "death" );
var_1 endon( "disconnect" );
var_1 endon( "LGM_player_lockingDone" );
var_0 waittill( "death" );
var_1 notify( "LGM_player_targetDied" );
}
lgm_locking_loopsound( var_0, var_1, var_2, var_3 )
{
var_0 endon( "death" );
var_0 endon( "disconnect" );
var_0 endon( var_3 );
for (;;)
{
var_0 playlocalsound( var_1 );
wait( var_2 );
}
}
lgm_locked_spawnmissiles( var_0, var_1, var_2, var_3 )
{
var_0 endon( "death" );
var_1 endon( "death" );
var_1 endon( "disconnect" );
var_4 = [];
for ( var_5 = 0; var_5 < var_3.size; var_5++ )
{
var_6 = magicbullet( var_2, var_3[var_5], var_0.origin, var_1 );
var_6.ismagicbullet = 1;
var_4[var_4.size] = var_6;
playfx( level._effect["laser_guided_launcher_missile_spawn_homing"], var_6.origin, anglestoforward( var_6.angles ), anglestoup( var_6.angles ) );
common_scripts\utility::waitframe();
}
return var_4;
}
lgm_locked_think( var_0, var_1, var_2, var_3 )
{
if ( var_3.size == 0 )
return;
var_4 = lgm_locked_spawnmissiles( var_0, var_1, var_2, var_3 );
if ( !isdefined( var_4 ) )
return;
var_4 = lgm_removeinvalidmissiles( var_4 );
if ( var_4.size == 0 )
return;
var_1 playlocalsound( "maaws_reticle_locked" );
var_5 = maps\mp\_utility::outlineenableforplayer( var_0, "red", var_1, 0, "killstreak_personal" );
var_6 = lgm_gettargetoffset( var_0 );
foreach ( var_8 in var_4 )
{
var_8 common_scripts\utility::missile_settargetandflightmode( var_0, "direct", var_6 );
lgm_targetnotifymissiles( var_0, var_1, var_4 );
}
if ( !isdefined( var_0.lg_missileslocked ) )
var_0.lg_missileslocked = [];
var_0.lg_missileslocked[var_5] = var_4;
foreach ( var_11 in var_4 )
level thread lgm_locked_missileondeath( var_11, var_0, var_5 );
var_13 = 1;
while ( var_13 )
{
var_14 = var_0 common_scripts\utility::waittill_any_return( "death", "LGM_target_lockedMissilesDestroyed" );
if ( var_14 == "death" )
{
var_13 = 0;
if ( isdefined( var_0 ) )
var_0.lg_missileslocked[var_5] = undefined;
continue;
}
if ( var_14 == "LGM_target_lockedMissilesDestroyed" )
{
waittillframeend;
if ( !isdefined( var_0.lg_missileslocked[var_5] ) || var_0.lg_missileslocked[var_5].size == 0 )
var_13 = 0;
}
}
if ( isdefined( var_0 ) )
maps\mp\_utility::outlinedisable( var_5, var_0 );
}
lgm_targetfind()
{
var_0 = maps\mp\gametypes\_weapons::lockonlaunchers_gettargetarray();
var_0 = sortbydistance( var_0, self.origin );
var_1 = undefined;
foreach ( var_3 in var_0 )
{
if ( self worldpointinreticle_circle( var_3.origin, 65, 75 ) )
{
var_1 = var_3;
break;
}
}
return var_1;
}
lgm_enablelaser()
{
if ( !isdefined( self.laserguidedlauncher_laseron ) || self.laserguidedlauncher_laseron == 0 )
{
self.laserguidedlauncher_laseron = 1;
maps\mp\_utility::enableweaponlaser();
}
}
lgm_disablelaser()
{
if ( isdefined( self.laserguidedlauncher_laseron ) && self.laserguidedlauncher_laseron == 1 )
maps\mp\_utility::disableweaponlaser();
self.laserguidedlauncher_laseron = undefined;
}
lgm_removeinvalidmissiles( var_0 )
{
var_1 = [];
foreach ( var_3 in var_0 )
{
if ( isvalidmissile( var_3 ) )
var_1[var_1.size] = var_3;
}
return var_1;
}
lgm_targetnotifymissiles( var_0, var_1, var_2 )
{
level notify( "laserGuidedMissiles_incoming", var_1, var_2, var_0 );
var_0 notify( "targeted_by_incoming_missile", var_2 );
}
lgm_gettargetoffset( var_0 )
{
var_1 = undefined;
if ( var_0.model != "vehicle_av8b_harrier_jet_mp" )
var_1 = var_0 gettagorigin( "tag_missile_target" );
else
var_1 = var_0 gettagorigin( "tag_body" );
if ( !isdefined( var_1 ) )
var_1 = var_0 getpointinbounds( 0, 0, 0 );
return var_1 - var_0.origin;
}
lgm_missilesnotifyandrelease( var_0 )
{
if ( isdefined( var_0.missileschasing ) && var_0.missileschasing.size > 0 )
{
foreach ( var_2 in var_0.missileschasing )
{
if ( isvalidmissile( var_2 ) )
{
var_2 notify( "missile_targetChanged" );
var_2 notify( "LGM_missile_abandoned" );
var_2 missile_cleartarget();
}
}
}
var_0.missileschasing = [];
}