// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool main() { precachemodel( "grenade_bag" ); createthreatbiasgroup( "allies" ); createthreatbiasgroup( "axis" ); createthreatbiasgroup( "team3" ); createthreatbiasgroup( "civilian" ); maps\_anim::addnotetrack_customfunction( "generic", "rappel_pushoff_initial_npc", maps\_utility::enable_achievement_harder_they_fall_guy ); maps\_anim::addnotetrack_customfunction( "generic", "ps_rappel_pushoff_initial_npc", maps\_utility::enable_achievement_harder_they_fall_guy ); maps\_anim::addnotetrack_customfunction( "generic", "feet_on_ground", maps\_utility::disable_achievement_harder_they_fall_guy ); maps\_anim::addnotetrack_customfunction( "generic", "ps_rappel_clipout_npc", maps\_utility::disable_achievement_harder_they_fall_guy ); foreach ( var_1 in level.players ) var_1 setthreatbiasgroup( "allies" ); level._nextcoverprint = 0; level._ai_group = []; level.killedaxis = 0; level.ffpoints = 0; level.missionfailed = 0; level.gather_delay = []; level.smoke_thrown = []; if ( !isdefined( level.deathflags ) ) level.deathflags = []; level.spawner_number = 0; level.go_to_node_arrays = []; if ( !isdefined( level.subclass_spawn_functions ) ) level.subclass_spawn_functions = []; level.subclass_spawn_functions["regular"] = ::subclass_regular; level.subclass_spawn_functions["elite"] = ::subclass_elite; level.team_specific_spawn_functions = []; level.team_specific_spawn_functions["axis"] = ::spawn_team_axis; level.team_specific_spawn_functions["allies"] = ::spawn_team_allies; level.team_specific_spawn_functions["team3"] = ::spawn_team_team3; level.team_specific_spawn_functions["neutral"] = ::spawn_team_neutral; level.next_health_drop_time = 0; level.guys_to_die_before_next_health_drop = randomintrange( 1, 4 ); if ( !isdefined( level.default_goalradius ) ) level.default_goalradius = 2048; if ( !isdefined( level.default_goalheight ) ) level.default_goalheight = 512; level.portable_mg_gun_tag = "J_Shoulder_RI"; level.mg42_hide_distance = 1024; if ( !isdefined( level.maxfriendlies ) ) level.maxfriendlies = 11; level._max_script_health = 0; var_3 = getaispeciesarray(); common_scripts\utility::array_thread( var_3, ::living_ai_prethink ); level.ai_classname_in_level = []; level.drone_paths = []; var_4 = getspawnerarray(); for ( var_5 = 0; var_5 < var_4.size; var_5++ ) var_4[var_5] thread spawn_prethink(); level.drone_paths = undefined; thread process_deathflags(); common_scripts\utility::array_thread( var_3, ::spawn_think ); level.ai_classname_in_level_keys = getarraykeys( level.ai_classname_in_level ); for ( var_5 = 0; var_5 < level.ai_classname_in_level_keys.size; var_5++ ) { var_6 = tolower( level.ai_classname_in_level_keys[var_5] ); if ( !issubstr( var_6, "panzerfaust3" ) && !issubstr( var_6, "rpg" ) ) continue; precacheitem( "panzerfaust3_player" ); break; } level.ai_classname_in_level_keys = undefined; } aitype_check() { } check_script_char_group_ratio( var_0 ) { if ( var_0.size <= 16 ) return; var_1 = 0; var_2 = 0; for ( var_3 = 0; var_3 < var_0.size; var_3++ ) { if ( !var_0[var_3].team != "axis" ) continue; var_1++; if ( !var_0[var_3] has_char_group() ) continue; var_2++; } } has_char_group() { if ( isdefined( self.script_char_group ) ) return 1; return isdefined( self.script_char_index ); } process_deathflags() { foreach ( var_2, var_1 in level.deathflags ) { if ( !isdefined( level.flag[var_2] ) ) common_scripts\utility::flag_init( var_2 ); } } spawn_guys_until_death_or_no_count() { self endon( "death" ); for (;;) { if ( self.count > 0 ) self waittill( "spawned" ); waittillframeend; if ( !self.count ) return; } } ai_deathflag() { level.deathflags[self.script_deathflag]["ai"][self.unique_id] = self; var_0 = self.unique_id; var_1 = self.script_deathflag; if ( isdefined( self.script_deathflag_longdeath ) ) waittilldeathorpaindeath(); else self waittill( "death" ); level.deathflags[var_1]["ai"][var_0] = undefined; update_deathflag( var_1 ); } vehicle_deathflag() { var_0 = self.unique_id; var_1 = self.script_deathflag; if ( !isdefined( level.deathflags ) || !isdefined( level.deathflags[self.script_deathflag] ) ) { waittillframeend; if ( !isdefined( self ) ) return; } level.deathflags[var_1]["vehicles"][var_0] = self; self waittill( "death" ); level.deathflags[var_1]["vehicles"][var_0] = undefined; update_deathflag( var_1 ); } spawner_deathflag() { level.deathflags[self.script_deathflag] = []; waittillframeend; if ( !isdefined( self ) || self.count == 0 ) return; self.spawner_number = level.spawner_number; level.spawner_number++; level.deathflags[self.script_deathflag]["spawners"][self.spawner_number] = self; var_0 = self.script_deathflag; var_1 = self.spawner_number; spawn_guys_until_death_or_no_count(); level.deathflags[var_0]["spawners"][var_1] = undefined; update_deathflag( var_0 ); } vehicle_spawner_deathflag() { level.deathflags[self.script_deathflag] = []; waittillframeend; if ( !isdefined( self ) ) return; self.spawner_number = level.spawner_number; level.spawner_number++; level.deathflags[self.script_deathflag]["vehicle_spawners"][self.spawner_number] = self; var_0 = self.script_deathflag; var_1 = self.spawner_number; spawn_guys_until_death_or_no_count(); level.deathflags[var_0]["vehicle_spawners"][var_1] = undefined; update_deathflag( var_0 ); } update_deathflag( var_0 ) { level notify( "updating_deathflag_" + var_0 ); level endon( "updating_deathflag_" + var_0 ); waittillframeend; foreach ( var_3, var_2 in level.deathflags[var_0] ) { if ( getarraykeys( var_2 ).size > 0 ) return; } common_scripts\utility::flag_set( var_0 ); } outdoor_think( var_0 ) { var_0 endon( "death" ); for (;;) { var_0 waittill( "trigger", var_1 ); if ( !isai( var_1 ) ) continue; var_1 thread maps\_utility::ignore_triggers( 0.15 ); var_1 maps\_utility::disable_cqbwalk(); var_1.wantshotgun = 0; } } indoor_think( var_0 ) { var_0 endon( "death" ); for (;;) { var_0 waittill( "trigger", var_1 ); if ( !isai( var_1 ) ) continue; var_1 thread maps\_utility::ignore_triggers( 0.15 ); var_1 maps\_utility::enable_cqbwalk(); var_1.wantshotgun = 1; } } doautospawn( var_0 ) { var_0 endon( "death" ); self endon( "death" ); for (;;) { self waittill( "trigger" ); if ( !var_0.count ) return; if ( self.target != var_0.targetname ) return; if ( isdefined( var_0.triggerunlocked ) ) return; var_1 = var_0 maps\_utility::spawn_ai(); if ( maps\_utility::spawn_failed( var_1 ) ) var_0 notify( "spawn_failed" ); if ( isdefined( self.wait ) && self.wait > 0 ) wait( self.wait ); } } trigger_spawner( var_0 ) { var_1 = var_0.random_killspawner; var_2 = var_0.target; var_0 waittill( "trigger" ); var_0 maps\_utility::script_delay(); if ( isdefined( var_1 ) ) waittillframeend; var_3 = getentarray( var_2, "targetname" ); foreach ( var_5 in var_3 ) { if ( var_5.code_classname == "script_vehicle" ) { if ( isdefined( var_5.script_moveoverride ) && var_5.script_moveoverride == 1 || !isdefined( var_5.target ) ) thread maps\_vehicle::vehicle_spawn( var_5 ); else var_5 thread maps\_vehicle::spawn_vehicle_and_gopath(); continue; } var_5 thread trigger_spawner_spawns_guys(); } if ( isdefined( level.spawn_pool_enabled ) ) trigger_pool_spawners( var_2 ); } trigger_pool_spawners( var_0 ) { var_1 = common_scripts\utility::getstructarray( var_0, "targetname" ); if ( getentarray( var_0, "target" ).size <= 1 ) maps\_utility::deletestructarray_ref( var_1 ); var_2 = get_pool_spawners_from_structarray( var_1 ); common_scripts\utility::array_thread( var_2, ::trigger_spawner_spawns_guys ); } get_pool_spawners_from_structarray( var_0 ) { var_1 = []; var_2 = []; foreach ( var_4 in var_0 ) { if ( !isdefined( var_4.script_spawn_pool ) ) continue; if ( !isdefined( var_2[var_4.script_spawn_pool] ) ) var_2[var_4.script_spawn_pool] = []; var_2[var_4.script_spawn_pool][var_2[var_4.script_spawn_pool].size] = var_4; } foreach ( var_7 in var_2 ) { foreach ( var_4 in var_7 ) { var_9 = get_spawner_from_pool( var_4, var_7.size ); var_1[var_1.size] = var_9; } } return var_1; } get_spawner_from_pool( var_0, var_1 ) { if ( !isdefined( level.spawner_pool ) ) level.spawner_pool = []; if ( !isdefined( level.spawner_pool[var_0.script_spawn_pool] ) ) level.spawner_pool[var_0.script_spawn_pool] = create_new_spawner_pool( var_0.script_spawn_pool ); var_2 = level.spawner_pool[var_0.script_spawn_pool]; var_3 = var_2.pool[var_2.poolindex]; var_2.poolindex++; var_2.poolindex = var_2.poolindex % var_2.pool.size; var_3.origin = var_0.origin; if ( isdefined( var_0.angles ) ) var_3.angles = var_0.angles; else if ( isdefined( var_0.target ) ) { var_4 = getnode( var_0.target, "targetname" ); if ( isdefined( var_4 ) ) var_3.angles = vectortoangles( var_4.origin - var_3.origin ); } if ( isdefined( level.spawn_pool_copy_function ) ) var_3 [[ level.spawn_pool_copy_function ]]( var_0 ); if ( isdefined( var_0.target ) ) var_3.target = var_0.target; var_3.count = 1; return var_3; } create_new_spawner_pool( var_0 ) { var_1 = getspawnerarray(); var_2 = spawnstruct(); var_3 = []; foreach ( var_5 in var_1 ) { if ( !isdefined( var_5.script_spawn_pool ) ) continue; if ( var_5.script_spawn_pool != var_0 ) continue; var_3[var_3.size] = var_5; } var_2.poolindex = 0; var_2.pool = var_3; return var_2; } trigger_spawner_spawns_guys() { self endon( "death" ); maps\_utility::script_delay(); if ( !isdefined( self ) ) return undefined; if ( isdefined( self.script_drone ) ) { var_0 = maps\_utility::dronespawn( self ); return undefined; } else if ( !issubstr( self.classname, "actor" ) ) return undefined; var_1 = isdefined( self.script_stealth ) && common_scripts\utility::flag( "_stealth_enabled" ) && !common_scripts\utility::flag( "_stealth_spotted" ); if ( isdefined( self.script_forcespawn ) ) var_0 = self stalingradspawn( var_1 ); else var_0 = self dospawn( var_1 ); if ( !maps\_utility::spawn_failed( var_0 ) ) { if ( isdefined( self.script_combatbehavior ) ) { if ( self.script_combatbehavior == "heat" ) var_0 maps\_utility::enable_heat_behavior(); if ( self.script_combatbehavior == "cqb" ) var_0 maps\_utility::enable_cqbwalk(); } } return var_0; } trigger_spawner_reinforcement( var_0 ) { var_1 = var_0.target; var_2 = 0; var_3 = getentarray( var_1, "targetname" ); foreach ( var_5 in var_3 ) { if ( !isdefined( var_5.target ) ) continue; var_6 = getent( var_5.target, "targetname" ); if ( !isdefined( var_6 ) ) { if ( !isdefined( var_5.script_linkto ) ) continue; var_6 = var_5 common_scripts\utility::get_linked_ent(); if ( !isdefined( var_6 ) ) continue; if ( !isspawner( var_6 ) ) continue; } var_2 = 1; break; } var_0 waittill( "trigger" ); var_0 maps\_utility::script_delay(); var_3 = getentarray( var_1, "targetname" ); foreach ( var_5 in var_3 ) var_5 thread trigger_reinforcement_spawn_guys(); } trigger_reinforcement_spawn_guys() { var_0 = trigger_reinforcement_get_reinforcement_spawner(); var_1 = trigger_spawner_spawns_guys(); if ( !isdefined( var_1 ) ) { self delete(); if ( isdefined( var_0 ) ) { var_1 = var_0 trigger_spawner_spawns_guys(); var_0 delete(); if ( !isdefined( var_1 ) ) return; } else return; } if ( !isdefined( var_0 ) ) return; var_1 waittill( "death" ); if ( !isdefined( var_0 ) ) return; if ( !isdefined( var_0.count ) ) var_0.count = 1; for (;;) { if ( !isdefined( var_0 ) ) break; var_2 = var_0 thread trigger_spawner_spawns_guys(); if ( !isdefined( var_2 ) ) { var_0 delete(); break; } var_2 thread reincrement_count_if_deleted( var_0 ); var_2 waittill( "death", var_3 ); if ( !player_saw_kill( var_2, var_3 ) ) { if ( !isdefined( var_0 ) ) break; var_0.count++; } if ( !isdefined( var_2 ) ) continue; if ( !isdefined( var_0 ) ) break; if ( !isdefined( var_0.count ) ) break; if ( var_0.count <= 0 ) break; if ( !maps\_utility::script_wait() ) wait( randomfloatrange( 1, 3 ) ); } if ( isdefined( var_0 ) ) var_0 delete(); } trigger_reinforcement_get_reinforcement_spawner() { if ( isdefined( self.target ) ) { var_0 = getent( self.target, "targetname" ); if ( isdefined( var_0 ) && isspawner( var_0 ) ) return var_0; } if ( isdefined( self.script_linkto ) ) { var_0 = common_scripts\utility::get_linked_ent(); if ( isdefined( var_0 ) && isspawner( var_0 ) ) return var_0; } return undefined; } flood_spawner_scripted( var_0 ) { common_scripts\utility::array_thread( var_0, ::flood_spawner_init ); common_scripts\utility::array_thread( var_0, ::flood_spawner_think ); } reincrement_count_if_deleted( var_0 ) { var_0 endon( "death" ); if ( isdefined( self.script_force_count ) ) { if ( self.script_force_count ) return; } self waittill( "death" ); if ( !isdefined( self ) ) var_0.count++; } delete_start( var_0 ) { for ( var_1 = 0; var_1 < 2; var_1++ ) { switch ( var_1 ) { case 0: var_2 = "axis"; break; default: var_2 = "allies"; break; } var_3 = getentarray( var_2, "team" ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) { if ( isdefined( var_3[var_4].script_start ) ) { if ( var_3[var_4].script_start == var_0 ) var_3[var_4] thread delete_me(); } } } } kill_trigger( var_0 ) { if ( !isdefined( var_0 ) ) return; if ( isdefined( var_0.targetname ) && var_0.targetname != "flood_spawner" ) return; var_0 delete(); } random_killspawner( var_0 ) { var_0 endon( "death" ); var_1 = var_0.script_random_killspawner; waittillframeend; if ( !isdefined( level.killspawn_groups[var_1] ) ) return; var_0 waittill( "trigger" ); cull_spawners_from_killspawner( var_1 ); } cull_spawners_from_killspawner( var_0 ) { if ( !isdefined( level.killspawn_groups[var_0] ) ) return; var_1 = level.killspawn_groups[var_0]; var_2 = getarraykeys( var_1 ); if ( var_2.size <= 1 ) return; var_3 = common_scripts\utility::random( var_2 ); var_1[var_3] = undefined; foreach ( var_9, var_5 in var_1 ) { foreach ( var_8, var_7 in var_5 ) { if ( isdefined( var_7 ) ) var_7 delete(); } level.killspawn_groups[var_0][var_9] = undefined; } } killspawner( var_0 ) { var_1 = getspawnerarray(); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { if ( isdefined( var_1[var_2].script_killspawner ) && var_0 == var_1[var_2].script_killspawner ) var_1[var_2] delete(); } } kill_spawner( var_0 ) { var_1 = var_0.script_killspawner; var_0 waittill( "trigger" ); waittillframeend; waittillframeend; killspawner( var_1 ); kill_trigger( var_0 ); } empty_spawner( var_0 ) { var_1 = var_0.script_emptyspawner; var_0 waittill( "trigger" ); var_2 = getspawnerarray(); for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { if ( !isdefined( var_2[var_3].script_emptyspawner ) ) continue; if ( var_1 != var_2[var_3].script_emptyspawner ) continue; if ( isdefined( var_2[var_3].script_flanker ) ) level notify( "stop_flanker_behavior" + var_2[var_3].script_flanker ); var_2[var_3] maps\_utility::set_count( 0 ); var_2[var_3] notify( "emptied spawner" ); } var_0 notify( "deleted spawners" ); } kill_spawnernum( var_0 ) { var_1 = getspawnerarray(); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { if ( !isdefined( var_1[var_2].script_killspawner ) ) continue; if ( var_0 != var_1[var_2].script_killspawner ) continue; var_1[var_2] delete(); } } trigger_spawn( var_0 ) { } spawn_grenade( var_0, var_1 ) { if ( !isdefined( level.grenade_cache ) || !isdefined( level.grenade_cache[var_1] ) ) { level.grenade_cache_index[var_1] = 0; level.grenade_cache[var_1] = []; } var_2 = level.grenade_cache_index[var_1]; var_3 = level.grenade_cache[var_1][var_2]; if ( isdefined( var_3 ) ) var_3 delete(); var_3 = spawn( "weapon_fraggrenade", var_0 ); level.grenade_cache[var_1][var_2] = var_3; level.grenade_cache_index[var_1] = ( var_2 + 1 ) % 16; return var_3; } waittilldeathorpaindeath() { self endon( "death" ); self waittill( "pain_death" ); } drop_gear() { var_0 = self.team; waittilldeathorpaindeath(); if ( !isdefined( self ) ) return; if ( isdefined( self.nodrop ) ) return; self.ignoreforfixednodesafecheck = 1; if ( self.grenadeammo <= 0 ) return; level.nextgrenadedrop--; if ( level.nextgrenadedrop > 0 ) return; level.nextgrenadedrop = 2 + randomint( 2 ); var_1 = 25; var_2 = 12; var_3 = self.origin + ( randomint( var_1 ) - var_2, randomint( var_1 ) - var_2, 2 ) + ( 0, 0, 42 ); var_4 = ( 0, randomint( 360 ), 90 ); thread spawn_grenade_bag( var_3, var_4, self.team ); } spawn_grenade_bag( var_0, var_1, var_2 ) { var_3 = spawn_grenade( var_0, var_2 ); var_3 setmodel( "grenade_bag" ); var_3.angles = var_1; var_3 hide(); wait 0.7; if ( !isdefined( var_3 ) ) return; var_3 show(); } dronespawner_init() { maps\_drone_base::drone_init_path(); } empty() { } spawn_prethink() { level.ai_classname_in_level[self.classname] = 1; if ( isdefined( self.script_difficulty ) ) { switch ( self.script_difficulty ) { case "easy": if ( level.gameskill > 1 ) maps\_utility::set_count( 0 ); break; case "hard": if ( level.gameskill < 2 ) maps\_utility::set_count( 0 ); break; } } if ( isdefined( self.script_drone ) ) thread dronespawner_init(); if ( isdefined( self.script_aigroup ) ) { var_0 = self.script_aigroup; if ( !isdefined( level._ai_group[var_0] ) ) aigroup_create( var_0 ); thread aigroup_spawnerthink( level._ai_group[var_0] ); } if ( isdefined( self.script_delete ) ) { var_1 = 0; if ( isdefined( level._ai_delete ) ) { if ( isdefined( level._ai_delete[self.script_delete] ) ) var_1 = level._ai_delete[self.script_delete].size; } level._ai_delete[self.script_delete][var_1] = self; } if ( isdefined( self.script_health ) ) { if ( self.script_health > level._max_script_health ) level._max_script_health = self.script_health; var_1 = 0; if ( isdefined( level._ai_health ) ) { if ( isdefined( level._ai_health[self.script_health] ) ) var_1 = level._ai_health[self.script_health].size; } level._ai_health[self.script_health][var_1] = self; } if ( isdefined( self.script_deathflag ) ) thread spawner_deathflag(); if ( isdefined( self.target ) ) crawl_through_targets_to_init_flags(); if ( isdefined( self.script_spawngroup ) ) add_to_spawngroup(); if ( isdefined( self.script_random_killspawner ) ) add_random_killspawner_to_spawngroup(); if ( !isdefined( self.spawn_functions ) ) self.spawn_functions = []; for (;;) { var_2 = undefined; self waittill( "spawned", var_2 ); if ( !isalive( var_2 ) ) continue; if ( isdefined( level.spawnercallbackthread ) ) self thread [[ level.spawnercallbackthread ]]( var_2 ); if ( isdefined( self.script_delete ) ) { for ( var_3 = 0; var_3 < level._ai_delete[self.script_delete].size; var_3++ ) { if ( level._ai_delete[self.script_delete][var_3] != self ) level._ai_delete[self.script_delete][var_3] delete(); } } var_2.spawn_funcs = self.spawn_functions; var_2.spawner = self; if ( isdefined( self.targetname ) ) { var_2 thread spawn_think( self.targetname ); continue; } var_2 thread spawn_think(); } } spawn_think( var_0 ) { level.ai_classname_in_level[self.classname] = 1; spawn_think_action( var_0 ); self endon( "death" ); if ( shouldnt_spawn_because_of_script_difficulty() ) self delete(); thread run_spawn_functions(); self.finished_spawning = 1; self notify( "finished spawning" ); if ( self.team == "allies" && !isdefined( self.script_nofriendlywave ) ) thread friendlydeath_thread(); } shouldnt_spawn_because_of_script_difficulty() { if ( !isdefined( self.script_difficulty ) ) return 0; var_0 = 0; switch ( self.script_difficulty ) { case "easy": if ( level.gameskill > 1 ) var_0 = 1; break; case "hard": if ( level.gameskill < 2 ) var_0 = 1; break; } return var_0; } run_spawn_functions() { if ( !isdefined( self.spawn_funcs ) ) { self.spawner = undefined; return; } for ( var_0 = 0; var_0 < self.spawn_funcs.size; var_0++ ) { var_1 = self.spawn_funcs[var_0]; if ( isdefined( var_1["param5"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"], var_1["param4"], var_1["param5"] ); continue; } if ( isdefined( var_1["param4"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"], var_1["param4"] ); continue; } if ( isdefined( var_1["param3"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"] ); continue; } if ( isdefined( var_1["param2"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"] ); continue; } if ( isdefined( var_1["param1"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"] ); continue; } thread [[ var_1["function"] ]](); } var_2 = common_scripts\utility::ter_op( isdefined( level.vehicle_spawn_functions_enable ) && level.vehicle_spawn_functions_enable && self.code_classname == "script_vehicle", self.script_team, self.team ); if ( isdefined( var_2 ) ) { for ( var_0 = 0; var_0 < level.spawn_funcs[var_2].size; var_0++ ) { var_1 = level.spawn_funcs[var_2][var_0]; if ( isdefined( var_1["param5"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"], var_1["param4"], var_1["param5"] ); continue; } if ( isdefined( var_1["param4"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"], var_1["param4"] ); continue; } if ( isdefined( var_1["param3"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"], var_1["param3"] ); continue; } if ( isdefined( var_1["param2"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"], var_1["param2"] ); continue; } if ( isdefined( var_1["param1"] ) ) { thread [[ var_1["function"] ]]( var_1["param1"] ); continue; } thread [[ var_1["function"] ]](); } } self.spawn_funcs = undefined; self.spawner = undefined; } specops_think() { if ( !maps\_utility::is_specialop() ) return; maps\_utility::add_damage_function( ::specops_dmg ); thread multikill_monitor(); } multikill_monitor() { self waittill( "death", var_0, var_1, var_2 ); if ( !isdefined( self ) ) return; if ( !self isbadguy() ) return; if ( !isdefined( var_0 ) ) return; if ( !isplayer( var_0 ) ) return; if ( !isdefined( var_2 ) ) { var_0.multikill_count = undefined; return; } if ( !isdefined( var_0.multikill_count ) ) var_0.multikill_count = 1; else var_0.multikill_count++; if ( maps\_utility::is_survival() && var_0.multikill_count >= 4 ) var_0 notify( "sur_ch_quadkill" ); waittillframeend; var_0.multikill_count = undefined; } specops_dmg( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { if ( !isdefined( self ) ) return; if ( isdefined( var_1 ) && isplayer( var_1 ) ) { self.last_dmg_player = var_1; self.last_dmg_type = var_4; } } deathfunctions() { self waittill( "death", var_0, var_1, var_2 ); level notify( "ai_killed", self ); if ( !isdefined( self ) ) return; if ( isdefined( var_0 ) ) { if ( self.team == "axis" || self.team == "team3" ) { var_3 = undefined; if ( isdefined( var_0.attacker ) ) { if ( isdefined( var_0.issentrygun ) && var_0.issentrygun ) var_3 = "sentry"; if ( isdefined( var_0.destructible_type ) ) var_3 = "destructible"; var_0 = var_0.attacker; } else if ( isdefined( var_0.owner ) ) { if ( isai( var_0 ) && isplayer( var_0.owner ) ) var_3 = "friendly"; var_0 = var_0.owner; } else if ( isdefined( var_0.damageowner ) ) { if ( isdefined( var_0.destructible_type ) ) var_3 = "destructible"; var_0 = var_0.damageowner; } var_4 = 0; if ( isplayer( var_0 ) ) var_4 = 1; if ( isdefined( level.pmc_match ) && level.pmc_match ) var_4 = 1; if ( var_4 ) var_0 maps\_player_stats::register_kill( self, var_1, var_2, var_3 ); } } for ( var_5 = 0; var_5 < self.deathfuncs.size; var_5++ ) { var_6 = self.deathfuncs[var_5]; switch ( var_6["params"] ) { case 0: [[ var_6["func"] ]]( var_0 ); break; case 1: [[ var_6["func"] ]]( var_0, var_6["param1"] ); break; case 2: [[ var_6["func"] ]]( var_0, var_6["param1"], var_6["param2"] ); break; case 3: [[ var_6["func"] ]]( var_0, var_6["param1"], var_6["param2"], var_6["param3"] ); break; } } } ai_damage_think() { self.damage_functions = []; for (;;) { self waittill( "damage", var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); if ( isdefined( var_1 ) && isplayer( var_1 ) ) { var_7 = var_1 getcurrentweapon(); if ( isdefined( var_7 ) && maps\_utility::isprimaryweapon( var_7 ) && isdefined( var_4 ) && ( var_4 == "MOD_PISTOL_BULLET" || var_4 == "MOD_RIFLE_BULLET" ) ) var_1 thread maps\_player_stats::register_shot_hit(); } foreach ( var_9 in self.damage_functions ) thread [[ var_9 ]]( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ); if ( !isalive( self ) || self.delayeddeath ) break; } } living_ai_prethink() { if ( isdefined( self.script_deathflag ) ) level.deathflags[self.script_deathflag] = 1; if ( isdefined( self.target ) ) crawl_through_targets_to_init_flags(); } crawl_through_targets_to_init_flags() { var_0 = get_node_funcs_based_on_target(); if ( isdefined( var_0 ) ) { var_1 = var_0["destination"]; var_2 = var_0["get_target_func"]; for ( var_3 = 0; var_3 < var_1.size; var_3++ ) crawl_target_and_init_flags( var_1[var_3], var_2 ); } } spawn_team_allies() { self.usechokepoints = 0; } spawn_team_axis() { if ( isdefined( level.xp_enable ) && level.xp_enable && isdefined( level.xp_ai_func ) ) self thread [[ level.xp_ai_func ]](); if ( self.type == "human" && !isdefined( level.disablegeardrop ) ) thread drop_gear(); maps\_utility::add_damage_function( maps\_gameskill::auto_adjust_enemy_death_detection ); if ( isdefined( self.script_combatmode ) ) self.combatmode = self.script_combatmode; } spawn_team_team3() { spawn_team_axis(); } spawn_team_neutral() { } subclass_elite() { self endon( "death" ); self.elite = 1; self.doorflashchance = 0.5; if ( !isdefined( self.script_accuracy ) ) self.baseaccuracy = 2; self.aggressivemode = 1; if ( maps\_utility::has_shotgun() ) { var_0 = undefined; switch ( level.gameskill ) { case 0: var_0 = 0; break; case 1: var_0 = 2; break; case 2: var_0 = 3; break; case 3: var_0 = 4; break; } if ( level.gameskill > 0 ) { self.grenadeweapon = "flash_grenade"; self.grenadeammo = var_0; } } } subclass_regular() { } pain_resistance( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { self endon( "death" ); if ( self.health <= 0 ) return; if ( var_0 >= self.minpaindamage ) { var_7 = self.minpaindamage; self.minpaindamage = var_7 * 3; wait 5; self.minpaindamage = var_7; } } bullet_resistance( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { if ( !isdefined( self ) || self.health <= 0 ) return; if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) return; if ( !issubstr( var_4, "BULLET" ) ) return; var_7 = self.bullet_resistance; if ( var_0 < self.bullet_resistance ) var_7 = var_0; self.health = self.health + var_7; } spawn_think_game_skill_related() { maps\_gameskill::default_door_node_flashbang_frequency(); maps\_gameskill::grenadeawareness(); } ai_lasers() { if ( !isalive( self ) ) return; if ( self.health <= 1 ) return; self laserforceon(); self waittill( "death" ); if ( !isdefined( self ) ) return; self laserforceoff(); } spawn_think_script_inits() { if ( isdefined( self.script_dontshootwhilemoving ) ) self.dontshootwhilemoving = 1; if ( isdefined( self.script_deathflag ) ) thread ai_deathflag(); if ( isdefined( self.script_attackeraccuracy ) ) self.attackeraccuracy = self.script_attackeraccuracy; if ( isdefined( self.script_startrunning ) ) thread start_off_running(); if ( isdefined( self.script_deathtime ) ) thread deathtime(); if ( isdefined( self.script_nosurprise ) ) maps\_utility::disable_surprise(); if ( isdefined( self.script_nobloodpool ) ) self.skipbloodpool = 1; if ( isdefined( self.script_laser ) ) thread ai_lasers(); if ( isdefined( self.script_danger_react ) ) { var_0 = self.script_danger_react; if ( var_0 == 1 ) var_0 = 8; maps\_utility::enable_danger_react( var_0 ); } if ( isdefined( self.script_faceenemydist ) ) self.maxfaceenemydist = self.script_faceenemydist; else self.maxfaceenemydist = 512; if ( isdefined( self.script_forcecolor ) ) maps\_utility::set_force_color( self.script_forcecolor ); if ( isdefined( self.dontdropweapon ) ) self.dropweapon = 0; if ( isdefined( self.script_fixednode ) ) self.fixednode = self.script_fixednode == 1; else self.fixednode = self.team == "allies"; self.providecoveringfire = self.team == "allies" && self.fixednode; if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "mgpair" ) thread maps\_mg_penetration::create_mg_team(); if ( isdefined( self.script_goalvolume ) && !( isdefined( self.script_moveoverride ) && self.script_moveoverride == 1 || isdefined( self.script_stealth ) ) ) thread set_goal_volume(); if ( isdefined( self.script_threatbiasgroup ) ) self setthreatbiasgroup( self.script_threatbiasgroup ); else if ( self.team == "neutral" ) self setthreatbiasgroup( "civilian" ); else self setthreatbiasgroup( self.team ); if ( isdefined( self.script_bcdialog ) ) maps\_utility::set_battlechatter( self.script_bcdialog ); if ( isdefined( self.script_accuracy ) ) self.baseaccuracy = self.script_accuracy; if ( isdefined( self.script_ignoreme ) ) self.ignoreme = 1; if ( isdefined( self.script_ignore_suppression ) ) self.ignoresuppression = 1; if ( isdefined( self.script_ignoreall ) ) { self.ignoreall = 1; self clearenemy(); } if ( isdefined( self.script_sightrange ) ) self.maxsightdistsqrd = self.script_sightrange; if ( isdefined( self.script_favoriteenemy ) ) { if ( self.script_favoriteenemy == "player" ) { self.favoriteenemy = level.player; level.player.targetname = "player"; } } if ( isdefined( self.script_fightdist ) ) self.pathenemyfightdist = self.script_fightdist; if ( isdefined( self.script_maxdist ) ) self.pathenemylookahead = self.script_maxdist; if ( isdefined( self.script_longdeath ) ) self.a.disablelongdeath = 1; if ( isdefined( self.script_diequietly ) ) self.diequietly = 1; if ( isdefined( self.script_flashbangs ) ) { self.grenadeweapon = "flash_grenade"; self.grenadeammo = self.script_flashbangs; } if ( isdefined( self.script_pacifist ) ) self.pacifist = 1; if ( isdefined( self.script_startinghealth ) ) self.health = self.script_startinghealth; if ( isdefined( self.script_nodrop ) ) self.nodrop = self.script_nodrop; } spawn_think_action( var_0 ) { thread ai_damage_think(); thread tanksquish(); thread death_achievements(); thread specops_think(); if ( !isdefined( level.ai_dont_glow_in_thermal ) ) self thermaldrawenable(); self.spawner_number = undefined; if ( !isdefined( self.unique_id ) ) maps\_utility::set_ai_number(); if ( !isdefined( self.deathfuncs ) ) self.deathfuncs = []; thread deathfunctions(); level thread maps\_friendlyfire::friendly_fire_think( self ); self.walkdist = 16; init_reset_ai(); spawn_think_game_skill_related(); spawn_think_script_inits(); [[ level.team_specific_spawn_functions[self.team] ]](); thread [[ level.subclass_spawn_functions[self.subclass] ]](); thread maps\_damagefeedback::monitordamage(); common_scripts\_dynamic_world::ai_init(); set_goal_height_from_settings(); if ( isdefined( self.script_playerseek ) ) { self setgoalentity( level.player ); return; } if ( isdefined( self.script_stealth ) ) { if ( isdefined( self.script_stealth_function ) ) { var_1 = level.stealth_default_func[self.script_stealth_function]; self thread [[ var_1 ]](); } else self thread [[ level.global_callbacks["_spawner_stealth_default"] ]](); } if ( isdefined( self.script_idleanim ) ) { self thread [[ level.global_callbacks["_idle_call_idle_func"] ]](); return; } if ( isdefined( self.script_idlereach ) && !isdefined( self.script_moveoverride ) ) self thread [[ level.global_callbacks["_idle_call_idle_func"] ]](); if ( isdefined( self.script_patroller ) && !isdefined( self.script_moveoverride ) ) { thread maps\_patrol::patrol(); return; } if ( isdefined( self.script_readystand ) && self.script_readystand == 1 ) maps\_utility::enable_readystand(); if ( isdefined( self.script_delayed_playerseek ) ) { if ( !isdefined( self.script_radius ) ) self.goalradius = 800; self setgoalentity( level.player ); level thread delayed_player_seek_think( self ); return; } if ( isdefined( self.used_an_mg42 ) ) return; if ( isdefined( self.script_moveoverride ) && self.script_moveoverride == 1 ) { set_goal_from_settings(); self setgoalpos( self.origin ); return; } if ( !isdefined( self.script_stealth ) ) { } set_goal_from_settings(); if ( isdefined( self.target ) ) thread go_to_node(); } init_reset_ai() { maps\_utility::set_default_pathenemy_settings(); if ( isdefined( self.script_grenades ) ) self.grenadeammo = self.script_grenades; else self.grenadeammo = 3; if ( isdefined( self.primaryweapon ) ) self.noattackeraccuracymod = animscripts\combat_utility::issniper(); if ( !maps\_utility::is_specialop() ) self.neversprintforvariation = 1; } scrub_guy() { if ( self.team == "neutral" ) self setthreatbiasgroup( "civilian" ); else self setthreatbiasgroup( self.team ); init_reset_ai(); self.baseaccuracy = 1; maps\_gameskill::grenadeawareness(); maps\_utility::clear_force_color(); self.interval = 96; self.disablearrivals = undefined; self.ignoreme = 0; self.threatbias = 0; self.pacifist = 0; self.pacifistwait = 20; self.ignorerandombulletdamage = 0; self.pushable = 1; self.script_pushable = 1; self.allowdeath = 0; self.anglelerprate = 540; self.badplaceawareness = 0.75; self.dontavoidplayer = 0; self.drawoncompass = 1; self.dropweapon = 1; self.goalradius = level.default_goalradius; self.goalheight = level.default_goalheight; self.ignoresuppression = 0; self pushplayer( 0 ); if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) maps\_utility::stop_magic_bullet_shield(); maps\_utility::disable_replace_on_death(); self.maxsightdistsqrd = 67108864; self.script_forcegrenade = 0; self.walkdist = 16; maps\_utility::unmake_hero(); self.pushable = 1; self.script_pushable = 1; animscripts\init::set_anim_playback_rate(); self.fixednode = self.team == "allies"; } delayed_player_seek_think( var_0 ) { var_0 endon( "death" ); while ( isalive( var_0 ) ) { if ( var_0.goalradius > 200 ) var_0.goalradius = var_0.goalradius - 200; wait 6; } } flag_turret_for_use( var_0 ) { self endon( "death" ); if ( !self.flagged_for_use ) { var_0.used_an_mg42 = 1; self.flagged_for_use = 1; var_0 waittill( "death" ); self.flagged_for_use = 0; self notify( "get new user" ); } } set_goal_volume() { self endon( "death" ); waittillframeend; if ( isdefined( self.team ) && self.team == "allies" ) self.fixednode = 0; var_0 = level.goalvolumes[self.script_goalvolume]; if ( !isdefined( var_0 ) ) return; if ( isdefined( var_0.target ) ) { var_1 = getnode( var_0.target, "targetname" ); var_2 = getent( var_0.target, "targetname" ); var_3 = common_scripts\utility::getstruct( var_0.target, "targetname" ); var_4 = undefined; if ( isdefined( var_1 ) ) { var_4 = var_1; self setgoalnode( var_4 ); } else if ( isdefined( var_2 ) ) { var_4 = var_2; self setgoalpos( var_4.origin ); } else if ( isdefined( var_3 ) ) { var_4 = var_3; self setgoalpos( var_4.origin ); } if ( isdefined( var_4.radius ) && var_4.radius != 0 ) self.goalradius = var_4.radius; if ( isdefined( var_4.goalheight ) && var_4.goalheight != 0 ) self.goalheight = var_4.goalheight; } if ( isdefined( self.target ) ) self setgoalvolume( var_0 ); else self setgoalvolumeauto( var_0 ); } get_target_ents( var_0 ) { return getentarray( var_0, "targetname" ); } get_target_nodes( var_0 ) { return getnodearray( var_0, "targetname" ); } get_target_structs( var_0 ) { return common_scripts\utility::getstructarray( var_0, "targetname" ); } node_has_radius( var_0 ) { return isdefined( var_0.radius ) && var_0.radius != 0; } go_to_origin( var_0, var_1 ) { go_to_node( var_0, "origin", var_1 ); } go_to_struct( var_0, var_1 ) { go_to_node( var_0, "struct", var_1 ); } go_to_node( var_0, var_1, var_2, var_3, var_4 ) { if ( isdefined( self.used_an_mg42 ) ) return; var_5 = get_node_funcs_based_on_target( var_0, var_1 ); if ( !isdefined( var_5 ) ) { self notify( "reached_path_end" ); return; } go_to_node_using_funcs( var_5["destination"], var_5["get_target_func"], var_5["set_goal_func_quits"], var_2, var_3, var_4 ); } get_least_used_from_array( var_0 ) { if ( var_0.size == 1 ) return var_0[0]; var_1 = var_0[0].targetname; if ( !isdefined( level.go_to_node_arrays[var_1] ) ) level.go_to_node_arrays[var_1] = var_0; var_0 = level.go_to_node_arrays[var_1]; var_2 = var_0[0]; var_3 = []; for ( var_4 = 0; var_4 < var_0.size - 1; var_4++ ) var_3[var_4] = var_0[var_4 + 1]; var_3[var_0.size - 1] = var_0[0]; level.go_to_node_arrays[var_1] = var_3; return var_2; } go_to_node_using_funcs( var_0, var_1, var_2, var_3, var_4, var_5 ) { self notify( "stop_going_to_node" ); self endon( "stop_going_to_node" ); self endon( "death" ); for (;;) { var_0 = get_least_used_from_array( var_0 ); var_6 = var_4; if ( isdefined( var_0.script_requires_player ) ) { if ( var_0.script_requires_player > 1 ) var_6 = var_0.script_requires_player; var_0.script_requires_player = 0; } if ( node_has_radius( var_0 ) ) self.goalradius = var_0.radius; else self.goalradius = level.default_goalradius; if ( isdefined( var_0.height ) ) self.goalheight = var_0.height; else self.goalheight = level.default_goalheight; [[ var_2 ]]( var_0 ); if ( maps\_utility::ent_flag_exist( "_stealth_override_goalpos" ) ) { for (;;) { self waittill( "goal" ); if ( !maps\_utility::ent_flag( "_stealth_override_goalpos" ) ) break; maps\_utility::ent_flag_waitopen( "_stealth_override_goalpos" ); } } else self waittill( "goal" ); var_0 notify( "trigger", self ); if ( isdefined( var_3 ) ) [[ var_3 ]]( var_0 ); if ( isdefined( var_0.script_flag_set ) ) common_scripts\utility::flag_set( var_0.script_flag_set ); if ( isdefined( var_0.script_ent_flag_set ) ) maps\_utility::ent_flag_set( var_0.script_ent_flag_set ); if ( isdefined( var_0.script_flag_clear ) ) common_scripts\utility::flag_clear( var_0.script_flag_clear ); if ( targets_and_uses_turret( var_0 ) ) return 1; var_0 maps\_utility::script_delay(); if ( isdefined( var_0.script_flag_wait ) ) common_scripts\utility::flag_wait( var_0.script_flag_wait ); var_0 maps\_utility::script_wait(); if ( isdefined( var_0.script_delay_post ) ) wait( var_0.script_delay_post ); while ( isdefined( var_0.script_requires_player ) ) { var_0.script_requires_player = 0; if ( go_to_node_wait_for_player( var_0, var_1, var_6 ) ) { var_0.script_requires_player = 1; var_0 notify( "script_requires_player" ); break; } wait 0.1; } if ( isdefined( var_5 ) ) [[ var_5 ]]( var_0 ); if ( !isdefined( var_0.target ) ) break; var_7 = [[ var_1 ]]( var_0.target ); if ( !var_7.size ) break; var_0 = var_7; } self notify( "reached_path_end" ); if ( isdefined( self.script_forcegoal ) ) return; if ( isdefined( self getgoalvolume() ) ) self setgoalvolumeauto( self getgoalvolume() ); else self.goalradius = level.default_goalradius; } go_to_node_wait_for_player( var_0, var_1, var_2 ) { foreach ( var_4 in level.players ) { if ( distancesquared( var_4.origin, var_0.origin ) < distancesquared( self.origin, var_0.origin ) ) return 1; } var_6 = anglestoforward( self.angles ); if ( isdefined( var_0.target ) ) { var_7 = [[ var_1 ]]( var_0.target ); if ( var_7.size == 1 ) var_6 = vectornormalize( var_7[0].origin - var_0.origin ); else if ( isdefined( var_0.angles ) ) var_6 = anglestoforward( var_0.angles ); } else if ( isdefined( var_0.angles ) ) var_6 = anglestoforward( var_0.angles ); var_8 = []; foreach ( var_4 in level.players ) var_8[var_8.size] = vectornormalize( var_4.origin - self.origin ); foreach ( var_12 in var_8 ) { if ( vectordot( var_6, var_12 ) > 0 ) return 1; } var_14 = var_2 * var_2; foreach ( var_4 in level.players ) { if ( distancesquared( var_4.origin, self.origin ) < var_14 ) return 1; } return 0; } go_to_node_set_goal_ent( var_0 ) { if ( var_0.classname == "info_volume" ) { self setgoalvolumeauto( var_0 ); self notify( "go_to_node_new_goal" ); return; } go_to_node_set_goal_pos( var_0 ); } go_to_node_set_goal_pos( var_0 ) { maps\_utility::set_goal_ent( var_0 ); self notify( "go_to_node_new_goal" ); } go_to_node_set_goal_node( var_0 ) { maps\_utility::set_goal_node( var_0 ); self notify( "go_to_node_new_goal" ); } targets_and_uses_turret( var_0 ) { if ( !isdefined( var_0.target ) ) return 0; var_1 = getentarray( var_0.target, "targetname" ); if ( !var_1.size ) return 0; var_2 = var_1[0]; if ( var_2.classname != "misc_turret" ) return 0; thread use_a_turret( var_2 ); return 1; } remove_crawled( var_0 ) { waittillframeend; if ( isdefined( var_0 ) ) var_0.crawled = undefined; } crawl_target_and_init_flags( var_0, var_1 ) { var_2 = 0; var_3 = []; var_4 = 0; for (;;) { if ( !isdefined( var_0.crawled ) ) { var_0.crawled = 1; level thread remove_crawled( var_0 ); if ( isdefined( var_0.script_flag_set ) ) { if ( !isdefined( level.flag[var_0.script_flag_set] ) ) common_scripts\utility::flag_init( var_0.script_flag_set ); } if ( isdefined( var_0.script_flag_wait ) ) { if ( !isdefined( level.flag[var_0.script_flag_wait] ) ) common_scripts\utility::flag_init( var_0.script_flag_wait ); } if ( isdefined( var_0.script_flag_clear ) ) { if ( !isdefined( level.flag[var_0.script_flag_clear] ) ) common_scripts\utility::flag_init( var_0.script_flag_clear ); } if ( isdefined( var_0.target ) ) { var_5 = [[ var_1 ]]( var_0.target ); var_3 = common_scripts\utility::add_to_array( var_3, var_5 ); } } var_4++; if ( var_4 >= var_3.size ) break; var_0 = var_3[var_4]; } } get_node_funcs_based_on_target( var_0, var_1 ) { var_2["entity"] = ::get_target_ents; var_2["node"] = ::get_target_nodes; var_2["struct"] = ::get_target_structs; var_3["entity"] = ::go_to_node_set_goal_ent; var_3["struct"] = ::go_to_node_set_goal_pos; var_3["node"] = ::go_to_node_set_goal_node; if ( !isdefined( var_1 ) ) var_1 = "node"; var_4 = []; if ( isdefined( var_0 ) ) var_4["destination"][0] = var_0; else { var_0 = getentarray( self.target, "targetname" ); if ( var_0.size > 0 ) var_1 = "entity"; if ( var_1 == "node" ) { var_0 = getnodearray( self.target, "targetname" ); if ( !var_0.size ) { var_0 = common_scripts\utility::getstructarray( self.target, "targetname" ); if ( !var_0.size ) return; var_1 = "struct"; } } var_4["destination"] = var_0; } var_4["get_target_func"] = var_2[var_1]; var_4["set_goal_func_quits"] = var_3[var_1]; return var_4; } set_goal_height_from_settings() { if ( isdefined( self.script_goalheight ) ) self.goalheight = self.script_goalheight; else self.goalheight = level.default_goalheight; } set_goal_from_settings( var_0 ) { if ( isdefined( self.script_radius ) ) { self.goalradius = self.script_radius; return; } if ( isdefined( self.script_forcegoal ) ) { if ( isdefined( var_0 ) && isdefined( var_0.radius ) ) { self.goalradius = var_0.radius; return; } } if ( !isdefined( self getgoalvolume() ) ) { if ( self.type == "civilian" ) self.goalradius = 128; else self.goalradius = level.default_goalradius; } } autotarget( var_0 ) { for (;;) { var_1 = self getturretowner(); if ( !isalive( var_1 ) ) { wait 1.5; continue; } if ( !isdefined( var_1.enemy ) ) { self settargetentity( common_scripts\utility::random( var_0 ) ); self notify( "startfiring" ); self startfiring(); } wait( 2 + randomfloat( 1 ) ); } } manualtarget( var_0 ) { for (;;) { self settargetentity( common_scripts\utility::random( var_0 ) ); self notify( "startfiring" ); self startfiring(); wait( 2 + randomfloat( 1 ) ); } } use_a_turret( var_0 ) { if ( self isbadguy() && self.health == 150 ) { self.health = 100; self.a.disablelongdeath = 1; } self useturret( var_0 ); if ( isdefined( var_0.target ) && var_0.target != var_0.targetname ) { var_1 = getentarray( var_0.target, "targetname" ); var_2 = []; for ( var_3 = 0; var_3 < var_1.size; var_3++ ) { if ( var_1[var_3].classname == "script_origin" ) var_2[var_2.size] = var_1[var_3]; } if ( isdefined( var_0.script_autotarget ) ) var_0 thread autotarget( var_2 ); else if ( isdefined( var_0.script_manualtarget ) ) { var_0 setmode( "manual_ai" ); var_0 thread manualtarget( var_2 ); } else if ( var_2.size > 0 ) { if ( var_2.size == 1 ) { var_0.manual_target = var_2[0]; var_0 settargetentity( var_2[0] ); thread maps\_mgturret::manual_think( var_0 ); } else var_0 thread maps\_mgturret::mg42_suppressionfire( var_2 ); } } thread maps\_mgturret::mg42_firing( var_0 ); var_0 notify( "startfiring" ); } fallback_spawner_think( var_0, var_1 ) { self endon( "death" ); level.current_fallbackers[var_0] = level.current_fallbackers[var_0] + self.count; var_2 = 1; while ( self.count > 0 ) { self waittill( "spawned", var_3 ); if ( var_2 ) { if ( getdvar( "fallback", "0" ) == "1" ) { } level notify( "fallback_firstspawn" + var_0 ); var_2 = 0; } common_scripts\utility::waitframe(); if ( maps\_utility::spawn_failed( var_3 ) ) { level notify( "fallbacker_died" + var_0 ); level.current_fallbackers[var_0]--; continue; } var_3 thread fallback_ai_think( var_0, var_1, "is spawner" ); } } fallback_ai_think_death( var_0, var_1 ) { var_0 waittill( "death" ); level.current_fallbackers[var_1]--; level notify( "fallbacker_died" + var_1 ); } fallback_ai_think( var_0, var_1, var_2 ) { if ( !isdefined( self.fallback ) || !isdefined( self.fallback[var_0] ) ) self.fallback[var_0] = 1; else return; self.script_fallback = var_0; if ( !isdefined( var_2 ) ) level.current_fallbackers[var_0]++; if ( isdefined( var_1 ) && level.fallback_initiated[var_0] ) thread fallback_ai( var_0, var_1 ); level thread fallback_ai_think_death( self, var_0 ); } fallback_death( var_0, var_1 ) { var_0 waittill( "death" ); level notify( "fallback_reached_goal" + var_1 ); } fallback_goal() { self waittill( "goal" ); self.ignoresuppression = 0; self notify( "fallback_notify" ); self notify( "stop_coverprint" ); } fallback_ai( var_0, var_1 ) { self notify( "stop_going_to_node" ); self stopuseturret(); self.ignoresuppression = 1; self setgoalnode( var_1 ); if ( node_has_radius( var_1 ) ) self.goalradius = var_1.radius; self endon( "death" ); level thread fallback_death( self, var_0 ); thread fallback_goal(); if ( getdvar( "fallback", "0" ) == "1" ) thread coverprint( var_1.origin ); self waittill( "fallback_notify" ); level notify( "fallback_reached_goal" + var_0 ); } coverprint( var_0 ) { self endon( "fallback_notify" ); self endon( "stop_coverprint" ); for (;;) common_scripts\utility::waitframe(); } newfallback_overmind( var_0, var_1 ) { var_2 = undefined; var_3 = getallnodes(); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) { if ( isdefined( var_3[var_4].script_fallback ) && var_3[var_4].script_fallback == var_0 ) var_2 = common_scripts\utility::add_to_array( var_2, var_3[var_4] ); } if ( !isdefined( var_2 ) ) return; level.current_fallbackers[var_0] = 0; level.spawner_fallbackers[var_0] = 0; level.fallback_initiated[var_0] = 0; var_5 = getspawnerarray(); for ( var_4 = 0; var_4 < var_5.size; var_4++ ) { if ( isdefined( var_5[var_4].script_fallback ) && var_5[var_4].script_fallback == var_0 ) { if ( var_5[var_4].count > 0 ) { var_5[var_4] thread fallback_spawner_think( var_0, var_2[randomint( var_2.size )] ); level.spawner_fallbackers[var_0]++; } } } var_6 = getaiarray(); for ( var_4 = 0; var_4 < var_6.size; var_4++ ) { if ( isdefined( var_6[var_4].script_fallback ) && var_6[var_4].script_fallback == var_0 ) var_6[var_4] thread fallback_ai_think( var_0 ); } if ( !level.current_fallbackers[var_0] && !level.spawner_fallbackers[var_0] ) return; var_5 = undefined; var_6 = undefined; thread fallback_wait( var_0, var_1 ); level waittill( "fallbacker_trigger" + var_0 ); if ( getdvar( "fallback", "0" ) == "1" ) { } level.fallback_initiated[var_0] = 1; var_7 = undefined; var_6 = getaiarray(); for ( var_4 = 0; var_4 < var_6.size; var_4++ ) { if ( isdefined( var_6[var_4].script_fallback ) && var_6[var_4].script_fallback == var_0 || isdefined( var_6[var_4].script_fallback_group ) && isdefined( var_1 ) && var_6[var_4].script_fallback_group == var_1 ) var_7 = common_scripts\utility::add_to_array( var_7, var_6[var_4] ); } var_6 = undefined; if ( !isdefined( var_7 ) ) return; var_8 = var_7.size * 0.4; var_8 = int( var_8 ); level notify( "fallback initiated " + var_0 ); fallback_text( var_7, 0, var_8 ); for ( var_4 = 0; var_4 < var_8; var_4++ ) var_7[var_4] thread fallback_ai( var_0, var_2[randomint( var_2.size )] ); for ( var_4 = 0; var_4 < var_8; var_4++ ) level waittill( "fallback_reached_goal" + var_0 ); fallback_text( var_7, var_8, var_7.size ); for ( var_4 = var_8; var_4 < var_7.size; var_4++ ) { if ( isalive( var_7[var_4] ) ) var_7[var_4] thread fallback_ai( var_0, var_2[randomint( var_2.size )] ); } } fallback_text( var_0, var_1, var_2 ) { if ( gettime() <= level._nextcoverprint ) return; for ( var_3 = var_1; var_3 < var_2; var_3++ ) { if ( !isalive( var_0[var_3] ) ) continue; level._nextcoverprint = gettime() + 2500 + randomint( 2000 ); var_4 = var_0.size; var_5 = int( var_4 * 0.4 ); if ( randomint( 100 ) > 50 ) { if ( var_4 - var_5 > 1 ) { if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_1"; else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_2"; else var_6 = "dawnville_defensive_german_3"; } else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_4"; else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_5"; else var_6 = "dawnville_defensive_german_1"; } else if ( var_5 > 1 ) { if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_2"; else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_3"; else var_6 = "dawnville_defensive_german_4"; } else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_5"; else if ( randomint( 100 ) > 66 ) var_6 = "dawnville_defensive_german_1"; else var_6 = "dawnville_defensive_german_2"; var_0[var_3] animscripts\face::sayspecificdialogue( undefined, var_6, 1.0 ); return; } } fallback_wait( var_0, var_1 ) { level endon( "fallbacker_trigger" + var_0 ); if ( getdvar( "fallback", "0" ) == "1" ) { } for ( var_2 = 0; var_2 < level.spawner_fallbackers[var_0]; var_2++ ) { if ( getdvar( "fallback", "0" ) == "1" ) { } level waittill( "fallback_firstspawn" + var_0 ); } if ( getdvar( "fallback", "0" ) == "1" ) { } var_3 = getaiarray(); for ( var_2 = 0; var_2 < var_3.size; var_2++ ) { if ( isdefined( var_3[var_2].script_fallback ) && var_3[var_2].script_fallback == var_0 || isdefined( var_3[var_2].script_fallback_group ) && isdefined( var_1 ) && var_3[var_2].script_fallback_group == var_1 ) var_3[var_2] thread fallback_ai_think( var_0 ); } var_3 = undefined; var_4 = level.current_fallbackers[var_0]; for ( var_5 = 0; level.current_fallbackers[var_0] > var_4 * 0.5; var_5++ ) { if ( getdvar( "fallback", "0" ) == "1" ) { } level waittill( "fallbacker_died" + var_0 ); } level notify( "fallbacker_trigger" + var_0 ); } fallback_think( var_0 ) { if ( !isdefined( level.fallback ) || !isdefined( level.fallback[var_0.script_fallback] ) ) level thread newfallback_overmind( var_0.script_fallback, var_0.script_fallback_group ); var_0 waittill( "trigger" ); level notify( "fallbacker_trigger" + var_0.script_fallback ); kill_trigger( var_0 ); } arrive( var_0 ) { self waittill( "goal" ); if ( node_has_radius( var_0 ) ) self.goalradius = var_0.radius; else self.goalradius = level.default_goalradius; } fallback_coverprint() { self endon( "fallback" ); self endon( "fallback_clear_goal" ); self endon( "fallback_clear_death" ); for (;;) { if ( isdefined( self.coverpoint ) ) { } common_scripts\utility::waitframe(); } } fallback_print() { self endon( "fallback_clear_goal" ); self endon( "fallback_clear_death" ); for (;;) { if ( isdefined( self.coverpoint ) ) { } common_scripts\utility::waitframe(); } } fallback() { var_0 = getnode( self.target, "targetname" ); self.coverpoint = var_0; self setgoalnode( var_0 ); if ( isdefined( self.script_seekgoal ) ) thread arrive( var_0 ); else if ( node_has_radius( var_0 ) ) self.goalradius = var_0.radius; else self.goalradius = level.default_goalradius; for (;;) { self waittill( "fallback" ); self.interval = 20; level thread fallback_death( self ); if ( getdvar( "fallback", "0" ) == "1" ) thread fallback_print(); if ( isdefined( var_0.target ) ) { var_0 = getnode( var_0.target, "targetname" ); self.coverpoint = var_0; self setgoalnode( var_0 ); thread fallback_goal(); if ( node_has_radius( var_0 ) ) self.goalradius = var_0.radius; continue; } level notify( "fallback_arrived" + self.script_fallback ); return; } } delete_me() { common_scripts\utility::waitframe(); self delete(); } vlength( var_0, var_1 ) { var_2 = var_0[0] - var_1[0]; var_3 = var_0[1] - var_1[1]; var_4 = var_0[2] - var_1[2]; var_2 = var_2 * var_2; var_3 = var_3 * var_3; var_4 = var_4 * var_4; var_5 = var_2 + var_3 + var_4; return var_5; } specialcheck( var_0 ) { for (;;) wait 0.05; } friendly_wave( var_0 ) { if ( !isdefined( level.friendly_wave_active ) ) thread friendly_wave_masterthread(); for (;;) { var_0 waittill( "trigger" ); level notify( "friendly_died" ); if ( var_0.targetname == "friendly_wave" ) level.friendly_wave_trigger = var_0; else level.friendly_wave_trigger = undefined; wait 1; } } set_spawncount( var_0 ) { if ( !isdefined( self.target ) ) return; var_1 = getentarray( self.target, "targetname" ); for ( var_2 = 0; var_2 < var_1.size; var_2++ ) var_1[var_2] maps\_utility::set_count( var_0 ); } friendlydeath_thread() { if ( !isdefined( level.totalfriends ) ) level.totalfriends = 0; level.totalfriends++; self waittill( "death" ); level notify( "friendly_died" ); level.totalfriends--; } friendly_wave_masterthread() { level.friendly_wave_active = 1; var_0 = getentarray( "friendly_wave", "targetname" ); common_scripts\utility::array_thread( var_0, ::set_spawncount, 0 ); if ( !isdefined( level.maxfriendlies ) ) level.maxfriendlies = 7; var_1 = 1; for (;;) { if ( isdefined( level.friendly_wave_trigger ) && isdefined( level.friendly_wave_trigger.target ) ) { var_2 = level.friendly_wave_trigger; var_3 = getentarray( level.friendly_wave_trigger.target, "targetname" ); if ( !var_3.size ) { level waittill( "friendly_died" ); continue; } var_4 = 0; var_5 = isdefined( level.friendly_wave_trigger.script_delay ); while ( isdefined( level.friendly_wave_trigger ) && level.totalfriends < level.maxfriendlies ) { if ( var_2 != level.friendly_wave_trigger ) { var_5 = isdefined( level.friendly_wave_trigger.script_delay ); var_2 = level.friendly_wave_trigger; var_3 = getentarray( level.friendly_wave_trigger.target, "targetname" ); } else if ( !var_5 ) var_4 = randomint( var_3.size ); else if ( var_4 == var_3.size ) var_4 = 0; var_3[var_4] maps\_utility::set_count( 1 ); var_6 = isdefined( var_3[var_4].script_stealth ) && common_scripts\utility::flag( "_stealth_enabled" ) && !common_scripts\utility::flag( "_stealth_spotted" ); if ( isdefined( var_3[var_4].script_forcespawn ) ) var_7 = var_3[var_4] stalingradspawn( var_6 ); else var_7 = var_3[var_4] dospawn( var_6 ); var_3[var_4] maps\_utility::set_count( 0 ); if ( maps\_utility::spawn_failed( var_7 ) ) { wait 0.2; continue; } if ( isdefined( var_3[var_4].script_combatbehavior ) ) { if ( var_3[var_4].combatbehavior == "heat" ) var_7 maps\_utility::enable_heat_behavior(); if ( var_3[var_4].combatbehavior == "cqb" ) var_7 maps\_utility::enable_cqbwalk(); } if ( isdefined( level.friendlywave_thread ) ) level thread [[ level.friendlywave_thread ]]( var_7 ); else var_7 setgoalentity( level.player ); if ( var_5 ) { if ( level.friendly_wave_trigger.script_delay == 0 ) waittillframeend; else wait( level.friendly_wave_trigger.script_delay ); var_4++; continue; } wait( randomfloat( 5 ) ); } } level waittill( "friendly_died" ); } } friendly_mgturret( var_0 ) { var_1 = getnode( var_0.target, "targetname" ); var_2 = getent( var_1.target, "targetname" ); var_2 setmode( "auto_ai" ); var_2 cleartargetentity(); var_3 = 0; for (;;) { var_0 waittill( "trigger", var_4 ); if ( !isai( var_4 ) ) continue; if ( !isdefined( var_4.team ) ) continue; if ( var_4.team != "allies" ) continue; if ( isdefined( var_4.script_usemg42 ) && var_4.script_usemg42 == 0 ) continue; if ( var_4 thread friendly_mg42_useable( var_2, var_1 ) ) { var_4 thread friendly_mg42_think( var_2, var_1 ); var_2 waittill( "friendly_finished_using_mg42" ); if ( isalive( var_4 ) ) var_4.turret_use_time = gettime() + 10000; } wait 1; } } friendly_mg42_death_notify( var_0, var_1 ) { var_1 endon( "friendly_finished_using_mg42" ); var_0 waittill( "death" ); var_1 notify( "friendly_finished_using_mg42" ); } friendly_mg42_wait_for_use( var_0 ) { var_0 endon( "friendly_finished_using_mg42" ); self.useable = 1; self setcursorhint( "HINT_NOICON" ); self sethintstring( &"PLATFORM_USEAIONMG42" ); self waittill( "trigger" ); self.useable = 0; self sethintstring( "" ); self stopuseturret(); self notify( "stopped_use_turret" ); var_0 notify( "friendly_finished_using_mg42" ); } friendly_mg42_useable( var_0, var_1 ) { if ( self.useable ) return 0; if ( isdefined( self.turret_use_time ) && gettime() < self.turret_use_time ) return 0; if ( distance( level.player.origin, var_1.origin ) < 100 ) return 0; return 1; } friendly_mg42_endtrigger( var_0, var_1 ) { var_0 endon( "friendly_finished_using_mg42" ); self waittill( "trigger" ); var_0 notify( "friendly_finished_using_mg42" ); } friendly_mg42_stop_use() { if ( !isdefined( self.friendly_mg42 ) ) return; self.friendly_mg42 notify( "friendly_finished_using_mg42" ); } nofour() { self endon( "death" ); self waittill( "goal" ); self.goalradius = self.oldradius; if ( self.goalradius < 32 ) self.goalradius = 400; } friendly_mg42_think( var_0, var_1 ) { self endon( "death" ); var_0 endon( "friendly_finished_using_mg42" ); level thread friendly_mg42_death_notify( self, var_0 ); self.oldradius = self.goalradius; self.goalradius = 28; thread nofour(); self setgoalnode( var_1 ); self.ignoresuppression = 1; self waittill( "goal" ); self.goalradius = self.oldradius; if ( self.goalradius < 32 ) self.goalradius = 400; self.ignoresuppression = 0; self.goalradius = self.oldradius; if ( distance( level.player.origin, var_1.origin ) < 32 ) { var_0 notify( "friendly_finished_using_mg42" ); return; } self.friendly_mg42 = var_0; thread friendly_mg42_wait_for_use( var_0 ); thread friendly_mg42_cleanup( var_0 ); self useturret( var_0 ); if ( isdefined( var_0.target ) ) { var_2 = getent( var_0.target, "targetname" ); if ( isdefined( var_2 ) ) var_2 thread friendly_mg42_endtrigger( var_0, self ); } for (;;) { if ( distance( self.origin, var_1.origin ) < 32 ) self useturret( var_0 ); else break; wait 1; } var_0 notify( "friendly_finished_using_mg42" ); } friendly_mg42_cleanup( var_0 ) { self endon( "death" ); var_0 waittill( "friendly_finished_using_mg42" ); friendly_mg42_doneusingturret(); } friendly_mg42_doneusingturret() { self endon( "death" ); var_0 = self.friendly_mg42; self.friendly_mg42 = undefined; self stopuseturret(); self notify( "stopped_use_turret" ); self.useable = 0; self.goalradius = self.oldradius; if ( !isdefined( var_0 ) ) return; if ( !isdefined( var_0.target ) ) return; var_1 = getnode( var_0.target, "targetname" ); var_2 = self.goalradius; self.goalradius = 8; self setgoalnode( var_1 ); wait 2; self.goalradius = 384; return; self waittill( "goal" ); if ( isdefined( self.target ) ) { var_1 = getnode( self.target, "targetname" ); if ( isdefined( var_1.target ) ) var_1 = getnode( var_1.target, "targetname" ); if ( isdefined( var_1 ) ) self setgoalnode( var_1 ); } self.goalradius = var_2; } tanksquish() { if ( isdefined( level.notanksquish ) ) return; if ( isdefined( level.levelhasvehicles ) && !level.levelhasvehicles ) return; maps\_utility::add_damage_function( ::tanksquish_damage_check ); } tanksquish_damage_check( var_0, var_1, var_2, var_3, var_4, var_5, var_6 ) { if ( !isdefined( self ) ) return; if ( isalive( self ) ) return; if ( !isalive( var_1 ) ) return; if ( !isdefined( var_1.vehicletype ) ) return; if ( var_1 maps\_vehicle::ishelicopter() ) return; if ( !isdefined( self.noragdoll ) ) self startragdoll(); if ( !isdefined( self ) ) return; maps\_utility::remove_damage_function( ::tanksquish_damage_check ); } panzer_target( var_0, var_1, var_2, var_3, var_4 ) { var_0 endon( "death" ); var_0.panzer_node = var_1; if ( isdefined( var_1.script_delay ) ) var_0.panzer_delay = var_1.script_delay; if ( isdefined( var_3 ) && isdefined( var_4 ) ) { var_0.panzer_ent = var_3; var_0.panzer_ent_offset = var_4; } else var_0.panzer_pos = var_2; var_0 setgoalpos( var_0.origin ); var_0 setgoalnode( var_1 ); var_0.goalradius = 12; var_0 waittill( "goal" ); var_0.goalradius = 28; var_0 waittill( "shot_at_target" ); var_0.panzer_ent = undefined; var_0.panzer_pos = undefined; var_0.panzer_delay = undefined; } showstart( var_0, var_1, var_2 ) { var_3 = getstartorigin( var_0, var_1, var_2 ); for (;;) wait 0.05; } spawnwaypointfriendlies() { maps\_utility::set_count( 1 ); if ( isdefined( self.script_forcespawn ) ) var_0 = self stalingradspawn(); else var_0 = self dospawn(); if ( maps\_utility::spawn_failed( var_0 ) ) return; if ( isdefined( self.script_combatbehavior ) ) { if ( self.script_combatbehavior == "heat" ) var_0 maps\_utility::enable_heat_behavior(); if ( self.script_combatbehavior == "cqb" ) var_0 maps\_utility::enable_cqbwalk(); } var_0.friendlywaypoint = 1; } waittilldeathorleavesquad() { self endon( "death" ); self waittill( "leaveSquad" ); } friendlyspawnwave() { common_scripts\utility::array_thread( getentarray( self.target, "targetname" ), ::friendlyspawnwave_triggerthink, self ); for (;;) { self waittill( "trigger", var_2 ); if ( activefriendlyspawn() && getfriendlyspawntrigger() == self ) unsetfriendlyspawn(); self waittill( "friendly_wave_start", var_3 ); setfriendlyspawn( var_3, self ); if ( !isdefined( var_3.target ) ) continue; var_4 = getent( var_3.target, "targetname" ); var_4 thread spawnwavestoptrigger( self ); } } flood_and_secure( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = 0; if ( isdefined( self.script_noteworthy ) && self.script_noteworthy == "instant_respawn" ) var_0 = 1; level.spawnerwave = []; var_1 = getentarray( self.target, "targetname" ); common_scripts\utility::array_thread( var_1, ::flood_and_secure_spawner, var_0 ); var_2 = 0; var_3 = 0; for (;;) { self waittill( "trigger", var_4 ); if ( !objectiveisallowed() ) continue; if ( !var_3 ) { var_3 = 1; maps\_utility::script_delay(); } if ( self istouching( level.player ) ) var_2 = 1; else { if ( !isalive( var_4 ) ) continue; if ( isplayer( var_4 ) ) var_2 = 1; else if ( !isdefined( var_4.issquad ) || !var_4.issquad ) continue; } var_1 = getentarray( self.target, "targetname" ); if ( isdefined( var_1[0] ) ) { if ( isdefined( var_1[0].script_randomspawn ) ) cull_spawners_from_killspawner( var_1[0].script_randomspawn ); } var_1 = getentarray( self.target, "targetname" ); for ( var_5 = 0; var_5 < var_1.size; var_5++ ) { var_1[var_5].playertriggered = var_2; var_1[var_5] notify( "flood_begin" ); } if ( var_2 ) { wait 5; continue; } wait 0.1; } } cull_spawners_leaving_one_set( var_0 ) { var_1 = []; for ( var_2 = 0; var_2 < var_0.size; var_2++ ) var_1[var_0[var_2].script_randomspawn] = 1; var_3 = getarraykeys( var_1 ); var_4 = common_scripts\utility::random( var_3 ); for ( var_2 = 0; var_2 < var_0.size; var_2++ ) { if ( var_0[var_2].script_randomspawn != var_4 ) var_0[var_2] delete(); } } flood_and_secure_spawner( var_0 ) { if ( isdefined( self.securestarted ) ) return; self.securestarted = 1; self.triggerunlocked = 1; var_1 = self.target; var_2 = self.targetname; if ( !isdefined( var_1 ) && !isdefined( self.script_moveoverride ) ) waittillframeend; var_3 = []; if ( isdefined( var_1 ) ) { var_4 = getentarray( var_1, "targetname" ); for ( var_5 = 0; var_5 < var_4.size; var_5++ ) { if ( !issubstr( var_4[var_5].classname, "actor" ) ) continue; var_3[var_3.size] = var_4[var_5]; } } var_6 = spawnstruct(); var_7 = self.origin; flood_and_secure_spawner_think( var_6, var_3.size > 0, var_0 ); if ( isalive( var_6.ai ) ) var_6.ai waittill( "death" ); if ( !isdefined( var_1 ) ) return; var_4 = getentarray( var_1, "targetname" ); if ( !var_4.size ) return; for ( var_5 = 0; var_5 < var_4.size; var_5++ ) { if ( !issubstr( var_4[var_5].classname, "actor" ) ) continue; var_4[var_5].targetname = var_2; var_8 = var_1; if ( isdefined( var_4[var_5].target ) ) { var_9 = getent( var_4[var_5].target, "targetname" ); if ( !isdefined( var_9 ) || !issubstr( var_9.classname, "actor" ) ) var_8 = var_4[var_5].target; } var_4[var_5].target = var_8; var_4[var_5] thread flood_and_secure_spawner( var_0 ); var_4[var_5].playertriggered = 1; var_4[var_5] notify( "flood_begin" ); } } flood_and_secure_spawner_think( var_0, var_1, var_2 ) { self endon( "death" ); var_3 = self.count; if ( !var_1 ) var_1 = isdefined( self.script_noteworthy ) && self.script_noteworthy == "delete"; maps\_utility::set_count( 2 ); if ( isdefined( self.script_delay ) ) var_4 = self.script_delay; else var_4 = 0; for (;;) { self waittill( "flood_begin" ); if ( self.playertriggered ) break; if ( var_4 ) continue; break; } var_5 = distance( level.player.origin, self.origin ); while ( var_3 ) { self.truecount = var_3; maps\_utility::set_count( 2 ); wait( var_4 ); var_6 = isdefined( self.script_stealth ) && common_scripts\utility::flag( "_stealth_enabled" ) && !common_scripts\utility::flag( "_stealth_spotted" ); if ( isdefined( self.script_forcespawn ) ) var_7 = self stalingradspawn( var_6 ); else var_7 = self dospawn( var_6 ); if ( maps\_utility::spawn_failed( var_7 ) ) { var_8 = 0; if ( var_4 < 2 ) wait 2; continue; } else { if ( isdefined( self.script_combatbehavior ) ) { if ( self.script_combatbehavior == "heat" ) var_7 maps\_utility::enable_heat_behavior(); if ( self.script_combatbehavior == "cqb" ) var_7 maps\_utility::enable_cqbwalk(); } thread addtowavespawner( var_7 ); var_7 thread flood_and_secure_spawn( self ); if ( isdefined( self.script_accuracy ) ) var_7.baseaccuracy = self.script_accuracy; var_0.ai = var_7; var_0 notify( "got_ai" ); self waittill( "spawn_died", var_9, var_8 ); if ( var_4 > 2 ) var_4 = randomint( 4 ) + 2; else var_4 = 0.5 + randomfloat( 0.5 ); } if ( var_9 ) { waittillrestartordistance( var_5 ); continue; } if ( playerwasnearby( var_8 || var_1, var_0.ai ) ) var_3--; if ( !var_2 ) waituntilwaverelease(); } self delete(); } waittilldeletedordeath( var_0 ) { self endon( "death" ); var_0 waittill( "death" ); } addtowavespawner( var_0 ) { var_1 = self.targetname; if ( !isdefined( level.spawnerwave[var_1] ) ) { level.spawnerwave[var_1] = spawnstruct(); level.spawnerwave[var_1] maps\_utility::set_count( 0 ); level.spawnerwave[var_1].total = 0; } if ( !isdefined( self.addedtowave ) ) { self.addedtowave = 1; level.spawnerwave[var_1].total++; } level.spawnerwave[var_1].count++; waittilldeletedordeath( var_0 ); level.spawnerwave[var_1].count--; if ( !isdefined( self ) ) level.spawnerwave[var_1].total--; if ( level.spawnerwave[var_1].total ) { if ( level.spawnerwave[var_1].count / level.spawnerwave[var_1].total < 0.32 ) level.spawnerwave[var_1] notify( "waveReady" ); } } debugwavecount( var_0 ) { self endon( "debug_stop" ); self endon( "death" ); for (;;) wait 0.05; } waituntilwaverelease() { var_0 = self.targetname; if ( level.spawnerwave[var_0].count ) level.spawnerwave[var_0] waittill( "waveReady" ); } playerwasnearby( var_0, var_1 ) { if ( var_0 ) return 1; if ( isdefined( var_1 ) && isdefined( var_1.origin ) ) var_2 = var_1.origin; else var_2 = self.origin; if ( distance( level.player.origin, var_2 ) < 700 ) return 1; return bullettracepassed( level.player geteye(), var_1 geteye(), 0, undefined ); } waittillrestartordistance( var_0 ) { self endon( "flood_begin" ); var_0 = var_0 * 0.75; while ( distance( level.player.origin, self.origin ) > var_0 ) wait 1; } flood_and_secure_spawn( var_0 ) { thread flood_and_secure_spawn_goal(); self waittill( "death", var_1 ); var_2 = isalive( var_1 ) && isplayer( var_1 ); if ( !var_2 && isdefined( var_1 ) && var_1.classname == "worldspawn" ) var_2 = 1; var_3 = !isdefined( self ); var_0 notify( "spawn_died", var_3, var_2 ); } flood_and_secure_spawn_goal() { if ( isdefined( self.script_moveoverride ) ) return; self endon( "death" ); var_0 = getnode( self.target, "targetname" ); if ( isdefined( var_0 ) ) self setgoalnode( var_0 ); else { var_0 = getent( self.target, "targetname" ); if ( isdefined( var_0 ) ) self setgoalpos( var_0.origin ); } if ( isdefined( level.fightdist ) ) { self.pathenemyfightdist = level.fightdist; self.pathenemylookahead = level.maxdist; } if ( isdefined( var_0.radius ) && var_0.radius >= 0 ) self.goalradius = var_0.radius; else self.goalradius = 256; self waittill( "goal" ); while ( isdefined( var_0.target ) ) { var_1 = getnode( var_0.target, "targetname" ); if ( isdefined( var_1 ) ) var_0 = var_1; else break; self setgoalnode( var_0 ); if ( node_has_radius( var_0 ) ) self.goalradius = var_0.radius; else self.goalradius = 256; self waittill( "goal" ); } if ( isdefined( self.script_noteworthy ) ) { if ( self.script_noteworthy == "delete" ) { self kill(); return; } } if ( isdefined( var_0.target ) ) { var_2 = getent( var_0.target, "targetname" ); if ( isdefined( var_2 ) && ( var_2.code_classname == "misc_mgturret" || var_2.code_classname == "misc_turret" ) ) { self setgoalnode( var_0 ); self.goalradius = 4; self waittill( "goal" ); if ( !isdefined( self.script_forcegoal ) ) self.goalradius = level.default_goalradius; use_a_turret( var_2 ); } } if ( isdefined( self.script_noteworthy ) ) { if ( isdefined( self.script_noteworthy2 ) ) { if ( self.script_noteworthy2 == "furniture_push" ) thread furniturepushsound(); } if ( self.script_noteworthy == "hide" ) { thread maps\_utility::set_battlechatter( 0 ); return; } } if ( !isdefined( self.script_forcegoal ) && !isdefined( self getgoalvolume() ) ) self.goalradius = level.default_goalradius; } furniturepushsound() { var_0 = getent( self.target, "targetname" ).origin; common_scripts\utility::play_sound_in_space( "furniture_slide", var_0 ); wait 0.9; if ( isdefined( level.whisper ) ) common_scripts\utility::play_sound_in_space( common_scripts\utility::random( level.whisper ), var_0 ); } friendlychain() { waittillframeend; var_0 = getentarray( self.target, "targetname" ); if ( !var_0.size ) { var_1 = getnode( self.target, "targetname" ); for (;;) { self waittill( "trigger" ); if ( isdefined( level.lastfriendlytrigger ) && level.lastfriendlytrigger == self ) { wait 0.5; continue; } if ( !objectiveisallowed() ) { wait 0.5; continue; } level notify( "new_friendly_trigger" ); level.lastfriendlytrigger = self; var_2 = !isdefined( self.script_baseoffire ) || self.script_baseoffire == 0; setnewplayerchain( var_1, var_2 ); } } for (;;) { self waittill( "trigger" ); while ( level.player istouching( self ) ) wait 0.05; if ( !objectiveisallowed() ) { wait 0.05; continue; } if ( isdefined( level.lastfriendlytrigger ) && level.lastfriendlytrigger == self ) continue; level notify( "new_friendly_trigger" ); level.lastfriendlytrigger = self; common_scripts\utility::array_thread( var_0, ::friendlytrigger ); wait 0.5; } } objectiveisallowed() { var_0 = 1; if ( isdefined( self.script_objective_active ) ) { var_0 = 0; for ( var_1 = 0; var_1 < level.active_objective.size; var_1++ ) { if ( !issubstr( self.script_objective_active, level.active_objective[var_1] ) ) continue; var_0 = 1; break; } if ( !var_0 ) return 0; } if ( !isdefined( self.script_objective_inactive ) ) return var_0; var_2 = 0; for ( var_1 = 0; var_1 < level.inactive_objective.size; var_1++ ) { if ( !issubstr( self.script_objective_inactive, level.inactive_objective[var_1] ) ) continue; var_2++; } var_3 = strtok( self.script_objective_inactive, " " ); return var_2 == var_3.size; } friendlytrigger( var_0 ) { level endon( "new_friendly_trigger" ); self waittill( "trigger" ); var_0 = getnode( self.target, "targetname" ); var_1 = !isdefined( self.script_baseoffire ) || self.script_baseoffire == 0; setnewplayerchain( var_0, var_1 ); } waittilldeathorempty() { self endon( "death" ); var_0 = self.script_deathchain; while ( self.count ) { self waittill( "spawned", var_1 ); var_1 thread deathchainainotify( var_0 ); } } deathchainainotify( var_0 ) { level.deathspawner[var_0]++; self waittill( "death" ); level.deathspawner[var_0]--; level notify( "spawner_expired" + var_0 ); } deathchainspawnerlogic() { var_0 = self.script_deathchain; level.deathspawner[var_0]++; var_1 = self.origin; waittilldeathorempty(); level notify( "spawner dot" + var_1 ); level.deathspawner[var_0]--; level notify( "spawner_expired" + var_0 ); } friendlychain_ondeath() { var_0 = getentarray( "friendly_chain_on_death", "targetname" ); var_1 = getspawnerarray(); level.deathspawner = []; for ( var_2 = 0; var_2 < var_1.size; var_2++ ) { if ( !isdefined( var_1[var_2].script_deathchain ) ) continue; var_3 = var_1[var_2].script_deathchain; if ( !isdefined( level.deathspawner[var_3] ) ) level.deathspawner[var_3] = 0; var_1[var_2] thread deathchainspawnerlogic(); } for ( var_2 = 0; var_2 < var_0.size; var_2++ ) { if ( !isdefined( var_0[var_2].script_deathchain ) ) return; var_0[var_2] thread friendlychain_ondeaththink(); } } friendlychain_ondeaththink() { while ( level.deathspawner[self.script_deathchain] > 0 ) level waittill( "spawner_expired" + self.script_deathchain ); level endon( "start_chain" ); var_0 = getnode( self.target, "targetname" ); for (;;) { self waittill( "trigger" ); setnewplayerchain( var_0, 1 ); iprintlnbold( "Area secured, move up!" ); wait 5; } } setnewplayerchain( var_0, var_1 ) { level notify( "new_escort_trigger" ); level notify( "new_escort_debug" ); level notify( "start_chain", var_1 ); } friendlychains() { level.friendlyspawnorg = []; level.friendlyspawntrigger = []; common_scripts\utility::array_thread( getentarray( "friendlychain", "targetname" ), ::friendlychain ); } unsetfriendlyspawn() { var_0 = []; var_1 = []; for ( var_2 = 0; var_2 < level.friendlyspawnorg.size; var_2++ ) { var_0[var_0.size] = level.friendlyspawnorg[var_2]; var_1[var_1.size] = level.friendlyspawntrigger[var_2]; } level.friendlyspawnorg = var_0; level.friendlyspawntrigger = var_1; if ( activefriendlyspawn() ) return; common_scripts\utility::flag_clear( "spawning_friendlies" ); } getfriendlyspawnstart() { return level.friendlyspawnorg[level.friendlyspawnorg.size - 1]; } activefriendlyspawn() { return level.friendlyspawnorg.size > 0; } getfriendlyspawntrigger() { return level.friendlyspawntrigger[level.friendlyspawntrigger.size - 1]; } setfriendlyspawn( var_0, var_1 ) { level.friendlyspawnorg[level.friendlyspawnorg.size] = var_0.origin; level.friendlyspawntrigger[level.friendlyspawntrigger.size] = var_1; common_scripts\utility::flag_set( "spawning_friendlies" ); } delayedplayergoal() { self endon( "death" ); self endon( "leaveSquad" ); wait 0.5; self setgoalentity( level.player ); } spawnwavestoptrigger( var_0 ) { self notify( "stopTrigger" ); self endon( "stopTrigger" ); self waittill( "trigger" ); if ( getfriendlyspawntrigger() != var_0 ) return; unsetfriendlyspawn(); } friendlyspawnwave_triggerthink( var_0 ) { var_1 = getent( self.target, "targetname" ); for (;;) { self waittill( "trigger" ); var_0 notify( "friendly_wave_start", var_1 ); if ( !isdefined( var_1.target ) ) continue; } } goalvolumes() { var_0 = getentarray( "info_volume", "classname" ); level.deathchain_goalvolume = []; level.goalvolumes = []; for ( var_1 = 0; var_1 < var_0.size; var_1++ ) { var_2 = var_0[var_1]; if ( isdefined( var_2.script_deathchain ) ) level.deathchain_goalvolume[var_2.script_deathchain] = var_2; if ( isdefined( var_2.script_goalvolume ) ) level.goalvolumes[var_2.script_goalvolume] = var_2; } } debugprint( var_0, var_1, var_2 ) { if ( 1 ) return; var_3 = self getorigin(); var_4 = 40 * sin( var_3[0] + var_3[1] ) - 40; var_3 = ( var_3[0], var_3[1], var_3[2] + var_4 ); level endon( var_1 ); self endon( "new_color" ); if ( !isdefined( var_2 ) ) var_2 = ( 0, 0.8, 0.6 ); var_5 = 0; for (;;) { var_5 = var_5 + 12; var_6 = sin( var_5 ) * 0.4; if ( var_6 < 0 ) var_6 = var_6 * -1; var_6 = var_6 + 1; wait 0.05; } } aigroup_create( var_0 ) { level._ai_group[var_0] = spawnstruct(); level._ai_group[var_0].aicount = 0; level._ai_group[var_0].spawnercount = 0; level._ai_group[var_0].ai = []; level._ai_group[var_0].spawners = []; } aigroup_spawnerthink( var_0 ) { self endon( "death" ); self.decremented = 0; var_0.spawnercount++; thread aigroup_spawnerdeath( var_0 ); thread aigroup_spawnerempty( var_0 ); while ( self.count ) { self waittill( "spawned", var_1 ); if ( maps\_utility::spawn_failed( var_1 ) ) continue; var_1 thread aigroup_soldierthink( var_0 ); } waittillframeend; if ( self.decremented ) return; self.decremented = 1; var_0.spawnercount--; } aigroup_spawnerdeath( var_0 ) { self waittill( "death" ); if ( self.decremented ) return; var_0.spawnercount--; } aigroup_spawnerempty( var_0 ) { self endon( "death" ); self waittill( "emptied spawner" ); waittillframeend; if ( self.decremented ) return; self.decremented = 1; var_0.spawnercount--; } aigroup_soldierthink( var_0 ) { var_0.aicount++; var_0.ai[var_0.ai.size] = self; if ( isdefined( self.script_deathflag_longdeath ) ) waittilldeathorpaindeath(); else self waittill( "death" ); var_0.aicount--; } camper_trigger_think( var_0 ) { var_1 = strtok( var_0.script_linkto, " " ); var_2 = []; var_3 = []; for ( var_4 = 0; var_4 < var_1.size; var_4++ ) { var_5 = var_1[var_4]; var_6 = getent( var_5, "script_linkname" ); if ( isdefined( var_6 ) ) { var_2 = common_scripts\utility::add_to_array( var_2, var_6 ); continue; } var_7 = getnode( var_5, "script_linkname" ); if ( !isdefined( var_7 ) ) continue; var_3 = common_scripts\utility::add_to_array( var_3, var_7 ); } var_0 waittill( "trigger" ); var_3 = common_scripts\utility::array_randomize( var_3 ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) var_3[var_4].claimed = 0; var_8 = 0; for ( var_4 = 0; var_4 < var_2.size; var_4++ ) { var_9 = var_2[var_4]; if ( !isdefined( var_9 ) ) continue; if ( isdefined( var_9.script_spawn_here ) ) continue; while ( isdefined( var_3[var_8].script_noteworthy ) && var_3[var_8].script_noteworthy == "dont_spawn" ) var_8++; var_9.origin = var_3[var_8].origin; var_9.angles = var_3[var_8].angles; var_9 maps\_utility::add_spawn_function( ::claim_a_node, var_3[var_8] ); var_8++; } common_scripts\utility::array_thread( var_2, maps\_utility::add_spawn_function, ::camper_guy ); common_scripts\utility::array_thread( var_2, maps\_utility::add_spawn_function, ::move_when_enemy_hides, var_3 ); common_scripts\utility::array_thread( var_2, maps\_utility::spawn_ai ); } camper_guy() { self.goalradius = 8; self.fixednode = 1; } move_when_enemy_hides( var_0 ) { self endon( "death" ); var_1 = 0; for (;;) { if ( !isalive( self.enemy ) ) { self waittill( "enemy" ); var_1 = 0; continue; } if ( isplayer( self.enemy ) ) { if ( self.enemy maps\_utility::ent_flag( "player_has_red_flashing_overlay" ) || common_scripts\utility::flag( "player_flashed" ) ) { self.fixednode = 0; for (;;) { self.goalradius = 180; self setgoalpos( level.player.origin ); wait 1; } return; } } if ( var_1 ) { if ( self cansee( self.enemy ) ) { wait 0.05; continue; } var_1 = 0; } else { if ( self cansee( self.enemy ) ) var_1 = 1; wait 0.05; continue; } if ( randomint( 3 ) > 0 ) { var_2 = find_unclaimed_node( var_0 ); if ( isdefined( var_2 ) ) { claim_a_node( var_2, self.claimed_node ); self waittill( "goal" ); } } } } claim_a_node( var_0, var_1 ) { self setgoalnode( var_0 ); self.claimed_node = var_0; var_0.claimed = 1; if ( isdefined( var_1 ) ) var_1.claimed = 0; } find_unclaimed_node( var_0 ) { for ( var_1 = 0; var_1 < var_0.size; var_1++ ) { if ( var_0[var_1].claimed ) continue; else return var_0[var_1]; } return undefined; } flood_trigger_think( var_0 ) { var_1 = getentarray( var_0.target, "targetname" ); common_scripts\utility::array_thread( var_1, ::flood_spawner_init ); var_0 waittill( "trigger" ); var_1 = getentarray( var_0.target, "targetname" ); common_scripts\utility::array_thread( var_1, ::flood_spawner_think, var_0 ); } flood_spawner_init( var_0 ) { } trigger_requires_player( var_0 ) { if ( !isdefined( var_0 ) ) return 0; return isdefined( var_0.script_requires_player ); } two_stage_spawner_think( var_0 ) { var_1 = getent( var_0.target, "targetname" ); waittillframeend; var_2 = getentarray( var_1.target, "targetname" ); for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { var_2[var_3].script_moveoverride = 1; var_2[var_3] maps\_utility::add_spawn_function( ::wait_to_go, var_1 ); } var_0 waittill( "trigger" ); var_2 = getentarray( var_1.target, "targetname" ); common_scripts\utility::array_thread( var_2, maps\_utility::spawn_ai ); } wait_to_go( var_0 ) { var_0 endon( "death" ); self endon( "death" ); self.goalradius = 8; var_0 waittill( "trigger" ); thread go_to_node(); } flood_spawner_think( var_0 ) { if ( !isdefined( level.spawn_pool_enabled ) || isspawner( self ) ) self endon( "death" ); self notify( "stop current floodspawner" ); self endon( "stop current floodspawner" ); if ( is_pyramid_spawner() ) { pyramid_spawn( var_0 ); return; } var_1 = trigger_requires_player( var_0 ); maps\_utility::script_delay(); if ( isdefined( level.spawn_pool_enabled ) ) { if ( !isspawner( self ) ) self.count = 1; } while ( self.count > 0 ) { while ( var_1 && !level.player istouching( var_0 ) ) wait 0.5; var_2 = isdefined( self.script_stealth ) && common_scripts\utility::flag( "_stealth_enabled" ) && !common_scripts\utility::flag( "_stealth_spotted" ); var_3 = self; if ( isdefined( level.spawn_pool_enabled ) ) { if ( !isspawner( self ) ) var_3 = get_spawner_from_pool( self, 1 ); } if ( isdefined( self.script_forcespawn ) ) var_4 = var_3 stalingradspawn( var_2 ); else var_4 = var_3 dospawn( var_2 ); if ( maps\_utility::spawn_failed( var_4 ) ) { wait 2; continue; } if ( isdefined( self.script_combatbehavior ) ) { if ( self.script_combatbehavior == "heat" ) var_4 maps\_utility::enable_heat_behavior(); if ( self.script_combatbehavior == "cqb" ) var_4 maps\_utility::enable_cqbwalk(); } var_4 thread reincrement_count_if_deleted( self ); var_4 thread expand_goalradius( var_0 ); var_4 waittill( "death", var_5 ); if ( !player_saw_kill( var_4, var_5 ) ) self.count++; else if ( isdefined( level.ac130_flood_respawn ) ) { if ( isdefined( level.ac130gunner ) && var_5 == level.ac130gunner ) { if ( randomint( 2 ) == 0 ) self.count++; } } if ( !isdefined( var_4 ) ) continue; if ( !maps\_utility::script_wait() ) wait( randomfloatrange( 5, 9 ) ); } } flood_spawner_stop() { self notify( "stop current floodspawner" ); } player_saw_kill( var_0, var_1 ) { if ( isdefined( self.script_force_count ) ) { if ( self.script_force_count ) return 1; } if ( !isdefined( var_0 ) ) return 0; if ( isalive( var_1 ) ) { if ( isplayer( var_1 ) ) return 1; if ( distance( var_1.origin, level.player.origin ) < 200 ) return 1; } else if ( isdefined( var_1 ) ) { if ( var_1.classname == "worldspawn" ) return 0; if ( distance( var_1.origin, level.player.origin ) < 200 ) return 1; } if ( distance( var_0.origin, level.player.origin ) < 200 ) return 1; return bullettracepassed( level.player geteye(), var_0 geteye(), 0, undefined ); } is_pyramid_spawner() { if ( !isdefined( self.target ) ) return 0; var_0 = getentarray( self.target, "targetname" ); if ( !var_0.size ) return 0; return issubstr( var_0[0].classname, "actor" ); } pyramid_death_report( var_0 ) { var_0.spawn waittill( "death" ); self notify( "death_report" ); } pyramid_spawn( var_0 ) { self endon( "death" ); var_1 = trigger_requires_player( var_0 ); maps\_utility::script_delay(); if ( var_1 ) { while ( !level.player istouching( var_0 ) ) wait 0.5; } var_2 = getentarray( self.target, "targetname" ); self.spawners = 0; common_scripts\utility::array_thread( var_2, ::pyramid_spawner_reports_death, self ); var_4 = randomint( var_2.size ); for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { if ( self.count <= 0 ) return; var_4++; if ( var_4 >= var_2.size ) var_4 = 0; var_5 = var_2[var_4]; var_5 maps\_utility::set_count( 1 ); var_6 = var_5 maps\_utility::spawn_ai(); if ( maps\_utility::spawn_failed( var_6 ) ) { wait 2; continue; } self.count--; var_5.spawn = var_6; var_6 thread reincrement_count_if_deleted( self ); var_6 thread expand_goalradius( var_0 ); thread pyramid_death_report( var_5 ); } var_7 = 0.01; while ( self.count > 0 ) { self waittill( "death_report" ); maps\_utility::script_wait(); wait( var_7 ); var_7 = var_7 + 2.5; var_4 = randomint( var_2.size ); for ( var_3 = 0; var_3 < var_2.size; var_3++ ) { var_2 = common_scripts\utility::array_removeundefined( var_2 ); if ( !var_2.size ) { if ( isdefined( self ) ) self delete(); return; } var_4++; if ( var_4 >= var_2.size ) var_4 = 0; var_5 = var_2[var_4]; if ( isalive( var_5.spawn ) ) continue; if ( isdefined( var_5.target ) ) self.target = var_5.target; else self.target = undefined; var_6 = maps\_utility::spawn_ai(); if ( maps\_utility::spawn_failed( var_6 ) ) { wait 2; continue; } var_6 thread reincrement_count_if_deleted( self ); var_6 thread expand_goalradius( var_0 ); var_5.spawn = var_6; thread pyramid_death_report( var_5 ); if ( self.count <= 0 ) return; } } } pyramid_spawner_reports_death( var_0 ) { var_0 endon( "death" ); var_0.spawners++; self waittill( "death" ); var_0.spawners--; if ( !var_0.spawners ) var_0 delete(); } expand_goalradius( var_0 ) { if ( isdefined( self.script_forcegoal ) ) return; var_1 = level.default_goalradius; if ( isdefined( var_0 ) ) { if ( isdefined( var_0.script_radius ) ) { if ( var_0.script_radius == -1 ) return; var_1 = var_0.script_radius; } } if ( isdefined( self.script_forcegoal ) ) return; self endon( "death" ); self waittill( "goal" ); self.goalradius = var_1; } drop_health_timeout_thread() { self endon( "death" ); wait 95; self notify( "timeout" ); } drop_health_trigger_think() { self endon( "timeout" ); thread drop_health_timeout_thread(); self waittill( "trigger" ); maps\_utility::change_player_health_packets( 1 ); } traceshow( var_0 ) { for (;;) wait 0.05; } show_bad_path() { } random_spawn( var_0 ) { var_0 waittill( "trigger" ); var_1 = getentarray( var_0.target, "targetname" ); if ( !var_1.size ) return; var_2 = common_scripts\utility::random( var_1 ); var_1 = []; var_1[var_1.size] = var_2; if ( isdefined( var_2.script_linkto ) ) { var_3 = strtok( var_2.script_linkto, " " ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) var_1[var_1.size] = getent( var_3[var_4], "script_linkname" ); } waittillframeend; common_scripts\utility::array_thread( var_1, maps\_utility::add_spawn_function, ::blowout_goalradius_on_pathend ); common_scripts\utility::array_thread( var_1, maps\_utility::spawn_ai ); } blowout_goalradius_on_pathend() { if ( isdefined( self.script_forcegoal ) ) return; self endon( "death" ); self waittill( "reached_path_end" ); if ( !isdefined( self getgoalvolume() ) ) self.goalradius = level.default_goalradius; } objective_event_init( var_0 ) { var_1 = var_0 maps\_utility::get_trigger_flag(); common_scripts\utility::flag_init( var_1 ); while ( level.deathspawner[var_0.script_deathchain] > 0 ) level waittill( "spawner_expired" + var_0.script_deathchain ); common_scripts\utility::flag_set( var_1 ); } setup_ai_eq_triggers() { self endon( "death" ); waittillframeend; self.is_the_player = isplayer( self ); self.eq_table = []; self.eq_touching = []; for ( var_0 = 0; var_0 < level.eq_trigger_num; var_0++ ) self.eq_table[var_0] = 0; } ai_array() { level.ai_array[level.unique_id] = self; self waittill( "death" ); waittillframeend; level.ai_array[level.unique_id] = undefined; } #using_animtree("generic_human"); spawner_dronespawn( var_0 ) { var_1 = var_0 spawndrone(); var_1 useanimtree( #animtree ); if ( var_1.weapon != "none" ) { var_2 = getweaponmodel( var_1.weapon ); var_1 attach( var_2, "tag_weapon_right" ); var_3 = getweaponhidetags( var_1.weapon ); for ( var_4 = 0; var_4 < var_3.size; var_4++ ) var_1 hidepart( var_3[var_4], var_2 ); } var_1.spawner = var_0; var_1.drone_delete_on_unload = isdefined( var_0.script_noteworthy ) && var_0.script_noteworthy == "drone_delete_on_unload"; var_0 notify( "drone_spawned", var_1 ); return var_1; } spawner_makerealai( var_0 ) { if ( !isdefined( var_0.spawner ) ) { } var_1 = var_0.spawner.origin; var_2 = var_0.spawner.angles; var_0.spawner.origin = var_0.origin; var_0.spawner.angles = var_0.angles; var_0.spawner.count = var_0.spawner.count + 1; var_3 = var_0.spawner stalingradspawn(); var_4 = maps\_utility::spawn_failed( var_3 ); if ( var_4 ) { } var_3.vehicle_idling = var_0.vehicle_idling; var_3.vehicle_position = var_0.vehicle_position; var_3.standing = var_0.standing; var_3.forcecolor = var_0.forcecolor; var_0.spawner.origin = var_1; var_0.spawner.angles = var_2; var_0 delete(); return var_3; } death_achievements() { self waittill( "death", var_0, var_1, var_2 ); if ( !isdefined( self ) ) return; if ( !self isbadguy() ) return; if ( !isdefined( var_0 ) ) return; if ( !isplayer( var_0 ) ) return; if ( isdefined( self.last_dmg_type ) ) var_1 = self.last_dmg_type; } death_achievements_rappel( var_0 ) { } add_random_killspawner_to_spawngroup() { var_0 = self.script_random_killspawner; var_1 = self.script_randomspawn; if ( !isdefined( level.killspawn_groups[var_0] ) ) level.killspawn_groups[var_0] = []; if ( !isdefined( level.killspawn_groups[var_0][var_1] ) ) level.killspawn_groups[var_0][var_1] = []; level.killspawn_groups[var_0][var_1][self.export] = self; } add_to_spawngroup() { var_0 = self.script_spawngroup; var_1 = self.script_spawnsubgroup; if ( !isdefined( level.spawn_groups[var_0] ) ) level.spawn_groups[var_0] = []; if ( !isdefined( level.spawn_groups[var_0][var_1] ) ) level.spawn_groups[var_0][var_1] = []; level.spawn_groups[var_0][var_1][self.export] = self; } start_off_running() { self endon( "death" ); self.disableexits = 1; wait 3; self.disableexits = 0; } deathtime() { self endon( "death" ); wait( self.script_deathtime ); wait( randomfloat( 10 ) ); self kill(); }