1 #using scripts\shared\array_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\flag_shared;
4 #using scripts\shared\flagsys_shared;
5 #using scripts\shared\lui_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\scene_shared;
8 #using scripts\shared\spawner_shared;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\statstable_shared.gsh;
21 #precache( "lui_menu", "CPChyron" );
22 #precache( "lui_menu_data", "line1full" );
23 #precache( "lui_menu_data", "line1short" );
24 #precache( "lui_menu_data", "line2full" );
25 #precache( "lui_menu_data", "line2short" );
26 #precache( "lui_menu_data", "line3full" );
27 #precache( "lui_menu_data", "line3short" );
28 #precache( "lui_menu_data", "line4full" );
29 #precache( "lui_menu_data", "line4short" );
30 #precache( "lui_menu_data", "line5full" );
31 #precache( "lui_menu_data", "line5short" );
32 #precache( "lui_menu_data", "close_current_menu" );
66 if ( NumRemoteClients() )
68 for ( i = 0; i < n_count; i++ )
70 snapshot_ids = GetSnapShotIndexArray();
73 while ( !isdefined( acked ) )
75 level waittill(
"snapacknowledged" );
76 acked = SnapShotAcknowledged( snapshot_ids );
82 wait ( 0.1 * n_count );
86 function streamer_wait( n_stream_request_id, n_wait_frames = 0, n_timeout = 0, b_bonuszm_streamer_fallback =
true )
88 level endon(
"loading_movie_done" );
91 if( n_wait_frames > 0 )
104 timeout = GetTime() + ( n_timeout * 1000 );
108 n_num_streamers_ready = 0;
114 n_num_streamers_ready = 0;
116 foreach ( player
in GetPlayers() )
118 if ( ( isdefined( n_stream_request_id ) ? player IsStreamerReady( n_stream_request_id ) : player IsStreamerReady() ) )
120 n_num_streamers_ready++;
124 if( n_timeout > 0 && GetTime() >
timeout )
129 while ( n_num_streamers_ready < Max( 1, GetPlayers().size ) );
133 self endon(
"disconnect" );
139 if( n_timeout > 0 && GetTime() >
timeout )
144 while ( !( isdefined( n_stream_request_id ) ?
self IsStreamerReady( n_stream_request_id ) :
self IsStreamerReady() ) );
154 line (start,
end, (1,1,0.5));
161 if ( !isdefined( color ) )
166 if ( !isdefined( alpha ) )
171 if ( !isdefined( depthTest ) )
176 if ( !isdefined( duration ) )
181 line(start,
end, color, alpha, depthTest, duration );
187 if ( !isdefined( slices ) )
192 if ( !isdefined( color ) )
197 if ( !isdefined( alpha ) )
202 if ( !isdefined( depthTest ) )
207 if ( !isdefined( duration ) )
212 sphericalcone( origin, domeApex, angle, slices, color, alpha, depthTest, duration );
218 if ( !isdefined(time) )
222 if ( !isdefined(color) )
227 sides = Int(10 * ( 1 + Int(radius) % 100 ));
228 sphere( origin, radius, color, alpha,
true, sides, time );
235 self waittillmatch (msg,
"end");
240 if(isdefined(
self.current_target))
242 if(spot_to_track ==
self.current_target)
245 self.current_target = spot_to_track;
250 if ( msg !=
"death" )
252 self endon (
"death");
256 self waittill( msg );
257 ent notify(
"returned", msg );
262 otherEnt endon (
"death");
265 level waittill( msg );
266 ent notify(
"returned", msg );
278 s_tracker = SpawnStruct();
279 s_tracker._wait_count = 0;
281 for ( i = 0; i < vararg.size; i++ )
286 if ( s_tracker._wait_count > 0 )
288 s_tracker waittill(
"waitlogic_finished" );
306 self waittill( msg2 );
321 const N_MIN_DAMAGE = 500;
322 const N_MAX_DAMAGE = 500;
325 n_radius = Float( n_radius );
331 v_origin_offset = ( 0, 0, 0 );
337 v_origin_offset = ( 0, 0, 40 );
340 GlassRadiusDamage(
self.origin + v_origin_offset, n_radius, N_MAX_DAMAGE, N_MIN_DAMAGE );
355 for ( i = 0; i < vararg.size; i++ )
367 s_tracker = SpawnStruct();
368 s_tracker._wait_count = 0;
370 for ( i = 0; i <
a_ents.size; i++ )
374 if ( isdefined( ent ) )
376 ent thread
_waitlogic( s_tracker, a_notifies[ i ] );
380 if ( s_tracker._wait_count > 0 )
382 s_tracker waittill(
"waitlogic_finished" );
388 s_tracker._wait_count++;
393 s_tracker._wait_count--;
394 if ( s_tracker._wait_count == 0 )
396 s_tracker notify(
"waitlogic_finished" );
418 if ((!isdefined (string1) || string1 !=
"death") &&
419 (!isdefined (string2) || string2 !=
"death") &&
420 (!isdefined (string3) || string3 !=
"death") &&
421 (!isdefined (string4) || string4 !=
"death") &&
422 (!isdefined (string5) || string5 !=
"death") &&
423 (!isdefined (string6) || string6 !=
"death") &&
424 (!isdefined (string7) || string7 !=
"death"))
425 self endon (
"death");
429 if (isdefined (string1))
432 if (isdefined (string2))
435 if (isdefined (string3))
438 if (isdefined (string4))
441 if (isdefined (string5))
444 if (isdefined (string6))
447 if (isdefined (string7))
450 ent waittill (
"returned", msg);
476 s_common = SpawnStruct();
483 if ( StrIsNumber( vararg[ 0 ] ) )
485 n_timeout = vararg[ 0 ];
495 if ( IsArray( vararg[ n_arg_index ] ) )
497 a_params = vararg[ n_arg_index ];
504 n_start_index = n_arg_index;
510 for( i=n_start_index; i<a_params.size; i++ )
512 if ( !IsString( a_params[i] ) )
515 e_current = a_params[i];
520 if ( isdefined( e_current ) )
527 s_common waittill (
"returned", str_notify );
528 s_common notify (
"die" );
546 if ( IsInArray( a_notifies,
"death" ) )
551 s_tracker = SpawnStruct();
553 foreach ( str_notify
in a_notifies )
555 if ( isdefined( str_notify ) )
561 s_tracker waittill(
"returned", msg );
562 s_tracker notify(
"die" );
581 function waittill_any( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5, str_notify6 )
583 Assert( isdefined( str_notify1 ) );
602 assert( isdefined( a_notifies[0] ),
603 "At least the first element has to be defined for waittill_any_array." );
605 for ( i = 1; i < a_notifies.size; i++ )
607 if ( isdefined( a_notifies[i] ) )
609 self endon( a_notifies[i] );
613 self waittill( a_notifies[0] );
633 if ( ( !isdefined( string1 ) || string1 !=
"death" ) &&
634 ( !isdefined( string2 ) || string2 !=
"death" ) &&
635 ( !isdefined( string3 ) || string3 !=
"death" ) &&
636 ( !isdefined( string4 ) || string4 !=
"death" ) &&
637 ( !isdefined( string5 ) || string5 !=
"death" ) )
638 self endon(
"death" );
642 if ( isdefined( string1 ) )
645 if ( isdefined( string2 ) )
648 if ( isdefined( string3 ) )
651 if ( isdefined( string4 ) )
654 if ( isdefined( string5 ) )
659 ent waittill(
"returned", msg );
682 otherEnt endon(
"death" );
686 if ( isdefined( string1 ) )
689 if ( isdefined( string2 ) )
692 if ( isdefined( string3 ) )
695 if ( isdefined( string4 ) )
698 if ( isdefined( string5 ) )
701 if ( isdefined( otherEnt ) )
706 ent waittill(
"returned", msg );
716 self notify(
"returned",
"timeout" );
737 function waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6,ent7, string7 )
739 assert( isdefined( ent1 ) );
740 assert( isdefined( string1 ) );
742 if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) )
743 ent2 endon( string2 );
745 if ( ( isdefined( ent3 ) ) && ( isdefined( string3 ) ) )
746 ent3 endon( string3 );
748 if ( ( isdefined( ent4 ) ) && ( isdefined( string4 ) ) )
749 ent4 endon( string4 );
751 if ( ( isdefined( ent5 ) ) && ( isdefined( string5 ) ) )
752 ent5 endon( string5 );
754 if ( ( isdefined( ent6 ) ) && ( isdefined( string6 ) ) )
755 ent6 endon( string6 );
757 if ( ( isdefined( ent7 ) ) && ( isdefined( string7 ) ) )
758 ent7 endon( string7 );
760 ent1 waittill( string1 );
778 assert( isdefined( ent1 ) );
779 assert( isdefined( string1 ) );
781 if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) )
782 ent2 endon( string2 );
784 ent1 waittill( string1 );
798 if ( !isdefined(
self.flashEndTime ) )
801 return GetTime() <
self.flashEndTime;
815 if ( !isdefined(
self.flashEndTime ) )
818 return GetTime() <
self.flashEndTime;
838 function single_func( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 )
840 if ( !isdefined( entity ) )
845 if ( isdefined( arg6 ) )
847 return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
849 else if ( isdefined( arg5 ) )
851 return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
853 else if ( isdefined( arg4 ) )
855 return entity [[ func ]]( arg1, arg2, arg3, arg4 );
857 else if ( isdefined( arg3 ) )
859 return entity [[ func ]]( arg1, arg2, arg3 );
861 else if ( isdefined( arg2 ) )
863 return entity [[ func ]]( arg1, arg2 );
865 else if ( isdefined( arg1 ) )
867 return entity [[ func ]]( arg1 );
871 return entity [[ func ]]();
891 function new_func( func, arg1, arg2, arg3, arg4, arg5, arg6 )
893 s_func = SpawnStruct();
916 return single_func(
self, s_func.func, s_func.arg1, s_func.arg2, s_func.arg3, s_func.arg4, s_func.arg5, s_func.arg6 );
938 Assert( isdefined( entity ),
"Undefined entity passed to util::single_thread()" );
940 if ( isdefined( arg6 ) )
942 entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
944 else if ( isdefined( arg5 ) )
946 entity thread [[ func ]](arg1, arg2, arg3, arg4, arg5);
948 else if ( isdefined( arg4 ) )
950 entity thread [[ func ]]( arg1, arg2, arg3, arg4 );
952 else if ( isdefined( arg3 ) )
954 entity thread [[ func ]]( arg1, arg2, arg3 );
956 else if ( isdefined( arg2 ) )
958 entity thread [[ func ]]( arg1, arg2 );
960 else if ( isdefined( arg1 ) )
962 entity thread [[ func ]]( arg1 );
966 entity thread [[ func ]]();
974 wait
self.script_delay;
977 else if ( isdefined(
self.script_delay_min ) && isdefined(
self.script_delay_max ) )
979 if (
self.script_delay_max >
self.script_delay_min )
981 wait RandomFloatrange(
self.script_delay_min,
self.script_delay_max );
985 wait
self.script_delay_min;
1011 function timeout( n_time, func, arg1, arg2, arg3, arg4, arg5, arg6 )
1014 single_func(
self, func, arg1, arg2, arg3, arg4, arg5, arg6 );
1019 tokens = strtok( flags,
" " );
1022 for( i=0; i < tokens.size; i++ )
1026 level
flag::init( tokens[ i ], undefined,
true );
1072 level notify(
"face",
"death",
self );
1073 self notify(
"death", attacker, damageType );
1078 level notify(
"face",
"damage",
self );
1079 self notify(
"damage",
damage, attacker, direction_vec, point, type, modelName, tagName, partName, iDFlags );
1084 level notify(
"face",
"explode",
self );
1085 self notify(
"explode" );
1090 level notify(
"face",
"alert",
self );
1091 self notify(
"alert" );
1096 level notify(
"face",
"shoot",
self );
1097 self notify(
"shoot" );
1102 level notify(
"face",
"melee",
self );
1103 self notify(
"melee" );
1108 return ( !
self.disabledUsability );
1114 self.disabledUsability++;
1115 self DisableUsability();
1121 self.disabledUsability--;
1123 assert(
self.disabledUsability >= 0 );
1125 if ( !
self.disabledUsability )
1126 self EnableUsability();
1132 self.disabledUsability = 0;
1133 self EnableUsability();
1139 DEFAULT(
self.disabledWeapon, 0 );
1141 self.disabledWeapon++;
1142 self DisableWeapons();
1147 if (
self.disabledWeapon > 0 )
1149 self.disabledWeapon--;
1151 if ( !
self.disabledWeapon )
1153 self EnableWeapons();
1160 return ( !
self.disabledWeapon );
1165 hor_normal = ( normal[ 0 ], normal[ 1 ], 0 );
1166 hor_length = Length( hor_normal );
1173 hor_dir = VectorNormalize( hor_normal );
1174 neg_height = normal[ 2 ] * -1;
1175 tangent = ( hor_dir[ 0 ] * neg_height, hor_dir[ 1 ] * neg_height, hor_length );
1176 plant_angle = VectorToAngles( tangent );
1202 function delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 )
1204 self thread
_delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 );
1207 function _delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 )
1209 self endon(
"death" );
1211 if ( isdefined( str_endon ) )
1213 self endon( str_endon );
1216 if ( IsString( time_or_notify ) )
1218 self waittill( time_or_notify );
1222 wait time_or_notify;
1225 single_func(
self, func, arg1, arg2, arg3, arg4, arg5, arg6 );
1249 self endon(
"entityshutdown" );
1251 if ( isdefined( str_endon ) )
1253 self endon( str_endon );
1258 single_func(
self, func, arg1, arg2, arg3, arg4, arg5, arg6 );
1278 function delay_notify( time_or_notify, str_notify, str_endon, arg1, arg2, arg3, arg4, arg5 )
1280 self thread
_delay_notify( time_or_notify, str_notify, str_endon, arg1, arg2, arg3, arg4, arg5 );
1283 function _delay_notify( time_or_notify, str_notify, str_endon, arg1, arg2, arg3, arg4, arg5 )
1285 self endon(
"death" );
1287 if ( isdefined( str_endon ) )
1289 self endon( str_endon );
1292 if ( IsString( time_or_notify ) )
1294 self waittill( time_or_notify );
1298 wait time_or_notify;
1301 self notify( str_notify, arg1, arg2, arg3, arg4, arg5 );
1340 players = GetPlayers( str_team );
1341 return ArraySort( players, org,
true, 1 )[0];
1346 if(!isdefined(level._clientSys))
1348 level._clientSys = [];
1351 if(level._clientSys.size >= 32)
1353 /#AssertMsg(
"Max num client systems exceeded.");#/
1357 if(isdefined(level._clientSys[sSysName]))
1359 /#AssertMsg(
"Attempt to re-register client system : " + sSysName);#/
1364 level._clientSys[sSysName] = spawnstruct();
1365 level._clientSys[sSysName].sysID = ClientSysRegister(sSysName);
1371 if(!isdefined(level._clientSys))
1373 /#AssertMsg(
"setClientSysState called before registration of any systems.");#/
1377 if(!isdefined(level._clientSys[sSysName]))
1379 /#AssertMsg(
"setClientSysState called on unregistered system " + sSysName);#/
1383 if(isdefined(player))
1385 player ClientSysSetState(level._clientSys[sSysName].sysID, sSysState);
1389 ClientSysSetState(level._clientSys[sSysName].sysID, sSysState);
1390 level._clientSys[sSysName].sysState = sSysState;
1396 if(!isdefined(level._clientSys))
1398 /#AssertMsg(
"Cannot getClientSysState before registering any client systems.");#/
1402 if(!isdefined(level._clientSys[sSysName]))
1404 /#AssertMsg(
"Client system " + sSysName +
" cannot return state, as it is unregistered.");#/
1408 if(isdefined(level._clientSys[sSysName].sysState))
1410 return level._clientSys[sSysName].sysState;
1418 if(level.clientscripts)
1433 return ( SessionModeIsSystemlink() || ( SessionModeIsOnlineGame() || IsSplitScreen() ) );
1448 function is_looking_at( ent_or_org, n_dot_range = 0.67, do_trace =
false, v_offset )
1450 Assert( isdefined( ent_or_org ),
"ent_or_org is required parameter for is_facing function" );
1452 v_point = ( IsVec( ent_or_org ) ? ent_or_org : ent_or_org.origin );
1454 if ( IsVec( v_offset ) )
1456 v_point += v_offset;
1460 b_use_tag_eye =
false;
1462 if ( IsPlayer(
self ) || IsAI(
self ) )
1464 b_use_tag_eye =
true;
1469 if ( n_dot > n_dot_range )
1474 b_can_see = SightTracePassed( v_eye, v_point,
false, ent_or_org );
1496 if ( IsPlayer(
self ) )
1498 linked_ent =
self GetLinkedEnt();
1499 if ( isdefined( linked_ent ) && ( GetDvarint(
"cg_cameraUseTagCamera" ) > 0 ) )
1501 camera = linked_ent GetTagOrigin(
"tag_camera" );
1502 if ( isdefined( camera ) )
1509 pos =
self GetEye();
1523 return (
self playerADS() > 0.5 );
1538 function spawn_model( model_name, origin, angles, n_spawnflags = 0, b_throttle =
false )
1545 if ( !isdefined( origin ) )
1547 origin = ( 0, 0, 0 );
1550 model =
Spawn(
"script_model", origin, n_spawnflags );
1551 model SetModel( model_name );
1553 if ( isdefined( angles ) )
1555 model.angles = angles;
1561 #using_animtree( "generic" );
1577 model =
spawn_model( model_name, origin, angles, n_spawnflags, b_throttle );
1578 model UseAnimTree( #animtree );
1579 model.animtree =
"generic";
1583 #using_animtree( "all_player" );
1597 model =
spawn_model( model_name, origin, angles, n_spawnflags );
1598 model UseAnimTree( #animtree );
1599 model.animtree =
"all_player";
1618 self endon(
"death" );
1620 arc_angle_degrees = AbsAngleClamp360( arc_angle_degrees );
1621 dot = cos( arc_angle_degrees * 0.5 );
1643 self endon(
"death" );
1666 assert(IsPlayer(
self),
"player_looking_at must be called on a player.");
1668 if (!isdefined(dot))
1673 if (!isdefined(do_trace))
1680 delta_vec = VectorNormalize(origin - eye);
1681 view_vec = AnglesToForward(
self GetPlayerAngles());
1683 new_dot = VectorDot( delta_vec, view_vec );
1684 if ( new_dot >= dot )
1688 return BulletTracePassed( origin, eye,
false, ignore_ent );
1699 function wait_endon( waitTime, endOnString, endonString2, endonString3, endonString4 )
1701 self endon ( endOnString );
1702 if ( isdefined( endonString2 ) )
1703 self endon ( endonString2 );
1704 if ( isdefined( endonString3 ) )
1705 self endon ( endonString3 );
1706 if ( isdefined( endonString4 ) )
1707 self endon ( endonString4 );
1715 if( isdefined( endCondition1 ) )
1716 self endon( endCondition1 );
1717 if( isdefined( endCondition2 ) )
1718 self endon( endCondition2 );
1719 if( isdefined( endCondition3 ) )
1720 self endon( endCondition3 );
1722 self waittill( waitCondition );
1734 s_timer = SpawnStruct();
1735 s_timer.n_time_created = GetTime();
1736 s_timer.n_length = n_timer_length;
1743 return t_now -
self.n_time_created;
1753 DEFAULT( n_end_time,
self.n_length );
1759 if ( isdefined(
self.n_length ) )
1762 return ( Max(
self.n_length - n_current_time, 0 ) );
1775 if ( isdefined(
self.n_length ) )
1784 return n_current_time;
1791 if( meansofdeath ==
"MOD_RIFLE_BULLET" || meansofdeath ==
"MOD_PISTOL_BULLET" )
1798 ent endon(
"death" );
1799 self waittill(
"death" );
1800 if( isdefined( ent ) )
1819 e_to_delete endon(
"death" );
1823 if( isdefined( e_to_delete ) )
1825 if( isdefined( str_clientfield ) )
1832 e_to_delete Delete();
1848 Assert( isdefined( e_to_check ),
"Undefined check entity passed to util::wait_till_not_touching" );
1849 Assert( isdefined( e_to_touch ),
"Undefined touch entity passed to util::wait_till_not_touching" );
1851 e_to_check endon(
"death" );
1852 e_to_touch endon(
"death" );
1854 while( e_to_check IsTouching( e_to_touch ) )
1870 foreach ( player
in GetPlayers( str_team ) )
1872 if ( IsAlive( player ) && player IsTouching( ent ) )
1901 if ( !isdefined( level.Console ) )
1903 level.Console = GetDvarString(
"consoleGame" ) ==
"true";
1907 assert( level.Console == ( GetDvarString(
"consoleGame" ) ==
"true" ),
"Level.console got set incorrectly." );
1910 if ( !isdefined( level.Consolexenon ) )
1912 level.xenon = GetDvarString(
"xenonGame" ) ==
"true";
1916 assert( level.xenon == ( GetDvarString(
"xenonGame" ) ==
"true" ),
"Level.xenon got set incorrectly." );
1936 if ( called_from_spawner )
1938 players = GetPlayers();
1940 if (players.size == 2)
1944 else if (players.size == 3)
1948 else if (players.size == 4)
1959 if( isdefined(
self.script_wait_add ) )
1961 self.script_wait +=
self.script_wait_add;
1964 else if( isdefined(
self.script_wait_min ) && isdefined(
self.script_wait_max ) )
1966 wait( RandomFloatrange(
self.script_wait_min,
self.script_wait_max ) * coop_scalar);
1968 if( isdefined(
self.script_wait_add ) )
1970 self.script_wait_min +=
self.script_wait_add;
1971 self.script_wait_max +=
self.script_wait_add;
1980 return isdefined( level.killstreaksenabled ) && level.killstreaksenabled;
1985 return isdefined(
self.flashEndTime ) && gettime() <
self.flashEndTime;
2001 ent.allowdeath =
false;
2002 ent.magic_bullet_shield =
true;
2005 ent notify(
"_stop_magic_bullet_shield_debug");
2009 assert( IsAlive( ent ),
"Tried to do magic_bullet_shield on a dead or undefined guy." );
2013 if ( IsActor( ent ) )
2015 ent BloodImpact(
"hero" );
2018 ent.attackerAccuracy = 0.1;
2024 targetname =
"none";
2025 if ( isdefined( guy.targetname ) )
2027 targetname = guy.targetname;
2030 guy endon(
"stop_magic_bullet_shield" );
2031 guy endon(
"_stop_magic_bullet_shield_debug" );
2032 guy waittill(
"death" );
2033 Assert( !isdefined( guy ),
"Guy died with magic bullet shield on with targetname: " + targetname );
2036 #using_animtree( "all_player" );
2051 playerClone =
Spawn(
"script_model", player.origin );
2052 playerClone.angles = player.angles;
2055 bodyModel = player GetCharacterBodyModel();
2056 playerClone SetModel( bodyModel );
2059 headModel = player GetCharacterHeadModel();
2060 if( IsDefined( headModel ) )
2062 playerClone Attach( headModel,
"" );
2066 helmetModel = player GetCharacterHelmetModel();
2067 if( IsDefined( helmetModel ) )
2069 playerClone Attach( helmetModel,
"" );
2073 bodyRenderOptions = player GetCharacterBodyRenderOptions();
2074 playerClone SetBodyRenderOptions( bodyRenderOptions, bodyRenderOptions, bodyRenderOptions );
2077 playerClone UseAnimTree( #animtree );
2078 if( IsDefined( animname ) )
2080 playerClone AnimScripted(
"clone_anim", playerClone.origin, playerClone.angles, animname );
2083 playerClone.health = 100;
2084 playerClone SetOwner( player );
2085 playerClone.team = player.team;
2086 playerClone Solid();
2104 ent.allowdeath =
true;
2105 ent.magic_bullet_shield = undefined;
2109 if ( IsActor( ent ) )
2111 ent BloodImpact(
"normal" );
2114 ent.attackerAccuracy = 1;
2117 ent notify(
"stop_magic_bullet_shield");
2123 if ( level.roundLimit == 1 )
2131 if ( level.roundLimit > 1 && game[
"roundsplayed" ] == 0 )
2139 if ( level.roundLimit > 1 && game[
"roundsplayed" ] >= ( level.roundLimit - 1 ) )
2147 return game[
"roundswon"][team];
2154 foreach ( team
in level.teams )
2156 if ( team == skip_team )
2159 roundswon += game[
"roundswon"][team];
2166 return game[
"roundsplayed"];
2171 if ( level.roundLimit != 1 && level.roundWinLimit != 1 )
2192 normal = VectorNormalize( end_origin - start_origin );
2193 forward = AnglesToForward( start_angles );
2194 dot = VectorDot( forward, normal );
2201 self endon(
"disconnect" );
2203 DEFAULT(
self._holding_button, [] );
2205 self._holding_button[ which_button ] =
false;
2208 const use_time = 250;
2212 if (
self._holding_button[ which_button ] )
2214 if ( !
self [[ level._button_funcs[ which_button ]]]() )
2216 self._holding_button[ which_button ] =
false;
2221 if (
self [[ level._button_funcs[ which_button ]]]() )
2223 if ( time_started == 0 )
2225 time_started = GetTime();
2228 if ( ( GetTime() - time_started ) > use_time )
2230 self._holding_button[ which_button ] =
true;
2235 if ( time_started != 0 )
2257 if ( !isdefined(
self._use_button_think_threaded ) )
2260 self._use_button_think_threaded =
true;
2277 if ( !isdefined(
self._stance_button_think_threaded ) )
2280 self._stance_button_think_threaded =
true;
2297 if ( !isdefined(
self._ads_button_think_threaded ) )
2300 self._ads_button_think_threaded =
true;
2317 if ( !isdefined(
self._attack_button_think_threaded ) )
2320 self._attack_button_think_threaded =
true;
2337 if ( !isdefined(
self._dpad_right_button_think_threaded ) )
2340 self._dpad_right_button_think_threaded =
true;
2355 while ( !
self UseButtonPressed() )
2385 while ( !
self StanceButtonPressed() )
2415 while ( !
self AttackButtonPressed() )
2430 while ( !
self AdsButtonPressed() )
2445 while ( !
self VehicleMoveUpButtonPressed() )
2453 if ( !isdefined( level._button_funcs ) )
2455 level._button_funcs[
BUTTON_USE ] = &UseButtonPressed;
2456 level._button_funcs[
BUTTON_ADS ] = &AdsButtonPressed;
2459 level._button_funcs[
BUTTON_RIGHT ] = &ActionSlotFourButtonPressed;
2476 if ( isdefined( level.hostMigrationTimer ) )
2481 if( b_frozen || !level.gameEnded )
2483 self FreezeControls( b_frozen );
2490 return ( IsPlayer(
self ) && isdefined (
self.pers[
"isBot"] ) &&
self.pers[
"isBot"] != 0 );
2495 return ( isdefined(
self.hacked ) &&
self.hacked );
2500 last_weapon = undefined;
2502 if( isdefined(
self.lastNonKillstreakWeapon ) &&
self hasWeapon(
self.lastNonKillstreakWeapon) )
2503 last_weapon =
self.lastNonKillstreakWeapon;
2504 else if( isdefined(
self.lastDroppableWeapon ) &&
self hasWeapon(
self.lastDroppableWeapon) )
2505 last_weapon =
self.lastDroppableWeapon;
2512 assert( isdefined( player ) );
2514 if ( !isplayer( player ) )
2517 if ( level.teambased )
2519 if ( player.team ==
self.team )
2526 if ( player ==
self )
2538 while ( level.lastSlowProcessFrame == gettime() )
2541 level.lastSlowProcessFrame = gettime();
2552 return GetMicrosecondsRaw();
2574 if ( !isdefined( start_time ) )
2577 elapsed_time = elapsed_time * 0.001;
2581 elapsed_time = int( elapsed_time );
2583 msg = label +
" elapsed time: " + elapsed_time +
" ms";
2587 #/ // note: this line may be commented out locally, but never submit it commented out
2600 if ( !isdefined( end_time ) )
2601 end_time = GetMicrosecondsRaw();
2603 if ( !isdefined( start_time ) )
2606 elapsed_time = ( end_time - start_time );
2607 if ( elapsed_time < 0 )
2608 elapsed_time += 2147483648;
2610 return elapsed_time;
2615 assert( isdefined(
self ) );
2616 assert( IsPlayer(
self ) );
2618 return ( !isdefined(
self.viewlockedentity ) );
2629 if (
self.classname ==
"grenade" )
2631 self waittill(
"stationary");
2635 prevorigin =
self.origin;
2639 if (
self.origin == prevorigin )
2641 prevorigin =
self.origin;
2652 return "stationary";
2662 if ( SessionModeIsCampaignGame() )
2666 else if ( SessionModeIsZombiesGame() )
2678 if( weapon == level.weaponNone )
2683 if ( !weapon.isValid )
2688 if ( !isdefined ( level.weaponClassArray ) )
2690 level.weaponClassArray = [];
2693 if ( isdefined( level.weaponClassArray[weapon] ) )
2695 return level.weaponClassArray[weapon];
2698 baseWeaponParam = [[ level.get_base_weapon_param ]]( weapon );
2699 baseWeaponIndex = GetBaseWeaponItemIndex( baseWeaponParam );
2701 level.weaponClassArray[weapon] = weaponClass;
2707 return( isdefined(
self.usingRemote ) );
2712 assert( isdefined(
self ) );
2713 assert( isdefined( time ) );
2714 assert( time >= 0.05 );
2721 self endon (
"death" );
2729 if ( !isdefined( time ) )
2743 if ( !isdefined( time ) )
2748 start_time_ms = GetTime();
2750 elapsed_time = (GetTime() - start_time_ms) * 0.001;
2751 remaining_time = time - elapsed_time;
2753 if ( remaining_time > 0 )
2755 wait ( remaining_time );
2763 assert( isdefined(
self ) );
2771 if ( !isdefined( duration ) )
2776 level thread
drawcylinder_think( pos, rad, height, duration, stop_notify, color, alpha );
2783 if ( isdefined( stop_notify ) )
2785 level endon( stop_notify );
2788 stop_time = GetTime() + ( seconds * 1000 );
2793 if ( !isdefined( color ) )
2794 color = ( 1, 1, 1 );
2796 if ( !isdefined( alpha ) )
2801 if ( seconds > 0 && stop_time <= GetTime() )
2806 for( r = 0; r < 20; r++ )
2808 theta = r / 20 * 360;
2809 theta2 = ( r + 1 ) / 20 * 360;
2811 line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ), color, alpha );
2812 line( pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ), color, alpha );
2813 line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ), color, alpha );
2826 if (isdefined(teamName) &&
2827 isdefined( level.alivePlayers ) &&
2828 isdefined( level.alivePlayers[ teamName ] ) )
2830 for ( i= 0; i < level.alivePlayers[ teamName ].size; i++ )
2832 teamPlayers_s.a[ teamPlayers_s.a.size ]= level.alivePlayers[ teamName ][ i ];
2836 return teamPlayers_s;
2843 if (isdefined(teamNameToIgnore) &&isdefined( level.alivePlayers ) )
2845 foreach( team
in level.teams )
2847 if ( team == teamNameToIgnore )
2852 foreach ( player
in level.alivePlayers[ team ] )
2854 teamPlayers_s.a[ teamPlayers_s.a.size ] = player;
2859 return teamPlayers_s;
2869 if ( isdefined( level.alivePlayers ) )
2871 keys = GetArrayKeys( level.alivePlayers );
2873 for ( i = 0; i < keys.size; i++ )
2877 for ( j = 0; j < level.alivePlayers[ team ].size; j++ )
2879 allPlayers_s.a[ allPlayers_s.a.size ] = level.alivePlayers[ team ][ j ];
2884 return allPlayers_s;
2906 players = GetPlayers();
2908 for ( index = 0; index < players.size; index++ )
2910 if ( players[index] IsHost() )
2911 return players[index];
2918 players = GetPlayers();
2920 for ( index = 0; index < players.size; index++ )
2922 if ( players[index] IsHostForBots() )
2923 return players[index];
2951 maxdists2rd = undefined;
2952 if ( isdefined( maxdist ) )
2954 maxdists2rd = maxdist * maxdist;
2960 for ( i = 0; i <
array.size; i++ )
2962 if ( !isdefined(
array[ i ] ) )
2967 if ( IsInArray( excluders,
array[ i ] ) )
2972 if ( IsVec(
array[i] ) )
2974 length = DistanceSquared( org,
array[ i ] );
2978 length = DistanceSquared( org,
array[ i ].origin );
2981 if ( isdefined( maxdists2rd ) && maxdists2rd < length )
2986 dist[ dist.size ] = length;
2987 index[ index.size ] = i;
2993 for ( i = 0; i < dist.size - 1; i++ )
2995 if ( dist[ i ] <= dist[ i + 1 ] )
3002 dist[ i ] = dist[ i + 1 ];
3003 dist[ i + 1 ] = temp;
3005 index[ i ] = index[ i + 1 ];
3006 index[ i + 1 ] = temp;
3016 if ( max > dist.size )
3021 for ( i = 0; i < max; i++ )
3023 newArray[ i ] =
array[ index[ i ] ];
3039 if ( isdefined( n_state ) )
3041 self.lighting_state = n_state;
3045 self.lighting_state = level.lighting_state;
3048 if ( isdefined(
self.lighting_state ) )
3050 if (
self == level )
3052 if ( isdefined( level.activePlayers ) )
3054 foreach( player
in level.activePlayers )
3060 else if ( IsPlayer(
self ) )
3062 self SetLightingState(
self.lighting_state );
3066 AssertMsg(
"Can only set lighting state on level or a player." );
3081 if ( isdefined( f_distance ) )
3083 self.sun_shadow_split_distance = f_distance;
3087 self.sun_shadow_split_distance = level.sun_shadow_split_distance;
3090 if ( isdefined(
self.sun_shadow_split_distance ) )
3092 if (
self == level )
3094 if ( isdefined( level.activePlayers ) )
3096 foreach( player
in level.activePlayers )
3102 else if ( IsPlayer(
self ) )
3104 self SetSunShadowSplitDistance(
self.sun_shadow_split_distance );
3108 AssertMsg(
"Can only set_sun_shadow_split_distance on level or a player." );
3134 self endon(
"death" );
3136 self notify(
"__auto_delete__" );
3137 self endon(
"__auto_delete__" );
3141 if ( isdefined( level.heroes ) && IsInArray( level.heroes,
self ) )
3174 while ( isdefined(
self.birthtime ) && ( ( GetTime() -
self.birthtime ) / 1000 ) < n_min_time_alive );
3178 foreach ( player
in level.players )
3180 if ( n_dist_horizontal && ( Distance2DSquared(
self.origin, player.origin ) < n_dist_horizontal ) )
3185 if ( n_dist_vertical && ( abs(
self.origin[2] - player.origin[2] ) < n_dist_vertical ) )
3190 v_eye = player GetEye();
3196 v_facing = AnglesToForward( player GetPlayerAngles() );
3198 v_to_ent = VectorNormalize(
self.origin - v_eye );
3199 n_dot = VectorDot( v_facing, v_to_ent );
3201 if ( n_dot < n_dot_check )
3215 if ( !
self SightConeTrace( v_eye, player ) )
3223 if ( n_tests_passed == level.players.size )
3226 if ( n_test_count < n_tests_to_do )
3231 self notify(
"_disable_reinforcement" );
3261 function query_ents( &
a_kvps_match, b_match_all =
true, &a_kvps_ingnore, b_ignore_spawners =
false, b_match_substrings =
false )
3265 if ( b_match_substrings )
3267 a_all_ents = GetEntArray();
3272 a_ents = _query_ents_by_substring_helper( a_all_ents, v, k, b_ignore_spawners );
3279 else if ( b_match_all )
3289 if ( isdefined( a_kvps_ingnore ) )
3291 foreach ( k, v
in a_kvps_ingnore )
3293 a_ents = _query_ents_by_substring_helper( a_all_ents, v, k, b_ignore_spawners );
3303 a_ents = GetEntArray( v, k );
3310 else if ( b_match_all )
3320 if ( isdefined( a_kvps_ingnore ) )
3322 foreach ( k, v
in a_kvps_ingnore )
3324 a_ents = GetEntArray( v, k );
3333 function _query_ents_by_substring_helper( &
a_ents, str_value, str_key =
"targetname", b_ignore_spawners =
false )
3339 if ( b_ignore_spawners && IsSpawner( ent ) )
3348 if ( IsString( ent.targetname ) && IsSubStr( ent.targetname, str_value ) )
3354 case "script_noteworthy":
3356 if ( IsString( ent.script_noteworthy ) && IsSubStr( ent.script_noteworthy, str_value ) )
3364 if ( IsString( ent.classname ) && IsSubStr( ent.classname, str_value ) )
3372 if ( IsString( ent.vehicletype ) && IsSubStr( ent.vehicletype, str_value ) )
3378 case "script_string":
3380 if ( IsString( ent.script_string ) && IsSubStr( ent.script_string, str_value ) )
3386 case "script_color_axis":
3388 if ( IsString( ent.script_color_axis ) && IsSubStr( ent.script_color_axis, str_value ) )
3394 case "script_color_allies":
3396 if ( IsString( ent.script_color_axis ) && IsSubStr( ent.script_color_axis, str_value ) )
3402 default: Assert(
"Unsupported key: '" + str_key +
"' use in util::query_ents()." );
3411 split = StrTok( weapon_name,
"+" );
3412 switch ( split.size )
3416 weapon = GetWeapon( split[0] );
3419 weapon = GetWeapon( split[0], split[1] );
3422 weapon = GetWeapon( split[0], split[1], split[2] );
3425 weapon = GetWeapon( split[0], split[1], split[2], split[3] );
3428 weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4] );
3431 weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4], split[5] );
3434 weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4], split[5], split[6] );
3437 weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4], split[5], split[6], split[7] );
3440 weapon = GetWeapon( split[0], split[1], split[2], split[3], split[4], split[5], split[6], split[7], split[8] );
3450 gender =
self GetPlayerGenderType( CurrentSessionMode() );
3453 if( isdefined( gender ) && gender ==
"female" )
3464 if ( isdefined( reachableBy_ent ) )
3466 queryResult = PositionQuery_Source_Navigation( origin, minSearchRadius, maxSearchRadius, halfHeight, innerSpacing, reachableBy_Ent );
3470 queryResult = PositionQuery_Source_Navigation( origin, minSearchRadius, maxSearchRadius, halfHeight, innerSpacing );
3474 foreach( pointStruct
in queryResult.data )
3476 ARRAY_ADD( pointarray, pointStruct.origin );
3485 foreach( team
in level.teams )
3487 count += level.playerCount[team];
3494 return IS_TRUE( level.rankEnabled );
3499 if ( level.roundLimit == 1 )
3507 if ( level.roundLimit > 1 && game[
"roundsplayed" ] == 0 )
3515 if ( level.roundLimit > 1 && game[
"roundsplayed" ] >= ( level.roundLimit - 1 ) )
3523 if ( level.forcedEnd )
3526 if ( isdefined( level.shouldPlayOvertimeRound ) )
3528 if ( [[level.shouldPlayOvertimeRound]]() )
3530 level.nextRoundIsOvertime =
true;
3533 else if ( isdefined( game[
"overtime_round"] ) )
3549 if( level.roundLimit <= 0 )
3557 foreach( team
in level.teams )
3568 tie_wins = game[
"roundswon"][
"tie"];
3570 foreach( team
in level.teams )
3572 if (
getRoundsWon(team) + tie_wins >= level.roundWinLimit )
3582 winning_team = undefined;
3584 foreach( team
in level.teams )
3588 if ( !isdefined( winning_team ) )
3591 winning_team = team;
3595 if ( wins == max_wins )
3597 winning_team =
"tie";
3599 else if ( wins > max_wins )
3602 winning_team = team;
3606 return winning_team;
3611 if( !isdefined(level.roundWinLimit) || level.roundWinLimit <= 0 )
3640 foreach( team
in level.teams )
3642 if ( game[
"teamScores"][team] >= level.scoreLimit )
3652 if ( level.scoreRoundWinBased )
3655 if( level.scoreLimit <= 0 )
3658 if ( level.teamBased )
3665 for ( i = 0; i < level.players.size; i++ )
3667 player = level.players[i];
3668 if ( isdefined( player.pointstowin ) && ( player.pointstowin >= level.scorelimit ) )
3677 return (level.roundScoreLimit * (game[
"roundsplayed" ] + 1));
3684 foreach( team
in level.teams )
3686 if ( game[
"teamScores"][team] >= round_score_limit )
3696 if ( level.roundScoreLimit <= 0 )
3699 if ( level.teamBased )
3708 for ( i = 0; i < level.players.size; i++ )
3710 player = level.players[i];
3711 if ( isdefined( player.pointstowin ) && ( player.pointstowin >= roundScoreLimit ) )
3720 return game[
"roundswon"][team];
3727 foreach ( team
in level.teams )
3729 if ( team == skip_team )
3732 roundswon += game[
"roundswon"][team];
3739 return game[
"roundsplayed"];
3744 if ( level.roundLimit != 1 && level.roundWinLimit != 1 )
3753 return "leaguematch";
3755 return "publicmatch";
3774 function ground_position( v_start, n_max_dist = 5000, n_ground_offset = 0, e_ignore, b_ignore_water =
false, b_ignore_glass =
false )
3776 const N_TRACE_FUDGE = 5;
3778 v_trace_start = v_start + ( 0, 0, N_TRACE_FUDGE );
3779 v_trace_end = v_trace_start + ( 0, 0, ( n_max_dist + N_TRACE_FUDGE ) * -1 );
3781 a_trace = GroundTrace( v_trace_start, v_trace_end,
false, e_ignore, b_ignore_water, b_ignore_glass );
3783 if ( a_trace[
"surfacetype" ] !=
"none" )
3785 return a_trace[
"position" ] + ( 0, 0, n_ground_offset );
3803 wait f_delay_seconds;
3805 if ( isDefined(
self ) )
3807 self notify( str_notify );
3820 assert( isEntity(
self ) );
3822 wait f_delay_seconds;
3824 if ( isDefined(
self ) && isEntity(
self ) )
3853 function do_chyron_text( str_1_full , str_1_short , str_2_full , str_2_short , str_3_full , str_3_short , str_4_full , str_4_short , str_5_full =
"", str_5_short =
"" , n_duration )
3855 level.chyron_text_active =
true;
3858 if ( !isdefined( n_duration ) )
3863 foreach ( player
in level.players )
3865 player thread
player_set_chyron_menu( str_1_full, str_1_short, str_2_full, str_2_short, str_3_full, str_3_short, str_4_full, str_4_short, str_5_full, str_5_short, n_duration );
3868 level waittill(
"chyron_menu_closed" );
3870 level.chyron_text_active = undefined;
3874 function player_set_chyron_menu( str_1_full , str_1_short , str_2_full , str_2_short , str_3_full , str_3_short , str_4_full , str_4_short , str_5_full =
"", str_5_short =
"" , n_duration )
3876 self endon(
"disconnect" );
3878 Assert( isdefined( n_duration ),
"Must set a duration for displaying the chyron menu text." );
3880 menuHandle =
self OpenLUIMenu(
"CPChyron" );
3882 self SetLUIMenuData( menuHandle,
"line1full", str_1_full );
3883 self SetLUIMenuData( menuHandle,
"line1short", str_1_short );
3884 self SetLUIMenuData( menuHandle,
"line2full", str_2_full );
3885 self SetLUIMenuData( menuHandle,
"line2short", str_2_short );
3887 mapname = GetDvarString(
"mapname" );
3889 hideLine3Full =
false;
3891 if( mapname ==
"cp_mi_eth_prologue" &&
IS_BONUSZM )
3892 hideLine3Full =
true;
3894 if( !hideLine3Full )
3896 self SetLUIMenuData( menuHandle,
"line3full", str_3_full );
3897 self SetLUIMenuData( menuHandle,
"line3short", str_3_short );
3902 self SetLUIMenuData( menuHandle,
"line4full", str_4_full );
3903 self SetLUIMenuData( menuHandle,
"line4short", str_4_short );
3904 self SetLUIMenuData( menuHandle,
"line5full", str_5_full );
3905 self SetLUIMenuData( menuHandle,
"line5short", str_5_short );
3909 self notify(
"chyron_menu_open" );
3910 level notify(
"chyron_menu_open" );
3914 self waittill(
"menuresponse", menu, response );
3916 while ( menu !=
"CPChyron" || response !=
"closed" );
3918 self notify(
"chyron_menu_closed" );
3919 level notify(
"chyron_menu_closed" );
3922 self CloseLUIMenu( menuHandle );
3928 switch( str_next_map )
3930 case "cp_mi_sing_blackstation":
3931 case "cp_mi_sing_biodomes":
3932 case "cp_mi_sing_sgen":
3933 return "cp_sh_singapore";
3934 case "cp_mi_cairo_infection":
3935 case "cp_mi_cairo_aquifer":
3936 case "cp_mi_cairo_lotus":
3937 return "cp_sh_cairo";
3939 return "cp_sh_mobile";
3945 mapname = toLower( GetDvarString(
"mapname" ) );
3947 if(mapname ==
"cp_sh_cairo" ||
3948 mapname ==
"cp_sh_mobile" ||
3949 mapname ==
"cp_sh_singapore")
3959 mapname = toLower( GetDvarString(
"mapname" ) );
3963 case "cp_mi_cairo_aquifer":
3964 case "cp_mi_cairo_infection":
3965 case "cp_mi_cairo_lotus":
3966 case "cp_mi_cairo_ramses":
3967 case "cp_mi_eth_prologue":
3968 case "cp_mi_sing_biodomes":
3969 case "cp_mi_sing_blackstation":
3970 case "cp_mi_sing_chinatown":
3971 case "cp_mi_sing_sgen":
3972 case "cp_mi_sing_vengeance":
3973 case "cp_mi_zurich_coalescene":
3974 case "cp_mi_zurich_newworld":
3987 foreach( e_player
in level.activeplayers )
3991 level notify(
"disable_cybercom", e_player,
true );
3999 level notify(
"disable_cybercom",
self,
true );
4008 foreach( e_player
in level.activeplayers )
4012 level notify(
"enable_cybercom", e_player );
4020 level notify(
"enable_cybercom", e_player );
4029 if ( !
IS_TRUE(
self.fullscreen_black_active ) )
4035 if ( !
IS_TRUE(
self.dont_show_hud ) )
4037 self SetClientUIVisibilityFlag(
"hud_visible",
true );
4045 self SetClientUIVisibilityFlag(
"hud_visible",
false );
4060 return ( IsArray( any_var ) ? ArrayCopy( any_var ) : any_var );
4065 itemIndex = GetItemIndexFromRef( ref );
4066 return ( ( itemIndex < 0 || itemIndex >= 256 ) ?
false :
self IsItemPurchased( itemIndex ) );
4076 if( IsPlayer(
self ) )
4078 return self hasPerk( single_perk_ref ) &&
self is_item_purchased( stats_table_ref );
4117 return (
self has_purchased_perk_equipped_with_specific_stat(
"specialty_nottargetedbyaitank",
"specialty_nottargetedbyaitank|specialty_nottargetedbyraps|specialty_nottargetedbysentry|specialty_nottargetedbyrobot|specialty_immunenvthermal" ) );
4122 return (
self has_purchased_perk_equipped_with_specific_stat(
"specialty_immunecounteruav",
"specialty_immunecounteruav|specialty_immuneemp|specialty_immunetriggerc4|specialty_immunetriggershock|specialty_immunetriggerbetty|specialty_sixthsensejammer|specialty_trackerjammer|specialty_immunesmoke" ) );
4166 if ( StrEndsWith( str,
"_lh" ) )
4168 return GetSubStr( str, 0, str.size - 3 );
4176 self endon(
"disconnect");
4177 self.movementTracking.wallRunning = SpawnStruct();
4178 self.movementTracking.wallRunning.distance = 0;
4179 self.movementTracking.wallRunning.count = 0;
4180 self.movementTracking.wallRunning.time = 0;
4184 self waittill(
"wallrun_begin" );
4186 startPos =
self.origin;
4188 self.movementTracking.wallRunning.count++;
4190 self waittill(
"wallrun_end" );
4192 self.movementTracking.wallRunning.distance += Distance( startPos,
self.origin );
4193 self.movementTracking.wallRunning.time += GetTime() -
startTime;
4199 self endon(
"disconnect");
4200 self.movementTracking.sprinting = SpawnStruct();
4201 self.movementTracking.sprinting.distance = 0;
4202 self.movementTracking.sprinting.count = 0;
4203 self.movementTracking.sprinting.time = 0;
4207 self waittill(
"sprint_begin" );
4209 startPos =
self.origin;
4211 self.movementTracking.sprinting.count++;
4213 self waittill(
"sprint_end" );
4215 self.movementTracking.sprinting.distance += Distance( startPos,
self.origin );
4216 self.movementTracking.sprinting.time += GetTime() -
startTime;
4222 self endon(
"disconnect");
4223 self.movementTracking.doublejump = SpawnStruct();
4224 self.movementTracking.doublejump.distance = 0;
4225 self.movementTracking.doublejump.count = 0;
4226 self.movementTracking.doublejump.time = 0;
4230 self waittill(
"doublejump_begin" );
4232 startPos =
self.origin;
4234 self.movementTracking.doublejump.count++;
4236 self waittill(
"doublejump_end" );
4238 self.movementTracking.doublejump.distance += Distance( startPos,
self.origin );
4239 self.movementTracking.doublejump.time += GetTime() -
startTime;
4245 minimapOrigins = getEntArray(
"minimap_corner",
"targetname" );
4246 if( miniMapOrigins.size )
4256 minimapOrigins = getEntArray(
"minimap_corner",
"targetname" );
4257 if( miniMapOrigins.size )
4259 x = abs( miniMapOrigins[0].origin[0] - miniMapOrigins[1].origin[0] );
4260 y = abs( miniMapOrigins[0].origin[1] - miniMapOrigins[1].origin[1] );