init
This commit is contained in:
726
maps/mp/agents/alien/alien_ancestor/_alien_ancestor.gsc
Normal file
726
maps/mp/agents/alien/alien_ancestor/_alien_ancestor.gsc
Normal 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;
|
||||
}
|
||||
}
|
39
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_idle.gsc
Normal file
39
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_idle.gsc
Normal 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 );
|
||||
}
|
937
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_melee.gsc
Normal file
937
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_melee.gsc
Normal 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();
|
||||
}
|
547
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_move.gsc
Normal file
547
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_move.gsc
Normal 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() );
|
||||
}
|
454
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_think.gsc
Normal file
454
maps/mp/agents/alien/alien_ancestor/_alien_ancestor_think.gsc
Normal 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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user