This commit is contained in:
2024-02-13 13:20:49 +01:00
commit 872504afef
1761 changed files with 871764 additions and 0 deletions

View File

@ -0,0 +1,726 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
init()
{
level.agent_funcs["ancestor"] = [];
level.agent_funcs["ancestor"]["spawn"] = ::onspawn;
level.agent_funcs["ancestor"]["on_killed"] = ::onkilled;
level.agent_funcs["ancestor"]["on_damaged"] = ::ondamaged;
level.agent_funcs["ancestor"]["on_damaged_finished"] = ::ondamagedfinished;
level.custom_alien_attribute_table_init = ::init_attributes;
level.drop_ims_when_grabbed_func = ::drop_ims_when_grabbed;
level.shield_down_extension_dur = [ 5, 3, 2 ];
load_ancestor_fx();
if ( !isdefined( level.active_ancestors ) )
level.active_ancestors = [];
}
init_attributes()
{
var_0 = "ancestor";
level.alien_types[var_0] = spawnstruct();
level.alien_types[var_0].attributes = [];
level.alien_types[var_0].attributes["emissive"] = getdefinitionvalue( 21.0 );
level.alien_types[var_0].attributes["max_emissive"] = getdefinitionvalue( 22.0 );
level.alien_types[var_0].attributes["view_height"] = getdefinitionvalue( 23 );
level.alien_types[var_0].attributes["anim_scale"] = getdefinitionvalue( 20.0 );
level.alien_types[var_0].attributes["model"] = getdefinitionvalue( "2" );
level.alien_types[var_0].attributes["starting_health"] = getdefinitionvalue( 24 );
level.alien_types[var_0].attributes["health_scalar_1p"] = getdefinitionvalue( 70.0 );
level.alien_types[var_0].attributes["health_scalar_2p"] = getdefinitionvalue( 71.0 );
level.alien_types[var_0].attributes["health_scalar_3p"] = getdefinitionvalue( 72.0 );
level.alien_types[var_0].attributes["attacker_difficulty"] = getdefinitionvalue( 80 );
level.alien_types[var_0].attributes["min_cumulative_pain_threshold"] = getdefinitionvalue( 81 );
level.alien_types[var_0].attributes["min_cumulative_pain_buffer_time"] = getdefinitionvalue( 82.0 );
level.alien_types[var_0].attributes["pain_interval"] = getdefinitionvalue( 83.0 );
}
load_ancestor_fx()
{
level._effect["ancestor_shield"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_01" );
level._effect["ancestor_shield_collapse"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_collapse_01" );
level._effect["ancestor_shield_raise"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_ff_raise_01" );
level._effect["ancestor_hover"] = loadfx( "vfx/gameplay/alien/vfx_alien_anc_hover" );
level._effect["ancestor_choke_ring"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_ring" );
level._effect["ancestor_choke_grab"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_grab" );
level._effect["ancestor_death_nuke"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancestor_blast_child_01" );
level._effect["blackhole_exp"] = loadfx( "vfx/gameplay/alien/vfx_alien_blackhole_exp" );
level._effect["ancestor_choke_pv"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_pv_1" );
level._effect["ancestor_choke_3pv"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_choke_3p" );
level._effect["ancestor_spawn_flash"] = loadfx( "vfx/gameplay/alien/vfx_alien_ancstr_spawn_flash" );
}
getdefinitionvalue( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
var_1 = 2;
var_2 = tablelookup( "mp/alien/alien_ancestor_definition.csv", 0, var_0, var_1 );
if ( !isstring( var_0 ) )
{
if ( !issubstr( var_2, "." ) )
var_2 = int( var_2 );
else
var_2 = float( var_2 );
}
return var_2;
}
addancestoragent( var_0, var_1, var_2 )
{
var_3 = maps\mp\agents\_agent_common::connectnewagent( "ancestor", var_0 );
if ( isdefined( var_3 ) )
var_3 thread [[ var_3 maps\mp\agents\_agent_utility::agentfunc( "spawn" ) ]]( var_1, var_2 );
return var_3;
}
onspawn( var_0, var_1 )
{
setancestormodel();
self.onenteranimstate = ::onenterstate;
self spawnagent( var_0, var_1, "alien_ancestor_last_animclass", 32, 120 );
level notify( "spawned_agent", self );
assignattributes();
setscriptfields( var_0 );
self scragentsetclipmode( "agent" );
self scragentsetphysicsmode( "gravity" );
self scragentusemodelcollisionbounds();
self takeallweapons();
level.active_ancestors = common_scripts\utility::array_add( level.active_ancestors, self );
level notify( "dlc_vo_notify", "last_vo", "ancestor_inbound" );
thread ancestor_shield();
thread ancestor_spawnfx();
maps\mp\agents\alien\_alien_think::cleardamagehistory();
thread maps\mp\agents\alien\alien_ancestor\_alien_ancestor_think::main();
self.headicon = maps\mp\_entityheadicons::setheadicon( "allies", "waypoint_ancestor_health_10", ( 0, 0, 182 ), 10, 10, undefined, undefined, 0, 1, 0, 0 );
}
setancestormodel()
{
var_0 = level.alien_types["ancestor"].attributes["model"];
self setmodel( var_0 );
self show();
self motionblurhqenable();
}
ancestor_spawnfx()
{
wait 0.1;
playfxontag( level._effect["ancestor_spawn_flash"], self, "j_spinelower" );
}
ancestor_shield()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
thread drop_shield_until_damaged();
thread listen_for_shield_disable();
self.shield_state = 1;
self.shield_radius_sq = 50176;
self.shield = spawn( "script_model", self.origin + ( 0, 0, 100 ) );
self.shield setmodel( "alien_shield_bubble_ancestor_col" );
self.shield linkto( self, "tag_origin", ( 0, 0, 100 ), ( -90, 0, 0 ) );
thread listen_for_shield_damage();
wait 1.0;
self.shield_down_time_end = gettime();
for (;;)
{
raise_shield();
if ( !maps\mp\alien\_utility::is_true( self.should_lower_shield ) && !maps\mp\alien\_utility::is_true( self.force_shield_down ) )
self waittill( "lower_shield" );
self.shield_down_time_extension_cnt = 0;
lower_shield();
while ( isdefined( self.shield_down_time_end ) && gettime() < self.shield_down_time_end || maps\mp\alien\_utility::is_true( self.force_shield_down ) )
wait 0.05;
self.shield_down_time_end = undefined;
self.shield_down_time_extension_cnt = undefined;
}
}
listen_for_shield_damage()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
if ( !isdefined( self.shield ) )
return;
self.shield setcandamage( 1 );
for (;;)
{
self.shield waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( isdefined( var_9 ) && var_9 == "iw6_aliendlc42_mp" )
{
self notify( "ancestor_disable_shield_weapon" );
continue;
}
if ( isdefined( var_9 ) && var_9 == "iw6_aliendlc43_mp" )
self notify( "ancestor_disable_shield_grenade" );
}
}
raise_shield()
{
self.shield playsound( "anc_shield_up" );
self.shield playloopsound( "anc_shield_lp" );
self.shield_state = 2;
self.shield show();
self.shield solid();
wait 0.1;
playfxontag( level._effect["ancestor_shield_raise"], self.shield, "tag_origin" );
wait 1;
playfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
wait 0.2;
self.shield_state = 1;
}
lower_shield()
{
self.shield stoploopsound( "anc_shield_lp" );
self.shield playsound( "anc_shield_down" );
self.shield_state = 3;
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
playfxontag( level._effect["ancestor_shield_collapse"], self.shield, "tag_origin" );
self.shield notsolid();
wait 0.2;
self.shield hide();
self.shield_state = 0;
level notify( "dlc_vo_notify", "ancestor_shield_down" );
self.should_lower_shield = 0;
}
listen_for_shield_disable()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
for (;;)
{
var_0 = common_scripts\utility::waittill_any_return( "ancestor_disable_shield_weapon", "ancestor_disable_shield_grenade", "ancestor_disable_shield_blast", "ancestor_disable_shield_grab" );
var_1 = 0;
if ( var_0 == "ancestor_disable_shield_weapon" )
var_1 = 7;
else if ( var_0 == "ancestor_disable_shield_grenade" )
var_1 = 9;
else if ( var_0 == "ancestor_disable_shield_blast" )
var_1 = 1.8;
else if ( var_0 == "ancestor_disable_shield_grab" )
var_1 = 1.8;
if ( !maps\mp\alien\_utility::is_true( self.force_shield_down ) && ( var_0 == "ancestor_disable_shield_blast" || var_0 == "ancestor_disable_shield_grab" ) )
continue;
if ( self.shield_state == 1 || self.shield_state == 2 )
self.should_lower_shield = 1;
var_2 = int( gettime() + var_1 * 1000 );
if ( !isdefined( self.shield_down_time_end ) || var_2 > self.shield_down_time_end )
self.shield_down_time_end = var_2;
self notify( "lower_shield" );
}
}
drop_shield_until_damaged()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
var_0 = 0.15;
var_1 = ( self.maxhealth - 20000 ) * var_0;
var_2 = 20;
if ( isdefined( level.ancestor_shield_up_override ) )
var_2 = level.ancestor_shield_up_override;
wait 5;
self.force_shield_down = 1;
var_3 = self.health;
var_4 = var_3 - var_1;
self notify( "lower_shield" );
for (;;)
{
self waittill( "damage" );
var_3 = self.health;
if ( var_3 > var_4 )
continue;
var_4 = var_3 - var_1;
self.force_shield_down = 0;
wait( var_2 );
self notify( "lower_shield" );
self.force_shield_down = 1;
}
}
ancestor_hover()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
wait 5;
playfxontag( level._effect["ancestor_hover"], self, "j_mainroot" );
}
isshieldup()
{
return isdefined( self.shield_state ) && self.shield_state == 1;
}
isshielddown()
{
return isdefined( self.shield_state ) && self.shield_state == 0;
}
extend_shield_down_time( var_0 )
{
if ( isshielddown() )
{
self.shield_down_time_extension_cnt++;
if ( !isdefined( self.shield_down_time_end ) )
self.shield_down_time_end = gettime();
var_1 = self.shield_down_time_end + var_0;
self.shield_down_time_end = var_1;
}
}
ensure_shield_stays_down_until_time( var_0 )
{
if ( isshielddown() )
{
if ( isdefined( self.shield_down_time_end ) && var_0 > self.shield_down_time_end )
self.shield_down_time_end = var_0;
}
}
assignattributes()
{
self.alien_type = "ancestor";
self.moveplaybackrate = 1.0;
self.defaultmoveplaybackrate = self.moveplaybackrate;
self.animplaybackrate = self.moveplaybackrate;
self.xyanimscale = level.alien_types[self.alien_type].attributes["anim_scale"];
self.defaultemissive = level.alien_types[self.alien_type].attributes["emissive"];
self.maxemissive = level.alien_types[self.alien_type].attributes["max_emissive"];
thread setinitialemissive();
self scragentsetviewheight( level.alien_types[self.alien_type].attributes["view_height"] );
var_0 = gethealthscalar();
self.health = int( level.alien_types["ancestor"].attributes["starting_health"] * var_0 + 20000 );
self.maxhealth = int( level.alien_types["ancestor"].attributes["starting_health"] * var_0 + 20000 );
self scragentsetmaxturnspeed( 0.05 );
if ( !threatbiasgroupexists( "ancestors" ) )
{
createthreatbiasgroup( "ancestors" );
setthreatbias( "players", "ancestors", 10000 );
}
self setthreatbiasgroup( "ancestors" );
maps\mp\alien\_utility::ent_flag_init( "activate_shield_health_check" );
}
setinitialemissive()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
wait 1;
maps\mp\alien\_utility::set_alien_emissive( 0.2, self.defaultemissive );
}
setscriptfields( var_0 )
{
self.species = "alien";
self.radius = 32;
self.height = 120;
maps\mp\agents\_agent_utility::activateagent();
self.spawntime = gettime();
self.spawnorigin = var_0;
self.is_moving = 1;
self.movemode = "walk";
self.trajectoryactive = 0;
}
gethealthscalar()
{
switch ( level.players.size )
{
case 1:
return level.alien_types["ancestor"].attributes["health_scalar_1p"];
case 2:
return level.alien_types["ancestor"].attributes["health_scalar_2p"];
case 3:
return level.alien_types["ancestor"].attributes["health_scalar_3p"];
}
return 1.0;
}
handleshielddamage( var_0 )
{
if ( isshieldup() )
{
if ( var_0 != "iw6_aliendlc42_mp" && var_0 != "iw6_aliendlc43_mp" )
level notify( "dlc_vo_notify", "ancestor_shield_up" );
}
else if ( isshielddown() && ( var_0 == "iw6_aliendlc43_mp" || var_0 == "iw6_aliendlc42_mp" ) )
{
var_1 = self.shield_down_time_extension_cnt;
if ( var_1 < level.shield_down_extension_dur.size )
{
var_2 = level.shield_down_extension_dur[var_1] * 1000;
extend_shield_down_time( var_2 );
}
}
}
handleshieldstateforattack( var_0 )
{
var_1 = undefined;
var_2 = undefined;
switch ( var_0 )
{
case "grab":
var_2 = "ancestor_disable_shield_grab";
var_1 = 1800.0;
break;
case "blast":
var_2 = "ancestor_disable_shield_blast";
var_1 = 1800.0;
break;
}
if ( isshieldup() )
self notify( var_2 );
else if ( isshielddown() )
{
var_3 = gettime() + var_1;
ensure_shield_stays_down_until_time( var_3 );
}
}
ondamaged( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( !maps\mp\alien\_damage::is_alien_agent_damage_allowed( var_0, var_1, var_5, var_4 ) )
return 0;
if ( var_2 <= 0 )
return 0;
if ( isshieldup() )
{
var_10 = "hitalienarmor";
var_2 = 0;
}
else if ( isdefined( var_8 ) && ( var_8 == "head" || var_8 == "neck" ) )
{
var_2 = var_2 * 1.2;
var_10 = "hitaliensoft";
}
else
var_10 = "standard";
handleshielddamage( var_5 );
if ( var_5 == "iw6_alienminigun_mp" || var_5 == "iw6_alienminigun1_mp" || var_5 == "iw6_alienminigun2_mp" || var_5 == "iw6_alienminigun3_mp" )
var_2 = 27.5;
else if ( var_5 == "iw6_alienminigun4_mp" )
var_2 = 37.5;
if ( var_5 == "iw6_alienmk32_mp" || var_5 == "iw6_alienmk321_mp" || var_5 == "iw6_alienmk322_mp" || var_5 == "iw6_alienmk323_mp" || var_5 == "iw6_alienmk324_mp" )
var_2 = var_2 * 0.5;
if ( var_5 == "alien_manned_minigun_turret_mp" || var_5 == "alien_manned_minigun_turret1_mp" || var_5 == "alien_manned_minigun_turret2_mp" || var_5 == "alien_manned_minigun_turret3_mp" || var_5 == "alien_manned_minigun_turret4_mp" )
var_2 = var_2 * 0.5;
if ( var_5 == "alien_manned_gl_turret_mp" || var_5 == "alien_manned_gl_turret1_mp" || var_5 == "alien_manned_gl_turret2_mp" || var_5 == "alien_manned_gl_turret3_mp" || var_5 == "alien_manned_gl_turret4_mp" )
var_2 = var_2 * 0.5;
if ( var_5 == "iw6_arkalienvks_mp_alienvksscope" )
var_2 = var_2 * 1.15;
if ( var_5 == "iw6_alienrgm_mp" )
var_2 = var_2 * 1.15;
if ( isdefined( level.custom_scale_alien_damage_func ) )
var_2 = [[ level.custom_scale_alien_damage_func ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
if ( var_5 == "alienthrowingknife_mp" )
{
if ( isdefined( level.achievement_you_wish_cb ) && isplayer( var_1 ) )
var_1 [[ level.achievement_you_wish_cb ]]();
var_2 = 0;
var_0 delete();
}
else
var_2 = maps\mp\alien\_damage::set_alien_damage_by_weapon_type( var_4, var_5, var_2 );
if ( isplayer( var_1 ) && !maps\mp\alien\_utility::is_trap( var_0 ) )
{
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_perks( var_1, var_2, var_4, var_5 );
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_weapon_type( var_1, var_2, var_4, var_5, var_8 );
}
var_2 = maps\mp\alien\_damage::scale_alien_damage_by_prestige( var_1, var_2 );
var_2 = int( var_2 );
if ( isdefined( var_1 ) )
{
if ( isdefined( var_1.owner ) && isplayer( var_1.owner ) )
var_1.owner thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
else
var_1 thread maps\mp\gametypes\_damagefeedback::updatedamagefeedback( var_10 );
}
if ( var_2 <= 0 )
return 0;
if ( getrealhealth() - var_2 <= 0 )
{
if ( isdefined( self.entityheadicons ) )
{
foreach ( var_12 in self.entityheadicons )
{
if ( !isdefined( var_12 ) )
continue;
var_12 destroy();
}
}
}
level thread maps\mp\alien\_challenge_function::update_alien_damage_challenge( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, self );
return self [[ maps\mp\agents\_agent_utility::agentfunc( "on_damaged_finished" ) ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
}
ondamagedfinished( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
var_3 = var_3 | level.idflags_no_knockback;
self finishagentdamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9, 0.0, 0 );
if ( !isdefined( self.ancestor_destroyed ) )
self.ancestor_attacker = var_1;
var_10 = getrealhealth();
if ( var_10 <= 0 )
return;
var_11 = maps\mp\alien\_utility::is_trap( var_0 );
maps\mp\agents\alien\_alien_think::registerdamage( var_2 );
if ( isdefined( var_1 ) )
{
if ( isplayer( var_1 ) || isdefined( var_1.owner ) && isplayer( var_1.owner ) )
{
if ( !var_11 )
var_1 maps\mp\alien\_damage::check_for_special_damage( self, var_5, var_4 );
}
}
if ( self.currentanimstate == "move" )
{
var_12 = maps\mp\agents\alien\_alien_think::belowcumulativepainthreshold( var_1, var_5 );
if ( !var_12 )
{
maps\mp\agents\alien\_alien_think::cleardamagehistory();
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 );
}
}
var_13 = int( getrealmaxhealth() * 0.1 );
var_14 = int( var_10 / var_13 ) + 1;
if ( !isdefined( self.current_headicon ) )
self.current_headicon = var_14;
if ( var_14 == self.current_headicon )
return;
var_15 = maps\mp\_entityheadicons::setheadicon( "allies", "waypoint_ancestor_health_" + var_14, ( 0, 0, 182 ), 10, 10, undefined, undefined, 0, 1, 0, 0 );
self.current_headicon = var_14;
}
getrealmaxhealth()
{
return self.maxhealth - 20000;
}
getrealhealth()
{
return self.health - 20000;
}
onkilled( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 )
{
var_9 = common_scripts\utility::flag_exist( "cortex_started" ) && common_scripts\utility::flag( "cortex_started" );
if ( isdefined( self.shield ) )
{
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
self.shield stoploopsound( "anc_shield_lp" );
self.shield delete();
}
if ( maps\mp\alien\_utility::is_true( self.killed_by_script ) )
return;
maps\mp\alien\_challenge_function::update_alien_death_challenges( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8 );
level maps\mp\alien\_achievement_dlc4::update_timing_is_everything();
if ( isdefined( self.ancestor_attacker ) && isplayer( self.ancestor_attacker ) )
{
level.alienbbdata["aliens_killed"]++;
maps\mp\alien\_death::record_player_kills( self.ancestor_attacker );
}
var_10 = maps\mp\alien\_gamescore::get_reward_point_for_kill();
foreach ( var_12 in level.players )
{
maps\mp\alien\_gamescore::givekillreward( var_12, 3500, "large" );
if ( !var_9 )
maps\mp\alien\_gamescore::calculate_player_encounter_scores( var_12, [ "ancestor_bonus" ] );
if ( !isdefined( var_12.ancestor_kills ) )
var_12.ancestor_kills = 0;
var_12.ancestor_kills++;
if ( !maps\mp\alien\_utility::is_casual_mode() )
{
if ( isdefined( var_12.ancestor_kills ) && var_12.ancestor_kills == 3 )
var_12 maps\mp\alien\_persistence::give_player_tokens( 1, 0 );
if ( isdefined( var_12.ancestor_kills ) && var_12.ancestor_kills == 5 )
var_12 maps\mp\alien\_persistence::give_player_tokens( 1, 0 );
}
}
if ( !maps\mp\alien\_utility::is_hardcore_mode() )
maps\mp\mp_alien_last_progression::give_players_skill_points( 1 );
if ( var_9 )
{
if ( isdefined( level.add_cortex_charge_func ) )
[[ level.add_cortex_charge_func ]]( 10, 1 );
}
return;
}
playdeath()
{
self notify( "ancestor_destroyed" );
if ( isdefined( self.shield ) )
{
stopfxontag( level._effect["ancestor_shield"], self.shield, "tag_origin" );
self.shield stoploopsound( "anc_shield_lp" );
self.shield delete();
}
level.active_ancestors = common_scripts\utility::array_remove( level.active_ancestors, self );
level notify( "dlc_vo_notify", "last_vo", "ancestor_killed" );
if ( isdefined( level.dead_ancestors ) )
level.dead_ancestors++;
level notify( "ancestor_died" );
var_0 = 24;
var_1 = 30;
if ( !maps\mp\alien\_utility::is_normal_upright( anglestoup( self.angles ) ) )
maps\mp\alien\_death::move_away_from_surface( anglestoup( self.angles ), var_0 );
if ( isdefined( self.apextraversaldeathvector ) )
maps\mp\alien\_death::move_away_from_surface( self.apextraversaldeathvector, var_1 );
self.ancestor_destroyed = 1;
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "death", undefined, "death_anim", "end", ::handledeathnotetracks );
self suicide();
}
ancestor_death_nuke_fx()
{
playfx( level._effect["ancestor_death_nuke"], self.origin + ( 0, 0, 60 ) );
wait 0.5;
foreach ( var_1 in level.players )
{
if ( isdefined( level.shell_shock_override ) )
var_1 [[ level.shell_shock_override ]]( 0.5 );
else
var_1 shellshock( "alien_spitter_gas_cloud", 0.5 );
var_1 playrumbleonentity( "grenade_rumble" );
}
}
handledeathnotetracks( var_0, var_1, var_2, var_3 )
{
switch ( var_0 )
{
case "death_end":
thread ancestor_death_nuke_fx();
break;
}
}
drop_ims_when_grabbed( var_0 )
{
}
onenterstate( var_0, var_1 )
{
onexitanimstate( var_0, var_1 );
self.currentanimstate = var_1;
switch ( var_1 )
{
case "idle":
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_idle::main();
break;
case "melee":
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_melee::main();
break;
case "move":
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::main();
break;
}
}
onexitanimstate( var_0, var_1 )
{
self notify( "killanimscript" );
switch ( var_0 )
{
case "melee":
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_melee::endscript();
break;
}
}

View File

@ -0,0 +1,39 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
for (;;)
play_idle();
}
play_idle()
{
face_target();
var_0 = get_idle_anim_state();
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", self.angles );
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, undefined, "idle", "end" );
}
get_idle_anim_state()
{
if ( maps\mp\agents\alien\alien_ancestor\_alien_ancestor::isshieldup() )
return "idle";
return "idle_vulnerable";
}
face_target()
{
var_0 = undefined;
var_1 = 1600;
if ( isalive( self.enemy ) && distancesquared( self.enemy.origin, self.origin ) < var_1 * var_1 )
var_0 = self.enemy;
if ( isdefined( var_0 ) )
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
}

View File

@ -0,0 +1,937 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
self endon( "death" );
var_0 = gettime();
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", self.angles );
if ( self.melee_type != "death" && self.is_moving )
{
self.is_moving = 0;
var_1 = self.origin + anglestoforward( self.angles ) * 500;
maps\mp\agents\alien\alien_ancestor\_alien_ancestor_move::playstopanimation( var_1, 0 );
}
switch ( self.melee_type )
{
case "blast":
blast_attack();
break;
case "forced_blast":
forced_blast_attack();
break;
case "forced_grab":
forced_grab_attack();
break;
case "grab":
grab_attack();
break;
case "spawn":
spawn_aliens();
break;
case "death":
death();
break;
default:
break;
}
if ( var_0 == gettime() )
wait 0.05;
self notify( "melee_complete" );
}
endscript()
{
if ( self.grab_target_disabled )
handle_post_grab_targets();
}
forced_blast_attack()
{
if ( !isdefined( self.forced_blast_position ) )
return;
var_0 = self.forced_blast_position - self.origin;
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_0 );
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "blast" );
self.looktarget = undefined;
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
self scragentsetorientmode( "face angle abs", self.angles );
self scragentsetanimmode( "anim deltas" );
play_blast_anim();
self.forced_blast_position = undefined;
}
blast_attack()
{
var_0 = self.blast_target;
var_0 endon( "death" );
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_0 );
if ( isalive( var_0 ) )
{
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "blast" );
self.looktarget = var_0;
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1.0 );
self scragentsetorientmode( "face enemy" );
self scragentsetanimmode( "anim deltas" );
play_blast_anim();
}
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
self.looktarget = undefined;
self.blast_target = undefined;
self.blast_target_location = undefined;
}
play_blast_anim()
{
self.blast_anim_index = randomint( self getanimentrycount( "attack_blast" ) );
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_blast", self.blast_anim_index, "attack_melee", "end", ::handleattacknotetracks );
self.last_blast_time = gettime();
}
fire_blast_projectile()
{
if ( !isdefined( self.blast_target ) )
return;
if ( !isdefined( self.blast_target.usingremote ) )
var_0 = self.blast_target geteye();
else
var_0 = self.blast_target.origin + ( 0, 0, 32 );
var_1 = get_blast_fire_pos( var_0 );
var_2 = magicbullet( "alien_ancestor_mp", var_1, var_0, self );
var_2.owner = self;
if ( !isdefined( self.blast_target.usingremote ) )
var_3 = self.blast_target geteye() - self.blast_target.origin;
else
var_3 = ( 0, 0, 32 );
var_2 missile_settargetent( self.blast_target, var_3 );
var_2 missile_setflightmodedirect();
if ( isdefined( var_2 ) )
{
var_2 thread blast_tracking_monitor( self );
var_2 thread blast_projectile_proximity_monitor( self );
var_2 thread blast_projectile_impact_monitor( self );
}
}
fire_forced_blast_projectile()
{
if ( !isdefined( self.forced_blast_position ) )
return;
var_0 = get_blast_fire_pos( self.forced_blast_position );
var_1 = magicbullet( "alien_ancestor_mp", var_0, self.forced_blast_position, self );
var_1.owner = self;
if ( isdefined( var_1 ) )
var_1 thread blast_projectile_impact_monitor( self );
}
blast_tracking_monitor( var_0 )
{
self endon( "explode" );
var_1 = var_0.blast_target;
var_1 endon( "death" );
var_2 = 16384;
var_3 = gettime();
for (;;)
{
if ( !isdefined( self ) )
return;
if ( isdefined( var_1 ) && distancesquared( self.origin, var_1.origin ) < var_2 )
break;
if ( gettime() - var_3 > 2000 )
{
var_4 = anglestoforward( self.angles );
foreach ( var_6 in level.players )
{
if ( var_6 == var_1 || !isalive( var_6 ) )
continue;
if ( distancesquared( self.origin, var_6.origin ) > 160000 )
continue;
var_7 = vectornormalize( var_6.origin - self.origin );
if ( vectordot( var_4, var_7 ) > 0.5 )
{
var_1 = var_6;
if ( !isdefined( var_1.usingremote ) )
var_8 = var_1 geteye() - var_1.origin;
else
var_8 = ( 0, 0, 32 );
self missile_settargetent( var_1, var_8 );
var_3 = gettime();
}
}
}
if ( !isdefined( var_1 ) )
break;
wait 0.05;
}
self missile_cleartarget();
}
blast_projectile_impact_monitor( var_0 )
{
self waittill( "explode", var_1 );
if ( !isdefined( var_1 ) )
return;
playfx( level._effect["blackhole_exp"], var_1 );
playsoundatpos( var_1, "anc_orb_imp" );
}
blast_projectile_proximity_monitor( var_0 )
{
self endon( "death" );
var_1 = 10000;
var_2 = 90;
var_3 = 40;
var_4 = 256;
var_5 = undefined;
for (;;)
{
foreach ( var_7 in level.players )
{
if ( !isdefined( self ) )
return;
var_8 = distancesquared( self.origin, var_7.origin );
if ( var_8 < var_1 )
{
if ( !isdefined( var_5 ) )
var_5 = var_8;
if ( var_5 < var_8 )
{
self notify( "explode", self.origin );
common_scripts\utility::waitframe();
var_9 = var_2;
var_10 = var_3;
radiusdamage( self.origin, var_4, var_9, var_10, var_0, "MOD_EXPLOSIVE", "alien_ancestor_mp" );
common_scripts\utility::waitframe();
self delete();
return;
}
else
var_5 = var_8;
}
}
wait 0.05;
}
}
get_blast_fire_pos( var_0 )
{
if ( self.blast_anim_index == 0 )
var_1 = "TAG_WEAPON_RIGHT";
else
var_1 = "TAG_WEAPON_LEFT";
return self gettagorigin( var_1 );
}
forced_grab_attack()
{
level endon( "game_ended" );
if ( !isdefined( self.forced_grab_position ) )
return;
var_0 = self.forced_grab_position - self.origin;
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_0 );
var_1 = "attack_grab";
var_2 = "attack_melee";
var_3 = "end";
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 0, var_2, var_3 );
play_variable_grab_anim( var_1, 1, 0.2 );
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 2, var_2, var_3 );
self notify( "forced_grab_damage_start" );
play_variable_grab_anim( var_1, 3, 3 );
self notify( "forced_grab_damage_end" );
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_1, 4, var_2, var_3 );
self.forced_grab_position = undefined;
}
play_variable_grab_anim( var_0, var_1, var_2 )
{
var_3 = self getanimentry( "attack_grab", var_1 );
var_4 = getanimlength( var_3 );
self setanimstate( var_0, var_1 );
var_5 = min( var_4, var_2 );
wait( var_5 );
}
grab_attack()
{
level endon( "game_ended" );
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( self.grab_target );
thread monitor_grab_status();
self scragentsetorientmode( "face enemy" );
self scragentsetanimmode( "anim deltas" );
self.grab_status = 0;
activate_grab_zones();
play_initial_grab_anims();
if ( is_grab_active() )
self.grab_status = 2;
while ( is_grab_active() )
wait 0.05;
if ( self.grab_status == 3 )
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 4, "attack_melee", "end", ::handleattacknotetracks );
else if ( self.grab_status == 4 )
{
handle_post_grab_targets();
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 5, "attack_melee", "end" );
}
self.last_grab_time = gettime();
}
play_initial_grab_anims()
{
self endon( "grab_finished" );
var_0 = "attack_grab";
var_1 = "attack_melee";
var_2 = "end";
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, 0, var_1, var_2 );
self scragentsetorientmode( "face angle abs", self.angles );
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::handleshieldstateforattack( "grab" );
play_variable_grab_anim( var_0, 1, 0.9 );
self.current_grab_victims = get_player_victims();
if ( self.current_grab_victims.size > 0 )
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_0, 2, var_1, var_2, ::handleattacknotetracks );
else
{
self.grab_status = 6;
self notify( "grab_finished" );
}
}
get_player_victims()
{
var_0 = [];
foreach ( var_2 in level.players )
{
if ( var_2 isusingturret() || maps\mp\alien\_utility::is_true( var_2.is_using_remote_turret ) )
continue;
if ( maps\mp\alien\_utility::is_true( var_2.is_grabbed ) )
continue;
foreach ( var_4 in self.grab_damage_zone_locations )
{
if ( distancesquared( var_4, var_2.origin ) < 15625 )
var_0[var_0.size] = var_2;
}
}
return var_0;
}
activate_grab_zones()
{
var_0 = get_possible_grab_victims( self.grab_target );
self.grab_damage_zone_locations = [];
foreach ( var_2 in var_0 )
{
thread play_choke_ring_fx( var_2 );
self.grab_damage_zone_locations[self.grab_damage_zone_locations.size] = var_2.origin;
}
}
is_grab_active()
{
return self.grab_status == 0 || self.grab_status == 1 || self.grab_status == 2;
}
start_grab()
{
if ( self.current_grab_victims.size > 0 )
{
self.grab_status = 1;
do_grab_attack( self.current_grab_victims );
}
}
get_possible_grab_victims( var_0 )
{
var_1 = 0.5;
var_2 = 589824;
var_3 = anglestoforward( self.angles );
var_4 = [];
var_5 = gettime();
foreach ( var_7 in level.players )
{
if ( var_7.inlaststand )
continue;
if ( var_7.ignoreme )
continue;
if ( var_7 isusingturret() || maps\mp\alien\_utility::is_true( var_7.is_using_remote_turret ) )
continue;
if ( maps\mp\alien\_utility::is_true( var_7.is_grabbed ) )
continue;
if ( isdefined( var_7.next_valid_grab_time ) && var_7.next_valid_grab_time > var_5 )
continue;
var_8 = vectornormalize( var_7.origin - self.origin );
if ( vectordot( var_3, var_8 ) > var_1 )
{
if ( distancesquared( var_7.origin, self.origin ) < var_2 )
{
if ( bullettracepassed( self gettagorigin( "TAG_EYE" ), var_7 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
var_4[var_4.size] = var_7;
}
}
}
return var_4;
}
play_choke_ring_fx( var_0 )
{
self endon( "disconnect" );
self endon( "death" );
self endon( "ancestor_destroyed" );
self endon( "grab_finished" );
wait 0.9;
playsoundatpos( var_0.origin, "anc_choke_ring" );
var_1 = spawnfx( level._effect["ancestor_choke_ring"], var_0.origin );
for (;;)
{
triggerfx( var_1 );
wait 0.5;
}
}
monitor_grab_status()
{
self endon( "grab_finished" );
var_0 = 600;
if ( level.players.size == 4 )
var_0 = 900;
else if ( level.players.size == 3 )
var_0 = 800;
else if ( level.players.size == 2 )
var_0 = 700;
else if ( level.players.size == 1 )
var_0 = 600;
var_1 = self.health - var_0;
for (;;)
{
var_2 = common_scripts\utility::waittill_any_return( "damage", "death", "ancestor_destroyed" );
if ( var_2 == "death" || var_2 == "ancestor_destroyed" )
{
self.grab_status = 5;
break;
}
else if ( self.health < var_1 )
{
self.grab_status = 4;
break;
}
}
self notify( "grab_finished" );
}
grab_timeout_monitor()
{
self endon( "grab_finished" );
wait 4;
self.grab_status = 3;
self notify( "grab_finished" );
}
do_grab_attack( var_0 )
{
self endon( "grab_finished" );
level endon( "game_ended" );
level endon( "host_migration_begin" );
level endon( "host_migration_end" );
self.grab_lift_entities = [];
thread grab_timeout_monitor();
foreach ( var_2 in var_0 )
{
setup_grab_target( var_2 );
childthread process_grab_target( var_2 );
}
while ( self.grab_status == 0 || self.grab_status == 1 )
wait 0.05;
for (;;)
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_grab", 3, "attack_melee", "end" );
}
setup_grab_target( var_0 )
{
var_0 notify( "force_cancel_placement" );
var_0 notify( "dpad_cancel" );
self.grab_target_disabled = 1;
var_0 disableusability();
var_0 freezecontrols( 1 );
var_0 disableweapons();
var_0.turn_off_class_skill_activation = 1;
var_0.player_action_disabled = 1;
var_0.next_valid_grab_time = gettime() + 100000;
var_0.is_grabbed = 1;
var_0 notify( "grabbed" );
var_0 playlocalsound( "anc_choke" );
level notify( "dlc_vo_notify", "ancestor_close" );
var_1 = spawn( "script_model", var_0.origin );
var_1 setmodel( "tag_origin" );
self.grab_lift_entities[self.grab_lift_entities.size] = var_1;
thread lift_grab_player( var_1, var_0 );
thread grab_detect_migration( self );
}
lift_grab_player( var_0, var_1 )
{
self endon( "death" );
self endon( "ancestor_destroyed" );
self endon( "killanimscript" );
var_2 = 100;
var_3 = 1.0;
var_4 = var_0.origin;
var_5 = var_0.origin + ( 0, 0, var_2 );
var_6 = 0.2;
var_7 = playerphysicstrace( var_4, var_5 );
playfxontagforclients( level._effect["ancestor_choke_pv"], var_1, "tag_origin", var_1 );
playfxontag( level._effect["ancestor_choke_3pv"], var_1, "tag_origin" );
var_1 thread grab_detect_stuck();
var_1 thread grab_detect_migration( self );
var_8 = ( self geteye() - var_7 ) * ( 1, 1, 0 );
var_0.angles = vectortoangles( var_8 );
var_0.origin = var_7;
var_1 playerlinktoblend( var_0 );
var_1 _meth_842D();
var_9 = 72;
var_10 = 32;
if ( capsuletracepassed( var_0.origin, var_10, var_9 ) )
var_0 scriptmodelplayanimdeltamotion( "alien_ancestor_player_attack_grab" );
}
process_grab_target( var_0 )
{
level endon( "host_migration_begin" );
level endon( "host_migration_end" );
var_1 = 18.75;
for (;;)
{
wait 1.0;
if ( !isdefined( var_0 ) || !isdefined( self ) || !isalive( self ) )
return;
var_0 dodamage( var_1, self.origin, self, self );
}
}
handle_post_grab_targets()
{
level endon( "game_ended" );
if ( level.gameended )
return;
var_0 = -400;
foreach ( var_2 in self.current_grab_victims )
{
if ( !isalive( var_2 ) )
continue;
var_2.turn_off_class_skill_activation = undefined;
var_2.player_action_disabled = undefined;
if ( !maps\mp\alien\_utility::is_true( var_2.iscarrying ) )
var_2 enableweapons();
var_2 freezecontrols( 0 );
if ( !isdefined( var_2.inlaststand ) || !var_2.inlaststand )
var_2 enableusability();
var_2 unlink();
var_2.is_grabbed = 0;
var_2 notify( "grab_finished" );
var_2.next_valid_grab_time = gettime() + 5000;
if ( isdefined( var_2.imslist ) )
{
foreach ( var_4 in var_2.imslist )
{
if ( isdefined( var_4.carriedby ) && var_4.carriedby == var_2 )
var_4 delete();
}
}
if ( self.grab_status == 3 )
{
var_6 = anglestoforward( var_2.angles ) * var_0;
var_2 setvelocity( var_6 );
}
}
foreach ( var_9 in self.grab_lift_entities )
{
if ( isdefined( var_9 ) )
var_9 delete();
}
self.grab_target_disabled = 0;
self.grab_lift_entities = [];
self.current_grab_victims = [];
}
grab_detect_stuck()
{
level endon( "game_ended" );
self endon( "disconnect" );
self endon( "death" );
var_0 = self.origin;
var_1 = 0;
var_2 = common_scripts\utility::waittill_any_return( "unresolved_collision", "grab_finished" );
if ( var_2 == "unresolved_collision" )
var_1 = 1;
else if ( var_2 == "grab_finished" )
{
var_3 = self.origin;
wait 0.5;
if ( self.origin == var_3 )
var_1 = 1;
}
wait 0.1;
if ( var_1 )
self setorigin( var_0 );
}
grab_detect_migration( var_0 )
{
self endon( "grab_finished" );
level waittill( "host_migration_end" );
wait 1.0;
var_0 handle_post_grab_targets();
}
spawn_aliens()
{
self.num_spawns = get_default_ancestor_spawns();
if ( !ancestor_spawn_find_spawn_loc() )
self.spawn_locations[self.spawn_locations.size] = self.origin;
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "spawn_alien", 0, "spawn_alien", "end", ::handleattacknotetracks );
foreach ( var_1 in self.minions )
{
if ( isalive( var_1 ) )
var_1 thread set_minion_stationary( self.enemy );
}
thread watch_for_death_during_spawn();
var_3 = undefined;
if ( isdefined( self.enemy ) )
var_3 = get_direct_minions_anim_index();
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "direct_minions", var_3, "direct_minions", "end", ::handleattacknotetracks );
self.last_spawn_time = gettime();
}
get_direct_minions_anim_index()
{
var_0 = 0.906;
var_1 = 0.5;
var_2 = anglestoforward( self.angles );
var_3 = anglestoright( self.angles );
var_4 = vectornormalize( self.enemy.origin - self.origin );
var_5 = vectordot( var_2, var_4 );
if ( var_5 < var_1 )
{
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( self.enemy );
return 1;
}
if ( var_5 > var_0 )
return 1;
if ( vectordot( var_3, var_4 ) > 0.0 )
return 2;
return 0;
}
watch_for_death_during_spawn()
{
self endon( "minion_released" );
common_scripts\utility::waittill_any( "death", "ancestor_destroyed" );
release_minions();
}
release_minions()
{
foreach ( var_1 in self.minions )
var_1 notify( "minion_released" );
self notify( "minion_released" );
}
set_minion_stationary( var_0 )
{
self endon( "death" );
while ( self.trajectoryactive || isdefined( self.alien_scripted ) && self.alien_scripted )
wait 0.05;
self scragentsetscripted( 1 );
maps\mp\alien\_utility::enable_alien_scripted();
thread maps\mp\agents\alien\_alien_idle::main();
var_1 = 10;
thread minion_player_proximity_monitor();
var_2 = common_scripts\utility::waittill_any_timeout( var_1, "damage", "minion_released", "player_proximity" );
self notify( "minion_activated" );
set_minion_enemy( var_0 );
}
minion_player_proximity_monitor()
{
self endon( "minion_activated" );
self endon( "death" );
var_0 = 90000;
for (;;)
{
wait 0.2;
foreach ( var_2 in level.players )
{
if ( !isalive( var_2 ) )
continue;
if ( var_2.inlaststand )
continue;
if ( distancesquared( var_2.origin, self.origin ) < var_0 )
{
self notify( "player_proximity" );
return;
}
}
}
}
set_minion_enemy( var_0 )
{
self endon( "death" );
var_1 = 10;
self.favoriteenemy = var_0;
self scragentsetscripted( 0 );
maps\mp\alien\_utility::disable_alien_scripted();
if ( isalive( var_0 ) )
var_0 common_scripts\utility::waittill_any_timeout( var_1, "death" );
else
wait( var_1 );
self.favoriteenemy = undefined;
}
get_default_ancestor_spawns()
{
switch ( level.players.size )
{
case 1:
return 2;
case 2:
return 2;
case 3:
return 3;
case 4:
return 3;
}
}
ancestor_spawn_find_spawn_loc()
{
var_0 = anglestoforward( self.angles );
var_1 = anglestoright( self.angles );
self.spawn_locations = [];
var_2 = self.origin + var_0 * 56.0;
var_2 = maps\mp\agents\_scriptedagents::droppostoground( var_2 );
if ( isdefined( var_2 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_2, 12.0 ) )
self.spawn_locations[self.spawn_locations.size] = var_2;
var_3 = self.origin + var_1 * 56.0;
var_3 = maps\mp\agents\_scriptedagents::droppostoground( var_3 );
if ( isdefined( var_3 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_3, 12.0 ) )
self.spawn_locations[self.spawn_locations.size] = var_3;
var_4 = self.origin + var_1 * -56.0;
var_4 = maps\mp\agents\_scriptedagents::droppostoground( var_4 );
if ( isdefined( var_4 ) && maps\mp\agents\_scriptedagents::canmovepointtopoint( self.origin, var_4, 12.0 ) )
self.spawn_locations[self.spawn_locations.size] = var_4;
if ( self.spawn_locations.size > 0 )
return 1;
return 0;
}
release_reserved_space_on_death()
{
self notify( "reserved_space_death_monitor" );
self endon( "reserved_space_death_monitor" );
common_scripts\utility::waittill_any( "death", "ancestor_destroyed" );
empty_reserved_space();
}
empty_reserved_space()
{
if ( isdefined( self.reserved_space ) && self.reserved_space > 0 )
{
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
self.reserved_space = 0;
}
}
do_ancestor_spawns()
{
self endon( "death" );
self endon( "ancestor_destroyed" );
thread release_reserved_space_on_death();
self.minions = [];
var_0 = spawn_of_type( self.num_spawns, "brute" );
var_1 = self.num_spawns - var_0;
if ( var_1 > 0 )
spawn_of_type( var_1, "goon" );
}
spawn_of_type( var_0, var_1 )
{
var_2 = int( maps\mp\alien\_spawn_director::reserve_custom_spawn_space( var_0, 1, var_1 ) );
for ( self.reserved_space = var_2; self.reserved_space > 0; self.minions = common_scripts\utility::array_combine( self.minions, do_spawn( var_3, self.spawn_locations, var_1 ) ) )
var_3 = min( self.reserved_space, self.spawn_locations.size );
return var_2;
}
do_spawn( var_0, var_1, var_2 )
{
var_3 = spawnstruct();
var_3.angles = self.angles;
var_4 = level.cycle_data.spawn_node_info["chen_test"].vignetteinfo[var_2];
var_5 = ( 0, 0, -100 );
var_6 = [];
for ( var_7 = 0; var_7 < var_0; var_7++ )
{
var_8 = var_7 % var_1.size;
var_3.origin = var_1[var_8] + var_5;
var_9 = maps\mp\alien\_spawn_director::process_custom_spawn( var_2, var_3, var_4 );
if ( isdefined( var_9 ) )
var_6[var_6.size] = var_9;
self.reserved_space--;
wait( randomfloatrange( 0.01, 0.14 ) );
}
return var_6;
}
handleattacknotetracks( var_0, var_1, var_2, var_3 )
{
if ( isdefined( level.dlc_attacknotetrack_override_func ) )
{
self [[ level.dlc_attacknotetrack_override_func ]]( var_0, var_1, var_2, var_3 );
return;
}
switch ( var_0 )
{
case "ball_projectile_start":
if ( isdefined( self.forced_blast_position ) )
fire_forced_blast_projectile();
else
fire_blast_projectile();
break;
case "throw_player":
handle_post_grab_targets();
break;
case "summon":
do_ancestor_spawns();
break;
case "grab_player":
thread start_grab();
break;
case "attack_direct":
release_minions();
break;
default:
break;
}
}
death()
{
maps\mp\agents\alien\alien_ancestor\_alien_ancestor::playdeath();
}

