926 lines
26 KiB
Plaintext
926 lines
26 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
#using_animtree("dog");
|
|
|
|
init_dog_control()
|
|
{
|
|
precachestring( &"SCRIPT_DOG_NOTARGET" );
|
|
precachestring( &"SCRIPT_DOG_NOTREADY" );
|
|
createthreatbiasgroup( "dog" );
|
|
createthreatbiasgroup( "dog_targets" );
|
|
setignoremegroup( "dog_targets", "allies" );
|
|
level.scr_anim["dog"]["dog_bark"] = %iw6_dog_attackidle_bark;
|
|
common_scripts\utility::flag_init( "enable_dog_pip" );
|
|
}
|
|
|
|
enable_dog_control( var_0 )
|
|
{
|
|
var_0.animname = "dog";
|
|
|
|
if ( !var_0 maps\_utility::ent_flag_exist( "dog_no_teleport" ) )
|
|
var_0 maps\_utility::ent_flag_init( "dog_no_teleport" );
|
|
|
|
if ( !var_0 maps\_utility::ent_flag_exist( "dog_cooldown" ) )
|
|
var_0 maps\_utility::ent_flag_init( "dog_cooldown" );
|
|
|
|
if ( !var_0 maps\_utility::ent_flag_exist( "running_dog_command" ) )
|
|
var_0 maps\_utility::ent_flag_init( "running_dog_command" );
|
|
|
|
if ( !var_0 maps\_utility::ent_flag_exist( "pause_dog_command" ) )
|
|
var_0 maps\_utility::ent_flag_init( "pause_dog_command" );
|
|
|
|
if ( !var_0 maps\_utility::ent_flag_exist( "cancel_command_disabled" ) )
|
|
var_0 maps\_utility::ent_flag_init( "cancel_command_disabled" );
|
|
|
|
self.controlled_dog = var_0;
|
|
var_0.player_controller = self;
|
|
childthread give_laser();
|
|
childthread listen_for_dog_commands( var_0 );
|
|
|
|
if ( !isdefined( self.notargethudelem ) )
|
|
{
|
|
self.notargethudelem = maps\_hud_util::createclientfontstring( "default", 1.1 );
|
|
self.notargethudelem maps\_hud_util::setpoint( "CENTER", "CENTER", 0, -15, 0 );
|
|
self.notargethudelem settext( "No Target" );
|
|
self.notargethudelem.alpha = 0;
|
|
}
|
|
|
|
self takeweapon( "flash_grenade" );
|
|
self.controlled_dog.dog_marker = common_scripts\utility::spawn_tag_origin();
|
|
setdvar( "ui_dog_grenade", 1 );
|
|
thread ui_dog_grenade_logic();
|
|
|
|
if ( level.xb3 )
|
|
maps\_dog_kinect::speechcommands();
|
|
}
|
|
|
|
disable_dog_control()
|
|
{
|
|
self notify( "disable_dog_control" );
|
|
self.controlled_dog = undefined;
|
|
self.controlled_dog.dog_marker delete();
|
|
self enableoffhandweapons();
|
|
setdvar( "ui_dog_grenade", 0 );
|
|
}
|
|
|
|
listen_for_dog_commands( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_0 endon( "death" );
|
|
self endon( "disable_dog_control" );
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "issue_dog_command", var_1, var_2, var_3 );
|
|
|
|
if ( var_0 maps\_utility::ent_flag( "pause_dog_command" ) )
|
|
continue;
|
|
|
|
if ( var_0 maps\_utility::ent_flag( "dog_cooldown" ) || isdefined( var_0.in_melee ) && var_0.in_melee )
|
|
{
|
|
thread display_no_target( &"SCRIPT_DOG_NOTREADY", 2 );
|
|
continue;
|
|
}
|
|
|
|
if ( isdefined( var_0.animnode ) )
|
|
{
|
|
var_0 stopanimscripted();
|
|
var_0.animnode notify( "stop_loop" );
|
|
}
|
|
|
|
var_0 thread run_dog_command( var_1, var_2, var_3 );
|
|
}
|
|
}
|
|
|
|
isneargrenade()
|
|
{
|
|
var_0 = getentarray( "grenade", "classname" );
|
|
|
|
for ( var_1 = 0; var_1 < var_0.size; var_1++ )
|
|
{
|
|
var_2 = var_0[var_1];
|
|
|
|
if ( var_2.model == "weapon_claymore" )
|
|
continue;
|
|
|
|
for ( var_3 = 0; var_3 < level.players.size; var_3++ )
|
|
{
|
|
var_4 = level.players[var_3];
|
|
|
|
if ( distancesquared( var_2.origin, var_4.origin ) < 36864 )
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
give_laser()
|
|
{
|
|
level.see_enemy_dot = 0.985;
|
|
level.see_enemy_dot_close = 0.99;
|
|
self endon( "disable_dog_control" );
|
|
self endon( "remove_laser" );
|
|
self.lastusedweapon = undefined;
|
|
self notifyonplayercommand( "fired_laser", "+smoke" );
|
|
childthread laser_designate_target();
|
|
childthread listen_for_cancel();
|
|
}
|
|
|
|
laser_designate_target()
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( "fired_laser" );
|
|
var_0 = get_laser_designated_trace();
|
|
var_1 = undefined;
|
|
var_2 = getaiarray( "axis" );
|
|
var_3 = [];
|
|
var_4 = self;
|
|
var_5 = var_4 get_eye();
|
|
|
|
if ( isdefined( var_0["entity"] ) && isai( var_0["entity"] ) )
|
|
{
|
|
if ( isalive( var_0["entity"] ) && var_0["entity"].team != "allies" && var_0["entity"].type != "dog" )
|
|
var_1 = var_0["entity"];
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_6 = level.see_enemy_dot_close;
|
|
|
|
foreach ( var_8 in var_2 )
|
|
{
|
|
if ( var_8.type == "dog" )
|
|
continue;
|
|
|
|
var_9 = var_8 gettagorigin( "J_SpineUpper" );
|
|
var_10 = vectortoangles( var_9 - var_5 );
|
|
var_11 = anglestoforward( var_10 );
|
|
var_12 = var_4 getplayerangles();
|
|
var_13 = anglestoforward( var_12 );
|
|
var_14 = vectordot( var_11, var_13 );
|
|
|
|
if ( var_14 > var_6 )
|
|
var_3 = common_scripts\utility::array_add( var_3, var_8 );
|
|
}
|
|
|
|
if ( var_3.size > 0 )
|
|
{
|
|
var_3 = sortbydistance( var_3, var_5 );
|
|
|
|
foreach ( var_8 in var_3 )
|
|
{
|
|
if ( test_trace( var_8 geteye(), var_5, var_4.controlled_dog ) )
|
|
{
|
|
var_1 = var_8;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
var_6 = level.see_enemy_dot;
|
|
|
|
foreach ( var_8 in var_2 )
|
|
{
|
|
if ( var_8.type == "dog" )
|
|
continue;
|
|
|
|
var_9 = var_8 gettagorigin( "J_SpineUpper" );
|
|
var_10 = vectortoangles( var_9 - var_5 );
|
|
var_11 = anglestoforward( var_10 );
|
|
var_12 = var_4 getplayerangles();
|
|
var_13 = anglestoforward( var_12 );
|
|
var_14 = vectordot( var_11, var_13 );
|
|
|
|
if ( var_14 > var_6 && test_trace( var_8 geteye(), var_5, var_4.controlled_dog ) )
|
|
{
|
|
var_1 = var_8;
|
|
var_6 = var_14;
|
|
}
|
|
}
|
|
}
|
|
|
|
self notify( "issue_dog_command", var_0, undefined, var_1 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
wait 2;
|
|
}
|
|
}
|
|
|
|
test_trace( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = bullettrace( var_0, var_1, 0, var_2 );
|
|
return var_3["fraction"] == 1;
|
|
}
|
|
|
|
listen_for_cancel()
|
|
{
|
|
for (;;)
|
|
{
|
|
self waittill( "cancel_command" );
|
|
|
|
if ( !self.controlled_dog maps\_utility::ent_flag( "cancel_command_disabled" ) )
|
|
{
|
|
var_0 = get_laser_designated_trace();
|
|
self notify( "issue_dog_command", var_0, self );
|
|
}
|
|
|
|
wait 0.1;
|
|
}
|
|
}
|
|
|
|
get_laser_designated_trace()
|
|
{
|
|
var_0 = get_eye();
|
|
var_1 = self getplayerangles();
|
|
var_2 = anglestoforward( var_1 );
|
|
var_0 = var_0 + var_2 * 20;
|
|
var_3 = var_0 + var_2 * 7000;
|
|
var_4 = bullettrace( var_0, var_3, 1, self.controlled_dog );
|
|
var_5 = var_4["entity"];
|
|
|
|
if ( isdefined( var_5 ) )
|
|
var_4["position"] = var_5.origin;
|
|
|
|
return var_4;
|
|
}
|
|
|
|
run_dog_command( var_0, var_1, var_2 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( var_0["fraction"] >= 0.98 && !isdefined( var_1 ) )
|
|
{
|
|
if ( !maps\_utility::ent_flag( "running_dog_command" ) )
|
|
self.player_controller thread display_no_target( &"SCRIPT_DOG_NOTARGET", 1.75 );
|
|
|
|
return;
|
|
}
|
|
|
|
var_3 = var_0["position"];
|
|
|
|
if ( isdefined( var_2 ) )
|
|
var_4 = var_2;
|
|
else
|
|
var_4 = enemy_near_position( var_0["position"] );
|
|
|
|
var_5 = get_flush_volume( var_3 );
|
|
|
|
if ( !isdefined( var_2 ) && !isdefined( var_1 ) && !isdefined( var_5 ) )
|
|
{
|
|
if ( !maps\_utility::ent_flag( "running_dog_command" ) )
|
|
self.player_controller thread display_no_target( &"SCRIPT_DOG_NOTARGET", 1.75 );
|
|
|
|
return;
|
|
}
|
|
|
|
self notify( "new_dog_command" );
|
|
self hudoutlinedisable();
|
|
self endon( "new_dog_command" );
|
|
maps\_utility::ent_flag_set( "running_dog_command" );
|
|
var_6 = isdefined( self.script_forcecolor ) || isdefined( self.script_old_forcecolor );
|
|
|
|
if ( var_6 && isdefined( self.script_forcecolor ) )
|
|
self.script_old_forcecolor = self.script_forcecolor;
|
|
|
|
if ( isdefined( self.current_follow_path ) )
|
|
{
|
|
self.old_path = self.current_follow_path;
|
|
self notify( "stop_path" );
|
|
}
|
|
|
|
if ( isdefined( self.doghandler ) )
|
|
{
|
|
self.oldhandler = self.doghandler;
|
|
self setdoghandler();
|
|
}
|
|
|
|
maps\_utility::disable_ai_color();
|
|
self.dog_marker unlink();
|
|
self.dog_marker.origin = var_3;
|
|
self.dog_marker.angles = vectortoangles( var_0["normal"] );
|
|
|
|
if ( !isdefined( self.dc_old_moveplaybackrate ) )
|
|
self.dc_old_moveplaybackrate = self.moveplaybackrate;
|
|
|
|
self.moveplaybackrate = 1;
|
|
|
|
if ( self.a.movement == "walk" )
|
|
{
|
|
self.was_walking = 1;
|
|
maps\_utility::clear_run_anim();
|
|
}
|
|
|
|
if ( isdefined( var_1 ) )
|
|
dog_command_cancel( var_1 );
|
|
else if ( isdefined( var_5 ) )
|
|
dog_command_flush( var_5, var_0 );
|
|
else if ( isdefined( var_4 ) )
|
|
{
|
|
self.script_nostairs = 1;
|
|
maps\_utility::set_hudoutline( "friendly", 0 );
|
|
self.moveplaybackrate = 1;
|
|
maps\_utility::enable_sprint();
|
|
var_7 = dog_command_attack( var_4 );
|
|
|
|
if ( isdefined( var_7 ) && var_7 == "attack" )
|
|
{
|
|
if ( isalive( var_4 ) )
|
|
{
|
|
if ( isdefined( self.in_melee ) && self.in_melee )
|
|
var_4 waittill( "death" );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
wait 0.5;
|
|
|
|
if ( !isdefined( self.in_melee ) || !self.in_melee )
|
|
self clearenemy();
|
|
}
|
|
|
|
if ( isdefined( self.old_ai_target ) )
|
|
{
|
|
self.old_ai_target hudoutlinedisable();
|
|
self.favoriteenemy = undefined;
|
|
}
|
|
|
|
maps\_utility::disable_sprint();
|
|
self hudoutlinedisable();
|
|
}
|
|
else
|
|
dog_command_goto( var_0 );
|
|
|
|
self.script_nostairs = undefined;
|
|
self hudoutlinedisable();
|
|
|
|
if ( isdefined( self.oldhandler ) )
|
|
{
|
|
self setdoghandler( self.oldhandler );
|
|
self setgoalentity( self.oldhandler );
|
|
}
|
|
else if ( var_6 && isdefined( self.script_old_forcecolor ) )
|
|
{
|
|
var_8 = undefined;
|
|
|
|
if ( isdefined( self.script_color_delay_override ) )
|
|
{
|
|
var_8 = self.script_color_delay_override;
|
|
self.script_color_delay_override = undefined;
|
|
}
|
|
|
|
maps\_utility::enable_ai_color();
|
|
self.script_old_forcecolor = undefined;
|
|
self.old_path = undefined;
|
|
|
|
if ( isdefined( var_8 ) )
|
|
self.script_color_delay_override = var_8;
|
|
}
|
|
else if ( isdefined( self.old_path ) )
|
|
{
|
|
thread maps\_utility::follow_path_and_animate( self.old_path );
|
|
self.old_path = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.dc_old_moveplaybackrate ) )
|
|
{
|
|
common_scripts\utility::waittill_notify_or_timeout( "goal", 5 );
|
|
|
|
if ( isdefined( self.dc_old_moveplaybackrate ) )
|
|
{
|
|
self.moveplaybackrate = self.dc_old_moveplaybackrate;
|
|
self.dc_old_moveplaybackrate = undefined;
|
|
}
|
|
}
|
|
|
|
if ( isdefined( self.was_walking ) && self.was_walking )
|
|
{
|
|
self.was_walking = undefined;
|
|
maps\_utility::set_dog_walk_anim();
|
|
}
|
|
|
|
self.oldhandler = undefined;
|
|
maps\_utility::ent_flag_clear( "running_dog_command" );
|
|
self notify( "dog_command_complete" );
|
|
}
|
|
|
|
dog_command_flush( var_0, var_1 )
|
|
{
|
|
self endon( "new_dog_command" );
|
|
var_2 = var_1["position"];
|
|
wait 0.05;
|
|
playfxontag( common_scripts\utility::getfx( "target_marker_yellow" ), self.dog_marker, "tag_origin" );
|
|
thread maps\_utility::play_sound_on_entity( "anml_dog_bark" );
|
|
var_3 = level.dog_flush_functions[var_0.script_noteworthy];
|
|
self childthread [[ var_3 ]]( var_0, var_1 );
|
|
level waittill( "dog_flush_started" );
|
|
var_0.done_flushing = 1;
|
|
level waittill( "dog_flush_done" );
|
|
}
|
|
|
|
dog_command_cancel( var_0 )
|
|
{
|
|
if ( isdefined( self.favoriteenemy ) )
|
|
{
|
|
if ( isdefined( self.favoriteenemy.oldignoreme ) )
|
|
self.favoriteenemy.ignoreme = self.favoriteenemy.oldignoreme;
|
|
|
|
self.favoriteenemy = undefined;
|
|
}
|
|
|
|
if ( isdefined( self.old_moveplaybackrate ) )
|
|
{
|
|
self.moveplaybackrate = self.old_moveplaybackrate;
|
|
self.old_moveplaybackrate = undefined;
|
|
}
|
|
}
|
|
|
|
dog_command_attack( var_0 )
|
|
{
|
|
self endon( "damage" );
|
|
self endon( "cancel_dog_attack" );
|
|
self notify( "dog_command_attack", var_0 );
|
|
self.dog_marker linkto( var_0, "tag_origin", ( 0, 0, 0 ), ( -90, 0, -90 ) );
|
|
wait 0.05;
|
|
|
|
if ( !isalive( var_0 ) )
|
|
return "bail";
|
|
|
|
self.script_nostairs = 1;
|
|
|
|
if ( isdefined( self.old_ai_target ) && self.old_ai_target != var_0 )
|
|
self.old_ai_target hudoutlinedisable();
|
|
|
|
var_0 thread hud_outlineenable();
|
|
|
|
if ( isdefined( var_0.dog_attack_alt_func ) )
|
|
self [[ var_0.dog_attack_alt_func ]]( var_0 );
|
|
else
|
|
{
|
|
self.old_ai_target = var_0;
|
|
var_0.old_ignoreme = var_0.ignoreme;
|
|
var_0.ignoreme = 0;
|
|
var_0 setthreatbiasgroup( "dog_targets" );
|
|
var_0 thread maps\_utility::set_battlechatter( 0 );
|
|
self.favoriteenemy = var_0;
|
|
|
|
if ( common_scripts\utility::flag_exist( "_stealth_spotted" ) && !common_scripts\utility::flag( "_stealth_spotted" ) )
|
|
thread maps\_utility::play_sound_on_entity( "anml_dog_growl" );
|
|
else
|
|
thread maps\_utility::play_sound_on_entity( "anml_dog_bark_attack_start_npc" );
|
|
|
|
self setgoalentity( var_0, 50 );
|
|
thread temporary_disable_pain();
|
|
thread dog_attack_damage_tracking();
|
|
|
|
if ( !maps\_utility::ent_flag( "dog_no_teleport" ) )
|
|
{
|
|
var_1 = self gettagorigin( "spine2_jnt" );
|
|
|
|
if ( !maps\_utility::player_looking_at( var_1, 0.5, 1 ) )
|
|
{
|
|
var_2 = var_0 gettagorigin( "J_SpineUpper" );
|
|
var_3 = level.player geteye();
|
|
var_4 = distance( var_1, var_2 );
|
|
var_5 = distance( var_3, var_2 );
|
|
|
|
if ( var_4 > var_5 )
|
|
{
|
|
var_6 = getnodesinradius( var_3, 128, 32, 128, "Path" );
|
|
|
|
foreach ( var_8 in var_6 )
|
|
{
|
|
if ( !maps\_utility::player_looking_at( var_8.origin, 0.5, 1 ) )
|
|
{
|
|
if ( test_trace( var_3, var_8.origin, level.player ) )
|
|
{
|
|
var_9 = var_2 - var_1;
|
|
var_9 = ( var_9[0], var_9[1], 0 );
|
|
var_10 = vectortoangles( var_9 );
|
|
self forceteleport( var_8.origin, var_10 );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
self.player_controller notify( "displaying_no_target" );
|
|
self.player_controller notify( "clear_no_target" );
|
|
self.player_controller.notargethudelem.alpha = 0;
|
|
var_12 = dog_waitfor_attack_or_bail( var_0 );
|
|
|
|
if ( isdefined( var_12 ) )
|
|
self notify( "stop_disable_pain" );
|
|
|
|
self notify( "dog_attack_damage_tracking" );
|
|
|
|
if ( !isdefined( var_12 ) || var_12 == "bail" )
|
|
return "bail";
|
|
}
|
|
}
|
|
|
|
dog_waitfor_attack_or_bail( var_0 )
|
|
{
|
|
var_0 endon( "death" );
|
|
|
|
if ( isdefined( self.in_melee ) && self.in_melee )
|
|
{
|
|
if ( isdefined( self.enemy ) && self.enemy == var_0 )
|
|
return "dog_attacks_ai";
|
|
|
|
return "bail";
|
|
}
|
|
|
|
level waittill( "dog_attacks_ai", var_1, var_2, var_3 );
|
|
|
|
if ( var_2 == var_0 )
|
|
return "dog_attacks_ai";
|
|
|
|
return "bail";
|
|
}
|
|
|
|
temporary_disable_pain()
|
|
{
|
|
self endon( "stop_disable_pain" );
|
|
self notify( "temporary_disable_pain" );
|
|
self endon( "temporary_disable_pain" );
|
|
self setcandamage( 0 );
|
|
wait 2;
|
|
|
|
if ( !isdefined( self.in_melee ) || self.in_melee == 0 )
|
|
self setcandamage( 1 );
|
|
}
|
|
|
|
dog_attack_damage_tracking()
|
|
{
|
|
self notify( "dog_attack_damage_tracking" );
|
|
self endon( "dog_attack_damage_tracking" );
|
|
common_scripts\utility::waittill_either( "damage", "cancel_dog_attack" );
|
|
|
|
if ( !isdefined( self.in_melee ) || !self.in_melee )
|
|
thread dog_got_hit();
|
|
}
|
|
|
|
dog_got_hit()
|
|
{
|
|
self notify( "dog_got_hit" );
|
|
self endon( "dog_got_hit" );
|
|
maps\_utility::disable_pain();
|
|
maps\_utility::ent_flag_set( "dog_cooldown" );
|
|
var_0 = self.ignoreall;
|
|
self.ignoreall = 0;
|
|
self clearenemy();
|
|
wait 8;
|
|
self.ignoreall = var_0;
|
|
maps\_utility::enable_pain();
|
|
maps\_utility::ent_flag_clear( "dog_cooldown" );
|
|
}
|
|
|
|
ai_remove_outline_waiter( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "dog_attacks_ai" );
|
|
var_0 waittill( "new_dog_command" );
|
|
self hudoutlinedisable();
|
|
}
|
|
|
|
dog_command_goto( var_0 )
|
|
{
|
|
var_1 = var_0["position"];
|
|
wait 0.05;
|
|
playfxontag( common_scripts\utility::getfx( "target_marker_yellow" ), self.dog_marker, "tag_origin" );
|
|
thread maps\_utility::play_sound_on_entity( "anml_dog_bark" );
|
|
self setgoalpos( var_1 );
|
|
common_scripts\utility::waittill_notify_or_timeout( "goal", 0.2 );
|
|
|
|
if ( isdefined( self.pathgoalpos ) )
|
|
self waittill( "goal" );
|
|
else if ( distance2d( self.origin, var_1 ) > self.goalradius )
|
|
{
|
|
var_2 = getnodesinradius( var_1, 96, 0, 96 );
|
|
var_2 = sortbydistance( var_2, level.player get_eye() );
|
|
|
|
if ( var_2.size > 0 )
|
|
{
|
|
var_3 = var_2[0];
|
|
self setgoalpos( var_3.origin );
|
|
self waittill( "goal" );
|
|
}
|
|
}
|
|
|
|
wait( randomfloatrange( 1, 3 ) );
|
|
}
|
|
|
|
enemy_near_position( var_0 )
|
|
{
|
|
var_1 = getaiarray( "axis" );
|
|
|
|
if ( var_1.size > 0 )
|
|
{
|
|
var_1 = sortbydistance( var_1, var_0 );
|
|
|
|
if ( distance( var_1[0].origin, var_0 ) < 196 )
|
|
return var_1[0];
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
get_flush_volume( var_0 )
|
|
{
|
|
var_1 = common_scripts\utility::spawn_tag_origin();
|
|
var_1.origin = var_0;
|
|
var_2 = getentarray( "dog_flush_volume", "targetname" );
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
if ( isdefined( var_4.script_noteworthy ) && ( !isdefined( var_4.done_flushing ) || var_4.done_flushing == 0 ) )
|
|
{
|
|
if ( var_1 istouching( var_4 ) )
|
|
{
|
|
var_1 delete();
|
|
return var_4;
|
|
}
|
|
}
|
|
}
|
|
|
|
var_1 delete();
|
|
return undefined;
|
|
}
|
|
|
|
chopper_air_support_activate()
|
|
{
|
|
level endon( "air_support_canceled" );
|
|
level endon( "air_support_called" );
|
|
level.chopperattackarrow = spawn( "script_model", ( 0, 0, 0 ) );
|
|
level.chopperattackarrow setmodel( "tag_origin" );
|
|
level.chopperattackarrow.angles = ( -90, 0, 0 );
|
|
level.chopperattackarrow.offset = 4;
|
|
level.playeractivatedairsupport = 1;
|
|
var_0 = undefined;
|
|
var_1 = 15;
|
|
var_2 = 15000;
|
|
var_3 = 90000;
|
|
var_4 = [];
|
|
var_4[0] = spawnstruct();
|
|
var_4[0].offsetdir = "vertical";
|
|
var_4[0].offsetdist = var_1;
|
|
var_4[1] = spawnstruct();
|
|
var_4[1].offsetdir = "vertical";
|
|
var_4[1].offsetdist = var_1 * -1;
|
|
var_4[2] = spawnstruct();
|
|
var_4[2].offsetdir = "horizontal";
|
|
var_4[2].offsetdist = var_1;
|
|
var_4[3] = spawnstruct();
|
|
var_4[3].offsetdir = "horizontal";
|
|
var_4[3].offsetdist = var_1 * -1;
|
|
var_5 = 0;
|
|
|
|
for (;;)
|
|
{
|
|
wait 0.05;
|
|
var_6 = level.player getplayerangles();
|
|
var_7 = anglestoforward( var_6 );
|
|
var_8 = level.player get_eye();
|
|
|
|
for ( var_9 = 0; var_9 < var_4.size; var_9++ )
|
|
{
|
|
var_10 = var_8;
|
|
var_11 = undefined;
|
|
|
|
if ( var_4[var_9].offsetdir == "vertical" )
|
|
var_11 = anglestoup( var_6 );
|
|
else if ( var_4[var_9].offsetdir == "horizontal" )
|
|
var_11 = anglestoright( var_6 );
|
|
|
|
var_10 = var_10 + var_11 * var_4[var_9].offsetdist;
|
|
var_4[var_9].trace = bullettrace( var_10, var_10 + var_7 * var_2, 0, undefined );
|
|
var_4[var_9].length = distancesquared( var_10, var_4[var_9].trace["position"] );
|
|
|
|
if ( getdvar( "village_assault_debug_marker" ) == "1" )
|
|
thread common_scripts\utility::draw_line_for_time( var_10, var_4[var_9].trace["position"], 1, 1, 1, 0.05 );
|
|
}
|
|
|
|
var_12 = [];
|
|
var_13 = [];
|
|
|
|
for ( var_9 = 0; var_9 < var_4.size; var_9++ )
|
|
{
|
|
if ( var_4[var_9].length < var_3 )
|
|
continue;
|
|
|
|
var_14 = var_12.size;
|
|
var_12[var_14] = var_4[var_9].trace["position"];
|
|
var_13[var_14] = var_4[var_9].trace["normal"];
|
|
|
|
if ( getdvar( "village_assault_debug_marker" ) == "1" )
|
|
thread common_scripts\utility::draw_line_for_time( level.player get_eye(), var_12[var_14], 0, 1, 0, 0.05 );
|
|
}
|
|
|
|
if ( var_12.size == 0 )
|
|
{
|
|
for ( var_9 = 0; var_9 < var_4.size; var_9++ )
|
|
{
|
|
var_12[var_9] = var_4[var_9].trace["position"];
|
|
var_13[var_9] = var_4[var_9].trace["normal"];
|
|
}
|
|
}
|
|
|
|
if ( var_12.size == 4 )
|
|
{
|
|
var_15 = findaveragepointvec( var_12[0], var_12[1], var_12[2], var_12[3] );
|
|
var_16 = findaveragepointvec( var_13[0], var_13[1], var_13[2], var_13[3] );
|
|
}
|
|
else if ( var_12.size == 3 )
|
|
{
|
|
var_15 = findaveragepointvec( var_12[0], var_12[1], var_12[2] );
|
|
var_16 = findaveragepointvec( var_13[0], var_13[1], var_13[2] );
|
|
}
|
|
else if ( var_12.size == 2 )
|
|
{
|
|
var_15 = findaveragepointvec( var_12[0], var_12[1] );
|
|
var_16 = findaveragepointvec( var_13[0], var_13[1] );
|
|
}
|
|
else
|
|
{
|
|
var_15 = var_12[0];
|
|
var_16 = var_13[0];
|
|
}
|
|
|
|
if ( getdvar( "village_assault_debug_marker" ) == "1" )
|
|
thread common_scripts\utility::draw_line_for_time( level.player get_eye(), var_15, 1, 0, 0, 0.05 );
|
|
|
|
thread drawchopperattackarrow( var_15, var_16, var_5 );
|
|
var_5 = 0.2;
|
|
}
|
|
}
|
|
|
|
findaveragepointvec( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
var_4 = findaveragepoint( var_0[0], var_1[0], var_2[0], var_3[0] );
|
|
var_5 = findaveragepoint( var_0[1], var_1[1], var_2[1], var_3[1] );
|
|
var_6 = findaveragepoint( var_0[2], var_1[2], var_2[2], var_3[2] );
|
|
}
|
|
else if ( isdefined( var_2 ) )
|
|
{
|
|
var_4 = findaveragepoint( var_0[0], var_1[0], var_2[0] );
|
|
var_5 = findaveragepoint( var_0[1], var_1[1], var_2[1] );
|
|
var_6 = findaveragepoint( var_0[2], var_1[2], var_2[2] );
|
|
}
|
|
else
|
|
{
|
|
var_4 = findaveragepoint( var_0[0], var_1[0] );
|
|
var_5 = findaveragepoint( var_0[1], var_1[1] );
|
|
var_6 = findaveragepoint( var_0[2], var_1[2] );
|
|
}
|
|
|
|
return ( var_4, var_5, var_6 );
|
|
}
|
|
|
|
findaveragepoint( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( isdefined( var_3 ) )
|
|
return ( var_0 + var_1 + var_2 + var_3 ) / 4;
|
|
else if ( isdefined( var_2 ) )
|
|
return ( var_0 + var_1 + var_2 ) / 3;
|
|
else
|
|
return ( var_0 + var_1 ) / 2;
|
|
}
|
|
|
|
drawchopperattackarrow( var_0, var_1, var_2 )
|
|
{
|
|
var_0 = var_0 + var_1 * level.chopperattackarrow.offset;
|
|
level.chopperattackarrow.origin = var_0;
|
|
|
|
if ( var_2 > 0 )
|
|
level.chopperattackarrow rotateto( vectortoangles( var_1 ), 0.2 );
|
|
else
|
|
level.chopperattackarrow.angles = vectortoangles( var_1 );
|
|
}
|
|
|
|
get_eye()
|
|
{
|
|
if ( isdefined( self.controlled_dog.controlling_dog ) && self.controlled_dog.controlling_dog )
|
|
{
|
|
var_0 = self.controlled_dog gettagorigin( "TAG_CAMERA" );
|
|
return var_0;
|
|
}
|
|
else
|
|
return self geteye();
|
|
}
|
|
|
|
hud_outlineenable()
|
|
{
|
|
if ( !isdefined( self ) )
|
|
return;
|
|
|
|
self notify( "outline_enable" );
|
|
self endon( "outline_enable" );
|
|
thread hudoutline_blink();
|
|
thread hudoutline_wait_death();
|
|
self endon( "death" );
|
|
self waittill( "dog_attacks_ai" );
|
|
wait 0.1;
|
|
maps\_utility::set_hudoutline( "enemy", 0 );
|
|
wait 5;
|
|
|
|
if ( isdefined( self ) )
|
|
{
|
|
self.no_more_outlines = 1;
|
|
self hudoutlinedisable();
|
|
}
|
|
}
|
|
|
|
hudoutline_blink()
|
|
{
|
|
self endon( "outline_enable" );
|
|
self endon( "dog_attacks_ai" );
|
|
self endon( "death" );
|
|
maps\_utility::set_hudoutline( "enemy", 0 );
|
|
wait 0.8;
|
|
self hudoutlinedisable();
|
|
wait 0.1;
|
|
|
|
for ( var_0 = 0; var_0 < 3; var_0++ )
|
|
{
|
|
maps\_utility::set_hudoutline( "enemy", 0 );
|
|
wait 0.1;
|
|
self hudoutlinedisable();
|
|
wait 0.1;
|
|
}
|
|
|
|
self hudoutlinedisable();
|
|
}
|
|
|
|
hudoutline_wait_death()
|
|
{
|
|
self endon( "outline_enable" );
|
|
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();
|
|
}
|
|
|
|
display_no_target( var_0, var_1 )
|
|
{
|
|
self notify( "displaying_no_target" );
|
|
self endon( "displaying_no_target" );
|
|
self.notargethudelem settext( var_0 );
|
|
self.notargethudelem fadeovertime( 0.1 );
|
|
self.notargethudelem.alpha = 0.5;
|
|
wait 0.1;
|
|
thread notargethudelem_pulse();
|
|
wait( var_1 );
|
|
self notify( "clear_no_target" );
|
|
self.notargethudelem fadeovertime( 0.25 );
|
|
self.notargethudelem.alpha = 0.0;
|
|
}
|
|
|
|
notargethudelem_pulse()
|
|
{
|
|
self endon( "displaying_no_target" );
|
|
self endon( "clear_no_target" );
|
|
|
|
for (;;)
|
|
{
|
|
self.notargethudelem fadeovertime( 0.2 );
|
|
self.notargethudelem.alpha = 0.7;
|
|
wait 0.2;
|
|
self.notargethudelem fadeovertime( 0.2 );
|
|
self.notargethudelem.alpha = 0.5;
|
|
wait 0.2;
|
|
}
|
|
}
|
|
|
|
ui_dog_grenade_logic()
|
|
{
|
|
self.controlled_dog endon( "death" );
|
|
|
|
for (;;)
|
|
{
|
|
self.controlled_dog maps\_utility::ent_flag_wait_either( "pause_dog_command", "dog_cooldown" );
|
|
setdvar( "ui_dog_grenade", 0 );
|
|
self.controlled_dog maps\_utility::ent_flag_waitopen( "pause_dog_command" );
|
|
self.controlled_dog maps\_utility::ent_flag_waitopen( "dog_cooldown" );
|
|
setdvar( "ui_dog_grenade", 1 );
|
|
}
|
|
}
|