495 lines
13 KiB
Plaintext
495 lines
13 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
mammoth_level_init()
|
|
{
|
|
if ( !isdefined( level.alien_funcs ) )
|
|
level.alien_funcs = [];
|
|
|
|
level.alien_funcs["mammoth"]["approach"] = ::mammoth_approach;
|
|
level.alien_funcs["mammoth"]["combat"] = maps\mp\agents\alien\_alien_think::default_alien_combat;
|
|
level.alien_funcs["mammoth"]["badpath"] = ::handle_badpath;
|
|
level.donotburrowvolumes = getentarray( "donotburrow", "targetname" );
|
|
}
|
|
|
|
mammoth_init()
|
|
{
|
|
self.last_charge_time = gettime();
|
|
self.lastattacktime = gettime();
|
|
self.fissurespawntimeout = get_fissure_spawn_timeout();
|
|
self.burrowtimeout = get_burrow_timeout();
|
|
self.currentphase = 0;
|
|
self.canburrow = 1;
|
|
self.canfissurespawn = 0;
|
|
self.elite_angered = 1;
|
|
self.burrowing = 0;
|
|
self.lastburrowattacktime = gettime();
|
|
self.lastfissurespawntime = gettime() + int( self.fissurespawntimeout * 0.5 );
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "walk" );
|
|
self.fissurespawnlocs = [];
|
|
self.cannothypno = 1;
|
|
thread watch_for_immediate_abilities();
|
|
}
|
|
|
|
get_fissure_spawn_timeout()
|
|
{
|
|
switch ( level.players.size )
|
|
{
|
|
case 1:
|
|
return 20000;
|
|
case 2:
|
|
return 20000;
|
|
case 3:
|
|
return 20000;
|
|
case 4:
|
|
return 20000;
|
|
}
|
|
}
|
|
|
|
get_burrow_timeout()
|
|
{
|
|
switch ( level.players.size )
|
|
{
|
|
case 1:
|
|
return 15000;
|
|
case 2:
|
|
return 15000;
|
|
case 3:
|
|
return 15000;
|
|
case 4:
|
|
return 15000;
|
|
}
|
|
}
|
|
|
|
get_default_fissure_spawns()
|
|
{
|
|
switch ( level.players.size )
|
|
{
|
|
case 1:
|
|
return 1;
|
|
case 2:
|
|
return 1;
|
|
case 3:
|
|
return 2;
|
|
case 4:
|
|
return 2;
|
|
}
|
|
}
|
|
|
|
burrow_attack( var_0 )
|
|
{
|
|
self.melee_type = "burrow";
|
|
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
|
}
|
|
|
|
burrow( var_0 )
|
|
{
|
|
level notify( "dlc_vo_notify", "warn_dig", self );
|
|
thread burrow_fx();
|
|
|
|
if ( isdefined( self.burrow_now ) && self.burrow_now )
|
|
self.burrow_now = undefined;
|
|
|
|
self.lastburrowattacktime = gettime();
|
|
self.burrowing = 1;
|
|
self.last_burrow_location = self.origin;
|
|
self.last_burrow_angles = self.angles;
|
|
self scragentsetphysicsmode( "noclip" );
|
|
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "burrow", 0, "burrow", "end", ::handleburrownotes );
|
|
self hide();
|
|
level notify( "dlc_vo_notify", "warn_underground", self );
|
|
wait( randomfloatrange( 2.0, 6.0 ) );
|
|
var_1 = self getanimentry( "burrow", 1 );
|
|
var_2 = getanimlength( var_1 );
|
|
var_3 = getmovedelta( var_1, 0.0, 1.0 );
|
|
var_4 = get_valid_burrow_emerge_location( self.enemy );
|
|
|
|
if ( isalive( self.enemy ) )
|
|
{
|
|
var_5 = self.enemy.origin;
|
|
var_6 = vectortoangles( var_5 - var_4 );
|
|
}
|
|
else if ( isdefined( self.emerge_angles ) )
|
|
var_6 = self.emerge_angles;
|
|
else
|
|
var_6 = self.last_burrow_angles;
|
|
|
|
self scragentsetorientmode( "face angle abs", var_6 );
|
|
var_3 = rotatevector( var_3, var_6 );
|
|
var_7 = var_4 - var_3;
|
|
self setorigin( var_7, 0 );
|
|
wait 0.1;
|
|
level notify( "dlc_vo_notify", "warn_emerge", self );
|
|
self show();
|
|
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "burrow", 1, "burrow", "end", ::handleburrownotes );
|
|
self.lastattacktime = gettime();
|
|
self.burrowing = 0;
|
|
}
|
|
|
|
burrow_fx()
|
|
{
|
|
playfx( level._effect["mammoth_burrow"], self.origin + ( 0, 0, 0 ) );
|
|
}
|
|
|
|
handleburrownotes( var_0, var_1, var_2, var_3 )
|
|
{
|
|
switch ( var_0 )
|
|
{
|
|
case "burrow_note":
|
|
break;
|
|
}
|
|
}
|
|
|
|
get_valid_burrow_emerge_location( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = 56;
|
|
var_2 = 356;
|
|
var_3 = 512;
|
|
var_4 = undefined;
|
|
|
|
if ( isalive( var_0 ) && !is_enemy_vanguard( var_0 ) )
|
|
{
|
|
var_4 = find_emerge_node( var_0, var_1, var_2 );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = find_emerge_node( var_0, var_2, var_3 );
|
|
}
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
wait 0.05;
|
|
var_4 = find_emerge_node( self, var_1, var_3 );
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
{
|
|
self.emerge_angles = undefined;
|
|
return self.last_burrow_location;
|
|
}
|
|
}
|
|
|
|
self.emerge_angles = var_4.angles;
|
|
return var_4.origin;
|
|
}
|
|
|
|
find_emerge_node( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = getnodesinradiussorted( var_0.origin, var_2, var_1 );
|
|
var_4 = undefined;
|
|
|
|
foreach ( var_6 in var_3 )
|
|
{
|
|
if ( maps\mp\alien\_utility::is_normal_upright( anglestoup( var_6.angles ) ) )
|
|
{
|
|
if ( getpathdist( var_6.origin, var_0.origin, 256 ) != -1 )
|
|
{
|
|
var_4 = var_6;
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
return var_4;
|
|
}
|
|
|
|
mammoth_approach( var_0, var_1 )
|
|
{
|
|
if ( distancesquared( var_0.origin, self.origin ) > 250000 )
|
|
mammoth_approach_enemy( 500, var_0 );
|
|
|
|
for (;;)
|
|
{
|
|
if ( !self.burrowing )
|
|
{
|
|
if ( should_do_fissure_spawn() )
|
|
return "fissure_spawn";
|
|
|
|
if ( should_do_new_phase() )
|
|
return "mammoth_angered";
|
|
else if ( should_burrow( var_0 ) )
|
|
return "burrow";
|
|
else if ( maps\mp\agents\alien\_alien_elite::can_do_charge_attack( var_0 ) )
|
|
return "charge";
|
|
else if ( maps\mp\agents\alien\_alien_elite::run_to_slam( var_0 ) )
|
|
return "slam";
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
mammoth_approach_enemy( var_0, var_1 )
|
|
{
|
|
self endon( "stop_mammoth_approach" );
|
|
thread watch_for_immediate_abilities();
|
|
maps\mp\agents\alien\_alien_think::run_near_enemy( var_0, var_1 );
|
|
self notify( "stop_mammoth_approach" );
|
|
}
|
|
|
|
should_burrow( var_0 )
|
|
{
|
|
if ( isdefined( self.burrow_now ) && self.burrow_now )
|
|
return 1;
|
|
|
|
if ( is_enemy_vanguard( var_0 ) )
|
|
return 0;
|
|
|
|
if ( !self.canburrow )
|
|
return 0;
|
|
|
|
if ( !self isonground() )
|
|
return 0;
|
|
|
|
foreach ( var_2 in level.donotburrowvolumes )
|
|
{
|
|
if ( ispointinvolume( self.origin, var_2 ) )
|
|
return 0;
|
|
}
|
|
|
|
var_4 = 0;
|
|
|
|
if ( distancesquared( self.origin, var_0.origin ) > 262144.0 )
|
|
var_4 = 1;
|
|
else if ( attack_timer_expired() || burrow_timer_expired() )
|
|
var_4 = 1;
|
|
|
|
return var_4 && has_room_to_burrow();
|
|
}
|
|
|
|
is_enemy_vanguard( var_0 )
|
|
{
|
|
return isdefined( var_0.helitype ) && var_0.helitype == "remote_uav";
|
|
}
|
|
|
|
has_room_to_burrow()
|
|
{
|
|
var_0 = maps\mp\agents\_scriptedagents::droppostoground( self.origin + anglestoforward( self.angles ) * 48.0 );
|
|
return isdefined( var_0 );
|
|
}
|
|
|
|
attack_timer_expired()
|
|
{
|
|
if ( gettime() - self.lastattacktime > 10000 )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
burrow_timer_expired()
|
|
{
|
|
if ( gettime() - self.lastburrowattacktime > self.burrowtimeout )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
should_do_new_phase()
|
|
{
|
|
var_0 = [ 0.85, 0.5, 0.25 ];
|
|
|
|
if ( self.currentphase >= var_0.size - 1 )
|
|
return 0;
|
|
|
|
if ( self.health / self.maxhealth > var_0[self.currentphase] )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
should_do_fissure_spawn( var_0 )
|
|
{
|
|
if ( !self.canfissurespawn )
|
|
return 0;
|
|
|
|
if ( !fissure_spawn_timer_expired() )
|
|
return 0;
|
|
|
|
if ( !fissure_spawn_find_spawn_loc() )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
fissure_spawn_timer_expired()
|
|
{
|
|
if ( gettime() - self.lastfissurespawntime > self.fissurespawntimeout )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
fissure_spawn_find_spawn_loc()
|
|
{
|
|
var_0 = anglestoforward( self.angles );
|
|
var_1 = anglestoright( self.angles );
|
|
self.fissurespawnlocs = [];
|
|
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.fissurespawnlocs[self.fissurespawnlocs.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.fissurespawnlocs[self.fissurespawnlocs.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.fissurespawnlocs[self.fissurespawnlocs.size] = var_4;
|
|
|
|
if ( self.fissurespawnlocs.size > 0 )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
fissure_spawn_attack( var_0 )
|
|
{
|
|
self.melee_type = "fissure_spawn";
|
|
self.numfissurespawns = get_default_fissure_spawns();
|
|
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
|
}
|
|
|
|
release_reserved_space_on_death()
|
|
{
|
|
self waittill( "death" );
|
|
|
|
if ( isdefined( self.reserved_space ) && self.reserved_space > 0 )
|
|
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
|
|
}
|
|
|
|
fissure_spawn( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self.reserved_space = int( maps\mp\alien\_spawn_director::reserve_custom_spawn_space( self.numfissurespawns, 1 ) );
|
|
thread release_reserved_space_on_death();
|
|
self.lastfissurespawntime = gettime();
|
|
|
|
while ( self.reserved_space > 0 )
|
|
{
|
|
var_1 = min( self.reserved_space, self.fissurespawnlocs.size );
|
|
do_fissure_spawn( var_1, self.fissurespawnlocs );
|
|
}
|
|
|
|
if ( self.reserved_space > 0 )
|
|
{
|
|
maps\mp\alien\_spawn_director::release_custom_spawn_space( self.reserved_space );
|
|
self.reserved_space = 0;
|
|
}
|
|
}
|
|
|
|
do_fissure_spawn( var_0, var_1 )
|
|
{
|
|
maps\mp\agents\_scriptedagents::playanimnuntilnotetrack( "attack_melee_swipe", 2, "attack_melee", "alien_slam_big" );
|
|
var_2 = level.alien_types[self.alien_type].attributes["slam_min_damage"];
|
|
var_3 = level.alien_types[self.alien_type].attributes["slam_max_damage"];
|
|
maps\mp\agents\alien\_alien_elite::area_damage_and_impulse( 250, var_2, var_3, 800 );
|
|
thread process_fissure_spawns( var_0, var_1 );
|
|
maps\mp\agents\_scriptedagents::waituntilnotetrack( "attack_melee", "end" );
|
|
level notify( "dlc_vo_notify", "phantom_backup", self );
|
|
}
|
|
|
|
process_fissure_spawns( var_0, var_1, var_2 )
|
|
{
|
|
var_2 = spawnstruct();
|
|
var_2.angles = self.angles;
|
|
var_3 = level.cycle_data.spawn_node_info["chen_test"].vignetteinfo["brute"];
|
|
var_4 = ( 0, 0, -100 );
|
|
|
|
for ( var_5 = 0; var_5 < var_0; var_5++ )
|
|
{
|
|
var_6 = var_5 % var_1.size;
|
|
var_2.origin = var_1[var_6] + var_4;
|
|
var_7 = maps\mp\alien\_spawn_director::process_custom_spawn( "brute", var_2, var_3 );
|
|
self.reserved_space--;
|
|
wait( randomfloatrange( 0.01, 0.14 ) );
|
|
}
|
|
}
|
|
|
|
mammoth_angered( var_0 )
|
|
{
|
|
self.currentphase++;
|
|
|
|
switch ( self.currentphase )
|
|
{
|
|
case 1:
|
|
self.moveplaybackrate = 1.4;
|
|
self.defaultemissive = 0.2;
|
|
self.maxemissive = 0.2;
|
|
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
|
self.canfissurespawn = 1;
|
|
self.damagescalar = 1.2;
|
|
break;
|
|
case 2:
|
|
self.moveplaybackrate = 1.2;
|
|
self.defaultemissive = 1.0;
|
|
self.maxemissive = 1.0;
|
|
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
|
self.damagescalar = 1.4;
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
break;
|
|
default:
|
|
}
|
|
|
|
self scragentsetanimmode( "anim deltas" );
|
|
self scragentsetorientmode( "face angle abs", self.angles );
|
|
maps\mp\agents\_scriptedagents::playanimnatrateuntilnotetrack( "prepare_to_regen", 0, 2.0, "prepare_to_regen", "end" );
|
|
fissure_spawn_angered( var_0 );
|
|
}
|
|
|
|
fissure_spawn_angered( var_0 )
|
|
{
|
|
self.numfissurespawns = get_default_fissure_spawns() * 2;
|
|
|
|
if ( !fissure_spawn_find_spawn_loc() )
|
|
self.fissurespawnlocs[self.fissurespawnlocs.size] = self.origin;
|
|
|
|
fissure_spawn( var_0 );
|
|
}
|
|
|
|
mammoth_angered_attack( var_0 )
|
|
{
|
|
self.melee_type = "mammoth_angered";
|
|
maps\mp\agents\alien\_alien_think::alien_melee( var_0 );
|
|
}
|
|
|
|
handle_badpath( var_0 )
|
|
{
|
|
self.badpath = 0;
|
|
|
|
if ( self.badpathcount > 3 )
|
|
{
|
|
if ( has_room_to_burrow() && !is_enemy_vanguard( var_0 ) )
|
|
{
|
|
self.badpathcount = 0;
|
|
self.burrow_now = 1;
|
|
self notify( "alien_main_loop_restart" );
|
|
}
|
|
else
|
|
maps\mp\agents\alien\_alien_think::handle_badpath( var_0 );
|
|
}
|
|
}
|
|
|
|
watch_for_immediate_abilities()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "stop_mammoth_approach" );
|
|
|
|
for (;;)
|
|
{
|
|
if ( fissure_spawn_timer_expired() || should_do_new_phase() || isdefined( self.enemy ) && should_burrow( self.enemy ) )
|
|
{
|
|
self notify( "stop_mammoth_approach" );
|
|
return;
|
|
}
|
|
|
|
wait 1.0;
|
|
}
|
|
}
|