547 lines
15 KiB
Plaintext
547 lines
15 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
alien_maaws_init()
|
|
{
|
|
level.alternate_trinity_weapon_try_use = ::tryuse_dpad_maaws;
|
|
level.alternate_trinity_weapon_use = ::use_dpad_maaws;
|
|
level.alternate_trinity_weapon_cancel_use = ::canceluse_dpad_maaws;
|
|
level._effect["maaws_burst"] = loadfx( "vfx/gameplay/alien/vfx_alien_maaws_burst" );
|
|
}
|
|
|
|
tryuse_dpad_maaws( var_0, var_1 )
|
|
{
|
|
thread tryuse_dpad_maaws_internal( var_0, var_1 );
|
|
}
|
|
|
|
tryuse_dpad_maaws_internal( var_0, var_1 )
|
|
{
|
|
waittillframeend;
|
|
maps\mp\alien\_utility::store_weapons_status();
|
|
self.last_weapon = self getcurrentweapon();
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
|
|
if ( !isdefined( level.cosine ) )
|
|
{
|
|
level.cosine = [];
|
|
level.cosine["90"] = cos( 90 );
|
|
level.cosine["89"] = cos( 89 );
|
|
level.cosine["45"] = cos( 45 );
|
|
level.cosine["25"] = cos( 25 );
|
|
level.cosine["15"] = cos( 15 );
|
|
level.cosine["10"] = cos( 10 );
|
|
level.cosine["5"] = cos( 5 );
|
|
}
|
|
|
|
maps\mp\_utility::_giveweapon( var_2 );
|
|
wait 0.05;
|
|
self switchtoweapon( var_2 );
|
|
self disableweaponswitch();
|
|
|
|
if ( var_1 > 3 )
|
|
self setweaponammoclip( var_2, 3 );
|
|
else if ( var_1 > 0 )
|
|
self setweaponammoclip( var_2, 2 );
|
|
|
|
thread handle_missile_logic( var_2, var_1 );
|
|
}
|
|
|
|
use_dpad_maaws( var_0, var_1 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_in_laststand() )
|
|
return;
|
|
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
|
|
switch ( var_1 )
|
|
{
|
|
case 0:
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
break;
|
|
case 1:
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
break;
|
|
case 2:
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
break;
|
|
case 3:
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
break;
|
|
case 4:
|
|
var_2 = "iw6_alienmaaws_mp";
|
|
break;
|
|
}
|
|
|
|
thread maps\mp\alien\_combat_resources::watch_ammo( var_2 );
|
|
wait 0.1;
|
|
}
|
|
|
|
watch_rank_for_fof( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "disconnect" );
|
|
self notify( "fof_cancel" );
|
|
self endon( "fof_cancel" );
|
|
|
|
if ( var_1 > 0 )
|
|
{
|
|
while ( self getcurrentweapon() != var_0 )
|
|
wait 0.05;
|
|
|
|
self thermalvisionfofoverlayon();
|
|
|
|
while ( self getcurrentweapon() == var_0 )
|
|
wait 0.05;
|
|
|
|
self thermalvisionfofoverlayoff();
|
|
}
|
|
}
|
|
|
|
within_fov_set_dot( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
var_5 = get_alien_origin( var_2 );
|
|
|
|
if ( !isdefined( var_5 ) )
|
|
return 0;
|
|
|
|
var_6 = vectornormalize( var_5 - var_0 );
|
|
|
|
if ( !isdefined( var_4 ) || var_4 == "forward" )
|
|
var_7 = anglestoforward( var_1 );
|
|
else
|
|
var_7 = anglestoright( var_1 );
|
|
|
|
var_8 = vectordot( var_7, var_6 );
|
|
var_2.dot = var_8;
|
|
return var_8 >= var_3;
|
|
}
|
|
|
|
missile_bullet_trace( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = bullettrace( var_0, var_1, 1, level.player, 1, 0, 1 );
|
|
|
|
if ( !isdefined( var_4["entity"] ) )
|
|
return 0;
|
|
|
|
if ( var_4["entity"] != var_2 )
|
|
return 0;
|
|
else
|
|
return 1;
|
|
}
|
|
|
|
get_forward_point( var_0, var_1 )
|
|
{
|
|
var_2 = anglestoforward( var_1 );
|
|
var_2 = vectornormalize( var_2 );
|
|
var_2 = ( var_2[0] * 2, var_2[1] * 2, var_2[2] * 2 );
|
|
var_2 = var_2 + var_0;
|
|
return var_2;
|
|
}
|
|
|
|
handle_missile_logic( var_0, var_1 )
|
|
{
|
|
self endon( "cancel_maaws" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
var_2 = "iw6_alienmaawschild_mp";
|
|
self.maaws_done = 0;
|
|
|
|
if ( !isdefined( self.trace_available ) )
|
|
thread manage_bullet_trace_queue( var_0 );
|
|
|
|
while ( self getammocount( var_0 ) )
|
|
{
|
|
level.alien_on_drill = undefined;
|
|
self waittill( "missile_fire", var_3, var_4 );
|
|
|
|
if ( !isdefined( level.outlined_aliens ) )
|
|
level.outlined_aliens = [];
|
|
|
|
level.outlined_aliens common_scripts\utility::array_removeundefined( level.outlined_aliens );
|
|
var_5 = 10000;
|
|
var_6 = 0;
|
|
var_7 = var_3.origin;
|
|
|
|
while ( isdefined( var_3 ) && var_6 < var_5 )
|
|
{
|
|
var_8 = var_3.origin;
|
|
var_6 = distancesquared( var_8, var_7 );
|
|
wait 0.1;
|
|
}
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
var_3 thread alien_maaws_initial_projectile_death_fx();
|
|
var_9 = var_3.origin;
|
|
var_10 = var_3.angles;
|
|
var_11 = 45;
|
|
thread fire_missile_at_angles( var_9, var_10, var_2, 0, ( 1, 0, 0 ) );
|
|
common_scripts\utility::waitframe();
|
|
var_12 = ( var_10[0] - var_11 / 10, var_10[1] - var_11 / 4, var_10[2] );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
thread fire_missile_at_angles( var_9, var_12, var_2, var_1, ( 0, 1, 0 ) );
|
|
|
|
common_scripts\utility::waitframe();
|
|
var_13 = ( var_10[0] - var_11 / 10, var_10[1] + var_11 / 4, var_10[2] );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
thread fire_missile_at_angles( var_9, var_13, var_2, var_1, ( 0, 0, 1 ) );
|
|
|
|
common_scripts\utility::waitframe();
|
|
|
|
if ( var_1 > 2 )
|
|
{
|
|
var_13 = ( var_10[0], var_10[1] + var_11 / 2, var_10[2] );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
thread fire_missile_at_angles( var_9, var_13, var_2, var_1, ( 1, 1, 0 ) );
|
|
|
|
common_scripts\utility::waitframe();
|
|
var_14 = ( var_10[0], var_10[1] - var_11 / 2, var_10[2] );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
thread fire_missile_at_angles( var_9, var_14, var_2, var_1, ( 1, 0, 1 ) );
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_3 ) )
|
|
var_3 delete();
|
|
}
|
|
|
|
self.maaws_done = 1;
|
|
}
|
|
|
|
fire_missile_at_angles( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
var_5 = get_forward_point( var_0, var_1 );
|
|
var_6 = magicbullet( var_2, var_0, var_5, self );
|
|
var_6 endon( "death" );
|
|
self.player_missiles[self.player_missiles.size] = var_6;
|
|
thread damage_alien_on_drill( var_6 );
|
|
|
|
if ( isdefined( var_3 ) && var_3 > 1 )
|
|
{
|
|
var_7 = maps\mp\alien\_spawnlogic::get_alive_agents();
|
|
|
|
if ( level.script == "mp_alien_last" && isdefined( level.active_ancestors ) )
|
|
var_7 = common_scripts\utility::array_combine( var_7, level.active_ancestors );
|
|
|
|
if ( isdefined( level.seeder_active_turrets ) )
|
|
var_7 = common_scripts\utility::array_combine( var_7, level.seeder_active_turrets );
|
|
|
|
var_7 = get_alien_targets_in_fov( self.origin, self.angles, "10" );
|
|
var_8 = get_missile_target( var_6, var_7, var_4 );
|
|
|
|
if ( isdefined( var_8 ) )
|
|
{
|
|
var_6.target_ent = var_8;
|
|
var_9 = ( 0, 0, 10 );
|
|
|
|
if ( isalive( var_6.target_ent ) && isdefined( var_6.target_ent.alien_type ) && var_6.target_ent.alien_type == "ancestor" )
|
|
var_9 = ( 0, 0, 110 );
|
|
|
|
var_6 missile_settargetent( var_8, var_9 );
|
|
}
|
|
else
|
|
{
|
|
wait 0.1;
|
|
thread scan_for_targets( var_6, var_4 );
|
|
}
|
|
}
|
|
}
|
|
|
|
damage_alien_on_drill( var_0 )
|
|
{
|
|
self endon( "disconnect" );
|
|
self endon( "death" );
|
|
var_1 = undefined;
|
|
var_0 waittill( "death" );
|
|
var_1 = var_0.origin;
|
|
|
|
if ( isdefined( var_1 ) && isdefined( level.alien_on_drill ) && isalive( level.alien_on_drill ) )
|
|
{
|
|
if ( distancesquared( level.alien_on_drill.origin, var_1 ) < 10000 )
|
|
level.alien_on_drill dodamage( 275, var_1, self, var_0, "MOD_PROJECTILE" );
|
|
else if ( distancesquared( level.alien_on_drill.origin, var_1 ) < 62500 )
|
|
level.alien_on_drill dodamage( 125, var_1, self, var_0, "MOD_PROJECTILE" );
|
|
}
|
|
}
|
|
|
|
scan_for_targets( var_0, var_1 )
|
|
{
|
|
var_0 endon( "death" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
var_2 = undefined;
|
|
|
|
while ( !isdefined( var_2 ) )
|
|
{
|
|
var_2 = get_missile_target( var_0, undefined, var_1 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
{
|
|
var_0.target_ent = var_2;
|
|
var_3 = ( 0, 0, 10 );
|
|
|
|
if ( isalive( var_0.target_ent ) && isdefined( var_0.target_ent.alien_type ) && var_0.target_ent.alien_type == "ancestor" )
|
|
var_3 = ( 0, 0, 110 );
|
|
|
|
var_0 missile_settargetent( var_2, var_3 );
|
|
break;
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
get_missile_target( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return undefined;
|
|
|
|
var_3 = get_array_of_targets( var_0, "5", var_1, var_2 );
|
|
|
|
if ( var_3.size == 0 )
|
|
{
|
|
var_3 = get_array_of_targets( var_0, "45", var_1, var_2 );
|
|
|
|
if ( var_3.size == 0 )
|
|
var_3 = get_array_of_targets( var_0, "89", var_1, var_2 );
|
|
}
|
|
|
|
if ( var_3.size > 0 )
|
|
{
|
|
var_4 = var_3[0];
|
|
|
|
foreach ( var_6 in var_3 )
|
|
{
|
|
if ( isdefined( var_6.alien_type ) && ( var_6.alien_type == "gargoyle" || var_6.alien_type == "bomber" ) )
|
|
{
|
|
var_4 = var_6;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !is_in_array( level.outlined_aliens, var_4 ) )
|
|
level.outlined_aliens[level.outlined_aliens.size] = var_4;
|
|
|
|
return var_4;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
get_array_of_targets( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_0 endon( "death" );
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return undefined;
|
|
|
|
var_4 = 0;
|
|
var_5 = [];
|
|
var_6 = [];
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_6 = get_alien_targets_in_fov( self.origin, self.angles, var_1, var_2 );
|
|
else
|
|
var_6 = get_alien_targets_in_fov( var_0.origin, var_0.angles, var_1 );
|
|
|
|
if ( var_6.size > 0 )
|
|
{
|
|
var_6 = common_scripts\utility::get_array_of_closest( var_0.origin, var_6 );
|
|
|
|
foreach ( var_8 in var_6 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
break;
|
|
|
|
if ( !isdefined( var_8 ) )
|
|
continue;
|
|
|
|
var_9 = get_alien_origin( var_8 );
|
|
|
|
if ( !isdefined( var_9 ) )
|
|
continue;
|
|
|
|
if ( var_8 alien_is_on_drill() )
|
|
{
|
|
var_5[var_5.size] = var_8;
|
|
level.alien_on_drill = var_8;
|
|
continue;
|
|
}
|
|
|
|
self.trace_available[self.trace_available.size] = var_0;
|
|
var_0 waittill( "my_turn_to_trace" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
break;
|
|
|
|
if ( !isdefined( var_8 ) )
|
|
continue;
|
|
|
|
var_9 = get_alien_origin( var_8 );
|
|
|
|
if ( !isdefined( var_9 ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_8.coll_model ) )
|
|
var_8 = var_8.coll_model;
|
|
|
|
if ( missile_bullet_trace( var_0.origin, var_9, var_8, var_3 ) )
|
|
{
|
|
var_5[var_5.size] = var_8;
|
|
break;
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
}
|
|
|
|
return var_5;
|
|
}
|
|
|
|
get_alien_targets_in_fov( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = [];
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
{
|
|
var_5 = maps\mp\alien\_spawnlogic::get_alive_agents();
|
|
|
|
if ( level.script == "mp_alien_last" && isdefined( level.active_ancestors ) )
|
|
var_5 = common_scripts\utility::array_combine( var_5, level.active_ancestors );
|
|
|
|
if ( isdefined( level.seeder_active_turrets ) )
|
|
var_5 = common_scripts\utility::array_combine( var_5, level.seeder_active_turrets );
|
|
}
|
|
else
|
|
var_5 = var_3;
|
|
|
|
foreach ( var_7 in var_5 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_true( var_7.pet ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_7.agent_type ) && ( var_7.agent_type == "kraken" || var_7.agent_type == "kraken_tentacle" ) )
|
|
continue;
|
|
|
|
if ( within_fov_set_dot( var_0, var_1, var_7, level.cosine[var_2] ) )
|
|
var_4[var_4.size] = var_7;
|
|
}
|
|
|
|
return var_4;
|
|
}
|
|
|
|
manage_bullet_trace_queue( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "disconnect" );
|
|
self.trace_available = [];
|
|
self.player_missiles = [];
|
|
|
|
for (;;)
|
|
{
|
|
self.player_missiles = common_scripts\utility::array_removeundefined( self.player_missiles );
|
|
|
|
if ( self.maaws_done && self.player_missiles.size == 0 )
|
|
break;
|
|
|
|
if ( self.trace_available.size > 0 )
|
|
{
|
|
while ( !isdefined( self.trace_available[0] ) )
|
|
self.trace_available = common_scripts\utility::array_remove( self.trace_available, self.trace_available[0] );
|
|
|
|
self.trace_available[0] notify( "my_turn_to_trace" );
|
|
self.trace_available = common_scripts\utility::array_remove( self.trace_available, self.trace_available[0] );
|
|
}
|
|
|
|
common_scripts\utility::waitframe();
|
|
}
|
|
|
|
self.trace_available = undefined;
|
|
}
|
|
|
|
get_alien_origin( var_0 )
|
|
{
|
|
if ( isalive( var_0 ) && isdefined( var_0.alien_type ) && ( var_0.alien_type == "seeder" || var_0.alien_type == "elite" ) )
|
|
var_1 = var_0 gettagorigin( "TAG_ORIGIN" );
|
|
else if ( isdefined( var_0.alien_type ) && var_0.alien_type == "seeder_spore" )
|
|
{
|
|
if ( !isdefined( var_0.coll_model ) )
|
|
return undefined;
|
|
|
|
var_1 = var_0 gettagorigin( "J_Spore_46" );
|
|
var_0 = var_0.coll_model;
|
|
}
|
|
else if ( isalive( var_0 ) && isdefined( var_0.alien_type ) && var_0.alien_type == "ancestor" )
|
|
var_1 = var_0.origin + ( 0, 0, 110 );
|
|
else if ( isalive( var_0 ) && isdefined( var_0.model ) && maps\mp\alien\_utility::has_tag( var_0.model, "J_SpineUpper" ) )
|
|
var_1 = var_0 gettagorigin( "J_SpineUpper" );
|
|
else
|
|
var_1 = var_0.origin + ( 0, 0, 10 );
|
|
|
|
return var_1;
|
|
}
|
|
|
|
alien_is_on_drill()
|
|
{
|
|
if ( isdefined( self.melee_type ) && self.melee_type == "synch" && ( isdefined( self.synch_anim_state ) && issubstr( self.synch_anim_state, "attack_drill" ) ) )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
alien_maaws_initial_projectile_death_fx()
|
|
{
|
|
playfx( level._effect["maaws_burst"], self.origin );
|
|
}
|
|
|
|
is_in_array( var_0, var_1 )
|
|
{
|
|
for ( var_2 = 0; var_2 < var_0.size; var_2++ )
|
|
{
|
|
if ( var_0[var_2] == var_1 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
canceluse_dpad_maaws( var_0, var_1 )
|
|
{
|
|
self endon( "disconnect" );
|
|
maps\mp\alien\_combat_resources::wait_to_cancel_dpad_weapon();
|
|
self notify( "cancel_maaws" );
|
|
self takeweapon( "iw6_alienmaaws_mp" );
|
|
self.maaws_done = 1;
|
|
|
|
if ( isdefined( self.last_weapon ) && player_not_carrying_drill_or_cortex() )
|
|
{
|
|
self switchtoweapon( self.last_weapon );
|
|
self enableweaponswitch();
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
player_not_carrying_drill_or_cortex()
|
|
{
|
|
if ( !isdefined( level.drill_carrier ) || isdefined( level.drill_carrier ) && self != level.drill_carrier )
|
|
return 1;
|
|
else if ( !isdefined( level.cortex_carrier ) || isdefined( level.cortex_carrier ) && self != level.cortex_carrier )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|