1668 lines
44 KiB
Plaintext
1668 lines
44 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
spawnalien( var_0, var_1, var_2 )
|
|
{
|
|
return maps\mp\gametypes\aliens::addalienagent( "axis", var_0, var_1, var_2 );
|
|
}
|
|
|
|
alien_health_per_player_init()
|
|
{
|
|
level.alien_health_per_player_scalar = [];
|
|
level.alien_health_per_player_scalar[1] = 0.9;
|
|
level.alien_health_per_player_scalar[2] = 1.0;
|
|
level.alien_health_per_player_scalar[3] = 1.3;
|
|
level.alien_health_per_player_scalar[4] = 1.8;
|
|
}
|
|
|
|
alien_wave_init()
|
|
{
|
|
level.use_spawn_director = 1;
|
|
|
|
if ( use_spawn_director() )
|
|
maps\mp\alien\_spawn_director::init();
|
|
|
|
wave_spawners_init();
|
|
}
|
|
|
|
escape_choke_init()
|
|
{
|
|
level.choke_trigs = [];
|
|
level.choke_trigs[0] = getent( "choke_trig_0", "targetname" );
|
|
level.choke_trigs[1] = getent( "choke_trig_1", "targetname" );
|
|
level.choke_trigs[2] = getent( "choke_trig_2", "targetname" );
|
|
level.choke_trigs[3] = getent( "choke_trig_3", "targetname" );
|
|
|
|
if ( !isdefined( level.choke_trigs ) || !level.choke_trigs.size )
|
|
return;
|
|
|
|
foreach ( var_1 in level.choke_trigs )
|
|
{
|
|
var_2 = common_scripts\utility::getstruct( var_1.target, "targetname" );
|
|
var_3 = common_scripts\utility::getstruct( var_2.target, "targetname" );
|
|
var_1.choke_loc = var_2.origin;
|
|
var_1.spit_at_struct = var_3;
|
|
}
|
|
|
|
level thread monitor_trig_activation();
|
|
}
|
|
|
|
monitor_trig_activation()
|
|
{
|
|
level endon( "game_ended" );
|
|
|
|
if ( !common_scripts\utility::flag_exist( "nuke_countdown" ) )
|
|
return;
|
|
|
|
level.latest_choke_trig_active = level.choke_trigs[0];
|
|
level.escape_spitter_target_node = level.choke_trigs[0].spit_at_struct;
|
|
|
|
if ( !isdefined( level.escape_spitter_target_node.angles ) )
|
|
level.escape_spitter_target_node.angles = ( 0, 0, 0 );
|
|
|
|
if ( !common_scripts\utility::flag( "nuke_countdown" ) )
|
|
common_scripts\utility::flag_wait( "nuke_countdown" );
|
|
|
|
update_extraction_waypoint_location( level.latest_choke_trig_active get_choke_trig_id() );
|
|
|
|
for (;;)
|
|
{
|
|
foreach ( var_1 in level.players )
|
|
{
|
|
foreach ( var_3 in level.choke_trigs )
|
|
{
|
|
if ( isalive( var_1 ) && var_1 istouching( var_3 ) && var_1.sessionstate == "playing" )
|
|
{
|
|
var_4 = var_3 get_choke_trig_id();
|
|
var_5 = level.latest_choke_trig_active get_choke_trig_id();
|
|
|
|
if ( var_4 > var_5 )
|
|
{
|
|
level.latest_choke_trig_active = var_3;
|
|
update_extraction_waypoint_location( var_3 get_choke_trig_id() );
|
|
level.escape_spitter_target_node = var_3.spit_at_struct;
|
|
|
|
if ( !isdefined( level.escape_spitter_target_node.angles ) )
|
|
level.escape_spitter_target_node.angles = ( 0, 0, 0 );
|
|
|
|
thread escape_spawn_special_minion_wave( 6 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
wait 1;
|
|
}
|
|
}
|
|
|
|
update_extraction_waypoint_location( var_0 )
|
|
{
|
|
if ( !isdefined( level.rescue_waypoint ) )
|
|
return;
|
|
|
|
level.rescue_waypoint.alpha = 1;
|
|
|
|
if ( !isdefined( level.rescue_waypoint_locs ) || !isdefined( level.rescue_waypoint_locs[var_0] ) )
|
|
return;
|
|
|
|
level.rescue_waypoint.x = level.rescue_waypoint_locs[var_0][0];
|
|
level.rescue_waypoint.y = level.rescue_waypoint_locs[var_0][1];
|
|
level.rescue_waypoint.z = level.rescue_waypoint_locs[var_0][2];
|
|
}
|
|
|
|
escape_spawn_special_minion_wave( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "nuke_went_off" );
|
|
level notify( "escape_spawn_special_minion_wave" );
|
|
level endon( "escape_spawn_special_minion_wave" );
|
|
wait( var_0 );
|
|
var_1 = "chaos_event_1";
|
|
level notify( var_1 );
|
|
maps\mp\alien\_spawn_director::activate_spawn_event( var_1 );
|
|
}
|
|
|
|
get_choke_trig_id()
|
|
{
|
|
return int( strtok( self.targetname, "_" )[2] );
|
|
}
|
|
|
|
alien_scene_init()
|
|
{
|
|
level.scene_trigs = getentarray( "scene_trig", "targetname" );
|
|
|
|
foreach ( var_1 in level.scene_trigs )
|
|
var_1 thread setup_scene();
|
|
}
|
|
|
|
setup_scene()
|
|
{
|
|
self.scene_spawners = common_scripts\utility::getstructarray( self.target, "targetname" );
|
|
|
|
foreach ( var_1 in self.scene_spawners )
|
|
{
|
|
var_2 = strtok( var_1.script_noteworthy, " " );
|
|
var_1.types = var_2;
|
|
}
|
|
|
|
thread run_scene();
|
|
}
|
|
|
|
run_scene()
|
|
{
|
|
level endon( "game_ended" );
|
|
self endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "trigger", var_0 );
|
|
|
|
if ( !isplayer( var_0 ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
var_1 = common_scripts\utility::array_randomize( self.scene_spawners );
|
|
|
|
for ( var_2 = 0; var_2 < var_1.size; var_2++ )
|
|
{
|
|
if ( var_2 > 0 )
|
|
{
|
|
if ( randomint( 100 ) >= 50 )
|
|
continue;
|
|
}
|
|
|
|
var_3 = var_1[var_2];
|
|
thread spawn_scene_alien( var_3 );
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
spawn_scene_alien( var_0 )
|
|
{
|
|
if ( isdefined( var_0.script_delay ) )
|
|
wait( var_0.script_delay );
|
|
|
|
var_1 = "scene " + var_0.types[randomintrange( 0, var_0.types.size )];
|
|
var_2 = var_0.angles;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = ( 0, 270, 0 );
|
|
|
|
var_3 = spawnalien( var_0.origin, var_2, var_1 );
|
|
var_3.spawner = var_0;
|
|
}
|
|
|
|
alien_scene_behavior()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
var_0 = self.moveplaybackrate;
|
|
self.scene_moveplaybackrate = var_0 * 1.25;
|
|
set_ignore_enemy();
|
|
thread wakeup_to_player_damage();
|
|
thread wakeup_to_player_distance( 256 );
|
|
thread scene_loop();
|
|
self waittill( "woke" );
|
|
self.scene = undefined;
|
|
self.moveplaybackrate = var_0;
|
|
clear_ignore_enemy();
|
|
self scragentsetscripted( 0 );
|
|
|
|
if ( maps\mp\alien\_utility::get_alien_type() == "elite" )
|
|
level thread maps\mp\alien\_music_and_dialog::handlefirstelitearrival( self );
|
|
|
|
wait 1;
|
|
}
|
|
|
|
scene_loop()
|
|
{
|
|
self endon( "woke" );
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
wait 1;
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
var_0 = common_scripts\utility::getstructarray( self.spawner.target, "targetname" );
|
|
|
|
for ( var_1 = var_0[randomintrange( 0, var_0.size )]; isdefined( var_1 ); var_1 = var_0[randomintrange( 0, var_0.size )] )
|
|
{
|
|
self scragentsetgoalpos( var_1.origin );
|
|
self scragentsetgoalradius( 32 );
|
|
self waittill( "goal_reached" );
|
|
|
|
if ( isdefined( var_1.script_noteworthy ) )
|
|
{
|
|
wait 0.5;
|
|
var_2 = strtok( var_1.script_noteworthy, " " );
|
|
|
|
if ( var_2[0] == "delete" )
|
|
{
|
|
self suicide();
|
|
return;
|
|
}
|
|
|
|
var_3 = level.players[randomintrange( 0, level.players.size )];
|
|
maps\mp\agents\alien\_alien_anim_utils::turntowardsentity( var_3 );
|
|
var_4 = 1;
|
|
|
|
if ( var_2.size == 2 && int( var_2[1] ) > 1 )
|
|
var_4 = int( var_2[1] );
|
|
|
|
if ( var_2[0] == "posture" )
|
|
{
|
|
for ( var_5 = 0; var_5 < var_4; var_5++ )
|
|
{
|
|
self scragentsetscripted( 1 );
|
|
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1 );
|
|
self scragentsetorientmode( "face angle abs", self.angles );
|
|
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "posture", "posture", "end" );
|
|
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
|
self scragentsetscripted( 0 );
|
|
self scragentsetgoalpos( self.origin );
|
|
wait( randomfloatrange( 0.25, 0.75 ) );
|
|
}
|
|
|
|
self.moveplaybackrate = self.scene_moveplaybackrate;
|
|
}
|
|
|
|
if ( var_2[0] == "ground_slam" )
|
|
{
|
|
for ( var_5 = 0; var_5 < var_4; var_5++ )
|
|
{
|
|
self scragentsetscripted( 1 );
|
|
maps\mp\alien\_utility::set_alien_emissive( 0.2, 1 );
|
|
self scragentsetorientmode( "face angle abs", self.angles );
|
|
maps\mp\agents\_scriptedagents::playanimuntilnotetrack( "attack_melee_swipe", "attack_melee", "end" );
|
|
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
|
self scragentsetscripted( 0 );
|
|
self scragentsetgoalpos( self.origin );
|
|
wait( randomfloatrange( 0.5, 1.0 ) );
|
|
}
|
|
|
|
self.moveplaybackrate = self.scene_moveplaybackrate;
|
|
}
|
|
}
|
|
|
|
var_0 = common_scripts\utility::getstructarray( var_1.target, "targetname" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
return;
|
|
}
|
|
}
|
|
|
|
alien_lurker_init()
|
|
{
|
|
if ( !maps\mp\alien\_utility::alien_mode_has( "lurker" ) )
|
|
return;
|
|
|
|
common_scripts\utility::flag_init( "lurker_active" );
|
|
thread init_patrol_paths();
|
|
var_0 = common_scripts\utility::getstructarray( "alien_spawn_struct", "targetname" );
|
|
level.alien_lurkers = [];
|
|
level.max_lurker_population = 18;
|
|
|
|
foreach ( var_4, var_2 in level.alien_types )
|
|
{
|
|
var_3 = spawnstruct();
|
|
var_3.spawn_locs = [];
|
|
level.alien_lurkers[var_4] = var_3;
|
|
}
|
|
|
|
foreach ( var_6 in var_0 )
|
|
{
|
|
var_7 = "Spawn location at: " + var_6.origin + " ";
|
|
|
|
if ( isdefined( var_6.script_noteworthy ) && var_6.script_noteworthy != "" )
|
|
{
|
|
var_8 = strtok( var_6.script_noteworthy, " " );
|
|
|
|
if ( !issubstr( var_6.script_noteworthy, "lurker" ) )
|
|
continue;
|
|
else
|
|
var_8 = common_scripts\utility::array_remove( var_8, var_8[0] );
|
|
|
|
var_6.spawn_trigger = getent( var_6.target, "targetname" );
|
|
|
|
foreach ( var_2 in var_8 )
|
|
{
|
|
if ( isdefined( level.alien_lurkers[var_2] ) )
|
|
{
|
|
level.alien_lurkers[var_2].spawn_locs[level.alien_lurkers[var_2].spawn_locs.size] = var_6;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if ( !use_spawn_director() )
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
level notify( "alien_lurkers_spawn_initialized" );
|
|
}
|
|
|
|
init_patrol_paths()
|
|
{
|
|
level.patrol_start_nodes = common_scripts\utility::getstructarray( "patrol_start_node", "targetname" );
|
|
}
|
|
|
|
wave_spawners_init()
|
|
{
|
|
level.alien_wave = [];
|
|
|
|
foreach ( var_3, var_1 in level.alien_types )
|
|
{
|
|
var_2 = spawnstruct();
|
|
var_2.spawn_locs = [];
|
|
level.alien_wave[var_3] = var_2;
|
|
}
|
|
|
|
var_4 = common_scripts\utility::getstructarray( "alien_spawn_struct", "targetname" );
|
|
|
|
foreach ( var_6 in var_4 )
|
|
{
|
|
var_7 = "Spawn location at: " + var_6.origin + " ";
|
|
|
|
if ( isdefined( var_6.script_noteworthy ) && var_6.script_noteworthy != "" )
|
|
{
|
|
var_8 = strtok( var_6.script_noteworthy, " " );
|
|
|
|
if ( issubstr( var_6.script_noteworthy, "lurker" ) )
|
|
continue;
|
|
|
|
foreach ( var_1 in var_8 )
|
|
{
|
|
if ( isdefined( level.alien_wave[var_1] ) )
|
|
{
|
|
level.alien_wave[var_1].spawn_locs[level.alien_wave[var_1].spawn_locs.size] = var_6;
|
|
continue;
|
|
}
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if ( !use_spawn_director() )
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
level notify( "alien_wave_spawn_initialized" );
|
|
}
|
|
|
|
assign_alien_attributes( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = "none";
|
|
var_2 = strtok( var_0, " " );
|
|
|
|
if ( isdefined( var_2 ) && var_2.size == 2 )
|
|
{
|
|
if ( var_2[0] == "lurker" )
|
|
var_1 = "lurker";
|
|
|
|
if ( var_2[0] == "wave" )
|
|
var_1 = "wave";
|
|
|
|
if ( var_2[0] == "scene" )
|
|
var_1 = "scene";
|
|
|
|
var_0 = var_2[1];
|
|
}
|
|
|
|
if ( isdefined( level.players ) && level.players.size > 0 )
|
|
var_3 = level.alien_types[var_0].attributes["health"] * level.alien_health_per_player_scalar[level.players.size];
|
|
else
|
|
var_3 = level.alien_types[var_0].attributes["health"];
|
|
|
|
var_3 = int( level.cycle_health_scalar * var_3 );
|
|
maps\mp\agents\_agent_common::set_agent_health( var_3 );
|
|
self.max_health = var_3;
|
|
self.alien_type = level.alien_types[var_0].attributes["ref"];
|
|
self.moveplaybackrate = level.alien_types[var_0].attributes["speed"] * randomfloatrange( 0.95, 1.05 );
|
|
|
|
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) )
|
|
self.moveplaybackrate = self.moveplaybackrate * 1.25;
|
|
|
|
self.defaultmoveplaybackrate = self.moveplaybackrate;
|
|
self.animplaybackrate = self.moveplaybackrate;
|
|
self.xyanimscale = level.alien_types[var_0].attributes["scale"];
|
|
self.hindlegstraceoffset = -37.0 * self.xyanimscale;
|
|
self.defaultemissive = level.alien_types[var_0].attributes["emissive_default"];
|
|
self.maxemissive = level.alien_types[var_0].attributes["emissive_max"];
|
|
thread set_initial_emissive();
|
|
self scragentsetviewheight( level.alien_types[var_0].attributes["view_height"] );
|
|
|
|
if ( var_1 == "lurker" )
|
|
{
|
|
thread alien_lurker_behavior();
|
|
self.lurker = 1;
|
|
}
|
|
|
|
if ( var_1 == "scene" )
|
|
{
|
|
thread alien_scene_behavior();
|
|
self.scene = 1;
|
|
}
|
|
|
|
if ( var_1 == "wave" )
|
|
{
|
|
thread alien_wave_behavior();
|
|
self.wave_spawned = 1;
|
|
}
|
|
|
|
if ( level.alien_types[var_0].attributes["behavior_cloak"] == 1 )
|
|
thread maps\mp\alien\_director::alien_cloak();
|
|
}
|
|
|
|
set_initial_emissive()
|
|
{
|
|
self endon( "death" );
|
|
wait 1;
|
|
maps\mp\alien\_utility::set_alien_emissive_default( 0.2 );
|
|
}
|
|
|
|
add_fire_fx()
|
|
{
|
|
maps\mp\alien\_alien_fx::alien_fire_on();
|
|
}
|
|
|
|
stop_fire_fx()
|
|
{
|
|
maps\mp\alien\_alien_fx::alien_fire_off();
|
|
}
|
|
|
|
remaining_alien_management()
|
|
{
|
|
var_0 = maps\mp\agents\_agent_utility::getactiveagentsoftype( "alien" );
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( !isalive( var_2 ) )
|
|
continue;
|
|
|
|
if ( isdefined( var_2.from_previous_hive ) )
|
|
var_2 suicide();
|
|
else
|
|
var_2.from_previous_hive = 1;
|
|
|
|
if ( !isdefined( var_2.alien_type ) || var_2.alien_type == "elite" )
|
|
continue;
|
|
|
|
if ( var_2.health < 80 )
|
|
continue;
|
|
|
|
var_3 = 0.5;
|
|
var_4 = int( var_3 * var_2.health );
|
|
var_2.health = var_2.health - var_4;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
get_blocker_hive( var_0 )
|
|
{
|
|
foreach ( var_2 in level.stronghold_hive_locs )
|
|
{
|
|
if ( isdefined( var_2.target ) && var_2.target == var_0 )
|
|
return var_2;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
make_spitter_attack_chopper( var_0 )
|
|
{
|
|
if ( var_0 )
|
|
var_1 = "spitters";
|
|
else
|
|
var_1 = "other_aliens";
|
|
|
|
if ( threatbiasgroupexists( var_1 ) && self getthreatbiasgroup() != var_1 )
|
|
self setthreatbiasgroup( var_1 );
|
|
|
|
if ( isdefined( level.hive_heli ) && var_0 )
|
|
{
|
|
if ( !isdefined( self.favoriteenemy ) || self.favoriteenemy != level.hive_heli )
|
|
self.favoriteenemy = level.hive_heli;
|
|
}
|
|
}
|
|
|
|
escape_spawning( var_0 )
|
|
{
|
|
foreach ( var_2 in level.players )
|
|
var_2.threatbias = 100000;
|
|
|
|
maps\mp\alien\_spawn_director::start_cycle( var_0 );
|
|
level thread clean_up_lagged_aliens();
|
|
level common_scripts\utility::waittill_any( "game_ended", "nuke_went_off" );
|
|
maps\mp\alien\_spawn_director::end_cycle();
|
|
|
|
if ( common_scripts\utility::flag_exist( "nuke_went_off" ) && common_scripts\utility::flag( "nuke_went_off" ) )
|
|
level common_scripts\utility::waittill_any_timeout( 10, "game_ended" );
|
|
else
|
|
wait 7;
|
|
|
|
foreach ( var_5 in level.agentarray )
|
|
{
|
|
if ( isalive( var_5 ) && isdefined( var_5.isactive ) && var_5.isactive )
|
|
{
|
|
var_5 suicide();
|
|
wait 0.1;
|
|
}
|
|
}
|
|
}
|
|
|
|
clean_up_lagged_aliens()
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
level endon( "game_ended" );
|
|
level notify( "clean_up_lagged_aliens" );
|
|
level endon( "clean_up_lagged_aliens" );
|
|
var_0 = 1;
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = [];
|
|
|
|
foreach ( var_3 in level.agentarray )
|
|
{
|
|
if ( !isdefined( var_3.isactive ) || !var_3.isactive )
|
|
continue;
|
|
|
|
var_1[var_1.size] = var_3;
|
|
}
|
|
|
|
var_5 = 4;
|
|
|
|
if ( var_1.size <= maps\mp\alien\_spawn_director::get_max_alien_count() - var_5 )
|
|
{
|
|
wait 1;
|
|
continue;
|
|
}
|
|
|
|
foreach ( var_7 in var_1 )
|
|
{
|
|
if ( !isdefined( var_7.last_looked_at ) )
|
|
{
|
|
var_7.last_looked_at = gettime();
|
|
var_7 thread monitor_looked_at();
|
|
continue;
|
|
}
|
|
|
|
if ( !isdefined( var_7.team ) || var_7.team != "axis" )
|
|
continue;
|
|
|
|
var_8 = gettime() - var_7.birthtime;
|
|
|
|
if ( var_8 / 1000 < 10 )
|
|
continue;
|
|
|
|
var_9 = 0;
|
|
|
|
foreach ( var_11 in level.players )
|
|
{
|
|
if ( isalive( var_11 ) && distance( var_11.origin, var_7.origin ) < 1000 )
|
|
var_9 = 1;
|
|
}
|
|
|
|
if ( var_9 )
|
|
continue;
|
|
|
|
var_13 = gettime() - var_7.last_looked_at;
|
|
|
|
if ( var_13 / 1000 > 2 )
|
|
{
|
|
var_7 suicide();
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait( var_0 );
|
|
}
|
|
}
|
|
|
|
monitor_looked_at()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "monitoring_looked_at" );
|
|
self endon( "monitoring_looked_at" );
|
|
|
|
for (;;)
|
|
{
|
|
foreach ( var_1 in level.players )
|
|
{
|
|
if ( !isalive( var_1 ) )
|
|
continue;
|
|
|
|
var_2 = var_1 gettagangles( "tag_eye" );
|
|
var_3 = var_1 geteye();
|
|
var_4 = anglestoforward( var_2 );
|
|
var_5 = vectornormalize( self.origin - var_3 );
|
|
var_6 = 0.55;
|
|
|
|
if ( vectordot( var_4, var_5 ) > var_6 )
|
|
self.last_looked_at = gettime();
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
port_to_player_loc( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = 350;
|
|
|
|
if ( isdefined( var_0 ) && var_0 == "minion" )
|
|
var_1 = var_1 * 1.2;
|
|
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.players )
|
|
{
|
|
if ( isalive( var_4 ) )
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
var_6 = [];
|
|
|
|
for ( var_7 = level.choke_trigs.size - 1; var_7 >= 0; var_7-- )
|
|
{
|
|
var_8 = level.choke_trigs[var_7];
|
|
var_9 = [];
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
if ( var_4 istouching( var_8 ) )
|
|
var_9[var_9.size] = var_4;
|
|
}
|
|
|
|
if ( var_9.size )
|
|
{
|
|
var_9 = sortbydistance( var_9, var_8.choke_loc );
|
|
|
|
for ( var_12 = 0; var_12 < var_9.size; var_12++ )
|
|
var_6[var_6.size] = var_9[var_12];
|
|
}
|
|
}
|
|
|
|
var_13 = var_6[0];
|
|
|
|
if ( var_6.size > 1 && randomintrange( 0, 100 ) <= 66 )
|
|
var_13 = var_6[randomintrange( 1, var_6.size )];
|
|
|
|
var_14 = undefined;
|
|
|
|
foreach ( var_8 in level.choke_trigs )
|
|
{
|
|
if ( var_13 istouching( var_8 ) )
|
|
{
|
|
var_14 = var_8.choke_loc;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_14 ) )
|
|
return undefined;
|
|
|
|
var_17 = 3;
|
|
|
|
if ( var_0 == "spitter" || var_0 == "seeder" )
|
|
var_17 = 4;
|
|
|
|
var_18 = var_13.origin + vectornormalize( var_14 - var_13.origin ) * var_1 * var_17;
|
|
var_19 = getnodesinradius( var_18, var_1, 0, 1024, "Path" );
|
|
|
|
if ( var_19.size == 0 )
|
|
{
|
|
if ( var_1 >= 2000 )
|
|
return undefined;
|
|
|
|
var_20 = var_1 + 250;
|
|
return port_to_player_loc( var_0, var_20 );
|
|
}
|
|
|
|
var_21 = get_selected_node_for_teleport( var_19, var_14, var_13 );
|
|
var_29 = vectortoangles( var_13.origin - var_21.origin );
|
|
return [ var_21.origin, var_29 ];
|
|
}
|
|
|
|
port_to_escape_spitter_location()
|
|
{
|
|
var_0 = 512;
|
|
var_1 = level.escape_spitter_target_node.origin;
|
|
var_2 = getnodesinradius( var_1, var_0, 0, 1024, "Path" );
|
|
var_3 = get_selected_node_for_teleport( var_2, var_1, level.escape_spitter_target_node );
|
|
return var_3.origin;
|
|
}
|
|
|
|
get_selected_node_for_teleport( var_0, var_1, var_2 )
|
|
{
|
|
var_0 = sortbydistance( var_0, var_1 );
|
|
var_3 = undefined;
|
|
|
|
for ( var_4 = 0; var_4 < var_0.size; var_4++ )
|
|
{
|
|
if ( !isdefined( var_0[var_4].teleport_inuse ) || !var_0[var_4].teleport_inuse )
|
|
{
|
|
var_3 = var_0[var_4];
|
|
var_3.teleport_inuse = 1;
|
|
thread reset_teleport_inuse( var_3 );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = var_0[randomint( var_0.size )];
|
|
|
|
return var_3;
|
|
}
|
|
|
|
debug_circle( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
|
|
}
|
|
|
|
reset_teleport_inuse( var_0 )
|
|
{
|
|
wait 5;
|
|
var_0.teleport_inuse = undefined;
|
|
}
|
|
|
|
infinite_cycle( var_0 )
|
|
{
|
|
maps\mp\alien\_spawn_director::start_cycle( var_0 );
|
|
level waittill( "game_ended" );
|
|
maps\mp\alien\_spawn_director::end_cycle();
|
|
}
|
|
|
|
lurker_loop()
|
|
{
|
|
level endon( "game_ended" );
|
|
common_scripts\utility::flag_set( "lurker_active" );
|
|
|
|
for (;;)
|
|
{
|
|
ai_event_settings();
|
|
var_0 = "goon";
|
|
|
|
foreach ( var_2 in level.alien_lurkers[var_0].spawn_locs )
|
|
{
|
|
var_2 notify( "new_listener" );
|
|
var_2 thread lurker_listen_trigger( var_0 );
|
|
}
|
|
|
|
level waittill( "alien_cycle_prespawning", var_4 );
|
|
var_5 = 10;
|
|
wait( max( 0, var_4 - var_5 ) );
|
|
common_scripts\utility::flag_clear( "lurker_active" );
|
|
level notify( "removing_lurkers" );
|
|
ai_event_settings_reset();
|
|
var_6 = get_alive_lurkers();
|
|
|
|
foreach ( var_8 in var_6 )
|
|
var_8 thread send_away_and_die();
|
|
|
|
wait 6;
|
|
|
|
if ( get_alive_lurkers().size > 0 )
|
|
{
|
|
foreach ( var_8 in get_alive_lurkers() )
|
|
var_8 suicide();
|
|
}
|
|
|
|
level waittill( "alien_cycle_ended" );
|
|
common_scripts\utility::flag_set( "lurker_active" );
|
|
}
|
|
}
|
|
|
|
ai_event_settings()
|
|
{
|
|
level.old_ai_eventdistgunshot = getdvarint( "ai_eventdistgunshot" );
|
|
level.old_ai_eventdistgunshotteam = getdvarint( "ai_eventdistgunshotteam" );
|
|
level.old_ai_eventdistnewenemy = getdvarint( "ai_eventdistnewenemy" );
|
|
level.old_ai_eventdistdeath = getdvarint( "ai_eventdistdeath" );
|
|
setdvar( "ai_eventdistgunshot", 512 );
|
|
setdvar( "ai_eventdistgunshotteam", 512 );
|
|
setdvar( "ai_eventdistnewenemy", 512 );
|
|
setdvar( "ai_eventdistdeath", 512 );
|
|
}
|
|
|
|
ai_event_settings_reset()
|
|
{
|
|
setdvar( "ai_eventdistgunshot", level.old_ai_eventdistgunshot );
|
|
setdvar( "ai_eventdistgunshotteam", level.old_ai_eventdistgunshotteam );
|
|
setdvar( "ai_eventdistnewenemy", level.old_ai_eventdistnewenemy );
|
|
setdvar( "ai_eventdistdeath", level.old_ai_eventdistdeath );
|
|
}
|
|
|
|
remove_farthest_lurker( var_0 )
|
|
{
|
|
var_1 = get_alive_lurkers();
|
|
|
|
while ( var_1.size > 1 )
|
|
{
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
var_4 = common_scripts\utility::getclosest( var_3.origin, var_1 );
|
|
var_1 = common_scripts\utility::array_remove( var_1, var_4 );
|
|
|
|
if ( var_1.size == 1 )
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( !var_1.size )
|
|
return 0;
|
|
|
|
var_1[0] suicide();
|
|
}
|
|
|
|
get_alive_agents()
|
|
{
|
|
var_0 = [];
|
|
|
|
foreach ( var_2 in level.agentarray )
|
|
{
|
|
if ( isalive( var_2 ) )
|
|
var_0[var_0.size] = var_2;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
get_alive_enemies()
|
|
{
|
|
var_0 = [];
|
|
var_1 = [];
|
|
var_2 = get_alive_agents();
|
|
|
|
if ( isdefined( level.dlc_get_non_agent_enemies ) )
|
|
var_1 = [[ level.dlc_get_non_agent_enemies ]]();
|
|
|
|
var_0 = common_scripts\utility::array_combine( var_2, var_1 );
|
|
return var_0;
|
|
}
|
|
|
|
get_alive_lurkers()
|
|
{
|
|
var_0 = [];
|
|
|
|
foreach ( var_2 in level.agentarray )
|
|
{
|
|
if ( isalive( var_2 ) && isdefined( var_2.lurker ) )
|
|
var_0[var_0.size] = var_2;
|
|
}
|
|
|
|
return var_0;
|
|
}
|
|
|
|
lurker_listen_trigger( var_0 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "removing_lurkers" );
|
|
self endon( "new_listener" );
|
|
self.cooldown = 0;
|
|
self.spawned_lurker = undefined;
|
|
self.spawn_trigger.reset = 0;
|
|
|
|
for (;;)
|
|
{
|
|
if ( !common_scripts\utility::flag( "lurker_active" ) )
|
|
{
|
|
common_scripts\utility::flag_wait( "lurker_active" );
|
|
self.cooldown = 0;
|
|
}
|
|
|
|
wait( self.cooldown );
|
|
self.cooldown = 0;
|
|
|
|
if ( isdefined( self.spawned_lurker ) && isalive( self.spawned_lurker ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
if ( !self.spawn_trigger.reset )
|
|
wait_for_reset();
|
|
|
|
self.spawn_trigger waittill( "trigger", var_1 );
|
|
self.spawn_trigger.reset = 0;
|
|
|
|
if ( get_alive_agents().size >= get_alive_lurkers().size )
|
|
{
|
|
while ( get_alive_agents().size >= level.max_lurker_population )
|
|
{
|
|
remove_farthest_lurker( maps\mp\alien\_utility::get_players() );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
while ( get_alive_lurkers().size >= level.max_lurker_population )
|
|
{
|
|
remove_farthest_lurker( maps\mp\alien\_utility::get_players() );
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
self.cooldown = 10;
|
|
self.spawned_lurker = spawn_lurker( var_0 );
|
|
self.spawned_lurker waittill( "death" );
|
|
}
|
|
}
|
|
|
|
wait_for_reset()
|
|
{
|
|
level endon( "game_ended" );
|
|
level endon( "removing_lurkers" );
|
|
self endon( "new_listener" );
|
|
var_0 = 1;
|
|
|
|
while ( var_0 )
|
|
{
|
|
var_0 = 0;
|
|
|
|
foreach ( var_2 in maps\mp\alien\_utility::get_players() )
|
|
{
|
|
if ( var_2 istouching( self.spawn_trigger ) )
|
|
var_0 = 1;
|
|
}
|
|
|
|
if ( var_0 )
|
|
wait 0.05;
|
|
}
|
|
|
|
self.spawn_trigger.reset = 1;
|
|
}
|
|
|
|
send_away_and_die()
|
|
{
|
|
self endon( "death" );
|
|
self notify( "run_to_death" );
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
set_ignore_enemy();
|
|
self.moveplaybackrate = self.moveplaybackrate * 1.25;
|
|
var_0 = getnodesinradiussorted( self.origin, 1000, 10 );
|
|
self scragentsetgoalnode( var_0[var_0.size - 1] );
|
|
self scragentsetgoalradius( 64 );
|
|
common_scripts\utility::waittill_any_timeout( 5, "goal_reached" );
|
|
clear_ignore_enemy();
|
|
smoke_puff();
|
|
wait 0.2;
|
|
self suicide();
|
|
return 1;
|
|
}
|
|
|
|
set_ignore_enemy()
|
|
{
|
|
maps\mp\alien\_utility::enable_alien_scripted();
|
|
|
|
if ( isdefined( self.enemy ) )
|
|
self.enemy.current_attackers = [];
|
|
}
|
|
|
|
clear_ignore_enemy()
|
|
{
|
|
maps\mp\alien\_utility::disable_alien_scripted();
|
|
|
|
foreach ( var_1 in maps\mp\alien\_utility::get_players() )
|
|
self getenemyinfo( var_1 );
|
|
}
|
|
|
|
smoke_puff()
|
|
{
|
|
playfxontag( level._effect["alien_teleport"], self, "j_jaw" );
|
|
playfxontag( level._effect["alien_teleport"], self, "j_spineupper" );
|
|
playfxontag( level._effect["alien_teleport"], self, "j_mainroot" );
|
|
playfxontag( level._effect["alien_teleport"], self, "j_tail_3" );
|
|
playfxontag( level._effect["alien_teleport_dist"], self, "j_mainroot" );
|
|
}
|
|
|
|
spawn_lurker( var_0 )
|
|
{
|
|
var_1 = self.origin;
|
|
var_2 = ( 0, 0, 0 );
|
|
|
|
if ( isdefined( self.angles ) )
|
|
var_2 = self.angles;
|
|
|
|
var_3 = "lurker";
|
|
var_4 = var_3 + " " + var_0;
|
|
var_5 = spawnalien( var_1, var_2, var_4 );
|
|
return var_5;
|
|
}
|
|
|
|
alien_wave_behavior()
|
|
{
|
|
self endon( "death" );
|
|
|
|
foreach ( var_1 in maps\mp\alien\_utility::get_players() )
|
|
self getenemyinfo( var_1 );
|
|
|
|
if ( isdefined( level.bomb ) && issentient( level.bomb ) )
|
|
self getenemyinfo( level.bomb );
|
|
|
|
self.goalradius = 64;
|
|
self.instandingmelee = 0;
|
|
}
|
|
|
|
alien_lurker_behavior()
|
|
{
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
set_ignore_enemy();
|
|
thread wakeup_to_player_distance();
|
|
thread wakeup_to_player_damage();
|
|
thread walk_patrol_loop();
|
|
self waittill( "woke" );
|
|
clear_ignore_enemy();
|
|
wait 1;
|
|
|
|
if ( self.movemode == "walk" )
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
}
|
|
|
|
wakeup_to_enemy()
|
|
{
|
|
self endon( "woke" );
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
self waittill( "enemy" );
|
|
self notify( "woke" );
|
|
}
|
|
|
|
wakeup_to_player_distance( var_0 )
|
|
{
|
|
self endon( "woke" );
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 512;
|
|
|
|
var_1 = 0;
|
|
|
|
while ( !var_1 )
|
|
{
|
|
foreach ( var_3 in maps\mp\alien\_utility::get_players() )
|
|
{
|
|
if ( distance( var_3.origin, self.origin ) < var_0 )
|
|
{
|
|
var_1 = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
wait 0.25;
|
|
}
|
|
|
|
self notify( "woke" );
|
|
}
|
|
|
|
wakeup_to_player_damage()
|
|
{
|
|
self endon( "woke" );
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_0, var_1 );
|
|
|
|
if ( isdefined( var_1 ) && isalive( var_1 ) && isplayer( var_1 ) )
|
|
break;
|
|
}
|
|
|
|
self notify( "woke" );
|
|
}
|
|
|
|
walk_patrol_loop()
|
|
{
|
|
self endon( "woke" );
|
|
self endon( "death" );
|
|
self endon( "run_to_death" );
|
|
wait 1;
|
|
|
|
if ( isdefined( level.patrol_start_nodes ) )
|
|
{
|
|
var_0 = common_scripts\utility::getclosest( self.origin, level.patrol_start_nodes );
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "walk" );
|
|
|
|
for (;;)
|
|
{
|
|
self scragentsetgoalpos( var_0.origin );
|
|
self scragentsetgoalradius( 32 );
|
|
self waittill( "goal_reached" );
|
|
|
|
if ( isdefined( var_0.script_delay ) )
|
|
wait( var_0.script_delay );
|
|
|
|
var_0 = common_scripts\utility::getstruct( var_0.target, "targetname" );
|
|
}
|
|
}
|
|
}
|
|
|
|
alien_ai_debug_print( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self notify( "new_name_tag" );
|
|
self endon( "new_name_tag" );
|
|
|
|
if ( getdvarint( "alien_debug_director" ) == 1 )
|
|
{
|
|
for (;;)
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
get_available_meteoroid_clip( var_0 )
|
|
{
|
|
foreach ( var_2 in level.meteoroid_clips )
|
|
{
|
|
if ( !isdefined( var_2.used_by ) )
|
|
{
|
|
var_2.used_by = var_0;
|
|
return var_2;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
setup_meteoroid_paths()
|
|
{
|
|
level._effect["vfx_alien_lightning_bolt"] = loadfx( "vfx/gameplay/alien/vfx_alien_lightning_bolt_02" );
|
|
level._effect["vfx_alien_lightning_impact"] = loadfx( "vfx/gameplay/alien/vfx_alien_lightning_impact_debris_01" );
|
|
level.meteoroid_impact_nodes = [];
|
|
level.meteoroid_impact_nodes = common_scripts\utility::getstructarray( "meteoroid_impact", "targetname" );
|
|
level.meteoroid_clips = [];
|
|
level.meteoroid_clips = getentarray( "meteoroid_clip", "targetname" );
|
|
|
|
foreach ( var_1 in level.meteoroid_clips )
|
|
{
|
|
var_1.used_by = undefined;
|
|
var_1.old_origin = var_1.origin;
|
|
}
|
|
|
|
if ( !isdefined( level.meteoroid_impact_nodes ) || level.meteoroid_impact_nodes.size == 0 )
|
|
return;
|
|
|
|
foreach ( var_4 in level.meteoroid_impact_nodes )
|
|
{
|
|
var_4.rocks = [];
|
|
var_4.occupied = 0;
|
|
var_5 = common_scripts\utility::getstructarray( var_4.target, "targetname" );
|
|
|
|
foreach ( var_7 in var_5 )
|
|
{
|
|
if ( !isdefined( var_7.script_noteworthy ) )
|
|
continue;
|
|
|
|
if ( var_7.script_noteworthy == "rocks" )
|
|
var_4.rocks[var_4.rocks.size] = var_7;
|
|
|
|
if ( var_7.script_noteworthy == "meteoroid_final" )
|
|
{
|
|
var_4.meteoroid_final_pos = var_7.origin;
|
|
var_4.meteoroid_final_angles = var_7.angles;
|
|
var_4.meteoroid = var_7;
|
|
var_8 = common_scripts\utility::getstruct( var_7.target, "targetname" );
|
|
|
|
if ( isdefined( var_8 ) )
|
|
{
|
|
var_4.meteoroid_start_pos = var_8.origin;
|
|
var_4.meteoroid_start_angles = var_8.angles;
|
|
var_9 = common_scripts\utility::getstruct( var_8.target, "targetname" );
|
|
|
|
if ( isdefined( var_9 ) )
|
|
{
|
|
var_4.meteoroid_end_pos = var_9.origin;
|
|
var_4.meteoroid_end_angles = var_9.angles;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
get_meteoroid_impact_node()
|
|
{
|
|
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) )
|
|
return get_meteoroid_impact_node_escape();
|
|
|
|
var_0 = get_center_of_players();
|
|
var_1 = 2000;
|
|
var_2 = [];
|
|
|
|
foreach ( var_4 in level.meteoroid_impact_nodes )
|
|
{
|
|
if ( isdefined( var_4.script_noteworthy ) && ( var_4.script_noteworthy == "escape_blocker_meteor" || var_4.script_noteworthy == "escape_meteor" ) )
|
|
continue;
|
|
|
|
if ( distance2d( var_4.origin, var_0 ) > var_1 )
|
|
continue;
|
|
|
|
if ( var_4.occupied == 0 )
|
|
var_2[var_2.size] = var_4;
|
|
}
|
|
|
|
if ( var_2.size > 0 )
|
|
return var_2[randomint( var_2.size )];
|
|
else
|
|
return undefined;
|
|
}
|
|
|
|
get_meteoroid_impact_node_escape()
|
|
{
|
|
var_0 = "level.latest_choke_trig_active not defined during escape sequence";
|
|
var_1 = level.latest_choke_trig_active.choke_loc;
|
|
var_2 = 4000;
|
|
var_3 = [];
|
|
|
|
foreach ( var_5 in level.meteoroid_impact_nodes )
|
|
{
|
|
if ( !isdefined( var_5.script_noteworthy ) || var_5.script_noteworthy != "escape_blocker_meteor" && var_5.script_noteworthy != "escape_meteor" )
|
|
continue;
|
|
|
|
if ( distance2d( var_5.origin, var_1 ) > var_2 )
|
|
continue;
|
|
|
|
if ( var_5.occupied == 0 )
|
|
var_3[var_3.size] = var_5;
|
|
}
|
|
|
|
if ( var_3.size > 0 )
|
|
{
|
|
var_7 = common_scripts\utility::getclosest( var_1, var_3 );
|
|
|
|
if ( isdefined( var_7 ) && isdefined( var_7.script_noteworthy ) && var_7.script_noteworthy == "escape_blocker_meteor" )
|
|
{
|
|
return var_7;
|
|
return;
|
|
}
|
|
|
|
return var_3[randomint( var_3.size )];
|
|
return;
|
|
}
|
|
else
|
|
return undefined;
|
|
}
|
|
|
|
get_center_of_players()
|
|
{
|
|
var_0 = 0;
|
|
var_1 = 0;
|
|
var_2 = 0;
|
|
|
|
foreach ( var_4 in level.players )
|
|
{
|
|
var_0 = var_0 + var_4.origin[0];
|
|
var_1 = var_1 + var_4.origin[1];
|
|
var_2 = var_2 + var_4.origin[2];
|
|
}
|
|
|
|
var_6 = max( 1, level.players.size );
|
|
var_7 = ( var_0 / var_6, var_1 / var_6, var_2 / var_6 );
|
|
return var_7;
|
|
}
|
|
|
|
spawn_alien_meteoroid( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
|
|
if ( !isdefined( level.meteoroid_impact_nodes ) || level.meteoroid_impact_nodes.size == 0 )
|
|
return 0;
|
|
|
|
if ( !isdefined( var_2 ) )
|
|
var_2 = 0;
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_1 = 4;
|
|
|
|
foreach ( var_6 in level.meteoroid_impact_nodes )
|
|
{
|
|
if ( var_6.occupied )
|
|
var_1 = var_1 + 2;
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 60;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 20;
|
|
|
|
var_8 = get_meteoroid_impact_node();
|
|
|
|
if ( !isdefined( var_8 ) )
|
|
return 0;
|
|
|
|
var_9 = get_available_meteoroid_clip( var_8 );
|
|
|
|
if ( !isdefined( var_9 ) )
|
|
return 0;
|
|
|
|
var_8.occupied = 1;
|
|
var_8.meteoroid.ent = spawn( "script_model", var_8.meteoroid.origin );
|
|
var_8.meteoroid.ent setmodel( "mp_ext_alien_meteor" );
|
|
var_10 = var_8.meteoroid_start_pos;
|
|
var_11 = var_8.meteoroid_start_angles;
|
|
var_12 = var_8.meteoroid_final_pos;
|
|
var_13 = var_8.meteoroid_final_angles;
|
|
var_14 = var_8.meteoroid_end_pos;
|
|
var_15 = var_8.meteoroid_end_angles;
|
|
var_16 = 5;
|
|
var_17 = 4;
|
|
var_18 = 3;
|
|
|
|
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) )
|
|
{
|
|
var_16 = 3;
|
|
var_17 = 1;
|
|
var_18 = 2;
|
|
}
|
|
|
|
var_8.meteoroid.ent.origin = var_10;
|
|
var_8.meteoroid.ent.angles = var_11;
|
|
level thread maps\mp\alien\_music_and_dialog::playvoformeteor();
|
|
var_8.meteoroid.ent moveto( var_12, var_16, var_17 );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_minion_spawn_mtr_incoming", var_12 );
|
|
var_8.meteoroid.ent rotatevelocity( ( 0, 360, 0 ), var_16, var_17 );
|
|
|
|
for ( var_19 = 0; var_19 < var_18; var_19++ )
|
|
{
|
|
playfx( level._effect["vfx_alien_lightning_bolt"], var_12 );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_minion_spawn_lightning", var_12 );
|
|
wait( var_16 / var_18 );
|
|
}
|
|
|
|
var_8.meteoroid.ent.origin = var_12;
|
|
var_8.meteoroid.ent.angles = var_13;
|
|
playfx( level._effect["vfx_alien_lightning_impact"], var_8.origin );
|
|
earthquake( 0.75, 1, var_8.origin, 2000 );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_meteor_impact", var_8.origin );
|
|
playrumbleonposition( "grenade_rumble", var_8.origin );
|
|
radiusdamage( var_8.origin, 256, 150, 10 );
|
|
var_9.origin = var_8.origin;
|
|
var_9 disconnectpaths();
|
|
playfx( level._effect["vfx_alien_lightning_bolt"], var_12 );
|
|
spawn_meteoroid_aliens( var_8, var_0, var_1, var_2, var_3, var_4 );
|
|
|
|
if ( common_scripts\utility::flag_exist( "hives_cleared" ) && common_scripts\utility::flag( "hives_cleared" ) && isdefined( var_8.script_noteworthy ) && var_8.script_noteworthy == "escape_blocker_meteor" )
|
|
{
|
|
var_20 = 25;
|
|
var_18 = 3;
|
|
|
|
for ( var_19 = 0; var_19 < var_18; var_19++ )
|
|
{
|
|
playfx( level._effect["vfx_alien_lightning_bolt"], var_12 );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_minion_spawn_lightning", var_12 );
|
|
wait( var_20 / var_18 );
|
|
}
|
|
}
|
|
|
|
playfx( level._effect["vfx_alien_lightning_bolt"], var_12 );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_minion_spawn_lightning", var_12 );
|
|
var_8.meteoroid.ent moveto( var_14, var_16 / 2, var_17 / 2 );
|
|
var_8.meteoroid.ent rotatevelocity( ( 0, 90, 0 ), var_16 / 2, var_17 / 2 );
|
|
playfx( level._effect["queen_ground_spawn"], var_8.origin, ( 0, 0, 1 ) );
|
|
thread maps\mp\_utility::playsoundinspace( "alien_minion_spawn_mtr_sink", var_8.origin );
|
|
earthquake( 0.3, var_16 / 2, var_8.origin, 512 );
|
|
wait( var_16 / 4 );
|
|
wait( var_16 / 4 );
|
|
var_8.meteoroid.ent delete();
|
|
var_9.origin = var_9.old_origin;
|
|
var_9 connectpaths();
|
|
var_9.used_by = undefined;
|
|
var_8.occupied = 0;
|
|
}
|
|
|
|
spawn_meteoroid_aliens( var_0, var_1, var_2, var_3, var_4, var_5 )
|
|
{
|
|
level endon( "nuke_went_off" );
|
|
var_6 = var_0.origin;
|
|
wait 1;
|
|
var_7 = 0;
|
|
var_8 = gettime() + var_5 * 1000.0;
|
|
var_9 = [];
|
|
|
|
for (;;)
|
|
{
|
|
if ( gettime() >= var_8 )
|
|
{
|
|
level notify( "meteor_aliens_spawned", var_9, var_2 );
|
|
return;
|
|
}
|
|
|
|
if ( var_7 >= var_2 && !var_3 )
|
|
{
|
|
level notify( "meteor_aliens_spawned", var_9, var_2 );
|
|
wait 7;
|
|
return;
|
|
}
|
|
|
|
if ( !can_spawn_meteoroid_alien( var_1, var_2 ) )
|
|
{
|
|
wait 0.05;
|
|
continue;
|
|
}
|
|
|
|
var_10 = get_center_of_players();
|
|
var_11 = vectornormalize( var_10 - var_6 );
|
|
var_11 = rotatevector( var_11, ( 0, 120 - randomint( 120 ), 0 ) );
|
|
var_12 = vectortoangles( var_11 );
|
|
var_13 = spawnalien( var_6, var_12, "wave " + var_1 );
|
|
|
|
if ( !isdefined( var_0.script_noteworthy ) || var_0.script_noteworthy != "escape_blocker_meteor" && var_0.script_noteworthy != "escape_meteor" )
|
|
var_13 thread crawl_out( var_6, var_11 );
|
|
|
|
var_9[var_9.size] = var_13;
|
|
var_7++;
|
|
wait( randomfloatrange( 0.05, 0.25 ) );
|
|
wait( 60 / var_4 - 0.15 );
|
|
}
|
|
}
|
|
|
|
can_spawn_meteoroid_alien( var_0, var_1 )
|
|
{
|
|
var_2 = 0;
|
|
|
|
foreach ( var_4 in level.agentarray )
|
|
{
|
|
if ( isalive( var_4 ) )
|
|
{
|
|
if ( var_4 maps\mp\alien\_utility::is_alien_agent() && var_4.alien_type == var_0 )
|
|
var_2++;
|
|
}
|
|
}
|
|
|
|
var_6 = maps\mp\alien\_spawn_director::get_current_agent_count( 1 );
|
|
|
|
if ( var_6 > 17 )
|
|
return 0;
|
|
|
|
if ( var_2 > var_1 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
crawl_out( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
maps\mp\alien\_utility::enable_alien_scripted();
|
|
var_2 = self.moveplaybackrate;
|
|
self.moveplaybackrate = 0.5;
|
|
self scragentsetgoalradius( 4000 );
|
|
self scragentsetanimmode( "anim deltas" );
|
|
self scragentsetorientmode( "face angle abs", self.angles );
|
|
self scragentsetphysicsmode( "noclip" );
|
|
self setorigin( var_0 + vectornormalize( var_1 ) * 64 );
|
|
movetoendonground( "traverse_climb_up", 4 );
|
|
self setanimstate( "traverse_climb_up", 4 );
|
|
var_3 = getanimlength( self getanimentry( "traverse_climb_up", 4 ) );
|
|
wait( var_3 / 2 );
|
|
self scragentsetphysicsmode( "gravity" );
|
|
wait( var_3 / 2 );
|
|
self.moveplaybackrate = var_2;
|
|
clear_ignore_enemy();
|
|
var_4 = self.health;
|
|
var_5 = self.moveplaybackrate;
|
|
var_6 = self.animplaybackrate;
|
|
|
|
while ( self.health > var_4 * 0.95 )
|
|
{
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "walk" );
|
|
self.moveplaybackrate = 1.75;
|
|
self.animplaybackrate = 1.75;
|
|
wait 0.05;
|
|
}
|
|
|
|
maps\mp\agents\alien\_alien_think::set_alien_movemode( "run" );
|
|
self.moveplaybackrate = var_5;
|
|
self.animplaybackrate = var_6;
|
|
}
|
|
|
|
movetoendonground( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = 2;
|
|
var_5 = 60;
|
|
var_6 = 32;
|
|
var_7 = self getanimentry( var_0, var_1 );
|
|
var_8 = getanimlength( var_7 );
|
|
var_9 = getmovedelta( var_7, 0, 1 );
|
|
var_10 = rotatevector( var_9, self.angles );
|
|
var_11 = self.origin + ( var_10[0], var_10[1], var_5 );
|
|
var_12 = var_11 - ( 0, 0, 2 * var_5 );
|
|
var_13 = self aiphysicstrace( var_11, var_12, var_6, 65 );
|
|
var_14 = var_13 - var_10 + ( 0, 0, var_4 );
|
|
self setorigin( var_14 );
|
|
playfx( level._effect["drone_ground_spawn"], ( self.origin[0], self.origin[1], var_13[2] ), ( 0, 0, 1 ) );
|
|
debug_line( var_11, var_13, ( 1, 0, 0 ), 30 );
|
|
debug_origin( var_13, 4, ( 1, 0, 0 ), 30 );
|
|
debug_origin( self.origin + var_10, 4, ( 1, 1, 1 ), 30 );
|
|
debug_line( self.origin, self.origin + var_10, ( 1, 1, 1 ), 30 );
|
|
}
|
|
|
|
debug_origin( var_0, var_1, var_2, var_3 )
|
|
{
|
|
|
|
}
|
|
|
|
debug_line( var_0, var_1, var_2, var_3 )
|
|
{
|
|
|
|
}
|
|
|
|
draw_line( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( getdvarint( "alien_debug_director" ) > 0 )
|
|
{
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
for ( var_4 = 0; var_4 < var_3; var_4++ )
|
|
wait 0.05;
|
|
}
|
|
else
|
|
{
|
|
for (;;)
|
|
wait 0.05;
|
|
}
|
|
}
|
|
}
|
|
|
|
get_cycles( var_0 )
|
|
{
|
|
return level.strongholds[var_0].cycles;
|
|
}
|
|
|
|
is_cycle_repeated( var_0, var_1 )
|
|
{
|
|
var_2 = get_cycles( var_0 );
|
|
return var_2[var_1].repeat;
|
|
}
|
|
|
|
get_waves( var_0, var_1 )
|
|
{
|
|
var_2 = get_cycles( var_0 );
|
|
return var_2[var_1].waves;
|
|
}
|
|
|
|
get_current_cycle()
|
|
{
|
|
return level.alien_wave_status["cycle"];
|
|
}
|
|
|
|
get_current_wave()
|
|
{
|
|
return level.alien_wave_status["wave"];
|
|
}
|
|
|
|
use_spawn_director()
|
|
{
|
|
if ( isdefined( level.use_spawn_director ) && level.use_spawn_director == 1 )
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
encounter_cycle_spawn( var_0, var_1 )
|
|
{
|
|
level endon( "game_ended" );
|
|
level.current_cycle_started_by_timeout = undefined;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
level endon( var_1 );
|
|
|
|
if ( !isdefined( level.cycle_count ) )
|
|
level.cycle_count = init_cycle_count();
|
|
|
|
var_2 = get_cycle_spawn_delay();
|
|
var_3 = undefined;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_3 = level common_scripts\utility::waittill_any_timeout( var_2, var_0 );
|
|
else
|
|
wait( var_2 );
|
|
|
|
if ( isdefined( var_3 ) && var_3 == "timeout" )
|
|
level.current_cycle_started_by_timeout = 1;
|
|
|
|
var_4 = level.cycle_count;
|
|
|
|
if ( isdefined( level.get_custom_cycle_func ) )
|
|
var_4 = [[ level.get_custom_cycle_func ]]();
|
|
|
|
maps\mp\alien\_spawn_director::start_cycle( var_4 );
|
|
level.cycle_count++;
|
|
}
|
|
|
|
init_cycle_count()
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
get_cycle_spawn_delay()
|
|
{
|
|
var_0 = get_extra_spawn_delay();
|
|
return level.cycle_data.cycle_delay_times[level.cycle_count] + var_0;
|
|
}
|
|
|
|
get_extra_spawn_delay()
|
|
{
|
|
if ( maps\mp\alien\_utility::is_chaos_mode() )
|
|
return 0;
|
|
else
|
|
return maps\mp\agents\_agent_utility::getnumactiveagents() * 3.0;
|
|
}
|