1 #using scripts\shared\flagsys_shared;
2 #using scripts\shared\trigger_shared;
3 #using scripts\shared\util_shared;
5 #insert scripts\shared\shared.gsh;
7 #define MAX_CLIENT_OBJECTIVE_IDS 32
40 if(!isdefined(level.localPlayers))
42 while(!isdefined(level.localPlayers))
48 while( level.localPlayers.size <= 0 )
53 while (localClient < level.localPlayers.size)
62 while(!clienthassnapshot(client))
71 value = GetDvarString( str_dvar );
72 return ( value !=
"" ? Float( value ) : default_val );
77 value = GetDvarString( str_dvar );
78 return ( value !=
"" ? Int( value ) : default_val );
92 function spawn_model( n_client, str_model, origin = ( 0, 0, 0 ), angles = ( 0, 0, 0 ) )
94 model =
Spawn( n_client, origin,
"script_model" );
95 model SetModel( str_model );
96 model.angles = angles;
106 if ( msg !=
"entityshutdown" )
108 self endon (
"entityshutdown");
112 self waittill( msg );
113 ent notify(
"returned", msg );
125 s_tracker = SpawnStruct();
126 s_tracker._wait_count = 0;
128 for ( i = 0; i < vararg.size; i++ )
133 if ( s_tracker._wait_count > 0 )
135 s_tracker waittill(
"waitlogic_finished" );
151 for ( i = 0; i < vararg.size; i++ )
163 s_tracker = SpawnStruct();
164 s_tracker._wait_count = 0;
166 for ( i = 0; i <
a_ents.size; i++ )
170 if ( isdefined( ent ) )
172 ent thread
_waitlogic( s_tracker, a_notifies[ i ] );
176 if ( s_tracker._wait_count > 0 )
178 s_tracker waittill(
"waitlogic_finished" );
184 s_tracker._wait_count++;
189 s_tracker._wait_count--;
190 if ( s_tracker._wait_count == 0 )
192 s_tracker notify(
"waitlogic_finished" );
214 if ((!isdefined (string1) || string1 !=
"entityshutdown") &&
215 (!isdefined (string2) || string2 !=
"entityshutdown") &&
216 (!isdefined (string3) || string3 !=
"entityshutdown") &&
217 (!isdefined (string4) || string4 !=
"entityshutdown") &&
218 (!isdefined (string5) || string5 !=
"entityshutdown") &&
219 (!isdefined (string6) || string6 !=
"entityshutdown") &&
220 (!isdefined (string7) || string7 !=
"entityshutdown"))
221 self endon (
"entityshutdown");
225 if (isdefined (string1))
228 if (isdefined (string2))
231 if (isdefined (string3))
234 if (isdefined (string4))
237 if (isdefined (string5))
240 if (isdefined (string6))
243 if (isdefined (string7))
246 ent waittill (
"returned", msg);
272 s_common = SpawnStruct();
279 if ( StrIsNumber( vararg[ 0 ] ) )
281 n_timeout = vararg[ 0 ];
291 if ( IsArray( vararg[ n_arg_index ] ) )
293 a_params = vararg[ n_arg_index ];
300 n_start_index = n_arg_index;
306 for( i=n_start_index; i<a_params.size; i++ )
308 if ( !IsString( a_params[i] ) )
311 e_current = a_params[i];
316 if ( isdefined( e_current ) )
323 s_common waittill (
"returned", str_notify );
324 s_common notify (
"die" );
341 if ( IsInArray( a_notifies,
"entityshutdown" ) )
343 self endon(
"entityshutdown");
346 s_tracker = SpawnStruct();
348 foreach ( str_notify
in a_notifies )
350 if ( isdefined( str_notify ) )
356 s_tracker waittill(
"returned", msg );
357 s_tracker notify(
"die" );
375 function waittill_any( str_notify1, str_notify2, str_notify3, str_notify4, str_notify5 )
377 Assert( isdefined( str_notify1 ) );
394 assert( isdefined( a_notifies[0] ),
395 "At least the first element has to be defined for waittill_any_array." );
397 for ( i = 1; i < a_notifies.size; i++ )
399 if ( isdefined( a_notifies[i] ) )
401 self endon( a_notifies[i] );
405 self waittill( a_notifies[0] );
425 if ( ( !isdefined( string1 ) || string1 !=
"entityshutdown" ) &&
426 ( !isdefined( string2 ) || string2 !=
"entityshutdown" ) &&
427 ( !isdefined( string3 ) || string3 !=
"entityshutdown" ) &&
428 ( !isdefined( string4 ) || string4 !=
"entityshutdown" ) &&
429 ( !isdefined( string5 ) || string5 !=
"entityshutdown" ) )
430 self endon(
"entityshutdown" );
434 if ( isdefined( string1 ) )
437 if ( isdefined( string2 ) )
440 if ( isdefined( string3 ) )
443 if ( isdefined( string4 ) )
446 if ( isdefined( string5 ) )
451 ent waittill(
"returned", msg );
461 self notify(
"returned",
"timeout" );
496 function waittill_any_ents( ent1, string1, ent2, string2, ent3, string3, ent4, string4, ent5, string5, ent6, string6,ent7, string7 )
498 assert( isdefined( ent1 ) );
499 assert( isdefined( string1 ) );
501 if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) )
502 ent2 endon( string2 );
504 if ( ( isdefined( ent3 ) ) && ( isdefined( string3 ) ) )
505 ent3 endon( string3 );
507 if ( ( isdefined( ent4 ) ) && ( isdefined( string4 ) ) )
508 ent4 endon( string4 );
510 if ( ( isdefined( ent5 ) ) && ( isdefined( string5 ) ) )
511 ent5 endon( string5 );
513 if ( ( isdefined( ent6 ) ) && ( isdefined( string6 ) ) )
514 ent6 endon( string6 );
516 if ( ( isdefined( ent7 ) ) && ( isdefined( string7 ) ) )
517 ent7 endon( string7 );
519 ent1 waittill( string1 );
537 assert( isdefined( ent1 ) );
538 assert( isdefined( string1 ) );
540 if ( ( isdefined( ent2 ) ) && ( isdefined( string2 ) ) )
541 ent2 endon( string2 );
543 ent1 waittill( string1 );
563 function single_func( entity, func, arg1, arg2, arg3, arg4, arg5, arg6 )
565 if ( !isdefined( entity ) )
570 if ( isdefined( arg6 ) )
572 return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
574 else if ( isdefined( arg5 ) )
576 return entity [[ func ]]( arg1, arg2, arg3, arg4, arg5 );
578 else if ( isdefined( arg4 ) )
580 return entity [[ func ]]( arg1, arg2, arg3, arg4 );
582 else if ( isdefined( arg3 ) )
584 return entity [[ func ]]( arg1, arg2, arg3 );
586 else if ( isdefined( arg2 ) )
588 return entity [[ func ]]( arg1, arg2 );
590 else if ( isdefined( arg1 ) )
592 return entity [[ func ]]( arg1 );
596 return entity [[ func ]]();
616 function new_func( func, arg1, arg2, arg3, arg4, arg5, arg6 )
618 s_func = SpawnStruct();
641 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 );
662 Assert( isdefined( entities ),
"Undefined entity array passed to util::array_ent_thread" );
663 Assert( isdefined( func ),
"Undefined function passed to util::array_ent_thread" );
665 if ( IsArray( entities ) )
669 keys = GetArrayKeys( entities );
670 for ( i = 0; i < keys.size; i++ )
672 single_thread(
self, func, entities[keys[i]], arg1, arg2, arg3, arg4, arg5 );
678 single_thread(
self, func, entities, arg1, arg2, arg3, arg4, arg5 );
701 Assert( isdefined( entity ),
"Undefined entity passed to util::single_thread()" );
703 if ( isdefined( arg6 ) )
705 entity thread [[ func ]]( arg1, arg2, arg3, arg4, arg5, arg6 );
707 else if ( isdefined( arg5 ) )
709 entity thread [[ func ]](arg1, arg2, arg3, arg4, arg5);
711 else if ( isdefined( arg4 ) )
713 entity thread [[ func ]]( arg1, arg2, arg3, arg4 );
715 else if ( isdefined( arg3 ) )
717 entity thread [[ func ]]( arg1, arg2, arg3 );
719 else if ( isdefined( arg2 ) )
721 entity thread [[ func ]]( arg1, arg2 );
723 else if ( isdefined( arg1 ) )
725 entity thread [[ func ]]( arg1 );
729 entity thread [[ func ]]();
743 single_thread(level, func, param1, param2, param3, param4, param5);
762 function timeout( n_time, func, arg1, arg2, arg3, arg4, arg5, arg6 )
764 self endon(
"entityshutdown" );
767 single_func(
self, func, arg1, arg2, arg3, arg4, arg5, arg6 );
784 function delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 )
786 self thread
_delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 );
789 function _delay( time_or_notify, str_endon, func, arg1, arg2, arg3, arg4, arg5, arg6 )
791 self endon(
"entityshutdown" );
793 if ( isdefined( str_endon ) )
795 self endon( str_endon );
798 if ( IsString( time_or_notify ) )
800 self waittill( time_or_notify );
807 single_func(
self, func, arg1, arg2, arg3, arg4, arg5, arg6 );
824 self thread
_delay_notify( time_or_notify, str_notify, str_endon );
829 self endon(
"entityshutdown" );
831 if ( isdefined( str_endon ) )
833 self endon( str_endon );
836 if ( IsString( time_or_notify ) )
838 self waittill( time_or_notify );
845 self notify( str_notify );
852 s_timer = SpawnStruct();
853 s_timer.n_time_created = GetTime();
854 s_timer.n_length = n_timer_length;
861 return t_now -
self.n_time_created;
871 DEFAULT( n_end_time,
self.n_length );
877 if ( isdefined(
self.n_length ) )
880 return ( Max(
self.n_length - n_current_time, 0 ) );
893 if ( isdefined(
self.n_length ) )
902 return n_current_time;
905 function add_remove_list( &
a, on_off )
910 if ( !IsInArray(
a,
self ) )
912 ArrayInsert(
a,
self,
a.size);
917 ArrayRemoveValue(
a,
self,
false );
921 function clean_deleted( &
array )
927 foreach( key, val
in array )
931 ArrayRemoveIndex(
array,key,
false);
950 if( SessionModeIsCampaignGame() )
954 linked_ent =
self GetLinkedEnt();
955 if (isdefined(linked_ent) && (GetDvarInt(
"cg_cameraUseTagCamera") > 0))
957 camera = linked_ent GetTagOrigin(
"tag_camera");
958 if (isdefined(camera))
972 arms =
spawn(
self GetLocalClientNumber(),
self.origin + ( 0, 0, -1000 ),
"script_model");
974 if (isdefined(level.player_viewmodel))
977 arms SetModel(level.player_viewmodel);
982 arms SetModel(
"c_usa_cia_masonjr_viewhands");
988 function lerp_dvar( str_dvar, n_start_val, n_end_val, n_lerp_time, b_saved_dvar, b_client_dvar, n_client = 0 )
990 DEFAULT( n_start_val, GetDvarFloat( str_dvar ) );
997 n_curr_val = LerpFloat( n_start_val, n_end_val, n_time_delta / n_lerp_time );
1001 SetSavedDvar( str_dvar, n_curr_val );
1009 SetDvar( str_dvar, n_curr_val );
1012 while ( n_time_delta < n_lerp_time );
1054 Assert( isdefined( e_to_check ),
"Undefined check entity passed to util::wait_till_not_touching" );
1055 Assert( isdefined( e_to_touch ),
"Undefined touch entity passed to util::wait_till_not_touching" );
1057 e_to_check endon(
"entityshutdown" );
1058 e_to_touch endon(
"entityshutdown" );
1060 while( e_to_check IsTouching( e_to_touch ) )
1069 println(
"^c * ERROR * ", message );
1076 if(!isdefined(level._systemStates))
1078 level._systemStates = [];
1081 if(level._systemStates.size >= 32)
1083 /#
error(
"Max num client systems exceeded.");#/
1087 if(isdefined(level._systemStates[sSysName]))
1089 /#
error(
"Attempt to re-register client system : " + sSysName);#/
1094 level._systemStates[sSysName] = spawnstruct();
1095 level._systemStates[sSysName].callback = cbFunc;
1101 level.light_entity =
self;
1119 while( isdefined(
self ) && !(
self hasdobj(localClientNum)) )
1125 function server_wait( localClientNum, seconds, waitBetweenChecks, level_endon )
1127 if ( isdefined( level_endon ) )
1129 level endon( level_endon );
1132 if ( level.isDemoPlaying && seconds != 0 )
1134 if ( !isdefined( waitBetweenChecks ) )
1136 waitBetweenChecks = 0.2;
1139 waitCompletedSuccessfully =
false;
1144 while( level.serverTime < endTime && level.serverTime >= lastTime )
1146 lastTime = level.serverTime;
1147 wait( waitBetweenChecks );
1150 if ( lastTime < level.serverTime )
1152 waitCompletedSuccessfully =
true;
1157 waitrealtime( seconds );
1158 waitCompletedSuccessfully =
true;
1161 return waitCompletedSuccessfully;
1166 player = GetNonPredictedLocalPlayer( localClientIndex );
1169 if (
IS_TRUE( predicted ) || isdefined( player ) && isdefined( player.team ) && ( player.team ==
"spectator" ))
1171 player = GetLocalPlayer( localClientIndex );
1174 if ( isdefined( player ) && isdefined( player.team ))
1179 if ( team ==
"free" )
1181 owner =
self GetOwner( localClientIndex );
1183 if ( isdefined( owner ) && owner == player )
1188 else if (
self.team == team )
1200 player = GetNonPredictedLocalPlayer( localClientIndex );
1203 if (
IS_TRUE( predicted ) || isdefined( player ) && isdefined( player.team ) && ( player.team ==
"spectator" ))
1205 player = GetLocalPlayer( localClientIndex );
1208 if ( isdefined( player ) && isdefined( player.team ))
1210 if ( player.team == team )
1222 assert( isdefined( player ) );
1224 if( !player IsPlayer() )
1227 if( player.team !=
"free" )
1229 if ( player.team ==
self.team )
1236 if ( player ==
self )
1246 if (
self IsDriving( localClientNum ) )
1251 if (
self IsLocalPlayerWeaponViewOnlyLinked( ) )
1261 level.IsDemoPlaying = IsDemoPlaying();
1262 level.localPlayers = [];
1263 level.numGametypeReservedObjectives = [];
1264 level.releasedObjectives = [];
1266 maxLocalClients = GetMaxLocalClients();
1267 for( localClientNum = 0; localClientNum < maxLocalClients; localClientNum++ )
1269 level.releasedObjectives[localClientNum] = [];
1270 level.numGametypeReservedObjectives[localClientNum] = 0;
1274 util::WaitForClient( 0 );
1275 level.localPlayers = GetLocalPlayers();
1293 normal = VectorNormalize( end_origin - start_origin );
1294 forward = AnglesToForward( start_angles );
1295 dot = VectorDot( forward, normal );
1302 return IsMatureContentEnabled();
1307 if( !(IsMatureContentEnabled() && IsShowGibsEnabled() ))
1320 if(!isdefined(level._systemStates))
1322 level._systemStates = [];
1325 if(level._systemStates.size >= 32)
1327 /#
error(
"Max num client systems exceeded.");#/
1331 if(isdefined(level._systemStates[sSysName]))
1333 /#
error(
"Attempt to re-register client system : " + sSysName);#/
1338 level._systemStates[sSysName] = spawnstruct();
1339 level._systemStates[sSysName].callback = cbFunc;
1345 if ( SessionModeIsCampaignGame() )
1349 else if ( SessionModeIsZombiesGame() )
1371 if(!isdefined(ent._triggers))
1376 ent._triggers[trig getentitynumber()] = 1;
1381 if(!isdefined(ent._triggers))
1384 if(!isdefined(ent._triggers[trig getentitynumber()]))
1387 ent._triggers[trig getentitynumber()] = 0;
1392 if(!isdefined(
self._triggers))
1395 if(!isdefined(
self._triggers[trig getentitynumber()]))
1398 if(!
self._triggers[trig getentitynumber()])
1406 ent endon(
"entityshutdown");
1415 if(isdefined(on_enter_payload))
1417 [[on_enter_payload]](ent);
1420 while(isdefined(ent) && ent istouching(
self))
1427 if(isdefined(ent) && isdefined(on_exit_payload))
1429 [[on_exit_payload]](ent);
1448 if(isdefined(on_enter_payload))
1450 [[on_enter_payload]](ent);
1453 while(isdefined(ent) && ent istouching(
self) && ent issplitscreenhost() )
1458 if(isdefined(on_exit_payload))
1460 [[on_exit_payload]](ent);
1471 entity endon(
"entityshutdown");
1475 single_thread(entity, func, localClientNum, arg1, arg2, arg3, arg4);
1495 players = level.localPlayers;
1496 for (i = 0; i < players.size; i++)
1505 level.debug_line = GetDvarInt(
"scr_debug_line", 0 );
1507 if ( isdefined( level.debug_line ) && level.debug_line == 1.0 )
1509 if ( !isdefined(time) )
1513 Line( from, to, color, 1, 1, time);
1522 level.debug_star = GetDvarInt(
"scr_debug_star", 0 );
1524 if ( isdefined( level.debug_star ) && level.debug_star == 1.0 )
1526 if ( !isdefined(time) )
1530 if ( !isdefined(color) )
1534 debugstar( origin, time, color );
1544 level.serverTime = getServerTime( 0 );
1553 if ( level.releasedObjectives[localClientNum].size > 0 )
1555 nextID = level.releasedObjectives[localClientNum][ level.releasedObjectives[localClientNum].size - 1 ];
1556 level.releasedObjectives[localClientNum][ level.releasedObjectives[localClientNum].size - 1 ] = undefined;
1560 nextID = level.numGametypeReservedObjectives[localClientNum];
1561 level.numGametypeReservedObjectives[localClientNum]++;
1568 println(
"^3SCRIPT WARNING: Ran out of objective IDs");
1584 assert( objID < level.numGametypeReservedObjectives[localClientNum] );
1585 for( i = 0; i < level.releasedObjectives[localClientNum].size; i++ )
1587 if( objID == level.releasedObjectives[localClientNum][i] )
1590 level.releasedObjectives[localClientNum][level.releasedObjectives[localClientNum].size] = objID;
1595 switch( str_next_map )
1597 case "cp_mi_sing_blackstation":
1598 case "cp_mi_sing_biodomes":
1599 case "cp_mi_sing_sgen":
1601 return "cp_sh_singapore";
1603 case "cp_mi_cairo_infection":
1604 case "cp_mi_cairo_aquifer":
1605 case "cp_mi_cairo_lotus":
1607 return "cp_sh_cairo";
1611 return "cp_sh_mobile";
1617 DEFAULT( str_next_map, ToLower( GetDvarString(
"mapname" ) ) );
1619 switch ( str_next_map )
1622 case "cp_sh_mobile":
1623 case "cp_sh_singapore":