// IW6 GSC SOURCE // Generated by https://github.com/xensik/gsc-tool team_set_colors() { level.baker maps\_utility::set_force_color( "r" ); level.dog maps\_utility::set_force_color( "o" ); } team_unset_colors( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = 256; level.baker maps\_utility::clear_force_color(); level.baker.goalradius = var_0; level.baker.fixednode = 1; level.dog maps\_utility::clear_force_color(); level.dog set_move_rate( 0.8 ); level.dog.goalradius = var_0; level.dog.fixednode = 1; } team_2_unset_colors( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = 128; level.baker maps\_utility::clear_force_color(); level.baker.goalradius = var_0; level.adam maps\_utility::clear_force_color(); level.adam.goalradius = var_0; } set_start_positions( var_0 ) { var_1 = common_scripts\utility::getstructarray( var_0, "targetname" ); foreach ( var_3 in var_1 ) { switch ( var_3.script_noteworthy ) { case "player": level.player setorigin( var_3.origin ); level.player setplayerangles( var_3.angles ); break; case "baker": level.baker forceteleport( var_3.origin, var_3.angles ); level.baker setgoalpos( var_3.origin ); if ( isdefined( var_3.animation ) ) var_3 thread maps\_anim::anim_generic( level.baker, var_3.animation ); if ( isdefined( var_3.target ) ) { var_3 = var_3 common_scripts\utility::get_target_ent(); level.baker thread maps\_utility::follow_path_and_animate( var_3 ); } break; case "adam": level.adam forceteleport( var_3.origin, var_3.angles ); level.adam setgoalpos( var_3.origin ); if ( isdefined( var_3.animation ) ) var_3 thread maps\_anim::anim_generic( level.adam, var_3.animation ); if ( isdefined( var_3.target ) ) { var_3 = var_3 common_scripts\utility::get_target_ent(); level.adam thread maps\_utility::follow_path_and_animate( var_3 ); } break; case "cairo": case "dog": level.dog forceteleport( var_3.origin, var_3.angles ); level.dog setgoalpos( var_3.origin ); if ( isdefined( var_3.target ) ) { var_3 = var_3 common_scripts\utility::get_target_ent(); level.dog thread maps\_utility::follow_path_and_animate( var_3 ); } break; case "merrick": level.merrick forceteleport( var_3.origin, var_3.angles ); level.merrick setgoalpos( var_3.origin ); if ( isdefined( var_3.animation ) ) var_3 thread maps\_anim::anim_generic( level.merrick, var_3.animation ); if ( isdefined( var_3.target ) ) { var_3 = var_3 common_scripts\utility::get_target_ent(); level.merrick thread maps\_utility::follow_path_and_animate( var_3 ); } break; case "keegan": level.keegan forceteleport( var_3.origin, var_3.angles ); level.keegan setgoalpos( var_3.origin ); if ( isdefined( var_3.animation ) ) var_3 thread maps\_anim::anim_generic( level.keegan, var_3.animation ); if ( isdefined( var_3.target ) ) { var_3 = var_3 common_scripts\utility::get_target_ent(); level.keegan thread maps\_utility::follow_path_and_animate( var_3 ); } break; } } } spawn_adam() { var_0 = common_scripts\utility::get_target_ent( "adam" ); level.adam = var_0 maps\_utility::spawn_ai( 1 ); level.adam thread maps\_utility::deletable_magic_bullet_shield(); level.adam.animname = "adam"; level.adam.script_friendname = "Logan"; level.adam.name = "Logan"; level.adam maps\_utility::set_force_color( "g" ); level.adam thread maps\_stealth_utility::stealth_default(); level.adam maps\_utility::disable_surprise(); level.adam.fixednode = 1; level.adam maps\_utility::forceuseweapon( "honeybadger+reflex_sp", "primary" ); level.adam.disable_sniper_glint = 1; } spawn_baker() { var_0 = common_scripts\utility::get_target_ent( "baker" ); level.baker = var_0 maps\_utility::spawn_ai( 1 ); level.baker thread maps\_utility::magic_bullet_shield(); level.baker.animname = "hesh"; level.baker.fixednode = 1; level.baker maps\_utility::set_ai_bcvoice( "seal" ); level.baker maps\_utility::set_force_color( "r" ); level.baker thread maps\_stealth_utility::stealth_default(); level.baker maps\_utility::disable_surprise(); level.baker pushplayer( 1 ); level.baker maps\_utility::forceuseweapon( "honeybadger+reflex_sp", "primary" ); level.baker.disable_sniper_glint = 1; } spawn_merrick() { var_0 = common_scripts\utility::get_target_ent( "merrick" ); level.merrick = var_0 maps\_utility::spawn_ai( 1 ); level.merrick thread maps\_utility::magic_bullet_shield(); level.merrick.animname = "merrick"; level.merrick maps\_utility::set_force_color( "p" ); } spawn_keegan() { var_0 = common_scripts\utility::get_target_ent( "keegan" ); level.keegan = var_0 maps\_utility::spawn_ai( 1 ); level.keegan thread maps\_utility::magic_bullet_shield(); level.keegan.animname = "keegan"; level.keegan maps\_utility::set_force_color( "b" ); level.keegan maps\_utility::forceuseweapon( "l115a3+scopel115a3_sp", "primary" ); } spawn_dog() { var_0 = common_scripts\utility::get_target_ent( "cairo" ); level.dog = var_0 maps\_utility::spawn_ai( 1 ); level.dog thread maps\_utility::magic_bullet_shield(); level.dog.animname = "dog"; level.dog.meleealwayswin = 1; level.dog.script_stealthgroup = "dog"; level.dog.script_nobark = 1; level.dog.script_friendname = "Riley"; level.dog.name = "Riley"; level.dog maps\_utility::set_force_color( "r" ); level.dog.goalradius = 512; level.dog.goalheight = 128; level.dog.pathenemyfightdist = level.dog.goalradius; level.dog.fixednode = 1; level.dog setdogattackradius( 128 ); level.dog setthreatbiasgroup( "dog" ); setthreatbias( "dog", "axis", 75 ); level.dog pushplayer( 1 ); level.dog set_move_rate( 0.7 ); level.dog thread maps\nml_stealth::dog_stealth(); level.dog.script_color_delay_override = 1.5; level.dog thread maps\_utility_dogs::dog_pant_think(); } set_move_rate( var_0 ) { self.moveplaybackrate = var_0; self.movetransitionrate = var_0; } move_up_when_clear() { var_0 = common_scripts\utility::get_target_ent(); var_1 = var_0 common_scripts\utility::get_target_ent(); for (;;) { move_up_when_clear_think( var_1, var_0 ); wait 2; } } move_up_when_clear_think( var_0, var_1 ) { var_0 endon( "trigger" ); self waittill( "trigger" ); volume_waittill_no_axis( var_1.targetname, var_1.script_count ); var_0 thread maps\_utility::activate_trigger(); } tree_sway() { self endon( "death" ); var_0 = common_scripts\utility::random( [ -1, 1 ] ); for (;;) { var_1 = randomfloatrange( 4, 8 ); var_2 = randomfloatrange( 4, 7 ); self rotateyaw( var_2 * var_0, var_1, var_1 * 0.45, var_1 * 0.45 ); wait( var_1 ); self rotateyaw( -1 * var_2 * var_0, var_1, var_1 * 0.45, var_1 * 0.45 ); wait( var_1 ); } } tree_pitch() { self endon( "death" ); var_0 = common_scripts\utility::random( [ -1, 1 ] ); for (;;) { var_1 = randomfloatrange( 5, 10 ); var_2 = randomfloatrange( 5, 10 ); self rotatepitch( var_2 * var_0, var_1, var_1 * 0.45, var_1 * 0.45 ); wait( var_1 ); self rotatepitch( -1 * var_2 * var_0, var_1, var_1 * 0.45, var_1 * 0.45 ); wait( var_1 ); } } earthquake_trigger() { self waittill( "trigger" ); thread common_scripts\utility::do_earthquake( self.script_earthquake, self.origin ); var_0 = common_scripts\utility::getstructarray( self.target, "targetname" ); common_scripts\utility::array_thread( var_0, ::fx_ent_think ); if ( isdefined( self.script_soundalias ) ) thread common_scripts\utility::play_sound_in_space( self.script_soundalias, var_0[0].origin ); wait 0.75; level.player maps\_utility::player_speed_percent( 50, 1 ); wait 0.5; level.player maps\_utility::player_speed_percent( 100, 0.25 ); } fx_ent_think() { var_0 = "cave_dust"; wait( randomfloatrange( 1, 3.5 ) ); playfx( common_scripts\utility::getfx( var_0 ), self.origin, ( 0, 0, 1 ), ( 0, 1, 0 ) ); thread common_scripts\utility::play_sound_in_space( "nml_rubble", self.origin - ( 0, 0, 32 ) ); } ledge_trigger_logic() { var_0 = common_scripts\utility::get_target_ent(); for (;;) { self waittill( "trigger" ); if ( level.player maps\_utility::player_looking_at( var_0.origin, 0, 1 ) ) common_scripts\utility::flag_set( "player_on_ledge" ); else common_scripts\utility::flag_clear( "player_on_ledge" ); wait 0.1; } } player_ledge_logic() { for (;;) { common_scripts\utility::flag_wait( "player_on_ledge" ); level.player disableweapons(); level.player thread maps\_utility::player_speed_percent( 15, 1 ); thread ledge_fx(); thread ledge_quake(); common_scripts\utility::flag_waitopen( "player_on_ledge" ); level.player playersetgroundreferenceent( undefined ); level notify( "stop_ledge" ); level.player enableweapons(); level.player thread maps\_utility::player_speed_percent( 100, 1 ); } } ledge_quake() { level endon( "stop_ledge" ); wait 1; for (;;) { earthquake( randomfloatrange( 0.08, 0.12 ), randomfloatrange( 1, 2 ), level.player.origin, 512 ); wait( randomfloatrange( 0.1, 0.5 ) ); } } ledge_sway( var_0 ) { level endon( "stop_ledge" ); var_0 rotatepitch( 4, 5, 2, 2 ); var_0 waittill( "rotatedone" ); for (;;) { var_0 rotatepitch( -8, 5, 2, 2 ); var_0 waittill( "rotatedone" ); var_0 rotatepitch( 8, 5, 2, 2 ); var_0 waittill( "rotatedone" ); } } ledge_fx() { level endon( "stop_ledge" ); var_0 = common_scripts\utility::getstructarray( "ledge_top_fx", "targetname" ); var_1 = common_scripts\utility::getstructarray( "ledge_edge_fx", "targetname" ); level.ledge_old_player_pos = level.player.origin; childthread ledge_track_player_pos(); wait 2; for (;;) { level.ledge_old_player_pos = level.player.origin; spawn_fx_near_player( var_0, randomintrange( 1, 3 ) ); spawn_fx_near_player( var_1, randomintrange( 1, 3 ) ); level common_scripts\utility::waittill_notify_or_timeout( "spawn_new_ledge_fx", 3 ); } } ledge_track_player_pos() { for (;;) { if ( distance2d( level.ledge_old_player_pos, level.player.origin ) > 12 ) { level notify( "spawn_new_ledge_fx" ); level.ledge_old_player_pos = level.player.origin; } wait 0.05; } } spawn_fx_near_player( var_0, var_1 ) { var_2 = 0; var_3 = sortbydistance( var_0, level.player.origin ); foreach ( var_5 in var_0 ) { if ( common_scripts\utility::cointoss() ) { playfx( common_scripts\utility::getfx( "cave_dust" ), var_5.origin, ( 0, 0, 1 ), ( 1, 0, 0 ) ); var_2 = var_2 + 1; } if ( var_2 >= var_1 ) break; } } wait_for_group_attack( var_0 ) { common_scripts\utility::array_thread( var_0, ::notify_ai_on_attack, self ); self waittill( "attack", var_1 ); var_0 = maps\_utility::array_removedead( var_0 ); var_0 = common_scripts\utility::array_removeundefined( var_0 ); var_0 = common_scripts\utility::array_remove( var_0, var_1 ); var_2 = 0.97; var_3 = undefined; foreach ( var_5 in var_0 ) { var_6 = level.player geteye(); var_7 = var_5 geteye(); var_8 = vectortoangles( var_7 - var_6 ); var_9 = anglestoforward( var_8 ); var_10 = level.player getplayerangles(); var_11 = anglestoforward( var_10 ); var_12 = vectordot( var_9, var_11 ); if ( var_12 > var_2 ) { var_3 = var_5; var_2 = var_12; } } if ( isdefined( var_3 ) ) var_0 = common_scripts\utility::array_remove( var_0, var_3 ); wait 0.3; var_0 = maps\_utility::array_removedead( var_0 ); if ( var_0.size > 0 ) maps\nml_stealth::stealth_shot( common_scripts\utility::random( var_0 ) ); } notify_ai_on_attack( var_0 ) { common_scripts\utility::waittill_either( "damage", "dog_attacks_ai" ); var_0 notify( "attack", self ); } hero_follow_path_trig() { self waittill( "trigger" ); hero_paths( self.target ); } hero_paths( var_0, var_1, var_2, var_3, var_4, var_5 ) { var_6 = common_scripts\utility::getstructarray( var_0, "targetname" ); var_6 = common_scripts\utility::array_combine( var_6, getnodearray( var_0, "targetname" ) ); foreach ( var_8 in var_6 ) { if ( isdefined( var_8.script_noteworthy ) ) { switch ( var_8.script_noteworthy ) { case "baker": if ( !isdefined( var_2 ) ) var_2 = var_1; if ( !isdefined( var_4 ) ) var_4 = 0; level.baker maps\_utility::delaythread( var_4, maps\_utility::follow_path_and_animate, var_8, var_2 ); break; case "cairo": if ( !isdefined( var_3 ) ) var_3 = var_1; if ( !isdefined( var_5 ) ) var_5 = 1.5; level.dog maps\_utility::delaythread( var_5, maps\_utility::follow_path_and_animate, var_8, var_3 ); break; case "adam": level.adam maps\_utility::delaythread( 0.5, maps\_utility::follow_path_and_animate, var_8 ); break; case "merrick": level.merrick maps\_utility::delaythread( 0, maps\_utility::follow_path_and_animate, var_8 ); break; case "keegan": level.keegan maps\_utility::delaythread( 0, maps\_utility::follow_path_and_animate, var_8 ); break; } } } } hero_paths_cairo_first( var_0, var_1 ) { var_2 = common_scripts\utility::getstructarray( var_0, "targetname" ); var_2 = common_scripts\utility::array_combine( var_2, getnodearray( var_0, "targetname" ) ); foreach ( var_4 in var_2 ) { if ( isdefined( var_4.script_noteworthy ) ) { switch ( var_4.script_noteworthy ) { case "baker": level.baker maps\_utility::delaythread( 1.5, maps\_utility::follow_path_and_animate, var_4, var_1 ); break; case "cairo": level.dog maps\_utility::delaythread( 0, maps\_utility::follow_path_and_animate, var_4, var_1 ); break; case "adam": level.adam maps\_utility::delaythread( 0.5, maps\_utility::follow_path_and_animate, var_4 ); break; } } } } delete_trigger() { for (;;) { self waittill( "trigger", var_0 ); var_0 delete(); } } link_linked_ents() { var_0 = common_scripts\utility::get_linked_ents(); common_scripts\utility::array_thread( var_0, ::parent_to_me, self ); } parent_to_me( var_0 ) { self linkto( var_0 ); self show(); var_0 waittill( "death" ); self delete(); } volume_waittill_no_axis( var_0, var_1 ) { var_2 = common_scripts\utility::get_target_ent( var_0 ); for (;;) { if ( volume_is_empty( var_2, var_1 ) ) break; wait 0.2; } } volume_is_empty( var_0, var_1 ) { if ( !isdefined( var_1 ) ) var_1 = 0; var_2 = getaiarray( "axis" ); var_3 = 0; foreach ( var_5 in var_2 ) { if ( var_5 istouching( var_0 ) ) { var_3 = var_3 + 1; if ( var_3 > var_1 ) return 0; } } return 1; } moveto_rotateto( var_0, var_1, var_2, var_3 ) { self moveto( var_0.origin, var_1, var_2, var_3 ); self rotateto( var_0.angles, var_1, var_2, var_3 ); self waittill( "movedone" ); } moveto_rotateto_speed( var_0, var_1, var_2, var_3 ) { var_4 = var_0.origin; var_5 = self.origin; var_6 = distance( var_5, var_4 ); var_7 = var_6 / var_1; if ( !isdefined( var_2 ) ) var_2 = 0; if ( !isdefined( var_3 ) ) var_3 = 0; if ( var_7 <= 0 ) return; self rotateto( var_0.angles, var_7, var_7 * var_2, var_7 * var_3 ); self moveto( var_4, var_7, var_7 * var_2, var_7 * var_3 ); self waittill( "movedone" ); } stealth_range_trigger() { self endon( "death" ); if ( !isdefined( self.script_parameters ) ) return; var_0 = strtok( self.script_parameters, " " ); var_1 = []; var_1["prone"] = float( var_0[2] ); var_1["crouch"] = float( var_0[1] ); var_1["stand"] = float( var_0[0] ); for (;;) { self waittill( "trigger", var_2 ); if ( !isdefined( var_2.rangetriggeroverride ) ) { var_2.istouchingrangetrigger = 0; var_2.rangetriggeroverride = 0; } if ( !var_2.rangetriggeroverride ) { while ( isdefined( var_2 ) && var_2 istouching( self ) && !var_2.rangetriggeroverride ) { maps\_stealth_visibility_system::system_set_detect_ranges( var_1 ); var_2.istouchingrangetrigger = 1; wait 0.1; } if ( isdefined( var_2 ) ) { var_2.istouchingrangetrigger = 0; wait 0.2; } if ( !isdefined( var_2 ) || !var_2.istouchingrangetrigger && !var_2.rangetriggeroverride ) default_stealth_settings(); } } } default_stealth_settings() { if ( isdefined( level.default_stealth_override ) ) [[ level.default_stealth_override ]](); else maps\_stealth_visibility_system::system_default_detect_ranges(); } vehicle_rumble_even_if_not_moving() { self endon( "kill_rumble_forever" ); var_0 = self.classname; var_1 = undefined; if ( isdefined( self.vehicle_rumble_unique ) ) var_1 = self.vehicle_rumble_unique; else if ( isdefined( level.vehicle_rumble_override ) && isdefined( level.vehicle_rumble_override[var_0] ) ) var_1 = level.vehicle_rumble_override; else if ( isdefined( level.vehicle_rumble[var_0] ) ) var_1 = level.vehicle_rumble[var_0]; if ( !isdefined( var_1 ) ) return; var_2 = var_1.radius * 2; var_3 = -1 * var_1.radius; var_4 = spawn( "trigger_radius", self.origin + ( 0, 0, var_3 ), 0, var_1.radius, var_2 ); var_4 enablelinkto(); var_4 linkto( self ); self.rumbletrigger = var_4; self endon( "death" ); if ( !isdefined( self.rumbleon ) ) self.rumbleon = 1; if ( isdefined( var_1.scale ) ) self.rumble_scale = var_1.scale; else self.rumble_scale = 0.15; if ( isdefined( var_1.duration ) ) self.rumble_duration = var_1.duration; else self.rumble_duration = 4.5; if ( isdefined( var_1.radius ) ) self.rumble_radius = var_1.radius; else self.rumble_radius = 600; if ( isdefined( var_1.basetime ) ) self.rumble_basetime = var_1.basetime; else self.rumble_basetime = 1; if ( isdefined( var_1.randomaditionaltime ) ) self.rumble_randomaditionaltime = var_1.randomaditionaltime; else self.rumble_randomaditionaltime = 1; var_4.radius = self.rumble_radius; for (;;) { var_4 waittill( "trigger" ); if ( !self.rumbleon ) { wait 0.1; continue; } self playrumblelooponentity( var_1.rumble ); while ( level.player istouching( var_4 ) && self.rumbleon ) { earthquake( self.rumble_scale, self.rumble_duration, self.origin, self.rumble_radius ); wait( self.rumble_basetime + randomfloat( self.rumble_randomaditionaltime ) ); } self stoprumble( var_1.rumble ); } } btr_attack_player_on_flag( var_0 ) { foreach ( var_2 in self.mgturret ) var_2 notify( "stop_burst_fire_unmanned" ); maps\_vehicle::mgoff(); self endon( "death" ); for (;;) { common_scripts\utility::flag_wait( var_0 ); self notify( "stop_random_fire" ); self.ignoreme = 0; self.ignoreall = 0; self.baseaccuracy = 9999; self.favoriteenemy = level.player; foreach ( var_2 in self.mgturret ) var_2 thread maps\_mgturret::burst_fire_unmanned(); thread maps\_vehicle::mgon(); thread btr_target_player(); common_scripts\utility::flag_waitopen( var_0 ); foreach ( var_2 in self.mgturret ) var_2 notify( "stop_burst_fire_unmanned" ); self notify( "stop_shooting" ); } } btr_target_player() { self endon( "death" ); self endon( "stop_shooting" ); self vehicle_setspeedimmediate( 0.0, 5.0, 15.0 ); self setturrettargetent( level.player ); wait 1.5; while ( isalive( level.player ) ) { self setturrettargetent( level.player ); if ( self.model == "vehicle_btr80" ) { if ( can_see_player() ) fire_at_target(); } wait 0.3; } } fire_at_target() { var_0 = randomintrange( 2, 15 ); var_1 = 0.1; for ( var_2 = 0; var_2 < var_0; var_2++ ) { self fireweapon(); wait( var_1 ); } } can_see_player() { var_0 = level.player; var_1 = self gettagorigin( "tag_flash" ); var_2 = var_0 geteye(); if ( sighttracepassed( var_1, var_2, 0, self ) ) { if ( isdefined( level.debug ) ) { } return 1; } else return 0; } ghille_on_player() { level.player.ghille_top = common_scripts\utility::get_target_ent( "ghille_top" ); level.player.ghille_top.animname = "grass"; level.player.ghille_top maps\_anim::setanimtree(); level.player.ghille_top delete(); } dyn_dogspeed_enable( var_0 ) { self endon( "death" ); self endon( "dynspeed_off" ); if ( isdefined( self.dyn_speed ) ) return; self.dyn_speed = 1; if ( !isdefined( var_0 ) ) var_0 = 200; self.old_moveplaybackrate = self.moveplaybackrate; for (;;) { var_1 = maps\_utility_dogs::player_is_behind_me(); var_2 = distance( self.origin, level.player.origin ); if ( !var_1 || var_2 < var_0 ) { if ( self.type == "dog" ) self.moveplaybackrate = self.old_moveplaybackrate * 1.4; else self.moveplaybackrate = self.old_moveplaybackrate * 1.15; self.movetransitionrate = self.moveplaybackrate; wait 1; while ( !maps\_utility_dogs::player_is_behind_me() || distance( self.origin, level.player.origin ) < var_0 ) wait 0.1; self.moveplaybackrate = self.old_moveplaybackrate; self.movetransitionrate = self.moveplaybackrate; wait 5; } wait 0.3; } } dyn_dogspeed_disable() { self notify( "dynspeed_off" ); if ( isdefined( self.old_moveplaybackrate ) ) { self.moveplaybackrate = self.old_moveplaybackrate; self.movetransitionrate = self.moveplaybackrate; } self.old_moveplaybackrate = undefined; self.dyn_speed = undefined; } make_enemy_squad_burst( var_0, var_1 ) { level endon( var_1 ); var_2 = []; foreach ( var_4 in var_0 ) { var_4.radio_emitter = common_scripts\utility::spawn_tag_origin(); var_4.radio_emitter linkto( var_4, "J_SpineUpper", ( 0, 0, 0 ), ( 0, 0, 0 ) ); var_2 = common_scripts\utility::array_add( var_2, var_4.radio_emitter ); } common_scripts\utility::array_thread( var_2, ::delete_on_notify, var_1 ); var_6 = randomintrange( 0, level.scr_enemy_bursts.size ); for (;;) { var_7 = common_scripts\utility::random( var_2 ); var_7 maps\_utility::play_sound_on_entity( level.scr_enemy_bursts[var_6] ); var_6 = ( var_6 + 1 ) % level.scr_enemy_bursts.size; wait( randomfloatrange( 3, 7 ) ); } } delete_on_notify( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = "level_cleanup"; self endon( "death" ); level waittill( var_0 ); if ( common_scripts\utility::flag_exist( "_stealth_spotted" ) ) common_scripts\utility::flag_waitopen( "_stealth_spotted" ); if ( isdefined( self.magic_bullet_shield ) && self.magic_bullet_shield ) maps\_utility::stop_magic_bullet_shield(); self delete(); } blur_pulse( var_0 ) { level.player thread maps\_utility::play_sound_on_entity( "scn_nml_camera_focus" ); level.player setblurforplayer( var_0, 0.4 ); wait 0.6; level.player setblurforplayer( 0, 0.3 ); wait 0.3; level.player setblurforplayer( var_0 / 2, 0.25 ); wait 0.5; level.player setblurforplayer( 0, 0.5 ); } is_dog_attacking() { return isdefined( level.dog.favoriteenemy ); } is_dog_really_attacking() { return isdefined( level.dog.enemy ) && isdefined( level.dog.enemy.syncedmeleetarget ) || isdefined( level.player.attack_indicator_on ) && level.player.attack_indicator_on.alpha == 0; } waittill_player_lookat_on_dog( var_0, var_1, var_2, var_3, var_4 ) { if ( !isdefined( var_4 ) ) var_4 = level.player; var_5 = int( var_0 * 20 ); var_6 = var_5; self endon( "death" ); var_7 = isai( self ); var_8 = undefined; for (;;) { if ( var_7 ) var_8 = self geteye(); else var_8 = self.origin; if ( var_4 player_looking_at_on_dog( var_8, var_1, var_2, var_3 ) ) { var_6--; if ( var_6 <= 0 ) return 1; } else var_6 = var_5; wait 0.05; } } player_looking_at_on_dog( var_0, var_1, var_2, var_3 ) { if ( !isdefined( var_1 ) ) var_1 = 0.8; var_4 = maps\_utility::get_player_from_self(); var_5 = var_4 maps\_dog_control::get_eye(); var_6 = vectortoangles( var_0 - var_5 ); var_7 = anglestoforward( var_6 ); var_8 = var_4 getplayerangles(); var_9 = anglestoforward( var_8 ); var_10 = vectordot( var_7, var_9 ); if ( var_10 < var_1 ) return 0; if ( isdefined( var_2 ) ) return 1; var_11 = bullettrace( var_0, var_5, 0, var_3 ); return var_11["fraction"] == 1; } mission_fail_on_dog_death( var_0 ) { if ( isdefined( level.dog ) && isalive( level.dog ) ) { level.dog notify( "magic_bullet_shield" ); level.dog endon( "magic_bullet_shield" ); if ( isdefined( level.dog.magic_bullet_shield ) && level.dog.magic_bullet_shield ) level.dog maps\_utility::stop_magic_bullet_shield(); level.dog.health = 1; level.dog waittill( "death", var_1 ); if ( isdefined( var_1 ) && var_1 == level.player ) force_deathquote( &"NML_HINT_CAIRO_DEATH_PLR" ); else if ( isdefined( var_0 ) ) force_deathquote( var_0 ); else force_deathquote( "" ); } maps\_utility::missionfailedwrapper(); } hazmat_if_hazmat( var_0 ) { if ( issubstr( self.model, "hazmat" ) ) thread hazmat_think( var_0 ); } hazmat_think( var_0 ) { if ( !isdefined( var_0 ) ) var_0 = "stand"; self.generic_voice_override = "hazmat"; self.ignoreall = 1; self.hazmat_stance = var_0; self.combatmode = "no_cover"; maps\_utility::gun_remove(); maps\_utility::set_generic_idle_anim( "hazmat_" + var_0 + "_geiger_idle" ); maps\_utility::set_generic_run_anim( "hazmat_walk_geiger" ); self.animname = "generic"; self.script_animation = "hazmat"; self attach( "nml_geiger_counter", "tag_inhand", 1 ); thread drop_geiger_on_dogattack(); self.geiger_sound_source = common_scripts\utility::spawn_tag_origin(); self.geiger_sound_source linkto( self, "tag_inhand", ( 0, 0, 0 ), ( 0, 0, 0 ) ); self.geiger_sound_source playloopsound( "scn_nml_geiger_counter" ); thread yell_and_scream_kill(); thread hazmat_gets_scared(); } drop_geiger_on_dogattack() { self endon( "death" ); self endon( "geiger_drop" ); self waittill( "dog_attacks_ai" ); self detach( "nml_geiger_counter", "tag_inhand" ); thread maps\nml_anim::drop_geiger_counter( self ); } hazmat_change_stance( var_0 ) { maps\_anim::anim_generic( self, "hazmat_" + self.hazmat_stance + "_2_" + var_0 ); self.hazmat_stance = var_0; } hazmat_gets_scared() { level.dog endon( "death" ); self endon( "death" ); self endon( "dog_attacks_ai" ); thread hazmat_guy_wait_for_dog_attack(); thread hazmat_guy_wait_for_dog_proximity(); self waittill( "runaway", var_0 ); self notify( "end_patrol" ); maps\_stealth_utility::disable_stealth_for_ai(); common_scripts\utility::waitframe(); self.ignoreall = 1; thread maps\_utility::set_battlechatter( 0 ); maps\_utility::set_generic_run_anim( "hazmat_run" ); maps\_utility::set_generic_idle_anim( "unarmed_cowercrouch_idle" ); maps\_utility::disable_turnanims(); maps\_utility::disable_arrivals(); maps\_utility::disable_exits(); maps\_utility::disable_surprise(); self.turnrate = 0.4; common_scripts\utility::waitframe(); hazmat_notify_nearby_allies(); thread hazmat_react( var_0 ); wait 1; if ( hazmat_find_gun() == 0 ) hazmat_run_away(); else thread hazmat_scared_fire(); } hazmat_notify_nearby_allies() { var_0 = getaiarray( "axis" ); var_0 = sortbydistance( var_0, self.origin ); foreach ( var_2 in var_0 ) { if ( var_2 != self ) { if ( distance( var_2.origin, self.origin ) < 300 ) { var_2 getenemyinfo( level.dog ); continue; } break; } } } hazmat_scared_fire() { self endon( "death" ); level.dog endon( "death" ); wait 3; for (;;) { self notify( "stop_yelling" ); self getenemyinfo( level.dog ); self.goalradius = 128; self setgoalentity( level.dog ); maps\_utility::clear_generic_idle_anim(); maps\_utility::clear_generic_run_anim(); self.ignoreall = 0; break; wait 0.05; } } hazmat_guy_wait_for_dog_attack() { self endon( "death" ); self endon( "dog_attacks_ai" ); self endon( "runaway" ); for (;;) { level waittill( "dog_attacks_ai", var_0, var_1 ); if ( distance2d( var_0.origin, self.origin ) < max( 400, level.dog.maxvisibledist ) ) self notify( "runaway", var_0 ); } } hazmat_guy_wait_for_dog_proximity() { self endon( "death" ); self endon( "dog_attacks_ai" ); self endon( "runaway" ); level.dog endon( "death" ); for (;;) { var_0 = distance( self.velocity, ( 0, 0, 0 ) ); var_1 = distance2d( level.dog.origin, self.origin ); var_2 = level.dog.maxvisibledist; if ( var_1 < var_2 ) { var_3 = vectortoangles( level.dog.origin - self gettagorigin( "tag_eye" ) ); var_4 = anglestoforward( var_3 ); var_5 = anglestoforward( self gettagangles( "tag_eye" ) ); var_6 = vectordot( var_4, var_5 ); if ( var_6 > 0.7 ) break; } wait 0.05; } self notify( "runaway", level.dog ); } hazmat_react( var_0 ) { self endon( "death" ); self endon( "dog_attacks_ai" ); self notify( "end_patrol" ); if ( self.type == "dog" ) return; var_1 = var_0.origin; var_2 = anglestoforward( self.angles ); var_3 = vectornormalize( var_2 ); var_4 = vectortoangles( var_3 ); var_5 = vectortoangles( var_1 - self.origin ); var_6 = var_4[1] - var_5[1]; var_6 = var_6 + 360; var_6 = int( var_6 ) % 360; self.react_node = spawn( "script_origin", self.origin ); if ( var_6 > 315 || var_6 < 45 ) { var_7 = "_B"; self.react_node.angles = ( 0, var_5[1] + 0, 0 ); } else if ( var_6 < 135 ) { var_7 = "_L"; self.react_node.angles = ( 0, var_5[1] + 90, 0 ); } else if ( var_6 < 225 ) { var_7 = ""; self.react_node.angles = ( 0, var_5[1] + 0, 0 ); } else { var_7 = "_R"; self.react_node.angles = ( 0, var_5[1] - 90, 0 ); } thread yell_and_scream(); self.react_node thread maps\_stealth_shared_utilities::stealth_anim_custom_animmode( self, "gravity", "hazmat_stand_geiger_react" + var_7 ); } yell_and_scream() { self endon( "death" ); self endon( "entitydeleted" ); self endon( "dog_attacks_ai" ); maps\_utility::play_sound_on_entity( "hazmat_dogstartle_enemy_1" ); self.scream_node = common_scripts\utility::spawn_tag_origin(); self.scream_node linkto( self, "j_head", ( 0, 0, 0 ), ( 0, 0, 0 ) ); thread yell_and_scream_stop(); for (;;) { yell_and_scream_think(); wait 0.1; } } yell_and_scream_think() { self endon( "stop_yelling" ); self.scream_node endon( "death" ); self.scream_node endon( "entitydeleted" ); if ( isdefined( self.scream_node ) ) { self.scream_node playsound( "hazmat_dogrun_enemy_1", "done_yelling" ); self.scream_node waittill( "done_yelling" ); } } yell_and_scream_stop() { common_scripts\utility::waittill_any( "death", "damage", "dog_attacks_ai", "stop_yelling" ); self.scream_node stopsounds(); } yell_and_scream_kill() { common_scripts\utility::waittill_either( "death", "stop_yelling" ); var_0 = undefined; var_1 = undefined; if ( isdefined( self.scream_node ) ) var_0 = self.scream_node; if ( isdefined( self.geiger_sound_source ) ) { self.geiger_sound_source stopsounds(); var_1 = self.geiger_sound_source; } wait 0.1; if ( isdefined( var_0 ) ) var_0 delete(); if ( isdefined( var_1 ) ) var_1 delete(); } hazmat_find_gun() { self endon( "death" ); self endon( "dog_attacks_ai" ); if ( !isdefined( level.pickup_guns ) ) return 0; var_0 = sortbydistance( level.pickup_guns, self.origin ); foreach ( var_2 in var_0 ) { if ( !isdefined( var_2.claimed ) ) { var_3 = distance2d( var_2.origin, self.origin ); var_4 = distance2d( var_2.origin, level.dog.origin ); if ( var_3 <= var_4 ) { var_5 = var_2.node; var_2.claimed = 1; level.pickup_guns = common_scripts\utility::array_remove( level.pickup_guns, var_2 ); for (;;) { var_6 = getstartorigin( var_5.origin, var_5.angles, maps\_utility::getgenericanim( "hazmat_run_2_grab_rifle_180" ) ); var_5 maps\_anim::anim_generic_reach( self, "hazmat_run_2_grab_rifle_180" ); if ( distance( self.origin, var_6 ) < 16 ) break; } var_5 thread maps\_anim::anim_generic_gravity( self, "hazmat_run_2_grab_rifle_180" ); common_scripts\utility::waitframe(); var_2 delete(); maps\_utility::delaythread( 0.5, maps\_utility::gun_recall ); scared_behavior(); return 1; } } } return 0; } hazmat_run_away() { run_away_from_dog(); } run_away_from_dog() { level endon( "mall_run_away" ); self endon( "death" ); level.dog endon( "death" ); level.dog endon( "" ); for (;;) { while ( distance2d( self.origin, level.dog.origin ) > 400 ) wait 0.1; var_0 = getnodesinradius( level.dog.origin, 1024, 600, 300 ); self.goalradius = 128; self setgoalnode( common_scripts\utility::random( var_0 ) ); self waittill( "goal" ); } } scared_behavior() { maps\_utility::set_generic_run_anim( "scared_walk_forward" ); maps\_utility::set_generic_idle_anim( "scared_idle" ); } load_hazmat_guns( var_0 ) { if ( !isdefined( level.pickup_guns ) ) level.pickup_guns = []; var_1 = getentarray( var_0, "script_noteworthy" ); common_scripts\utility::array_thread( var_1, ::spawn_pickup_gun ); } delete_hazmat_guns() { if ( !isdefined( level.pickup_guns ) ) level.pickup_guns = []; foreach ( var_1 in level.pickup_guns ) var_1 delete(); level.pickup_guns = []; } spawn_pickup_gun() { var_0 = spawn( "script_model", self.origin ); var_0 setmodel( self.model ); var_0.animname = "gun"; var_0 maps\_anim::setanimtree(); var_0.node = self; thread maps\_anim::anim_first_frame_solo( var_0, "hazmat_run_2_grab_rifle_180" ); level.pickup_guns = common_scripts\utility::array_add( level.pickup_guns, var_0 ); } hud_outlineenable() { self.grenadeammo = 0; thread delayhudoutline( 1, 0 ); thread hudoutline_wait_death(); self endon( "death" ); self waittill( "dog_attacks_ai" ); if ( isdefined( self ) ) { self.no_more_outlines = 1; self hudoutlinedisable(); } } hudoutline_wait_death() { self waittill( "death" ); wait 2.5; if ( isdefined( self ) ) { self.no_more_outlines = 1; self hudoutlinedisable(); } var_0 = getcorpsearray(); foreach ( var_2 in var_0 ) var_2 hudoutlinedisable(); } delayhudoutline( var_0, var_1 ) { self endon( "death" ); thread outline_off_when_far( var_1 ); } outline_off_when_far( var_0 ) { self endon( "death" ); level.dog endon( "death" ); for (;;) { while ( distance2d( self.origin, level.dog.origin ) > level.hudoutline_maxdist ) wait 0.05; if ( !isdefined( self.no_more_outlines ) ) { wait( randomfloatrange( 0, 0.5 ) ); self hudoutlineenable( var_0, 0 ); level.player thread maps\_utility::play_sound_on_entity( "scn_nml_camera_enemy_contact_on" ); } wait 1; while ( distance2d( self.origin, level.dog.origin ) <= level.hudoutline_maxdist ) wait 0.05; self hudoutlinedisable(); wait 0.2; } } sneak_trig() { for (;;) { self waittill( "trigger", var_0 ); if ( var_0.type != "dog" ) { wait 0.05; continue; } if ( issubstr( self.targetname, "enable" ) ) { var_0 maps\_utility_dogs::enable_dog_sneak(); continue; } var_0 maps\_utility_dogs::disable_dog_sneak(); } } intro_heli_think() { common_scripts\utility::flag_set( "skip_cave_cqb" ); self vehicle_turnengineoff(); maps\_utility::play_sound_on_entity( self.script_soundalias ); } #using_animtree("generic_human"); switch_from_cqb_to_creepwalk() { if ( isdefined( self.cqbwalking ) ) { if ( self.cqbwalking == 1 ) { maps\_utility::disable_cqbwalk(); self.moveloopoverridefunc = ::play_move_transition; self.deerhunttransitionanim = %cqb_run_to_creepwalk_iw6; animscripts\run::endfaceenemyaimtracking(); } } maps\_utility::set_archetype( "creepwalk" ); maps\_utility::disable_turnanims(); maps\_utility::enable_readystand(); } switch_from_creepwalk_to_cqb() { maps\_utility::enable_turnanims(); maps\_utility::enable_cqbwalk(); maps\_utility::clear_archetype(); maps\_utility::disable_readystand(); self.moveloopoverridefunc = ::play_move_transition; self.deerhunttransitionanim = %creepwalk_to_cqb_run_iw6; } play_move_transition() { self.moveloopoverridefunc = undefined; self clearanim( %body, 0.2 ); self setflaggedanimknoballrestart( "creepwalk_transition", self.deerhunttransitionanim, %body ); animscripts\shared::donotetracks( "creepwalk_transition" ); self clearanim( %body, 0.2 ); self.deerhunttransitionanim = undefined; } ragdoll_corpses() { var_0 = getcorpsearray(); foreach ( var_2 in var_0 ) { if ( var_2 isragdoll() == 0 ) var_2 startragdoll(); } } baker_noncombat() { level.baker clearenemy(); level.baker.alertlevel = "noncombat"; level.baker.a.combatendtime = gettime() - 10000; } group_walla( var_0, var_1, var_2, var_3 ) { foreach ( var_5 in var_0 ) { var_5 endon( "enemy" ); var_5 endon( "damage" ); var_5 endon( "dog_attacks_ai" ); } if ( isdefined( var_3 ) ) level endon( var_3 ); var_7 = var_1; var_8 = 1; for (;;) { var_0 = common_scripts\utility::array_removeundefined( var_0 ); var_0 = maps\_utility::array_removedead( var_0 ); if ( var_0.size == 0 ) break; var_9 = "walla_" + var_7 + "_" + var_8; if ( isdefined( level.scr_sound["generic"][var_9] ) ) { var_10 = common_scripts\utility::random( var_0 ); var_10 maps\_utility::generic_dialogue_queue( var_9 ); var_8 = var_8 + 1; wait( randomfloatrange( 0.5, 0.9 ) ); continue; } var_7 = var_7 + 1; var_8 = 1; if ( var_7 > var_2 ) break; } } force_deathquote( var_0 ) { if ( isdefined( var_0 ) ) { level notify( "new_quote_string" ); setdvar( "ui_deadquote", var_0 ); } } track_player_bark() { level waittill( "dog_barked", var_0 ); common_scripts\utility::flag_set( "player_knows_how_to_bark" ); } check_player_bark() { return common_scripts\utility::flag( "player_knows_how_to_bark" ) || common_scripts\utility::flag( "pc_guy_2_dead" ); } check_dog_ready_to_attack() { return isdefined( level.player.attack_indicator_on ) && level.player.attack_indicator_on.alpha == 1; } check_dog_sprinting() { return isdefined( level.dog ) && ( !level.dog isdogbeingdriven() || level.dog.sprint ); } check_player_zoom() { return isdefined( level.dog ) && ( !level.dog isdogbeingdriven() || level.dog.zoomed ); } reactive_grass_settings() { setsaveddvar( "r_reactiveMotionActorRadius", 40 ); setsaveddvar( "r_reactiveMotionActorVelocityMax", 0.2 ); setsaveddvar( "r_reactiveMotionEffectorStrengthScale", 10 ); setsaveddvar( "r_reactiveMotionVelocityTailScale", 0.5 ); setsaveddvar( "r_reactiveMotionWindDir", ( -1, 0, 1 ) ); setsaveddvar( "r_reactiveMotionWindAreaScale", 0.5 ); thread common_scripts\_wind::wind( 0.02, 0.6, 4 ); } reactive_grass_settings_pc() { setsaveddvar( "r_reactiveMotionActorRadius", 20 ); setsaveddvar( "r_reactiveMotionActorVelocityMax", 0.2 ); setsaveddvar( "r_reactiveMotionEffectorStrengthScale", 20 ); setsaveddvar( "r_reactiveMotionVelocityTailScale", 0.1 ); setsaveddvar( "r_reactiveMotionWindDir", ( -1, 0, 1 ) ); setsaveddvar( "r_reactiveMotionWindAreaScale", 0.5 ); thread common_scripts\_wind::wind( 0.02, 0.6, 4 ); } player_has_silenced_weapon() { var_0 = level.player getcurrentweapon(); if ( issubstr( var_0, "honeybadger" ) || issubstr( var_0, "silence" ) ) return 1; return 0; } slide_sounds( var_0 ) { maps\_utility::play_sound_on_entity( "foot_slide_npc_start" ); thread common_scripts\utility::play_loop_sound_on_entity( "foot_slide_npc_loop" ); self waittillmatch( "single anim", "stop_slide" ); common_scripts\utility::stop_loop_sound_on_entity( "foot_slide_npc_loop" ); maps\_utility::play_sound_on_entity( "foot_slide_npc_end" ); }