iw6-scripts/maps/nml_util.gsc
2024-02-13 13:20:49 +01:00

1649 lines
44 KiB
Plaintext

// 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" );
}