1416 lines
32 KiB
Plaintext
1416 lines
32 KiB
Plaintext
// IW6 GSC SOURCE
|
|
// Generated by https://github.com/xensik/gsc-tool
|
|
|
|
disable_twitches()
|
|
{
|
|
self.a.bdisablemovetwitch = 1;
|
|
}
|
|
|
|
enable_twitches()
|
|
{
|
|
self.a.bdisablemovetwitch = undefined;
|
|
}
|
|
|
|
if_flag_and_not_flag( var_0, var_1, var_2 )
|
|
{
|
|
if ( common_scripts\utility::flag( var_0 ) && !common_scripts\utility::flag( var_1 ) )
|
|
{
|
|
if ( isdefined( var_2 ) )
|
|
common_scripts\utility::flag_set( var_2 );
|
|
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
play_loop_sound_in_space_stop_on_flag( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = spawn( "script_origin", ( 0, 0, 0 ) );
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = self.origin;
|
|
|
|
var_3.origin = var_1;
|
|
var_3 playloopsound( var_0 );
|
|
common_scripts\utility::flag_wait( var_2 );
|
|
var_3 delete();
|
|
}
|
|
|
|
spawn_model_and_linkto_me( var_0, var_1 )
|
|
{
|
|
var_2 = spawn( "script_model", self gettagorigin( var_1 ) );
|
|
var_2 setmodel( var_0 );
|
|
var_2.angles = self gettagangles( var_1 );
|
|
var_2 linkto( self, var_1 );
|
|
return var_2;
|
|
}
|
|
|
|
dog_attack_guy( var_0 )
|
|
{
|
|
level.dog maps\_utility::disable_ai_color();
|
|
level.dog setgoalentity( var_0 );
|
|
level.dog.ignoreall = 0;
|
|
var_0 waittill( "death" );
|
|
level.dog maps\_utility::enable_ai_color();
|
|
level.dog.ignoreall = 1;
|
|
}
|
|
|
|
disable_turns_arrivals_exits()
|
|
{
|
|
maps\_utility::disable_arrivals();
|
|
maps\_utility::disable_exits();
|
|
maps\_utility::disable_turnanims();
|
|
}
|
|
|
|
enable_turns_arrivals_exits()
|
|
{
|
|
maps\_utility::enable_arrivals();
|
|
maps\_utility::enable_exits();
|
|
maps\_utility::enable_turnanims();
|
|
}
|
|
|
|
dog_node_wait( var_0, var_1 )
|
|
{
|
|
while ( distance2dsquared( level.dog.origin, var_0.origin ) > 100 )
|
|
wait 0.05;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
common_scripts\utility::flag_set( var_1 );
|
|
|
|
return;
|
|
}
|
|
|
|
spawn_model_on_me( var_0 )
|
|
{
|
|
var_1 = spawn( "script_model", self.origin );
|
|
var_1.angles = self.angles;
|
|
var_1 setmodel( var_0 );
|
|
return var_1;
|
|
}
|
|
|
|
try_slide_hint( var_0, var_1 )
|
|
{
|
|
if ( common_scripts\utility::flag( "did_slide_hint" ) )
|
|
return;
|
|
|
|
level endon( var_1 );
|
|
common_scripts\utility::flag_wait( var_0 );
|
|
|
|
while ( !level.player issprinting() )
|
|
wait 0.25;
|
|
|
|
thread maps\_utility::display_hint_timeout( "slide_hint", 7 );
|
|
common_scripts\utility::flag_set( "did_slide_hint" );
|
|
}
|
|
|
|
magicburst( var_0, var_1, var_2, var_3 )
|
|
{
|
|
if ( !isdefined( var_3 ) )
|
|
var_4 = randomintrange( 5, 9 );
|
|
else
|
|
var_4 = var_3;
|
|
|
|
for ( var_5 = 0; var_5 < var_4; var_5++ )
|
|
{
|
|
magicbullet( var_0, var_1, var_2 );
|
|
wait( randomfloatrange( 0.05, 0.35 ) );
|
|
}
|
|
}
|
|
|
|
hesh_calls_riley( var_0, var_1 )
|
|
{
|
|
level endon( var_1 );
|
|
var_2 = [ "stop_color_move", "stop_going_to_node", "goal_changed path_set", "node_relinquished" ];
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "stop_color_move" );
|
|
maps\_utility::delaythread( var_0, ::call_riley, 1 );
|
|
}
|
|
}
|
|
|
|
call_riley( var_0, var_1 )
|
|
{
|
|
if ( isdefined( var_0 ) )
|
|
var_2 = [ "deerhunt_hsh_rileyhere_2", "deerhunt_hsh_riley_2", "deerhunt_hsh_cmonboy_2", "deerhunt_hsh_rileyfollow_2" ];
|
|
else
|
|
var_2 = [ "deerhunt_hsh_rileyhere_3", "deerhunt_hsh_riley_3", "deerhunt_hsh_cmonboy_3", "deerhunt_hsh_rileyfollow_3" ];
|
|
|
|
var_2 = common_scripts\utility::array_randomize( var_2 );
|
|
|
|
if ( isdefined( self.last_call_line ) )
|
|
var_3 = get_random_from_array_except( var_2, self.last_call_line );
|
|
else
|
|
var_3 = common_scripts\utility::random( var_2 );
|
|
|
|
maps\_utility::smart_dialogue_generic( var_3 );
|
|
self.last_call_line = var_3;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
{
|
|
var_4 = [ "deerhunt_dogcall_1", "deerhunt_dogcall_2", "deerhunt_dogcall_3" ];
|
|
maps\_utility::play_sound_on_entity( common_scripts\utility::random( var_4 ) );
|
|
}
|
|
}
|
|
|
|
get_random_from_array_except( var_0, var_1 )
|
|
{
|
|
var_0 = common_scripts\utility::array_randomize( var_0 );
|
|
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( var_3 != var_1 )
|
|
return var_3;
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
hesh_nag_til_flag( var_0, var_1, var_2 )
|
|
{
|
|
if ( common_scripts\utility::flag( var_0 ) )
|
|
return;
|
|
|
|
level endon( var_0 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
self waittill( "goal" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
wait( var_1 );
|
|
|
|
var_3 = [ "deerhunt_hsh_cmonwegottakeep", "deerhunt_hsh_letskeepmovin", "deerhunt_hsh_letsgologan" ];
|
|
var_3 = common_scripts\utility::array_randomize( var_3 );
|
|
|
|
while ( !common_scripts\utility::flag( var_0 ) )
|
|
{
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
hesh_line( var_5 );
|
|
wait( randomintrange( 8, 13 ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
return_struct_spline( var_0 )
|
|
{
|
|
var_1 = var_0;
|
|
var_2 = [];
|
|
var_2[0] = var_1;
|
|
|
|
for (;;)
|
|
{
|
|
var_3 = common_scripts\utility::getstruct( var_1.target, "targetname" );
|
|
|
|
if ( isdefined( var_3 ) )
|
|
{
|
|
if ( var_3 == var_0 || maps\_utility::is_in_array( var_2, var_3 ) )
|
|
return var_2;
|
|
else
|
|
{
|
|
var_2 = common_scripts\utility::add_to_array( var_2, var_3 );
|
|
var_1 = var_3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
set_and_enable_color( var_0 )
|
|
{
|
|
maps\_utility::set_force_color( var_0 );
|
|
maps\_utility::enable_ai_color();
|
|
}
|
|
|
|
create_dog_start_point_ent( var_0, var_1 )
|
|
{
|
|
if ( isstring( var_1 ) )
|
|
var_1 = level.dog maps\_utility::getanim( var_1 );
|
|
|
|
var_2 = getstartorigin( var_0.origin, var_0.angles, var_1 );
|
|
var_3 = getstartangles( var_0.origin, var_0.angles, var_1 );
|
|
var_4 = spawn( "script_origin", var_2 );
|
|
var_4.angles = var_3;
|
|
return var_4;
|
|
}
|
|
|
|
convo_generator( var_0 )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
var_3 = strtok( var_2, "_" );
|
|
|
|
if ( var_3[1] == "els" )
|
|
{
|
|
elias_line( var_2 );
|
|
continue;
|
|
}
|
|
|
|
hesh_line( var_2 );
|
|
}
|
|
}
|
|
|
|
hesh_line( var_0 )
|
|
{
|
|
level.hesh maps\_utility::smart_dialogue_generic( var_0 );
|
|
vo_wait();
|
|
}
|
|
|
|
elias_line( var_0 )
|
|
{
|
|
level.elias maps\_utility::smart_dialogue( var_0 );
|
|
vo_wait();
|
|
}
|
|
|
|
vo_wait( var_0 )
|
|
{
|
|
wait( randomfloatrange( 0.15, 0.25 ) );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
wait( var_0 );
|
|
}
|
|
|
|
#using_animtree("generic_human");
|
|
|
|
drone_civs_init()
|
|
{
|
|
level.drone_anims["neutral"]["stand"]["idle"] = %casual_stand_idle;
|
|
level.drone_anims["neutral"]["stand"]["run"] = %unarmed_scared_run;
|
|
level.drone_anims["neutral"]["stand"]["death"] = %exposed_death;
|
|
level.attachpropsfunction = animscripts\civilian\civilian_init::attachprops;
|
|
}
|
|
|
|
manual_hint_display( var_0, var_1 )
|
|
{
|
|
var_2 = 5625;
|
|
thread manual_clear_hint_on_trigger();
|
|
self endon( var_1 );
|
|
|
|
for (;;)
|
|
{
|
|
if ( distance2dsquared( self.origin, level.player.origin ) > var_2 )
|
|
clear_hints();
|
|
else if ( distance2dsquared( self.origin, level.player.origin ) < var_2 )
|
|
thread keyhint( "matv_enter", undefined, undefined, 1 );
|
|
|
|
wait 0.25;
|
|
}
|
|
}
|
|
|
|
manual_clear_hint_on_trigger()
|
|
{
|
|
self waittill( "trigger" );
|
|
clear_hints();
|
|
}
|
|
|
|
retain_alert_level( var_0, var_1 )
|
|
{
|
|
self endon( "death" );
|
|
self endon( "damage" );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
level endon( var_1 );
|
|
|
|
self.alertlevelint = var_0;
|
|
|
|
while ( isalive( self ) )
|
|
{
|
|
if ( self.alertlevelint != var_0 )
|
|
self.alertlevelint = var_0;
|
|
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
flag_set_delayed( var_0, var_1 )
|
|
{
|
|
wait( var_0 );
|
|
common_scripts\utility::flag_set( var_1 );
|
|
}
|
|
|
|
registeractionbinding( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( level.actionbinds[var_0] ) )
|
|
level.actionbinds[var_0] = [];
|
|
|
|
var_3 = spawnstruct();
|
|
var_3.binding = var_1;
|
|
var_3.hint = var_2;
|
|
var_3.keytext = undefined;
|
|
var_3.hinttext = undefined;
|
|
precachestring( var_2 );
|
|
level.actionbinds[var_0][level.actionbinds[var_0].size] = var_3;
|
|
}
|
|
|
|
getactionbind( var_0 )
|
|
{
|
|
for ( var_1 = 0; var_1 < level.actionbinds[var_0].size; var_1++ )
|
|
{
|
|
var_2 = level.actionbinds[var_0][var_1];
|
|
var_3 = getkeybinding( var_2.binding );
|
|
|
|
if ( !var_3["count"] )
|
|
continue;
|
|
|
|
return level.actionbinds[var_0][var_1];
|
|
}
|
|
|
|
return level.actionbinds[var_0][0];
|
|
}
|
|
|
|
keyhint( var_0, var_1, var_2, var_3 )
|
|
{
|
|
clear_hints();
|
|
level endon( "clearing_hints" );
|
|
level.hintelem = create_custom_hint();
|
|
var_4 = getactionbind( var_0 );
|
|
level.hintelem settext( var_4.hint );
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
{
|
|
var_5 = "did_action_" + var_0;
|
|
|
|
for ( var_6 = 0; var_6 < level.actionbinds[var_0].size; var_6++ )
|
|
{
|
|
var_4 = level.actionbinds[var_0][var_6];
|
|
notifyoncommand( var_5, var_4.binding );
|
|
}
|
|
|
|
if ( isdefined( var_1 ) )
|
|
level.player thread notifyontimeout( var_5, var_1 );
|
|
|
|
level.player waittill( var_5 );
|
|
level.hintelem fadeovertime( 0.5 );
|
|
level.hintelem.alpha = 0;
|
|
wait 0.5;
|
|
clear_hints();
|
|
}
|
|
}
|
|
|
|
create_custom_hint()
|
|
{
|
|
var_0 = 2;
|
|
|
|
if ( isdefined( level.hint_fontscale ) )
|
|
var_0 = level.hint_fontscale;
|
|
|
|
var_1 = maps\_hud_util::createfontstring( "default", var_0 );
|
|
var_1.hidewheninmenu = 1;
|
|
var_1.sort = 0.5;
|
|
var_1.alpha = 0.9;
|
|
var_1.x = 0;
|
|
var_1.y = -68;
|
|
var_1.alignx = "center";
|
|
var_1.aligny = "middle";
|
|
var_1.horzalign = "center";
|
|
var_1.vertalign = "middle";
|
|
var_1.foreground = 0;
|
|
var_1.hidewhendead = 1;
|
|
var_1.hidewheninmenu = 1;
|
|
return var_1;
|
|
}
|
|
|
|
clear_hints()
|
|
{
|
|
if ( isdefined( level.hintelem ) )
|
|
level.hintelem maps\_hud_util::destroyelem();
|
|
|
|
if ( isdefined( level.iconelem ) )
|
|
level.iconelem maps\_hud_util::destroyelem();
|
|
|
|
if ( isdefined( level.iconelem2 ) )
|
|
level.iconelem2 maps\_hud_util::destroyelem();
|
|
|
|
if ( isdefined( level.iconelem3 ) )
|
|
level.iconelem3 maps\_hud_util::destroyelem();
|
|
|
|
if ( isdefined( level.hintbackground ) )
|
|
level.hintbackground maps\_hud_util::destroyelem();
|
|
|
|
level notify( "clearing_hints" );
|
|
}
|
|
|
|
notifyontimeout( var_0, var_1 )
|
|
{
|
|
self endon( var_0 );
|
|
wait( var_1 );
|
|
self notify( var_0 );
|
|
}
|
|
|
|
set_flag_on_weapon_pickup( var_0 )
|
|
{
|
|
self waittill( "trigger" );
|
|
set_flag_if_not_set( var_0 );
|
|
}
|
|
|
|
player_is_using_missile_launcher()
|
|
{
|
|
return level.player getcurrentweapon() != "maaws";
|
|
}
|
|
|
|
set_dog_master( var_0, var_1 )
|
|
{
|
|
self setdoghandler( var_0 );
|
|
self setgoalentity( var_0 );
|
|
self setdogattackradius( 800 );
|
|
self setdogcommand( "attack" );
|
|
}
|
|
|
|
clear_dog_master()
|
|
{
|
|
self setdoghandler( undefined );
|
|
self setdogattackradius( 1024 );
|
|
self setdogcommand( "attack" );
|
|
}
|
|
|
|
dog_drag_to_cover( var_0, var_1 )
|
|
{
|
|
var_2 = var_0.script_index;
|
|
var_3 = "dog_drag_" + var_2;
|
|
var_4 = [ level.hesh, level.dog ];
|
|
level.dog.animname = "dog";
|
|
var_5 = getstartorigin( var_0.origin, var_0.angles, level.dog maps\_utility::getanim( var_3 ) );
|
|
var_6 = getstartangles( var_0.origin, var_0.angles, level.dog maps\_utility::getanim( var_3 ) );
|
|
var_7 = getnode( var_0.target, "targetname" );
|
|
level.hesh maps\_utility::disable_ai_color();
|
|
level.hesh.goalradius = 32;
|
|
level.hesh setgoalnode( var_7 );
|
|
var_8 = spawn( "script_origin", var_5 );
|
|
var_8.angles = var_6;
|
|
var_9 = spawn( "script_origin", var_0.origin );
|
|
var_9.angles = var_0.angles;
|
|
level.dog maps\_utility::disable_ai_color();
|
|
level.dog maps\_utility::delaythread( 2, maps\_utility::set_goal_radius, 8 );
|
|
var_9 maps\_anim::anim_reach_and_approach( [ level.dog ], var_3, undefined, "Exposed" );
|
|
var_8 thread maps\_anim::anim_loop_solo( level.dog, "dog_drag_bark_loop", "stop_barking" );
|
|
|
|
if ( isstring( var_1 ) )
|
|
level waittill( var_1 );
|
|
else
|
|
wait( var_1 );
|
|
|
|
var_0 thread maps\_anim::anim_reach_solo( level.hesh, var_3 );
|
|
var_10 = level.hesh common_scripts\utility::waittill_notify_or_timeout_return( "anim_reach_complete", 20 );
|
|
|
|
if ( !isdefined( var_10 ) )
|
|
{
|
|
var_8 notify( "stop_barking" );
|
|
waittillframeend;
|
|
level.hesh maps\_utility::delaythread( 2, maps\_utility::smart_dialogue_generic, "deerhunt_hsh_easyboyeasssyy" );
|
|
var_0 maps\_anim::anim_single( var_4, var_3 );
|
|
}
|
|
else
|
|
{
|
|
var_8 notify( "stop_barking" );
|
|
level.hesh notify( "new_anim_reach" );
|
|
}
|
|
|
|
level.hesh thread maps\_utility::smart_dialogue_generic( "deerhunt_hsh_rileygo" );
|
|
level.dog.animname = "generic";
|
|
level.dog maps\_utility::enable_ai_color();
|
|
level.hesh setgoalnode( var_7 );
|
|
level.hesh maps\_utility::delaythread( 7, maps\_utility::enable_ai_color );
|
|
common_scripts\utility::flag_set( "drag_complete" );
|
|
}
|
|
|
|
dog_drag_failsafe()
|
|
{
|
|
|
|
}
|
|
|
|
get_anim_start_time( var_0, var_1 )
|
|
{
|
|
return var_0 / getanimlength( maps\_utility::getanim( var_1 ) );
|
|
}
|
|
|
|
get_world_relative_offset( var_0, var_1, var_2 )
|
|
{
|
|
var_3 = cos( var_1[1] );
|
|
var_4 = sin( var_1[1] );
|
|
var_5 = var_2[0] * var_3 - var_2[1] * var_4;
|
|
var_6 = var_2[0] * var_4 + var_2[1] * var_3;
|
|
var_5 = var_5 + var_0[0];
|
|
var_6 = var_6 + var_0[1];
|
|
return ( var_5, var_6, var_0[2] + var_2[2] );
|
|
}
|
|
|
|
set_forcegoal_nosight()
|
|
{
|
|
if ( isdefined( self.set_forcedgoal ) )
|
|
return;
|
|
|
|
self.oldfightdist = self.pathenemyfightdist;
|
|
self.oldmaxdist = self.pathenemylookahead;
|
|
self.pathenemyfightdist = 8;
|
|
self.pathenemylookahead = 8;
|
|
self.set_forcedgoal = 1;
|
|
}
|
|
|
|
unset_forcegoal_nosight()
|
|
{
|
|
if ( !isdefined( self.set_forcedgoal ) )
|
|
return;
|
|
|
|
self.pathenemyfightdist = self.oldfightdist;
|
|
self.pathenemylookahead = self.oldmaxdist;
|
|
self.set_forcedgoal = undefined;
|
|
}
|
|
|
|
ragdoll_corpses()
|
|
{
|
|
var_0 = getcorpsearray();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( var_2 isragdoll() == 0 )
|
|
var_2 startragdoll();
|
|
}
|
|
}
|
|
|
|
kill_me_from_closest_enemy( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
|
|
if ( self.team == "axis" )
|
|
var_1 = "allies";
|
|
else
|
|
var_1 = "axis";
|
|
|
|
self.a.disablelongdeath = 1;
|
|
wait( randomfloatrange( 0.5, 2.5 ) );
|
|
var_2 = getaiarray( var_1 );
|
|
|
|
if ( var_2.size == 0 )
|
|
{
|
|
maps\_utility::die();
|
|
return;
|
|
}
|
|
|
|
var_2 = sortbydistance( var_2, self.origin );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
{
|
|
shoot_from_ai_to_ai( var_2[0], self );
|
|
maps\_utility::die();
|
|
return;
|
|
}
|
|
|
|
foreach ( var_4 in var_2 )
|
|
{
|
|
if ( !isdefined( var_4.a.doinglongdeath ) && bullettracepassed( var_4 gettagorigin( "tag_flash" ), self geteye(), 1, self ) )
|
|
{
|
|
shoot_from_ai_to_ai( var_4, self );
|
|
maps\_utility::die();
|
|
return;
|
|
}
|
|
}
|
|
|
|
if ( isalive( self ) )
|
|
{
|
|
shoot_from_ai_to_ai( var_2[0], self );
|
|
maps\_utility::die();
|
|
}
|
|
}
|
|
|
|
shoot_from_ai_to_ai( var_0, var_1 )
|
|
{
|
|
var_2 = var_0 return_base_weapon_name();
|
|
|
|
if ( isdefined( var_2 ) && isdefined( var_0 gettagorigin( "tag_flash" ) ) )
|
|
magicbullet( var_2, var_0 gettagorigin( "tag_flash" ), var_1 geteye() );
|
|
}
|
|
|
|
return_base_weapon_name()
|
|
{
|
|
var_0 = strtok( self.weapon, "+" );
|
|
return var_0[0];
|
|
}
|
|
|
|
is_behind_player()
|
|
{
|
|
var_0 = ( level.player.angles[0], level.player.angles[1], 0 );
|
|
var_1 = anglestoforward( var_0 );
|
|
var_2 = level.player.origin - ( 0, 0, level.player.origin[2] );
|
|
var_3 = self.origin - ( 0, 0, self.origin[2] );
|
|
var_4 = vectornormalize( var_3 - var_2 );
|
|
var_5 = vectordot( var_4, var_1 );
|
|
return var_5 < -0.1;
|
|
}
|
|
|
|
get_my_vehicle_death_fx( var_0 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
var_0 = 0;
|
|
|
|
return level.vehicle_death_fx[self.classname][var_0].effect;
|
|
}
|
|
|
|
array_is_defined( var_0 )
|
|
{
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
if ( !isdefined( var_2 ) )
|
|
return 0;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
do_bokeh( var_0, var_1, var_2, var_3, var_4 )
|
|
{
|
|
level.player notify( "stop_bokeh" );
|
|
level.player endon( "stop_bokeh" );
|
|
|
|
if ( isdefined( var_0 ) )
|
|
level endon( var_0 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
level.player thread maps\_utility::notify_delay( "stop_bokeh", var_2 );
|
|
|
|
if ( !isdefined( var_3 ) )
|
|
var_3 = 10;
|
|
|
|
if ( !isdefined( var_4 ) )
|
|
var_4 = 30;
|
|
|
|
if ( !isdefined( level.player.bokeh_ent ) )
|
|
{
|
|
var_5 = anglestoforward( level.player.angles );
|
|
var_6 = level.player.origin + var_5 * 60;
|
|
var_7 = level.player geteye();
|
|
level.player.bokeh_ent = spawn( "script_model", var_6 );
|
|
level.player.bokeh_ent setmodel( "tag_origin" );
|
|
level.player.bokeh_ent linktoplayerview( level.player, "tag_origin", ( 5, 0, 0 ), ( 0, 0, 0 ), 1 );
|
|
}
|
|
|
|
if ( !isdefined( var_1 ) )
|
|
var_1 = "vfx_atmos_bokeh_deer";
|
|
|
|
for (;;)
|
|
{
|
|
playfxontag( common_scripts\utility::getfx( var_1 ), level.player.bokeh_ent, "tag_origin" );
|
|
wait( randomfloatrange( var_3, var_4 ) );
|
|
}
|
|
}
|
|
|
|
get_spot_in_front_of_ent( var_0 )
|
|
{
|
|
if ( self == level.player )
|
|
var_1 = level.player getplayerangles();
|
|
else
|
|
var_1 = self.angles;
|
|
|
|
var_1 = ( 0, var_1[1], 0 );
|
|
var_2 = anglestoforward( var_1 );
|
|
var_3 = var_2 * var_0;
|
|
var_4 = self.origin + var_3;
|
|
return var_4;
|
|
}
|
|
|
|
has_script_noteworthy( var_0 )
|
|
{
|
|
if ( !isdefined( self.script_noteworthy ) )
|
|
return 0;
|
|
|
|
if ( self.script_noteworthy != var_0 )
|
|
return 0;
|
|
|
|
if ( self.script_noteworthy == var_0 )
|
|
return 1;
|
|
}
|
|
|
|
shoot_single( var_0 )
|
|
{
|
|
var_1 = self gettagorigin( self.shoot_tag ) - ( 0, 0, 80 );
|
|
var_2 = level.player getplayerangles();
|
|
var_2 = ( 0, var_2[1], 0 );
|
|
var_3 = anglestoforward( var_2 );
|
|
var_4 = var_3 * 375;
|
|
var_5 = level.player.origin + var_4;
|
|
magicbullet( var_0, var_1, var_5 );
|
|
}
|
|
|
|
shoot_rocket( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_1 ) )
|
|
{
|
|
while ( !common_scripts\utility::within_fov( self.origin, self.angles, level.player.origin, cos( 70 ) ) )
|
|
wait 0.25;
|
|
}
|
|
else
|
|
{
|
|
while ( !common_scripts\utility::within_fov( self.origin, self.angles, var_1, cos( 70 ) ) )
|
|
wait 0.25;
|
|
}
|
|
|
|
var_2 = 300;
|
|
var_3 = maps\_utility::getdifficulty();
|
|
|
|
switch ( var_3 )
|
|
{
|
|
case "easy":
|
|
var_2 = 400;
|
|
break;
|
|
case "medium":
|
|
var_2 = 350;
|
|
break;
|
|
case "fu":
|
|
case "hard":
|
|
var_2 = 80;
|
|
break;
|
|
}
|
|
|
|
if ( common_scripts\utility::cointoss() )
|
|
var_4 = "tag_missile_right";
|
|
else
|
|
var_4 = "tag_missile_left";
|
|
|
|
var_5 = self gettagorigin( var_4 ) - ( 0, 0, 50 );
|
|
|
|
if ( isdefined( var_1 ) )
|
|
var_6 = var_1;
|
|
else
|
|
{
|
|
var_7 = level.player getplayerangles();
|
|
var_7 = ( 0, var_7[1], 0 );
|
|
var_8 = anglestoforward( var_7 );
|
|
var_9 = var_8 * var_2;
|
|
var_6 = level.player.origin + var_9;
|
|
}
|
|
|
|
var_10 = magicbullet( var_0, var_5, var_6 );
|
|
return var_10;
|
|
}
|
|
|
|
shootflares( var_0 )
|
|
{
|
|
var_1 = maps\_utility::spawn_anim_model( "flare_rig" );
|
|
var_1.origin = self gettagorigin( "tag_flare" );
|
|
var_1.angles = self gettagangles( "tag_flare" );
|
|
var_2 = [];
|
|
var_3 = [ "flare_right_top", "flare_left_bot", "flare_right_bot" ];
|
|
|
|
foreach ( var_5 in var_3 )
|
|
{
|
|
var_6 = common_scripts\utility::spawn_tag_origin();
|
|
var_6 linkto( var_1, var_5, ( 0, 0, 0 ), ( 0, 0, 0 ) );
|
|
var_6 thread flare_trackvelocity();
|
|
var_2[var_5] = var_6;
|
|
}
|
|
|
|
self.flares = var_2;
|
|
var_8 = level.scr_anim["flare_rig"]["flare"].size;
|
|
var_9 = level.scr_anim["flare_rig"]["flare"][2];
|
|
var_1 setflaggedanim( "flare_anim", var_9, 1, 0, 1 );
|
|
var_10 = common_scripts\utility::getfx( "chopper_flare" );
|
|
var_2 = common_scripts\utility::array_randomize( var_2 );
|
|
|
|
foreach ( var_5, var_6 in var_2 )
|
|
{
|
|
if ( isdefined( var_6 ) )
|
|
{
|
|
playfxontag( var_10, var_2[var_5], "tag_origin" );
|
|
var_6 playsound( "chopper_flare_fire" );
|
|
}
|
|
}
|
|
|
|
if ( isdefined( var_0 ) )
|
|
var_0 missile_settargetent( common_scripts\utility::random( var_2 ) );
|
|
|
|
var_1 waittillmatch( "flare_anim", "end" );
|
|
|
|
foreach ( var_5, var_6 in var_2 )
|
|
{
|
|
if ( isdefined( var_6 ) )
|
|
stopfxontag( var_10, var_2[var_5], "tag_origin" );
|
|
}
|
|
|
|
var_1 delete();
|
|
var_2 = common_scripts\utility::array_removeundefined( var_2 );
|
|
common_scripts\utility::array_thread( var_2, ::flare_doburnout );
|
|
return var_2;
|
|
}
|
|
|
|
flare_trackvelocity()
|
|
{
|
|
self endon( "death" );
|
|
self.velocity = 0;
|
|
var_0 = self.origin;
|
|
|
|
for (;;)
|
|
{
|
|
self.velocity = self.origin - var_0;
|
|
var_0 = self.origin;
|
|
wait 0.05;
|
|
}
|
|
}
|
|
|
|
flare_doburnout()
|
|
{
|
|
self endon( "death" );
|
|
self movegravity( 14 * self.velocity, 0.2 );
|
|
wait 0.2;
|
|
|
|
if ( !isdefined( self ) || isdefined( self.mytarget ) )
|
|
return;
|
|
|
|
self delete();
|
|
}
|
|
|
|
game_is_pc()
|
|
{
|
|
if ( level.xenon )
|
|
return 0;
|
|
|
|
if ( level.ps3 )
|
|
return 0;
|
|
|
|
if ( level.ps4 )
|
|
return 0;
|
|
|
|
if ( level.xb3 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
gameskill_is_difficult()
|
|
{
|
|
var_0 = maps\_utility::getdifficulty();
|
|
|
|
if ( var_0 == "easy" || var_0 == "medium" )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
set_flag_if_not_set( var_0 )
|
|
{
|
|
if ( !common_scripts\utility::flag( var_0 ) )
|
|
common_scripts\utility::flag_set( var_0 );
|
|
}
|
|
|
|
delete_me_on_notifies( var_0, var_1, var_2 )
|
|
{
|
|
if ( !isdefined( var_1 ) && !isdefined( var_2 ) )
|
|
var_3 = common_scripts\utility::waittill_any_return( var_0 );
|
|
else if ( !isdefined( var_2 ) )
|
|
var_3 = common_scripts\utility::waittill_any_return( var_0, var_1 );
|
|
else
|
|
var_3 = common_scripts\utility::waittill_any_return( var_0, var_1, var_2 );
|
|
|
|
if ( isdefined( level.custom_flavorburst_ents ) )
|
|
level.custom_flavorburst_ents = common_scripts\utility::array_remove( level.custom_flavorburst_ents, self );
|
|
|
|
self delete();
|
|
}
|
|
|
|
get_random_death_sound()
|
|
{
|
|
var_0 = randomintrange( 1, 8 );
|
|
return "generic_death_enemy_" + var_0;
|
|
}
|
|
|
|
cqb_off_sprint_on()
|
|
{
|
|
if ( isdefined( self.cqbwalking ) )
|
|
{
|
|
if ( self.cqbwalking == 1 )
|
|
maps\_utility::disable_cqbwalk();
|
|
}
|
|
|
|
maps\_utility::enable_sprint();
|
|
}
|
|
|
|
cqb_on_sprint_off()
|
|
{
|
|
if ( isdefined( self.sprint ) )
|
|
{
|
|
if ( self.sprint == 1 )
|
|
maps\_utility::disable_sprint();
|
|
}
|
|
|
|
maps\_utility::enable_cqbwalk();
|
|
}
|
|
|
|
activate_trig_if_not_flag( var_0 )
|
|
{
|
|
if ( !common_scripts\utility::flag( var_0 ) )
|
|
maps\_utility::activate_trigger_with_targetname( var_0 );
|
|
}
|
|
|
|
dog_growl()
|
|
{
|
|
maps\_utility::play_sound_on_entity( "anml_dog_attack_miss" );
|
|
}
|
|
|
|
waittill_player_moves_or_timeout_controller( var_0 )
|
|
{
|
|
var_1 = 130;
|
|
thread return_after_time( var_0, "player_moved_ahead" );
|
|
thread return_on_velocity( var_1 );
|
|
self waittill( "returned", var_2 );
|
|
self notify( "kill" );
|
|
return var_2;
|
|
}
|
|
|
|
waittill_player_moves_or_timeout_kb( var_0 )
|
|
{
|
|
var_1 = 40000;
|
|
thread return_after_time( var_0, "player_moved_ahead" );
|
|
thread return_on_movement( var_1 );
|
|
self waittill( "returned", var_2 );
|
|
self notify( "kill" );
|
|
return var_2;
|
|
}
|
|
|
|
is_moving()
|
|
{
|
|
self endon( "death" );
|
|
var_0 = self.origin;
|
|
wait 0.2;
|
|
var_1 = self.origin;
|
|
|
|
if ( var_0 == var_1 )
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
return_on_movement( var_0 )
|
|
{
|
|
self endon( "kill" );
|
|
level.player endon( "death" );
|
|
var_1 = level.player.origin;
|
|
|
|
for (;;)
|
|
{
|
|
wait 0.1;
|
|
var_2 = level.player.origin;
|
|
|
|
if ( distance2dsquared( var_1, var_2 ) >= var_0 )
|
|
self notify( "returned", "has_moved" );
|
|
}
|
|
}
|
|
|
|
return_on_velocity( var_0 )
|
|
{
|
|
self endon( "kill" );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 = level.player getvelocity();
|
|
|
|
if ( var_1 != ( 0, 0, 0 ) )
|
|
{
|
|
var_2 = distance2d( ( 0, 0, 0 ), var_1 );
|
|
|
|
if ( var_2 >= var_0 || var_2 <= var_0 * -1 )
|
|
self notify( "returned", "player_moved_ahead" );
|
|
}
|
|
|
|
wait 0.5;
|
|
}
|
|
}
|
|
|
|
return_after_time( var_0, var_1 )
|
|
{
|
|
self endon( "kill" );
|
|
self endon( var_1 );
|
|
wait( var_0 );
|
|
self notify( "returned", "timed_out" );
|
|
}
|
|
|
|
array_is_greater_than( var_0, var_1 )
|
|
{
|
|
if ( !isdefined( var_0 ) )
|
|
return 0;
|
|
|
|
if ( isdefined( var_0.size ) )
|
|
{
|
|
if ( var_0.size > var_1 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
only_take_damage_from_player( var_0 )
|
|
{
|
|
self endon( "death" );
|
|
var_1 = 2;
|
|
var_2 = 0;
|
|
|
|
if ( isdefined( var_0 ) )
|
|
level endon( var_0 );
|
|
|
|
thread maps\_utility::magic_bullet_shield();
|
|
|
|
for (;;)
|
|
{
|
|
self waittill( "damage", var_3, var_4 );
|
|
|
|
if ( isdefined( var_4 ) )
|
|
{
|
|
if ( var_4 == level.player )
|
|
{
|
|
var_2++;
|
|
|
|
if ( var_2 >= var_1 )
|
|
{
|
|
maps\_utility::stop_magic_bullet_shield();
|
|
maps\_utility::die();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
set_flag_on_targetname_trigger_by_player( var_0 )
|
|
{
|
|
if ( !common_scripts\utility::flag_exist( var_0 ) )
|
|
common_scripts\utility::flag_init( var_0 );
|
|
|
|
var_1 = getent( var_0, "targetname" );
|
|
|
|
for (;;)
|
|
{
|
|
var_1 waittill( "trigger", var_2 );
|
|
|
|
if ( isplayer( var_2 ) )
|
|
{
|
|
common_scripts\utility::flag_set( var_0 );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
hesh_says_on_you()
|
|
{
|
|
if ( common_scripts\utility::cointoss() )
|
|
level.hesh maps\_utility::smart_dialogue_generic( "deerhunt_hsh_onyou" );
|
|
else
|
|
level.hesh maps\_utility::smart_dialogue_generic( "deerhunt_hsh_onyourgo" );
|
|
}
|
|
|
|
hesh_radio_aknowledge()
|
|
{
|
|
var_0 = [ "deerhunt_hsh_rogteam2out", "deerhunt_hsh_copythatlifeguard", "deerhunt_hsh_team2copiesall" ];
|
|
var_0 = common_scripts\utility::array_randomize( var_0 );
|
|
level.hesh maps\_utility::smart_radio_dialogue( common_scripts\utility::random( var_0 ) );
|
|
}
|
|
|
|
music_on_flag( var_0, var_1, var_2 )
|
|
{
|
|
common_scripts\utility::flag_wait( var_0 );
|
|
|
|
if ( isdefined( var_2 ) )
|
|
wait( var_2 );
|
|
|
|
maps\_utility::music_play( var_1 );
|
|
}
|
|
|
|
print3d_on_me( var_0 )
|
|
{
|
|
|
|
}
|
|
|
|
grenades_by_difficulty()
|
|
{
|
|
var_0 = 0;
|
|
var_1 = maps\_utility::getdifficulty();
|
|
|
|
switch ( var_1 )
|
|
{
|
|
case "easy":
|
|
var_0 = 0;
|
|
break;
|
|
case "medium":
|
|
var_0 = 1;
|
|
break;
|
|
case "fu":
|
|
case "hard":
|
|
var_0 = 2;
|
|
break;
|
|
}
|
|
|
|
if ( randomint( 100 ) < 40 )
|
|
self.grenadeammo = var_0;
|
|
else
|
|
self.grenadeammo = 0;
|
|
}
|
|
|
|
fade_out_in( var_0, var_1, var_2, var_3 )
|
|
{
|
|
var_4 = newhudelem();
|
|
var_4.x = 0;
|
|
var_4.y = 0;
|
|
var_4 setshader( var_0, 640, 480 );
|
|
var_4.alignx = "left";
|
|
var_4.aligny = "top";
|
|
var_4.horzalign = "fullscreen";
|
|
var_4.vertalign = "fullscreen";
|
|
var_4.alpha = 0;
|
|
|
|
if ( isdefined( var_3 ) )
|
|
var_4 fadeovertime( var_3 );
|
|
|
|
var_4.alpha = 1;
|
|
var_4.sort = -2;
|
|
|
|
if ( isdefined( var_1 ) )
|
|
level waittill( var_1 );
|
|
else
|
|
wait( var_2 );
|
|
|
|
var_4 fadeovertime( 0.5 );
|
|
var_4.alpha = 0;
|
|
wait 1;
|
|
var_4 destroy();
|
|
}
|
|
|
|
disable_dontattackme()
|
|
{
|
|
if ( isdefined( self.dontattackme ) )
|
|
self.dontattackme = undefined;
|
|
}
|
|
|
|
ignore_me_ignore_all()
|
|
{
|
|
self.ignoreme = 1;
|
|
self.ignoreall = 1;
|
|
}
|
|
|
|
ignore_me_ignore_all_off()
|
|
{
|
|
self.ignoreme = 0;
|
|
self.ignoreall = 0;
|
|
}
|
|
|
|
shop_door_open( var_0 )
|
|
{
|
|
wait 1.15;
|
|
self rotateto( self.angles + ( 0, 90, 0 ), 2.2, 0.6, 1.6 );
|
|
self connectpaths();
|
|
self waittill( "rotatedone" );
|
|
}
|
|
|
|
is_array_close( var_0, var_1 )
|
|
{
|
|
foreach ( var_3 in var_0 )
|
|
{
|
|
if ( distance2dsquared( self.origin, var_3.origin ) < var_1 )
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
arm_player( var_0 )
|
|
{
|
|
level.player takeallweapons();
|
|
|
|
foreach ( var_2 in var_0 )
|
|
{
|
|
level.player giveweapon( var_2 );
|
|
level.player givemaxammo( var_2 );
|
|
}
|
|
|
|
level.player switchtoweapon( var_0[0] );
|
|
}
|
|
|
|
switch_from_cqb_to_creepwalk()
|
|
{
|
|
if ( isdefined( self.cqbwalking ) )
|
|
{
|
|
if ( self.cqbwalking == 1 )
|
|
{
|
|
maps\_utility::disable_cqbwalk();
|
|
maps\_utility::set_archetype( "creepwalk" );
|
|
self.moveloopoverridefunc = ::play_move_transition;
|
|
self.deerhunttransitionanim = %cqb_run_to_creepwalk_iw6;
|
|
|
|
if ( isdefined( self.aim_while_moving_thread ) )
|
|
animscripts\run::endfaceenemyaimtracking();
|
|
}
|
|
}
|
|
else
|
|
maps\_utility::set_archetype( "creepwalk" );
|
|
|
|
disable_turns_arrivals_exits();
|
|
}
|
|
|
|
switch_from_creepwalk_to_cqb()
|
|
{
|
|
maps\_utility::enable_cqbwalk();
|
|
enable_turns_arrivals_exits();
|
|
|
|
if ( isdefined( self.animarchetype ) )
|
|
{
|
|
if ( self.animarchetype == "creepwalk" )
|
|
{
|
|
maps\_utility::clear_archetype();
|
|
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;
|
|
}
|
|
|
|
switch_from_cqb_to_gundown()
|
|
{
|
|
if ( isdefined( self.cqbwalking ) )
|
|
{
|
|
if ( self.cqbwalking == 1 )
|
|
maps\_utility::disable_cqbwalk();
|
|
}
|
|
|
|
maps\_utility::set_archetype( "gundown_archetype" );
|
|
disable_turns_arrivals_exits();
|
|
}
|
|
|
|
switch_from_gundown_to_cqb()
|
|
{
|
|
maps\_utility::enable_cqbwalk();
|
|
maps\_utility::clear_archetype();
|
|
enable_turns_arrivals_exits();
|
|
}
|
|
|
|
makestruct()
|
|
{
|
|
var_0 = spawnstruct();
|
|
var_0.origin = self.origin;
|
|
var_0.angles = self.angles;
|
|
return var_0;
|
|
}
|
|
|
|
custom_anim_reach_together( var_0, var_1, var_2, var_3 )
|
|
{
|
|
thread custom_moveplaybackrate_together( var_0 );
|
|
maps\_anim::anim_reach_with_funcs( var_0, var_1, var_2, var_3, ::hack_reach_start_func, ::hack_reach_end_func );
|
|
}
|
|
|
|
custom_moveplaybackrate_together( var_0 )
|
|
{
|
|
var_1 = 0.5;
|
|
waittillframeend;
|
|
|
|
for (;;)
|
|
{
|
|
var_0 = maps\_utility::remove_dead_from_array( var_0 );
|
|
var_2 = [];
|
|
var_3 = 0;
|
|
|
|
foreach ( var_8, var_5 in var_0 )
|
|
{
|
|
var_6 = var_5.goalpos;
|
|
|
|
if ( isdefined( var_5.reach_goal_pos ) )
|
|
var_6 = var_5.reach_goal_pos;
|
|
|
|
var_7 = distance( var_5.origin, var_6 );
|
|
var_2[var_5.unique_id] = var_7;
|
|
|
|
if ( var_7 <= 4 )
|
|
{
|
|
var_0[var_8] = undefined;
|
|
continue;
|
|
}
|
|
|
|
var_3 = var_3 + var_7;
|
|
}
|
|
|
|
if ( var_0.size <= 1 )
|
|
break;
|
|
|
|
var_3 = var_3 / var_0.size;
|
|
|
|
foreach ( var_5 in var_0 )
|
|
{
|
|
var_10 = var_2[var_5.unique_id] - var_3;
|
|
var_11 = var_10 * 0.003;
|
|
|
|
if ( var_11 > var_1 )
|
|
var_11 = var_1;
|
|
else if ( var_11 < var_1 * -1 )
|
|
var_11 = var_1 * -1;
|
|
|
|
var_12 = 1;
|
|
|
|
if ( isdefined( var_5.anim_reach_playback_scale ) )
|
|
var_12 = var_5.anim_reach_playback_scale;
|
|
|
|
var_5.moveplaybackrate = 1 * var_12 + var_11;
|
|
}
|
|
|
|
wait 0.05;
|
|
}
|
|
|
|
foreach ( var_5 in var_0 )
|
|
{
|
|
if ( isalive( var_5 ) )
|
|
var_5.moveplaybackrate = 1;
|
|
}
|
|
}
|
|
|
|
hack_reach_start_func( var_0 )
|
|
{
|
|
self.oldgoalradius = self.goalradius;
|
|
self.oldpathenemyfightdist = self.pathenemyfightdist;
|
|
self.oldpathenemylookahead = self.pathenemylookahead;
|
|
self.pathenemyfightdist = 128;
|
|
self.pathenemylookahead = 128;
|
|
maps\_utility::disable_ai_color();
|
|
maps\_anim::anim_changes_pushplayer( 1 );
|
|
self.nododgemove = 0;
|
|
self.og_interval = self.interval;
|
|
self.interval = 50;
|
|
self.fixednodewason = self.fixednode;
|
|
self.fixednode = 0;
|
|
|
|
if ( !isdefined( self.scriptedarrivalent ) )
|
|
{
|
|
self.old_disablearrivals = self.disablearrivals;
|
|
self.disablearrivals = 1;
|
|
}
|
|
|
|
self.reach_goal_pos = undefined;
|
|
return var_0;
|
|
}
|
|
|
|
hack_reach_end_func()
|
|
{
|
|
maps\_anim::reach_with_standard_adjustments_end();
|
|
self.interval = self.og_interval;
|
|
self.og_interval = undefined;
|
|
}
|
|
|
|
radial_push_player( var_0, var_1, var_2, var_3 )
|
|
{
|
|
level endon( var_3 );
|
|
var_1 = squared( var_1 );
|
|
var_2 = anglestoforward( var_2 ) * 20;
|
|
|
|
for (;;)
|
|
{
|
|
wait 0.05;
|
|
|
|
if ( distancesquared( level.player.origin, var_0 ) < var_1 )
|
|
{
|
|
level.player pushplayervector( var_2 );
|
|
continue;
|
|
}
|
|
|
|
level.player pushplayervector( ( 0, 0, 0 ) );
|
|
}
|
|
}
|