View File

@ -0,0 +1,547 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "killanimscript" );
entermove();
startmove();
continuemovement();
}
entermove()
{
self.blockgoalpos = 0;
self.playing_pain_animation = 0;
self.is_moving = 1;
self scragentsetphysicsmode( "gravity" );
self scragentsetanimmode( "code_move" );
}
startmove()
{
if ( candostartmove() )
{
switch ( getstartmovetype() )
{
case "run-start":
dorunstart();
break;
case "walk-start":
dowalkstart();
break;
default:
break;
}
}
}
end_script()
{
self.blockgoalpos = 0;
self.playing_pain_animation = 0;
cancelallbut( undefined );
self scragentsetanimscale( 1, 1 );
self.previousanimstate = "move";
}
setupmovement()
{
self.enablestop = 1;
thread waitformovemodechange();
thread waitforsharpturn();
thread waitforstop();
thread waitforstuck();
}
continuemovement()
{
self scragentsetorientmode( "face motion" );
self scragentsetanimmode( "code_move" );
self scragentsetanimscale( self.xyanimscale, 1.0 );
setupmovement();
setmoveanim( self.movemode );
}
waitformovemodechange()
{
self endon( "killanimscript" );
self endon( "alienmove_endwait_runwalk" );
var_0 = self.movemode;
for (;;)
{
if ( var_0 != self.movemode )
{
setmoveanim( self.movemode );
var_0 = self.movemode;
}
wait 0.1;
}
}
waitforsharpturn()
{
self endon( "killanimscript" );
self endon( "alienmove_endwait_sharpturn" );
self waittill( "path_dir_change", var_0 );
var_1 = maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_0 );
if ( var_1 == 4 )
{
thread waitforsharpturn();
return;
}
var_2 = 0;
if ( var_2 )
var_1 = 0;
var_3 = "run_turn";
var_4 = self getanimentry( var_3, var_1 );
var_5 = var_2 || candoturnanim( var_4 );
if ( !var_5 )
{
thread waitforsharpturn();
return;
}
cancelallbut( "sharpturn" );
self.blockgoalpos = 1;
self.enablestop = 0;
if ( var_2 )
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", self.angles );
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_3, var_1, self.moveplaybackrate, var_3, "code_move" );
self scragentsetorientmode( "face motion" );
self.blockgoalpos = 0;
thread continuemovement();
}
waitforstop()
{
self endon( "killanimscript" );
self endon( "alienmove_endwait_stop" );
self waittill( "stop_soon" );
if ( !shoulddostopanim() )
thread waitforstop();
else
{
var_0 = self getpathgoalpos();
playstopanimation( var_0, 1 );
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
var_0 = self getpathgoalpos();
if ( distancesquared( self.origin, var_0 ) < 400.0 )
{
self.is_moving = 0;
self scragentsetanimmode( "code_move_slide" );
return;
return;
}
startmove();
continuemovement();
}
}
shouldrestartstop()
{
return self.currentanimstate == "move";
}
playstopanimation( var_0, var_1 )
{
var_2 = shouldrestartstop();
if ( !isdefined( var_0 ) )
{
if ( shouldrestartstop() )
thread waitforstop();
return;
}
var_3 = var_0 - self.origin;
var_4 = getstopendfacedir( var_0 );
var_5 = getstopanimstate();
var_6 = getstopanimindex( var_5, var_4 );
var_7 = self getanimentry( var_5, var_6 );
var_8 = getmovedelta( var_7 );
var_9 = getangledelta( var_7 );
if ( length( var_3 ) + 48 < length( var_8 ) )
{
if ( var_2 )
thread waitforstop();
return;
}
var_10 = getstopdata( var_0 );
var_11 = calcanimstartpos( var_10.pos, var_10.angles[1], var_8, var_9 );
var_12 = maps\mp\agents\_scriptedagents::droppostoground( var_11 );
if ( !isdefined( var_12 ) )
{
if ( var_2 )
thread waitforstop();
return;
}
if ( !maps\mp\agents\_scriptedagents::canmovepointtopoint( var_10.pos, var_12 ) )
{
if ( var_2 )
thread waitforstop();
return;
}
if ( var_2 )
{
cancelallbut( "stop", "sharpturn" );
thread waitforpathset( "alienmove_endwait_pathsetwhilestopping", "alienmove_endwait_stop" );
}
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", vectortoangles( var_3 ) );
if ( var_1 )
{
var_13 = maps\mp\agents\_scriptedagents::getanimscalefactors( var_0 - self.origin, var_8 );
self scragentsetanimscale( var_13.xy, var_13.z );
}
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( var_5, var_6, var_5, "end" );
self scragentsetanimscale( 1.0, 1.0 );
}
getstopendfacedir( var_0 )
{
if ( isdefined( self.enemy ) )
return self.enemy.origin - var_0;
return var_0 - self.origin;
}
getstopanimstate()
{
switch ( self.movemode )
{
case "jog":
case "run":
return "run_stop";
case "walk":
return "walk_stop";
default:
}
}
getstopanimindex( var_0, var_1 )
{
switch ( var_0 )
{
case "walk_stop":
return 0;
case "run_stop":
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( var_1 );
}
}
waitforpathset( var_0, var_1 )
{
self endon( "killanimscript" );
self endon( var_0 );
var_2 = self scragentgetgoalpos();
self waittill( "path_set" );
var_3 = self scragentgetgoalpos();
if ( distancesquared( var_2, var_3 ) < 1 )
{
thread waitforpathset( var_0, var_1 );
return;
}
self notify( var_1 );
continuemovement();
}
setmoveanim( var_0 )
{
if ( var_0 == "run" )
{
var_1 = self getanimentrycount( "run" );
var_2 = [ 20, 80 ];
var_3 = maps\mp\alien\_utility::getrandomindex( var_2 );
self setanimstate( "run", var_3, self.moveplaybackrate );
}
else if ( var_0 == "walk" )
{
var_4 = undefined;
self setanimstate( "walk", var_4, self.moveplaybackrate );
}
else
{
}
}
cancelallbut( var_0, var_1 )
{
var_2 = [ "runwalk", "sharpturn", "stop", "pathsetwhilestopping", "jumpsoon", "pathsetwhilejumping", "pathset", "nearmiss", "dodgechance", "stuck" ];
var_3 = isdefined( var_0 );
var_4 = isdefined( var_1 );
foreach ( var_6 in var_2 )
{
if ( var_3 && var_6 == var_0 )
continue;
if ( var_4 && var_6 == var_1 )
continue;
self notify( "alienmove_endwait_" + var_6 );
}
}
getstopdata( var_0 )
{
var_1 = spawnstruct();
if ( isdefined( self.node ) )
{
var_1.pos = self.node.origin;
var_1.angles = self.node.angles;
}
else if ( isdefined( self.enemy ) )
{
var_1.pos = var_0;
var_1.angles = vectortoangles( self.enemy.origin - var_0 );
}
else
{
var_1.pos = var_0;
var_1.angles = self.angles;
}
return var_1;
}
calcanimstartpos( var_0, var_1, var_2, var_3 )
{
var_4 = var_1 - var_3;
var_5 = ( 0, var_4, 0 );
var_6 = anglestoforward( var_5 );
var_7 = anglestoright( var_5 );
var_8 = var_6 * var_2[0];
var_9 = var_7 * var_2[1];
return var_0 - var_8 + var_9;
}
onflashbanged()
{
dostumble();
}
ondamage( var_0, var_1, var_2, var_3, var_4, var_5, var_6, var_7, var_8, var_9 )
{
if ( maps\mp\alien\_utility::is_pain_available( var_1, var_4 ) )
dostumble( var_3, var_7, var_8, var_2, var_4, var_1 );
}
dostumble( var_0, var_1, var_2, var_3, var_4, var_5 )
{
self endon( "killanimscript" );
if ( self.playing_pain_animation )
return;
cancelallbut( undefined );
self.statelocked = 1;
self.playing_pain_animation = 1;
var_6 = "move_pain";
var_7 = randomint( self getanimentrycount( var_6 ) );
var_8 = self getanimentry( var_6, var_7 );
maps\mp\alien\_utility::always_play_pain_sound( var_8 );
maps\mp\alien\_utility::register_pain( var_8 );
self scragentsetorientmode( "face angle abs", self.angles );
self scragentsetanimmode( "anim deltas" );
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_6, var_7, self.moveplaybackrate, var_6, "code_move" );
self.playing_pain_animation = 0;
self.statelocked = 0;
if ( shouldstartmove() )
startmove();
continuemovement();
}
waitforstuck()
{
self endon( "killanimscript" );
self endon( "alienmove_endwait_stuck" );
var_0 = 2000.0;
var_1 = gettime() + var_0;
var_2 = self.origin;
var_3 = 1.0;
for (;;)
{
var_4 = gettime();
var_5 = length( self.origin - var_2 );
if ( var_5 > var_3 )
var_1 = var_4 + var_0;
if ( var_1 <= var_4 )
{
stucklerp();
var_1 = var_4 + var_0;
break;
}
var_2 = self.origin;
wait 0.1;
}
continuemovement();
}
stucklerp()
{
self endon( "killanimscript" );
self endon( "alienmove_endwait_stuck" );
self endon( "death" );
var_0 = 0.2;
cancelallbut( "stuck" );
var_1 = self getanimentry();
var_2 = getanimlength( var_1 );
var_3 = length( getmovedelta( var_1 ) );
var_4 = var_0 / var_2 * var_3;
var_5 = self getlookaheaddir();
var_6 = self.origin + var_5 * var_4;
self scragentsetphysicsmode( "noclip" );
self scragentsetorientmode( "face angle abs", vectortoangles( var_5 ) );
self scragentdoanimlerp( self.origin, var_6, var_0 );
wait( var_0 );
self setorigin( self.origin );
}
dowalkstart()
{
var_0 = "walk_start";
var_1 = maps\mp\agents\_scriptedagents::getrandomanimentry( var_0 );
var_2 = self getlookaheaddir();
if ( isdefined( self.pathnode ) )
var_2 = vectornormalize( self.pathnode.origin - self.origin );
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( var_2 );
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", self.angles );
self.blockgoalpos = 1;
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
self scragentsetorientmode( "face motion" );
self.blockgoalpos = 0;
}
dorunstart()
{
var_0 = self getnegotiationstartnode();
if ( isdefined( var_0 ) )
var_1 = var_0.origin;
else
var_1 = self getpathgoalpos();
if ( !isdefined( var_1 ) )
return;
if ( distancesquared( var_1, self.origin ) < 10000 )
return;
dostartmoveanim( "run_start" );
}
dostartmoveanim( var_0 )
{
var_1 = 0;
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( self getlookaheaddir() );
self scragentsetanimmode( "anim deltas" );
self scragentsetorientmode( "face angle abs", self.angles );
self.blockgoalpos = 1;
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( var_0, var_1, self.moveplaybackrate, var_0, "code_move" );
self scragentsetorientmode( "face motion" );
self.blockgoalpos = 0;
}
candostartmove()
{
if ( !isdefined( self.skipstartmove ) )
return 1;
else
return 0;
}
getstartmovetype()
{
switch ( self.movemode )
{
case "run":
return "run-start";
case "walk":
return "walk-start";
default:
return "run-start";
}
}
shoulddostopanim()
{
return isdefined( self.enablestop ) && self.enablestop == 1;
}
candoturnanim( var_0 )
{
var_1 = 16;
var_2 = 10;
var_3 = ( 0, 0, 16 );
if ( !isdefined( self getpathgoalpos() ) )
return 0;
var_4 = getnotetracktimes( var_0, "code_move" );
var_5 = var_4[0];
var_6 = getmovedelta( var_0, 0, var_5 );
var_7 = self localtoworldcoords( var_6 );
var_7 = getgroundposition( var_7, self.radius );
if ( !isdefined( var_7 ) )
return 0;
var_8 = self aiphysicstracepassed( self.origin + var_3, var_7 + var_3, self.radius - var_2, self.height - var_1 );
if ( var_8 )
return 1;
else
return 0;
}
shouldstartmove()
{
var_0 = getstartmoveangleindex();
return var_0 < 3 || var_0 > 5;
}
getstartmoveangleindex()
{
return maps\mp\agents\_scriptedagents::getangleindexfromselfyaw( self getlookaheaddir() );
}

View File

@ -0,0 +1,454 @@
// IW6 GSC SOURCE
// Generated by https://github.com/xensik/gsc-tool
main()
{
self endon( "death" );
common_scripts\utility::waitframe();
thread watch_for_badpath();
thread health_monitor();
initialize_path();
initialize_attacks();
self.ancestor_scripted_active = 0;
for (;;)
main_loop();
}
initialize_path()
{
var_0 = getnodearray( "ancestor_path_start", "script_noteworthy" );
self.pathnode = common_scripts\utility::getclosest( self.origin, var_0, 512 );
self.following_path = 0;
}
initialize_attacks()
{
var_0 = gettime();
self.last_spawn_time = var_0;
self.last_blast_time = var_0;
self.last_attack_time = var_0;
self.last_grab_time = var_0;
self.grab_lift_entities = [];
self.current_grab_victims = [];
self.grab_target_disabled = 0;
}
has_died()
{
return maps\mp\agents\alien\alien_ancestor\_alien_ancestor::getrealhealth() < 0;
}
health_monitor()
{
self endon( "death" );
for (;;)
{
if ( has_died() )
break;
wait 0.05;
}
death_attack( self.enemy );
}
main_loop()
{
for (;;)
{
self.looktarget = undefined;
var_0 = self.enemy;
if ( isdefined( self.alien_scripted ) && self.alien_scripted == 1 )
{
self.ancestor_scripted_active = 1;
self.following_path = 0;
}
else
{
self.ancestor_scripted_active = 0;
if ( self.badpath )
badpath( var_0 );
else
update_loop();
}
wait 0.05;
}
}
badpath( var_0 )
{
self.badpathcount = 0;
self.badpath = 0;
}
update_loop()
{
if ( has_died() )
return;
self.looktarget = self.enemy;
var_0 = should_i_attack( self.enemy );
if ( isdefined( var_0 ) )
ancestor_attack( var_0, self.enemy );
else if ( !self.following_path )
thread follow_path();
}
should_i_attack( var_0 )
{
if ( self.statelocked )
return undefined;
if ( should_force_blast() )
return "forced_blast";
if ( should_force_grab() )
return "forced_grab";
if ( gettime() - self.last_attack_time < 2000 )
return undefined;
if ( should_shield( var_0 ) )
return "shield";
else if ( should_grab( var_0 ) )
return "grab";
else if ( should_blast( var_0 ) )
return "blast";
if ( should_spawn( var_0 ) )
return "spawn";
else if ( should_direct( var_0 ) )
return "direct";
return undefined;
}
follow_path()
{
if ( !isdefined( self.pathnode ) )
return;
if ( distancesquared( self.origin, self.pathnode.origin ) < 1024.0 )
{
if ( isdefined( self.pathnode.target ) )
self.pathnode = getnode( self.pathnode.target, "targetname" );
else
self.pathnode = undefined;
}
if ( !isdefined( self.pathnode ) )
{
self notify( "Path ended" );
return;
}
self.following_path = 1;
self scragentsetgoalradius( 32.0 );
self scragentsetgoalnode( self.pathnode );
if ( self.currentanimstate == "move" )
{
var_0 = vectornormalize( self.pathnode.origin - self.origin );
self notify( "path_dir_change", var_0 );
}
self waittill( "goal_reached" );
if ( isdefined( self.pathnode.script_noteworthy ) )
self notify( self.pathnode.script_noteworthy );
self.following_path = 0;
}
assign_path_node( var_0 )
{
self.pathnode = var_0;
self.following_path = 0;
}
should_shield( var_0 )
{
return 0;
}
should_spawn( var_0 )
{
if ( gettime() - self.last_spawn_time < 30000 )
return 0;
if ( maps\mp\alien\_spawn_director::can_spawn_type( "brute" ) )
return 1;
return maps\mp\alien\_spawn_director::can_spawn_type( "goon" );
}
should_direct( var_0 )
{
return 0;
}
should_blast( var_0 )
{
if ( !isdefined( var_0 ) )
return 0;
if ( var_0.classname == "script_model" && !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_0.origin, 0, self.shield ) )
return 0;
else if ( !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_0 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
return 0;
return gettime() - self.last_blast_time > 6000;
}
should_force_blast()
{
return isdefined( self.forced_blast_position );
}
should_force_grab()
{
return isdefined( self.forced_grab_position );
}
should_grab( var_0 )
{
if ( gettime() - self.last_grab_time < 4000 )
return 0;
self.grab_target = undefined;
var_1 = 0;
var_2 = anglestoforward( self.angles );
var_3 = 0.707;
var_4 = gettime();
foreach ( var_6 in level.players )
{
if ( var_6.inlaststand )
continue;
if ( var_6.ignoreme )
continue;
if ( isdefined( var_6.next_valid_grab_time ) && var_6.next_valid_grab_time > var_4 )
continue;
var_7 = vectornormalize( var_6.origin - self.origin );
if ( vectordot( var_2, var_7 ) < var_3 )
continue;
var_8 = distancesquared( var_6.origin, self.origin );
if ( var_8 > 589824 )
continue;
if ( !bullettracepassed( self gettagorigin( "TAG_EYE" ), var_6 gettagorigin( "TAG_EYE" ), 0, self.shield ) )
continue;
if ( !isdefined( self.grab_target ) || var_8 < var_1 )
{
self.grab_target = var_6;
var_1 = var_8;
}
}
return isdefined( self.grab_target );
}
blast( var_0 )
{
self.blast_target = var_0;
attack_enemy( "blast", var_0 );
}
forced_blast( var_0 )
{
attack_enemy( "forced_blast", var_0 );
}
forced_grab( var_0 )
{
attack_enemy( "forced_grab", var_0 );
}
grab( var_0 )
{
attack_enemy( "grab", var_0 );
}
spawn_attack( var_0 )
{
attack_enemy( "spawn", var_0 );
}
death_attack( var_0 )
{
attack_enemy( "death", var_0 );
}
ancestor_attack( var_0, var_1 )
{
self notify( "start_attack" );
switch ( var_0 )
{
case "blast":
blast( var_1 );
break;
case "forced_blast":
forced_blast( var_1 );
break;
case "forced_grab":
forced_grab( var_1 );
break;
case "grab":
grab( var_1 );
break;
case "spawn":
spawn_attack( var_1 );
break;
case "death":
death_attack( var_1 );
break;
default:
wait 1;
break;
}
}
attack_enemy( var_0, var_1 )
{
if ( !isdefined( var_1 ) )
{
foreach ( var_3 in level.players )
{
if ( isdefined( var_3 ) )
{
var_1 = var_3;
break;
}
}
}
if ( isdefined( var_1 ) )
{
self.melee_type = var_0;
self scragentbeginmelee( var_1 );
self scragentsetgoalpos( self.origin );
self scragentsetgoalradius( 4096.0 );
self waittill( "melee_complete" );
self.last_attack_time = gettime();
}
else
wait 0.2;
}
force_blast_attack( var_0 )
{
self.forced_blast_position = var_0;
}
force_grab_attack( var_0 )
{
self.forced_grab_position = var_0;
}
noncombat()
{
}
watch_for_badpath()
{
self endon( "death" );
self.badpath = 0;
for (;;)
{
self waittill( "bad_path", var_0, var_1 );
self.badpath = 1;
if ( !isdefined( self.badpathcount ) || isdefined( self.badpathtime ) && gettime() > self.badpathtime + 2000 )
self.badpathcount = 0;
self.badpathtime = gettime();
self.badpathcount++;
badpath( undefined );
wait 0.05;
}
}
ancestor_enter_scripted()
{
maps\mp\alien\_utility::enable_alien_scripted();
while ( !maps\mp\alien\_utility::is_true( self.ancestor_scripted_active ) )
wait 0.2;
}
ancestor_path_to_node( var_0 )
{
var_1 = getnode( var_0, "targetname" );
if ( !isdefined( var_1 ) )
return;
self.pathnode = var_1;
self scragentsetgoalradius( 28 );
self scragentsetgoalnode( self.pathnode );
self waittill( "goal_reached" );
}
ancestor_do_forced_grab( var_0 )
{
var_0 = getent( var_0, "targetname" );
self scragentsetorientmode( "face angle abs", var_0.angles );
force_grab_attack( var_0.origin );
self scragentsetgoalradius( 64 );
self scragentsetgoalnode( self.pathnode );
maps\mp\alien\_utility::disable_alien_scripted();
self waittill( "forced_grab_damage_start" );
ancestor_enter_scripted();
wait 0.2;
}
ancestor_play_traversal( var_0, var_1 )
{
self scragentsetscripted( 1 );
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( anglestoforward( var_0 ) );
wait 0.5;
self scragentsetphysicsmode( "noclip" );
self scragentsetorientmode( "face angle abs", var_0 );
self scragentsetanimmode( "anim deltas" );
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( var_1, "traverse", "end" );
self scragentsetgoalpos( self.origin );
self scragentsetgoalradius( 28.0 );
self scragentsetscripted( 0 );
}
ancestor_align_to_angles( var_0 )
{
var_1 = 0;
for (;;)
{
var_2 = vectordot( anglestoforward( self.angles ), anglestoforward( var_0 ) );
if ( var_2 < 0.95 )
{
var_1++;
maps\mp\agents\alien\_alien_anim_utils::turntowardsvector( anglestoforward( var_0 ) );
}
else
return;
if ( var_1 >= 5 )
return;
}
}