1 #using scripts\codescripts\struct;
3 #using scripts\shared\array_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flag_shared;
6 #using scripts\shared\hud_message_shared;
7 #using scripts\shared\laststand_shared;
8 #using scripts\shared\util_shared;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\statstable_shared.gsh;
13 #using scripts\shared\ai\zombie_utility;
15 #using scripts\zm\_util;
16 #using scripts\zm\_zm;
17 #using scripts\zm\_zm_ai_faller;
18 #using scripts\zm\_zm_audio;
19 #using scripts\zm\_zm_bgb;
20 #using scripts\zm\_zm_equipment;
21 #using scripts\zm\_zm_laststand;
22 #using scripts\zm\_zm_perks;
23 #using scripts\zm\_zm_power;
24 #using scripts\zm\_zm_powerups;
25 #using scripts\zm\_zm_server_throttle;
26 #using scripts\zm\_zm_stats;
27 #using scripts\zm\_zm_spawner;
28 #using scripts\zm\_zm_weapons;
30 #insert scripts\zm\_zm_perks.gsh;
31 #insert scripts\zm\_zm_utility.gsh;
33 #namespace zm_utility;
49 dvar = GetDvarString(
"ui_gametype" );
51 if ( dvar ==
"zstandard" )
62 return ( seconds * 1000 );
67 return ( IsPlayer(
self ) || ( IsDefined(
self.pers ) &&
IS_TRUE(
self.pers[
"isBot" ] ) ) );
74 link =
Spawn(
"script_origin",
self GetOrigin() );
75 link.angles =
self.first_node.angles ;
82 link RotateTo(
self.first_node.angles , level._CONTEXTUAL_GRAB_LERP_TIME);
84 link MoveTo(
self.attacking_spot , level._CONTEXTUAL_GRAB_LERP_TIME);
118 if ( isdefined( level.speed_change_round ) )
120 if ( level.round_number >= level.speed_change_round )
122 speed_percent = 0.2 + ( ( level.round_number - level.speed_change_round ) * 0.2 );
123 speed_percent = min( speed_percent, 1 );
125 change_round_max = Int( level.speed_change_max * speed_percent );
126 change_left = change_round_max - level.speed_change_num;
128 if ( change_left == 0 )
134 change_speed = RandomInt( 100 );
135 if ( change_speed > 80 )
142 zombie_left = level.zombie_ai_limit - zombie_count;
144 if ( zombie_left == change_left )
157 level.speed_change_num++;
158 if ( level.gamedifficulty == 0 )
180 self waittill(
"death" );
182 if ( level.speed_change_num > 0 )
184 level.speed_change_num--;
190 self endon(
"death" );
192 if(IsDefined(
self.spawn_pos))
194 self notify(
"risen",
self.spawn_pos.script_string );
197 self.spawn_pos = spot;
200 if(IsDefined(spot.target))
202 self.target = spot.target;
205 if(IsDefined(spot.zone_name))
207 self.zone_name = spot.zone_name;
208 self.previous_zone_name = spot.zone_name;
211 if(IsDefined(spot.script_parameters))
213 self.script_parameters = spot.script_parameters;
216 if(!IsDefined(spot.script_noteworthy))
218 spot.script_noteworthy =
"spawn_location";
221 tokens = StrTok( spot.script_noteworthy,
" " );
222 foreach ( index, token
in tokens )
225 if ( IsDefined(
self.spawn_point_override ) )
227 spot =
self.spawn_point_override;
228 token = spot.script_noteworthy;
231 if ( token ==
"custom_spawner_entry" )
233 next_token = index + 1;
235 if ( IsDefined( tokens[ next_token ] ) )
237 str_spawn_entry = tokens[ next_token ];
239 if ( IsDefined( level.custom_spawner_entry ) && IsDefined( level.custom_spawner_entry[ str_spawn_entry ] ) )
241 self thread [[ level.custom_spawner_entry[ str_spawn_entry ] ]]( spot );
247 if(token ==
"riser_location")
251 else if (token ==
"faller_location")
255 else if (token ==
"spawn_location" )
258 if ( IsDefined(
self.anchor ) )
263 self.anchor =
spawn(
"script_origin",
self.origin);
264 self.anchor.angles =
self.angles;
265 self linkto(
self.anchor);
268 if( !isDefined( spot.angles ) )
270 spot.angles = (0, 0, 0);
274 self.anchor moveto(spot.origin, .05);
275 self.anchor waittill(
"movedone");
279 if (IsDefined(target_org))
281 anim_ang = VectorToAngles(target_org -
self.origin);
282 self.anchor RotateTo((0, anim_ang[1], 0), .05);
283 self.anchor waittill(
"rotatedone");
285 if(isDefined(level.zombie_spawn_fx))
287 playfx(level.zombie_spawn_fx,spot.origin);
291 if(isDefined(
self.anchor))
293 self.anchor
delete();
299 self notify(
"risen", spot.script_string );
309 ai_zombie endon(
"risen" );
311 ai_zombie waittill(
"death" );
313 if( isdefined(
self ) )
321 self endon(
"death" );
325 for (i = 0; i < level.spawn_funcs[
self.team ].size; i++)
327 func = level.spawn_funcs[
self.team ][ i ];
328 util::single_thread(
self, func[
"function" ], func[
"param1" ], func[
"param2" ], func[
"param3" ], func[
"param4" ], func[
"param5" ] );
331 if ( IsDefined(
self.spawn_funcs ))
333 for (i = 0; i <
self.spawn_funcs.size; i++)
335 func =
self.spawn_funcs[ i ];
336 util::single_thread(
self, func[
"function" ], func[
"param1" ], func[
"param2" ], func[
"param3" ], func[
"param4" ] );
340 self.saved_spawn_functions =
self.spawn_funcs;
343 self.spawn_funcs = undefined;
347 self.spawn_funcs =
self.saved_spawn_functions;
348 self.saved_spawn_functions = undefined;
351 self.spawn_funcs = undefined;
358 if ( IsDefined( team ) )
360 hud = NewTeamHudElem( team );
365 if( IsDefined( client ) )
367 hud = NewClientHudElem( client );
375 level.hudelem_count++;
377 hud.foreground =
true;
379 hud.hidewheninmenu =
false;
386 level.hudelem_count--;
394 if(isdefined(barrier.zbarrier))
396 pieces = barrier.zbarrier GetZBarrierPieceIndicesInState(
"closed");
398 if(pieces.size != barrier.zbarrier GetNumZBarrierPieces())
405 for( i = 0; i < barrier_chunks.size; i++ )
422 if(isdefined(barrier.zbarrier))
424 pieces = barrier.zbarrier GetZBarrierPieceIndicesInState(
"open");
433 for( i = 0; i < barrier_chunks.size; i++ )
457 if(isdefined(barrier.zbarrier))
459 pieces = ArrayCombine(barrier.zbarrier GetZBarrierPieceIndicesInState(
"open"), barrier.zbarrier GetZBarrierPieceIndicesInState(
"opening"),
true,
false);
461 if(pieces.size != barrier.zbarrier GetNumZBarrierPieces())
466 else if( IsDefined( barrier_chunks ) )
468 ASSERT( IsDefined(barrier_chunks),
"zombie_utility::all_chunks_destroyed - Barrier chunks undefined" );
469 for( i = 0; i < barrier_chunks.size; i++ )
482 playable_area = getentarray(
"player_volume",
"script_noteworthy");
484 if ( !IsDefined( level.check_model ) )
486 level.check_model =
spawn (
"script_model", origin + (0,0,40));
490 level.check_model.origin = origin + ( 0, 0, 40 );
494 for (i = 0; i < playable_area.size; i++)
496 if (level.check_model istouching(playable_area[i]))
514 if( !IsDefined(player_zones) )
516 player_zones = getentarray(
"player_volume",
"script_noteworthy");
519 if( !isDefined( level.zones ) || !isDefined( player_zones ) )
524 if ( !isdefined( level.e_check_point ) )
527 level.e_check_point =
spawn(
"script_origin", origin+(0, 0, 40) );
531 level.e_check_point.origin = origin+(0,0,40);
534 one_valid_zone =
false;
535 for( i = 0; i < player_zones.size; i++ )
537 if( level.e_check_point IsTouching( player_zones[i] ) )
539 zone = level.zones[player_zones[i].targetname];
541 if( IsDefined(zone) &&
IS_TRUE(zone.is_enabled) )
543 if( IsDefined(zone_is_active) && (zone_is_active ==
true) && !
IS_TRUE(zone.is_active) )
548 one_valid_zone =
true;
554 return one_valid_zone;
559 new_score = score - score % 10;
560 if( new_score < score )
571 new_score = score - score % value;
572 if( new_score < score )
581 n_score = n_score / 2;
589 rand = randomint( 100 );
591 if(isDefined(level.char_percent_override) )
593 percentNotCharred = level.char_percent_override;
597 percentNotCharred = 65;
610 abs_num = abs( num );
626 if( !isDefined( added_poi_value ) )
628 self.added_poi_value = 0;
632 self.added_poi_value = added_poi_value;
635 if( !isDefined( start_turned_on ) )
637 start_turned_on =
true;
640 if ( !isdefined( attract_dist ) )
645 self.script_noteworthy =
"zombie_poi";
646 self.poi_active = start_turned_on;
648 if( isDefined( attract_dist ) )
650 self.max_attractor_dist = attract_dist;
651 self.poi_radius = attract_dist * attract_dist;
655 self.poi_radius = undefined;
657 self.num_poi_attracts = num_attractors;
658 self.attract_to_origin =
true;
659 self.attractor_array = [];
660 self.initial_attract_func = undefined;
661 self.arrival_attract_func = undefined;
662 if(isDefined(poi_team))
664 self._team = poi_team;
668 if( IsDefined( initial_attract_func ) )
670 self.initial_attract_func = initial_attract_func;
673 if( IsDefined( arrival_attract_func ) )
675 self.arrival_attract_func = arrival_attract_func;
685 self waittill(
"death" );
688 if ( IsInArray( level.zombie_poi_array,
self ) )
690 ArrayRemoveValue( level.zombie_poi_array,
self );
696 self endon(
"death" );
700 foreach( attract
in self.attractor_positions )
702 passed = BulletTracePassed( attract[0] + (0, 0, 24),
self.origin + (0, 0, 24),
false,
self );
705 /# debugstar( attract[0], 6, (1,1,1) ); #/
709 /# debugstar( attract[0], 6, (1,0,0) ); #/
719 self endon(
"death" );
721 if( !isdefined(
self.num_poi_attracts ) || (isDefined(
self.script_noteworthy) &&
self.script_noteworthy !=
"zombie_poi" ))
726 if( !isdefined( num_attract_dists ) )
728 num_attract_dists = 4;
732 queryResult = PositionQuery_Source_Navigation(
self.origin, (attract_dist / 2),
self.max_attractor_dist, (attract_dist / 2), (attract_dist / 2),
true, (attract_dist / 2) );
734 if( queryResult.data.size <
self.num_poi_attracts )
736 self.num_poi_attracts = queryResult.data.size;
738 for ( i = 0; i <
self.num_poi_attracts; i++ )
740 if (
IS_TRUE( level.validate_poi_attractors ) )
742 passed = BulletTracePassed( queryResult.data[i].origin + (0, 0, 24),
self.origin + (0, 0, 24),
false,
self );
745 self.attractor_positions[i][0] = queryResult.data[i].origin;
746 self.attractor_positions[i][1] =
self;
751 self.attractor_positions[i][0] = queryResult.data[i].origin;
752 self.attractor_positions[i][1] =
self;
756 if( !IsDefined(
self.attractor_positions ) )
758 self.attractor_positions = [];
761 self.num_attract_dists = num_attract_dists;
764 self.last_index = [];
765 for( i = 0; i < num_attract_dists; i++ )
767 self.last_index[i] = -1;
771 self.last_index[0] = 1;
774 self.last_index[1] =
self.attractor_positions.size;
776 self.attract_to_origin =
false;
778 self notify(
"attractor_positions_generated" );
779 level notify(
"attractor_positions_generated" );
786 self endon(
"death" );
790 degs_per_pos = 360 / num_positions;
791 for( i = offset; i < 360+offset; i += degs_per_pos )
793 altforward = forward * attract_radius;
794 rotated_forward = ( (cos(i)*altforward[0] - sin(i)*altforward[1]), (sin(i)*altforward[0] + cos(i)*altforward[1]), altforward[2] );
796 if(isDefined(level.poi_positioning_func))
798 pos = [[level.poi_positioning_func]](
self.origin, rotated_forward);
800 else if(
IS_TRUE(level.use_alternate_poi_positioning))
815 if(
IS_TRUE(level.use_alternate_poi_positioning))
817 if ( isDefined(
self ) && isDefined(
self.origin ) )
819 if(
self.origin[2] >= (pos[2]-epsilon) &&
self.origin[2] - pos[2] <= 150 )
824 ARRAY_ADD(
self.attractor_positions , pos_array );
832 else if(abs( pos[2] -
self.origin[2] ) < 60 )
837 ARRAY_ADD(
self.attractor_positions , pos_array );
852 while( !isDefined(
self.attractor_positions ) )
857 for( i = 0; i <
self.attractor_positions.size; i++ )
859 Line(
self.origin,
self.attractor_positions[i][0], (1, 0, 0),
true, 1 );
862 if( !IsDefined(
self ) )
875 while( !isDefined(
self.claimed_attractor_positions ) )
880 for( i = 0; i <
self.claimed_attractor_positions.size; i++ )
882 Line(
self.origin,
self.claimed_attractor_positions[i][0], (0, 1, 0),
true, 1 );
885 if( !IsDefined(
self ) )
895 AIProfile_BeginEntry(
"get_zombie_point_of_interest" );
897 if (
IS_TRUE(
self.ignore_all_poi ) )
899 AIProfile_EndEntry();
903 curr_radius = undefined;
905 if ( isdefined( poi_array ) )
907 ent_array = poi_array;
911 ent_array = level.zombie_poi_array;
914 best_poi = undefined;
915 position = undefined;
916 best_dist = 10000 * 10000;
918 for( i = 0; i < ent_array.size; i++ )
920 if( !isDefined( ent_array[i] ) || !isDefined( ent_array[i].poi_active ) || !ent_array[i].poi_active )
925 if ( isDefined(
self.ignore_poi_targetname ) &&
self.ignore_poi_targetname.size > 0 )
927 if ( isDefined( ent_array[i].targetname ) )
930 for ( j = 0; j <
self.ignore_poi_targetname.size; j++ )
932 if ( ent_array[i].targetname ==
self.ignore_poi_targetname[j] )
945 if ( isDefined(
self.ignore_poi ) &&
self.ignore_poi.size > 0 )
948 for ( j = 0; j <
self.ignore_poi.size; j++ )
950 if (
self.ignore_poi[j] == ent_array[i] )
962 dist = distanceSquared( origin, ent_array[i].origin );
964 dist -= ent_array[i].added_poi_value;
966 if( isDefined( ent_array[i].poi_radius ) )
968 curr_radius = ent_array[i].poi_radius;
971 if( (!isDefined( curr_radius ) || dist < curr_radius) && dist < best_dist && ent_array[i]
can_attract(
self) )
973 best_poi = ent_array[i];
978 if( isDefined( best_poi ) )
980 if(isDefined(best_poi._team))
982 if(isDefined(
self._race_team) &&
self._race_team != best_poi._team)
984 AIProfile_EndEntry();
988 if(
IS_TRUE( best_poi._new_ground_trace ) )
994 else if( isDefined( best_poi.attract_to_origin ) && best_poi.attract_to_origin )
997 position[0] =
groundpos( best_poi.origin + (0, 0, 100) );
1005 if( IsDefined( best_poi.initial_attract_func ) )
1007 self thread [[ best_poi.initial_attract_func ]]( best_poi );
1010 if( IsDefined( best_poi.arrival_attract_func ) )
1012 self thread [[ best_poi.arrival_attract_func ]]( best_poi );
1016 AIProfile_EndEntry();
1022 if(
self.script_noteworthy !=
"zombie_poi" )
1027 self.poi_active =
true;
1032 if(
self.script_noteworthy !=
"zombie_poi" )
1038 for( i = 0; i <
self.attractor_array.size; i++ )
1040 self.attractor_array[i] notify(
"kill_poi" );
1043 self.attractor_array = [];
1044 self.claimed_attractor_positions = [];
1046 self.poi_active =
false;
1054 if ( isdefined(
self ) )
1056 if ( IsInArray( level.zombie_poi_array,
self ) )
1058 ArrayRemoveValue( level.zombie_poi_array,
self );
1067 position = undefined;
1068 doremovalthread =
false;
1073 if (!IsDefined(poi.attractor_array) || ( IsDefined(poi.attractor_array) && !IsInArray( poi.attractor_array,
self ) ))
1074 doremovalthread =
true;
1079 if (IsDefined(position) && doremovalthread && IsInArray( poi.attractor_array,
self ))
1089 if( !isDefined( zombie_poi ) || !isDefined( zombie_poi.attractor_array ) )
1094 for( i = 0; i < zombie_poi.attractor_array.size; i++ )
1096 if( zombie_poi.attractor_array[i] ==
self )
1098 ArrayRemoveValue( zombie_poi.attractor_array, zombie_poi.attractor_array[i] );
1099 ArrayRemoveValue( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[i] );
1101 if ( isdefined(
self ) )
1103 self notify(
"kill_poi" );
1111 for( i = 0; i <
array.size; i++ )
1113 if( [[is_equal_fn]](
array[i], single ) )
1124 return loc1[0]==loc2[0];
1130 if( !isDefined( zombie_poi ) )
1134 if( !isDefined( zombie_poi.attractor_array ) )
1136 zombie_poi.attractor_array = [];
1140 if( !IsInArray( zombie_poi.attractor_array,
self ) )
1142 if( !isDefined( zombie_poi.claimed_attractor_positions ) )
1144 zombie_poi.claimed_attractor_positions = [];
1147 if( !isDefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 )
1155 for( i = 0; i < 4; i++ )
1157 if( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[i] )
1159 start = last_index+1;
1160 end = zombie_poi.last_index[i];
1163 last_index = zombie_poi.last_index[i];
1167 best_dist = 10000*10000;
1168 best_pos = undefined;
1177 for( i =
int(start); i <= int(
end); i++ )
1179 if(!isDefined(zombie_poi.attractor_positions[i]))
1187 if ( isDefined( zombie_poi.attractor_positions[i][0] ) && isDefined(
self.origin ) )
1189 dist = distancesquared( zombie_poi.attractor_positions[i][0], zombie_poi.origin );
1190 if( dist < best_dist || !isDefined( best_pos ) )
1193 best_pos = zombie_poi.attractor_positions[i];
1199 if( !isDefined( best_pos ) )
1201 if (
IS_TRUE( level.validate_poi_attractors ) )
1204 valid_pos[0] = zombie_poi.origin;
1205 valid_pos[1] = zombie_poi;
1212 ARRAY_ADD( zombie_poi.attractor_array,
self );
1215 ARRAY_ADD( zombie_poi.claimed_attractor_positions, best_pos );
1221 for( i = 0; i < zombie_poi.attractor_array.size; i++ )
1223 if( zombie_poi.attractor_array[i] ==
self )
1225 if( isDefined( zombie_poi.claimed_attractor_positions ) && isDefined( zombie_poi.claimed_attractor_positions[i] ) )
1227 return zombie_poi.claimed_attractor_positions[i];
1238 if( !isDefined(
self.attractor_array ) )
1240 self.attractor_array = [];
1243 if( isDefined(
self.attracted_array) && !IsInArray(
self.attracted_array, attractor) )
1248 if( IsInArray(
self.attractor_array, attractor ) )
1252 if( isDefined(
self.num_poi_attracts) &&
self.attractor_array.size >=
self.num_poi_attracts )
1262 self endon(
"kill_poi" );
1264 self waittill(
"death" );
1273 zombie_poi waittill(
"death" );
1275 if( !isDefined( zombie_poi.attractor_array ) )
1278 for( i = 0; i < zombie_poi.attractor_array.size; i++ )
1280 if( zombie_poi.attractor_array[i] ==
self )
1282 ArrayRemoveIndex( zombie_poi.attractor_array, i );
1283 ArrayRemoveIndex( zombie_poi.claimed_attractor_positions, i );
1292 if( !isDefined(
self ) || !isDefined( attractor_pos ) )
1301 for( i = 0; i <
self.attractor_positions.size; i++ )
1309 for( i = 0; i <
self.last_index.size; i++ )
1311 if( index <=
self.last_index[i] )
1313 self.last_index[i]--;
1317 ArrayRemoveValue(
self.attractor_array, zombie );
1318 ArrayRemoveValue(
self.attractor_positions, attractor_pos );
1319 for( i = 0; i <
self.claimed_attractor_positions.size; i++ )
1321 if(
self.claimed_attractor_positions[i][0] == attractor_pos[0] )
1323 ArrayRemoveValue(
self.claimed_attractor_positions,
self.claimed_attractor_positions[i] );
1337 if ( isDefined(
self.ignore_poi ) &&
self.ignore_poi.size > 0 )
1339 for ( i = 0; i <
self.ignore_poi.size; i++ )
1341 if (
self.ignore_poi[i] == poi )
1343 ArrayRemoveValue(
self.ignore_poi,
self.ignore_poi[i] );
1352 if ( !isDefined(
self.ignore_poi ) )
1354 self.ignore_poi = [];
1358 if (
self.ignore_poi.size > 0 )
1360 for ( i = 0; i <
self.ignore_poi.size; i++ )
1362 if (
self.ignore_poi[i] == poi )
1372 self.ignore_poi[
self.ignore_poi.size] = poi;
1384 d = DistanceSquared(
self.origin, player.origin );
1385 if ( d <= max_dist )
1395 AIProfile_BeginEntry(
"get_closest_valid_player" );
1397 valid_player_found =
false;
1398 players = GetPlayers();
1400 if( isdefined( level.get_closest_valid_player_override ) )
1402 players = [[ level.get_closest_valid_player_override ]]();
1405 b_designated_target_exists =
false;
1406 for(i = 0; i < players.size; i++ )
1408 player = players[i];
1411 if( !player.am_i_valid )
1416 if( isDefined( level.evaluate_zone_path_override ) )
1418 if( ![[ level.evaluate_zone_path_override ]]( player ) )
1425 if(
IS_TRUE( player.b_is_designated_target ) )
1427 b_designated_target_exists =
true;
1431 if( IsDefined( ignore_player ) )
1433 for(i = 0; i < ignore_player.size; i++ )
1435 ArrayRemoveValue( players, ignore_player[i] );
1441 while ( players.size && !done )
1444 for(i = 0; i < players.size; i++ )
1446 player = players[i];
1448 if( !player.am_i_valid )
1450 ArrayRemoveValue( players, player );
1454 if( b_designated_target_exists && !
IS_TRUE( player.b_is_designated_target ) )
1456 ArrayRemoveValue( players, player );
1463 if( players.size == 0 )
1465 AIProfile_EndEntry();
1469 while( !valid_player_found )
1472 if( IsDefined(
self.closest_player_override ) )
1474 player = [[
self.closest_player_override ]]( origin, players );
1476 else if( isdefined( level.closest_player_override ) )
1478 player = [[ level.closest_player_override ]]( origin, players );
1482 player = ArrayGetClosest( origin, players );
1485 if( !isdefined( player ) || players.size == 0 )
1487 AIProfile_EndEntry();
1491 if(
IS_TRUE(level.allow_zombie_to_target_ai) ||
IS_TRUE(player.allow_zombie_to_target_ai) )
1493 AIProfile_EndEntry();
1499 if( !player.am_i_valid )
1502 ArrayRemoveValue( players, player );
1503 if( players.size == 0 )
1505 AIProfile_EndEntry();
1512 AIProfile_EndEntry();
1521 AIProfile_BeginEntry(
"update_valid_players" );
1523 valid_player_found =
false;
1524 players = ArrayCopy( level.players );
1527 foreach( player
in players )
1529 self SetIgnoreEnt( player,
true );
1532 b_designated_target_exists =
false;
1533 for(i = 0; i < players.size; i++ )
1535 player = players[i];
1538 if( !player.am_i_valid )
1543 if( isDefined( level.evaluate_zone_path_override ) )
1545 if( ![[ level.evaluate_zone_path_override ]]( player ) )
1552 if(
IS_TRUE( player.b_is_designated_target ) )
1554 b_designated_target_exists =
true;
1558 if( IsDefined( ignore_player ) )
1560 for(i = 0; i < ignore_player.size; i++ )
1562 ArrayRemoveValue( players, ignore_player[i] );
1568 while ( players.size && !done )
1571 for(i = 0; i < players.size; i++ )
1573 player = players[i];
1575 if( !player.am_i_valid )
1577 ArrayRemoveValue( players, player );
1581 if( b_designated_target_exists && !
IS_TRUE( player.b_is_designated_target ) )
1583 ArrayRemoveValue( players, player );
1591 foreach( player
in players )
1593 self SetIgnoreEnt( player,
false );
1594 self GetPerfectInfo( player );
1597 AIProfile_EndEntry();
1602 if( !IsDefined( player ) )
1607 if( !IsAlive( player ) )
1612 if( !IsPlayer( player ) )
1617 if( IsDefined(player.is_zombie) && player.is_zombie ==
true )
1622 if( player.sessionstate ==
"spectator" )
1627 if( player.sessionstate ==
"intermission" )
1632 if(
IS_TRUE( level.intermission ) )
1637 if( !
IS_TRUE( ignore_laststand_players ) )
1651 if(
IS_TRUE(checkIgnoreMeFlag) && player.ignoreme )
1658 if( IsDefined( level.is_player_valid_override ) )
1660 return [[ level.is_player_valid_override ]]( player );
1669 players = GetPlayers();
1670 num_player_valid = 0;
1671 for( i = 0 ; i < players.size; i++ )
1674 num_player_valid += 1;
1678 return num_player_valid;
1686 if (isdefined(
self.rt_time) &&
self.rt_time + 100 >= GetTime())
1687 return self.in_rt_cached;
1688 self.rt_time = GetTime();
1690 players = level.players;
1691 for( i = 0; i < players.size; i++ )
1693 current_player = players[i];
1700 if( IsDefined( current_player ) && IsDefined( current_player.revivetrigger ) && IsAlive( current_player ) )
1702 if(
self IsTouching( current_player.revivetrigger ) )
1704 self.in_rt_cached =
true;
1710 self.in_rt_cached =
false;
1716 return ArrayGetClosest( org, nodes );
1729 for( i=0;i<chunks.size;i++ )
1731 if (IsDefined ( chunks[i].script_team ) && ( chunks[i].script_team ==
"classic_boards" ) )
1733 if (IsDefined (chunks[i].script_parameters) && (chunks[i].script_parameters ==
"board") )
1738 else if (IsDefined ( chunks[i].script_team ) && chunks[i].script_team ==
"bar_board_variant1" || chunks[i].script_team ==
"bar_board_variant2" ||
1739 chunks[i].script_team ==
"bar_board_variant4" || chunks[i].script_team ==
"bar_board_variant5" )
1745 else if(IsDefined(chunks[i].script_team ) && chunks[i].script_team ==
"new_barricade")
1747 if(IsDefined(chunks[i].script_parameters) && (chunks[i].script_parameters ==
"repair_board" || chunks[i].script_parameters ==
"barricade_vents"))
1756 for(i=0;i<chunks.size;i++)
1758 if ( IsDefined (chunks[i].script_team ) && ( chunks[i].script_team ==
"6_bars_bent" ) || ( chunks[i].script_team ==
"6_bars_prestine" ) )
1760 if (IsDefined (chunks[i].script_parameters) && (chunks[i].script_parameters ==
"bar") )
1762 if(isDefined(chunks[i].script_noteworthy))
1764 if(chunks[i].script_noteworthy ==
"4" || chunks[i].script_noteworthy ==
"6" )
1766 first_bars[first_bars.size] = chunks[i];
1773 for(i=0;i<first_bars.size;i++)
1775 if ( IsDefined (chunks[i].script_team ) && ( chunks[i].script_team ==
"6_bars_bent" ) || ( chunks[i].script_team ==
"6_bars_prestine" ) )
1777 if (IsDefined (chunks[i].script_parameters) && (chunks[i].script_parameters ==
"bar") )
1780 if( !first_bars[i].destroyed )
1782 return first_bars[i];
1789 for(i=0;i<chunks.size;i++)
1791 if ( IsDefined (chunks[i].script_team ) && ( chunks[i].script_team ==
"6_bars_bent" ) || ( chunks[i].script_team ==
"6_bars_prestine" ) )
1794 if (IsDefined (chunks[i].script_parameters) && (chunks[i].script_parameters ==
"bar") )
1796 if( !chunks[i].destroyed )
1820 if ( IsDefined ( chunks_grate ) )
1822 for(i=0;i<chunks_grate.size;i++)
1824 if (IsDefined (chunks_grate[i].script_parameters) && (chunks_grate[i].script_parameters ==
"grate") )
1828 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"1" ) )
1830 grate_order1[grate_order1.size] = chunks_grate[i];
1833 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"2" ) )
1835 grate_order2[grate_order2.size] = chunks_grate[i];
1838 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"3" ) )
1840 grate_order3[grate_order3.size] = chunks_grate[i];
1843 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"4" ) )
1845 grate_order4[grate_order4.size] = chunks_grate[i];
1848 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"5" ) )
1850 grate_order5[grate_order5.size] = chunks_grate[i];
1853 if ( IsDefined ( chunks_grate[i].script_noteworthy ) && ( chunks_grate[i].script_noteworthy ==
"6" ) )
1855 grate_order6[grate_order6.size] = chunks_grate[i];
1863 for(i=0;i<chunks_grate.size;i++)
1865 if (IsDefined ( chunks_grate[i].script_parameters ) && ( chunks_grate[i].script_parameters ==
"grate") )
1867 if ( IsDefined ( grate_order1[i] ) )
1869 if( ( grate_order1[i].state ==
"repaired" ) )
1872 return grate_order1[i];
1874 if( ( grate_order2[i].state ==
"repaired" ) )
1877 IPrintLnBold(
" pull bar2 ");
1880 return grate_order2[i];
1883 else if( ( grate_order3[i].state ==
"repaired" ) )
1886 IPrintLnBold(
" pull bar3 ");
1889 return grate_order3[i];
1892 else if( ( grate_order4[i].state ==
"repaired" ) )
1895 IPrintLnBold(
" pull bar4 ");
1898 return grate_order4[i];
1900 else if( ( grate_order5[i].state ==
"repaired" ) )
1903 IPrintLnBold(
" pull bar5 ");
1906 return grate_order5[i];
1908 else if( ( grate_order6[i].state ==
"repaired" ) )
1912 return grate_order6[i];
1931 variant1_order = [];
1932 variant1_order1 =[];
1933 variant1_order2 =[];
1934 variant1_order3 =[];
1935 variant1_order4 =[];
1936 variant1_order5 =[];
1937 variant1_order6 =[];
1940 if ( IsDefined ( chunks_variant1 ) )
1942 for(i=0;i<chunks_variant1.size;i++)
1944 if (IsDefined (chunks_variant1[i].script_team) && (chunks_variant1[i].script_team ==
"bar_board_variant1") )
1948 if ( IsDefined ( chunks_variant1[i].script_noteworthy ) )
1950 if ( chunks_variant1[i].script_noteworthy ==
"1" )
1952 variant1_order1[variant1_order1.size] = chunks_variant1[i];
1954 if ( chunks_variant1[i].script_noteworthy ==
"2" )
1956 variant1_order2[variant1_order2.size] = chunks_variant1[i];
1958 if ( chunks_variant1[i].script_noteworthy ==
"3" )
1960 variant1_order3[variant1_order3.size] = chunks_variant1[i];
1962 if ( chunks_variant1[i].script_noteworthy ==
"4" )
1964 variant1_order4[variant1_order4.size] = chunks_variant1[i];
1966 if ( chunks_variant1[i].script_noteworthy ==
"5" )
1968 variant1_order5[variant1_order5.size] = chunks_variant1[i];
1970 if ( chunks_variant1[i].script_noteworthy ==
"6" )
1972 variant1_order6[variant1_order6.size] = chunks_variant1[i];
1980 for(i=0;i<chunks_variant1.size;i++)
1982 if (IsDefined ( chunks_variant1[i].script_team ) && ( chunks_variant1[i].script_team ==
"bar_board_variant1") )
1984 if( IsDefined ( variant1_order2[i] ) )
1986 if( ( variant1_order2[i].state ==
"repaired" ) )
1988 return variant1_order2[i];
1990 else if( ( variant1_order3[i].state ==
"repaired" ) )
1992 return variant1_order3[i];
1994 else if( ( variant1_order4[i].state ==
"repaired" ) )
1996 return variant1_order4[i];
1998 else if( ( variant1_order6[i].state ==
"repaired" ) )
2000 return variant1_order6[i];
2002 else if( ( variant1_order5[i].state ==
"repaired" ) )
2004 return variant1_order5[i];
2006 else if( ( variant1_order1[i].state ==
"repaired" ) )
2008 return variant1_order1[i];
2026 variant2_order = [];
2027 variant2_order1 =[];
2028 variant2_order2 =[];
2029 variant2_order3 =[];
2030 variant2_order4 =[];
2031 variant2_order5 =[];
2032 variant2_order6 =[];
2035 if ( IsDefined ( chunks_variant2 ) )
2037 for(i=0;i<chunks_variant2.size;i++)
2039 if (IsDefined (chunks_variant2[i].script_team) && (chunks_variant2[i].script_team ==
"bar_board_variant2") )
2043 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"1" ) )
2045 variant2_order1[variant2_order1.size] = chunks_variant2[i];
2048 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"2" ) )
2050 variant2_order2[variant2_order2.size] = chunks_variant2[i];
2053 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"3" ) )
2055 variant2_order3[variant2_order3.size] = chunks_variant2[i];
2058 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"4" ) )
2060 variant2_order4[variant2_order4.size] = chunks_variant2[i];
2064 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"5" ) && IsDefined( chunks_variant2[i].script_location ) && (chunks_variant2[i].script_location ==
"5") )
2066 variant2_order5[variant2_order5.size] = chunks_variant2[i];
2069 if ( IsDefined ( chunks_variant2[i].script_noteworthy ) && ( chunks_variant2[i].script_noteworthy ==
"5" ) && IsDefined( chunks_variant2[i].script_location ) && (chunks_variant2[i].script_location ==
"6") )
2071 variant2_order6[variant2_order6.size] = chunks_variant2[i];
2078 for(i=0;i<chunks_variant2.size;i++)
2080 if (IsDefined ( chunks_variant2[i].script_team ) && ( chunks_variant2[i].script_team ==
"bar_board_variant2") )
2082 if( IsDefined ( variant2_order1[i] ) )
2084 if( ( variant2_order1[i].state ==
"repaired" ) )
2086 return variant2_order1[i];
2088 else if( ( variant2_order2[i].state ==
"repaired" ) )
2090 return variant2_order2[i];
2092 else if( ( variant2_order3[i].state ==
"repaired" ) )
2094 return variant2_order3[i];
2096 else if( ( variant2_order5[i].state ==
"repaired" ) )
2098 return variant2_order5[i];
2100 else if( ( variant2_order4[i].state ==
"repaired" ) )
2102 return variant2_order4[i];
2104 else if( ( variant2_order6[i].state ==
"repaired" ) )
2106 return variant2_order6[i];
2119 variant4_order = [];
2120 variant4_order1 =[];
2121 variant4_order2 =[];
2122 variant4_order3 =[];
2123 variant4_order4 =[];
2124 variant4_order5 =[];
2125 variant4_order6 =[];
2128 if ( IsDefined ( chunks_variant4 ) )
2130 for(i=0;i<chunks_variant4.size;i++)
2132 if (IsDefined (chunks_variant4[i].script_team) && (chunks_variant4[i].script_team ==
"bar_board_variant4") )
2136 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"1" ) && !IsDefined( chunks_variant4[i].script_location ) )
2138 variant4_order1[variant4_order1.size] = chunks_variant4[i];
2141 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"2" ) )
2143 variant4_order2[variant4_order2.size] = chunks_variant4[i];
2146 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"3" ) )
2148 variant4_order3[variant4_order3.size] = chunks_variant4[i];
2151 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"1" ) && IsDefined( chunks_variant4[i].script_location ) && (chunks_variant4[i].script_location ==
"3") )
2153 variant4_order4[variant4_order4.size] = chunks_variant4[i];
2157 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"5" ) )
2159 variant4_order5[variant4_order5.size] = chunks_variant4[i];
2162 if ( IsDefined ( chunks_variant4[i].script_noteworthy ) && ( chunks_variant4[i].script_noteworthy ==
"6" ) )
2164 variant4_order6[variant4_order6.size] = chunks_variant4[i];
2171 for(i=0;i<chunks_variant4.size;i++)
2173 if (IsDefined ( chunks_variant4[i].script_team ) && ( chunks_variant4[i].script_team ==
"bar_board_variant4") )
2175 if( IsDefined ( variant4_order1[i] ) )
2177 if( ( variant4_order1[i].state ==
"repaired" ) )
2179 return variant4_order1[i];
2181 else if( ( variant4_order6[i].state ==
"repaired" ) )
2183 return variant4_order6[i];
2185 else if( ( variant4_order3[i].state ==
"repaired" ) )
2187 return variant4_order3[i];
2189 else if( ( variant4_order4[i].state ==
"repaired" ) )
2191 return variant4_order4[i];
2193 else if( ( variant4_order2[i].state ==
"repaired" ) )
2195 return variant4_order2[i];
2197 else if( ( variant4_order5[i].state ==
"repaired" ) )
2199 return variant4_order5[i];
2212 variant5_order = [];
2213 variant5_order1 =[];
2214 variant5_order2 =[];
2215 variant5_order3 =[];
2216 variant5_order4 =[];
2217 variant5_order5 =[];
2218 variant5_order6 =[];
2221 if ( IsDefined ( chunks_variant5 ) )
2223 for(i=0;i<chunks_variant5.size;i++)
2225 if (IsDefined (chunks_variant5[i].script_team) && (chunks_variant5[i].script_team ==
"bar_board_variant5") )
2228 if ( IsDefined ( chunks_variant5[i].script_noteworthy ) )
2231 if ( ( chunks_variant5[i].script_noteworthy ==
"1" ) && !IsDefined( chunks_variant5[i].script_location ) )
2233 variant5_order1[variant5_order1.size] = chunks_variant5[i];
2235 if ( chunks_variant5[i].script_noteworthy ==
"2" )
2237 variant5_order2[variant5_order2.size] = chunks_variant5[i];
2239 if ( IsDefined ( chunks_variant5[i].script_noteworthy ) && ( chunks_variant5[i].script_noteworthy ==
"1" ) && IsDefined( chunks_variant5[i].script_location ) && (chunks_variant5[i].script_location ==
"3") )
2241 variant5_order3[variant5_order3.size] = chunks_variant5[i];
2243 if ( chunks_variant5[i].script_noteworthy ==
"4" )
2245 variant5_order4[variant5_order4.size] = chunks_variant5[i];
2247 if ( chunks_variant5[i].script_noteworthy ==
"5" )
2249 variant5_order5[variant5_order5.size] = chunks_variant5[i];
2251 if ( chunks_variant5[i].script_noteworthy ==
"6" )
2253 variant5_order6[variant5_order6.size] = chunks_variant5[i];
2258 for(i=0;i<chunks_variant5.size;i++)
2260 if (IsDefined ( chunks_variant5[i].script_team ) && ( chunks_variant5[i].script_team ==
"bar_board_variant5") )
2262 if( IsDefined ( variant5_order1[i] ) )
2264 if( ( variant5_order1[i].state ==
"repaired" ) )
2266 return variant5_order1[i];
2268 else if( ( variant5_order6[i].state ==
"repaired" ) )
2270 return variant5_order6[i];
2272 else if( ( variant5_order3[i].state ==
"repaired" ) )
2274 return variant5_order3[i];
2276 else if( ( variant5_order2[i].state ==
"repaired" ) )
2278 return variant5_order2[i];
2280 else if( ( variant5_order5[i].state ==
"repaired" ) )
2282 return variant5_order5[i];
2284 else if( ( variant5_order4[i].state ==
"repaired" ) )
2286 return variant5_order4[i];
2299 self vibrate(( 0, 270, 0 ), 0.2, 0.4, 0.4);
2306 if( !IsDefined( ents ) )
2311 dist = Distance2d( origin, ents[0].origin );
2315 for( i = 1; i < ents.size; i++ )
2317 if(IsDefined(ents[i].unbroken) && ents[i].unbroken ==
true)
2324 if(temp_array.size > 0)
2326 index = temp_array[RandomIntRange(0, temp_array.size)].index;
2331 for( i = 1; i < ents.size; i++ )
2333 temp_dist = Distance2d( origin, ents[i].origin );
2334 if( temp_dist < dist )
2370 playable_area = getentarray(
"player_volume",
"script_noteworthy");
2372 if( !IsDefined( playable_area ) )
2374 /# println(
"No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); #/
2378 for(i=0;i<playable_area.size;i++)
2381 if(
self IsTouching( playable_area[i] ) )
2395 chunks_grate = undefined;
2403 if(isdefined(barrier.zbarrier))
2405 if(isdefined(chunks))
2407 return array::randomize(chunks)[0];
2410 if(isdefined(chunks_grate))
2412 return array::randomize(chunks_grate)[0];
2419 if( IsDefined( chunks ) )
2426 else if ( IsDefined ( chunks_grate ) )
2440 if(isdefined(barrier.zbarrier))
2444 pieces = barrier.zbarrier GetZBarrierPieceIndicesInState(
"open");
2448 ret = array::randomize(pieces)[0];
2456 chunks_repair_grate = undefined;
2465 if ( IsDefined( chunks ) )
2467 return chunks[RandomInt( chunks.size )];
2471 else if( IsDefined( chunks_repair_grate ) )
2484 for( i = 0; i < barrier_chunks.size; i++ )
2486 if( IsDefined ( barrier_chunks[i] ) )
2488 if( IsDefined ( barrier_chunks[i].script_parameters ) && ( barrier_chunks[i].script_parameters ==
"grate" ) )
2508 if(isdefined(barrier.zbarrier))
2510 return barrier.zbarrier GetZBarrierPieceIndicesInState(
"closed");
2515 for( i = 0; i < barrier_chunks.size; i++ )
2517 if(IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"classic_boards") )
2519 if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"board") )
2523 if( barrier_chunks[i].origin == barrier_chunks[i].og_origin )
2531 if(IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"new_barricade") )
2533 if(IsDefined(barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"repair_board" || barrier_chunks[i].script_parameters ==
"barricade_vents"))
2537 if( barrier_chunks[i].origin == barrier_chunks[i].og_origin )
2545 else if ( IsDefined (barrier_chunks[i].script_team ) && ( barrier_chunks[i].script_team ==
"6_bars_bent" ) )
2547 if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"bar") )
2552 if( barrier_chunks[i].origin == barrier_chunks[i].og_origin )
2560 else if ( IsDefined (barrier_chunks[i].script_team ) && ( barrier_chunks[i].script_team ==
"6_bars_prestine" ) )
2562 if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"bar") )
2567 if( barrier_chunks[i].origin == barrier_chunks[i].og_origin )
2587 if(isdefined(barrier.zbarrier))
2589 return barrier.zbarrier GetZBarrierPieceIndicesInState(
"closed");
2594 for( i = 0; i < barrier_chunks.size; i++ )
2596 if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"grate") )
2598 if( IsDefined ( barrier_chunks[i] ) )
2617 for( i = 0; i < barrier_chunks.size; i++ )
2619 if (IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"bar_board_variant1") )
2621 if( IsDefined ( barrier_chunks[i] ) )
2639 for( i = 0; i < barrier_chunks.size; i++ )
2641 if (IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"bar_board_variant2") )
2643 if( IsDefined ( barrier_chunks[i] ) )
2661 for( i = 0; i < barrier_chunks.size; i++ )
2663 if (IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"bar_board_variant4") )
2665 if( IsDefined ( barrier_chunks[i] ) )
2683 for( i = 0; i < barrier_chunks.size; i++ )
2685 if (IsDefined (barrier_chunks[i].script_team) && (barrier_chunks[i].script_team ==
"bar_board_variant5") )
2687 if( IsDefined ( barrier_chunks[i] ) )
2705 for( i = 0; i < barrier_chunks.size; i++ )
2709 if (IsDefined (barrier_chunks[i].script_parameters) && barrier_chunks[i].script_parameters ==
"board")
2713 else if (IsDefined (barrier_chunks[i].script_parameters) && barrier_chunks[i].script_parameters ==
"repair_board" || barrier_chunks[i].script_parameters ==
"barricade_vents")
2717 else if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"bar") )
2722 else if (IsDefined (barrier_chunks[i].script_parameters) && (barrier_chunks[i].script_parameters ==
"grate") )
2747 grate_repair_order = [];
2748 grate_repair_order1 =[];
2749 grate_repair_order2 =[];
2750 grate_repair_order3 =[];
2751 grate_repair_order4 =[];
2752 grate_repair_order5 =[];
2753 grate_repair_order6 =[];
2767 for(i=0;i<chunks_repair_grate.size;i++)
2769 if (IsDefined (chunks_repair_grate[i].script_parameters) && (chunks_repair_grate[i].script_parameters ==
"grate") )
2771 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"1" ) )
2773 grate_repair_order1[grate_repair_order1.size] = chunks_repair_grate[i];
2776 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"2" ) )
2778 grate_repair_order2[grate_repair_order2.size] = chunks_repair_grate[i];
2781 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"3" ) )
2783 grate_repair_order3[grate_repair_order3.size] = chunks_repair_grate[i];
2786 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"4" ) )
2788 grate_repair_order4[grate_repair_order4.size] = chunks_repair_grate[i];
2791 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"5" ) )
2793 grate_repair_order5[grate_repair_order5.size] = chunks_repair_grate[i];
2796 if ( IsDefined ( chunks_repair_grate[i].script_noteworthy ) && ( chunks_repair_grate[i].script_noteworthy ==
"6" ) )
2798 grate_repair_order6[grate_repair_order6.size] = chunks_repair_grate[i];
2804 for(i=0;i<chunks_repair_grate.size;i++)
2806 if (IsDefined (chunks_repair_grate[i].script_parameters) && (chunks_repair_grate[i].script_parameters ==
"grate") )
2808 if( IsDefined ( grate_repair_order1[i] ) )
2811 if( ( grate_repair_order6[i].state ==
"destroyed" ) )
2814 IPrintLnBold(
" Fix grate6 ");
2817 return grate_repair_order6[i];
2819 if( ( grate_repair_order5[i].state ==
"destroyed" ) )
2822 IPrintLnBold(
" Fix grate5 ");
2825 return grate_repair_order5[i];
2827 else if( ( grate_repair_order4[i].state ==
"destroyed" ) )
2830 IPrintLnBold(
" Fix grate4 ");
2833 return grate_repair_order4[i];
2835 else if( ( grate_repair_order3[i].state ==
"destroyed" ) )
2838 IPrintLnBold(
" Fix grate3 ");
2841 return grate_repair_order3[i];
2843 else if( ( grate_repair_order2[i].state ==
"destroyed" ) )
2846 IPrintLnBold(
" Fix grate2 ");
2849 return grate_repair_order2[i];
2851 else if( ( grate_repair_order1[i].state ==
"destroyed" ) )
2854 IPrintLnBold(
" Fix grate1 ");
2859 return grate_repair_order1[i];
2875 assert( isdefined(
self.state ) );
2884 for( i = 0; i <
array.size; i++ )
2888 new_array[new_array.size] =
array[i];
2898 start_pos =
self.origin;
2904 gravity = GetDvarInt(
"bg_gravity" ) * -1;
2906 dist = Distance( start_pos, target_pos );
2908 time = dist / power;
2909 delta = target_pos - start_pos;
2910 drop = 0.5 * gravity *( time * time );
2912 velocity = ( ( delta[0] / time ), ( delta[1] / time ), ( delta[2] - drop ) / time );
2916 self MoveGravity( velocity, time );
2925 if( !IsDefined( level.zombie_hints ) )
2927 level.zombie_hints = [];
2930 level.zombie_hints[ref] = text;
2935 if( IsDefined( level.zombie_hints[ref] ) )
2937 return level.zombie_hints[ref];
2941 println(
"UNABLE TO FIND HINT STRING " + ref );
2943 return level.zombie_hints[
"undefined"];
2951 if( IsDefined( ent.script_hint ) )
2953 ref = ent.script_hint;
2955 if (
IS_TRUE( level.legacy_hint_system ) )
2957 ref = ref +
"_" + cost;
2963 if (IsDefined(cost))
2965 self SetHintString( hint, cost );
2969 self SetHintString( hint );
2977 if( IsDefined( ent.script_hint ) )
2979 ref = ent.script_hint;
2981 if (
IS_TRUE( level.legacy_hint_system ) && IsDefined(cost) )
2983 ref = ref +
"_" + cost;
2991 if(
self.trigger_per_player)
2993 triggers =
self.playertrigger;
2997 triggers[0] =
self.trigger;
2999 foreach(trigger
in triggers)
3002 if( IsDefined( ent.script_hint ) )
3004 ref = ent.script_hint;
3006 if (
IS_TRUE( level.legacy_hint_system ) )
3008 ref = ref +
"_" + cost;
3014 if (IsDefined(cost))
3016 trigger SetHintString( hint, cost );
3020 trigger SetHintString( hint );
3032 if( !IsDefined( level.zombie_sounds ) )
3034 level.zombie_sounds = [];
3037 level.zombie_sounds[ref] = alias;
3042 if( IsDefined( ent ) )
3044 if( IsDefined( ent.script_soundalias ) )
3046 PlaySoundAtPosition( ent.script_soundalias, pos );
3050 if( IsDefined(
self.script_sound ) )
3052 ref =
self.script_sound;
3061 if( !IsDefined( level.zombie_sounds[ref] ) )
3063 AssertMsg(
"Sound \"" + ref +
"\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." );
3067 PlaySoundAtPosition( level.zombie_sounds[ref], pos );
3072 if( IsDefined(
self.script_soundalias ) )
3074 self PlaySound(
self.script_soundalias );
3078 if( IsDefined(
self.script_sound ) )
3080 ref =
self.script_sound;
3088 if( !IsDefined( level.zombie_sounds[ref] ) )
3090 AssertMsg(
"Sound \"" + ref +
"\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." );
3094 self PlaySound( level.zombie_sounds[ref] );
3099 if( IsDefined(
self.script_firefxsound ) )
3101 ref =
self.script_firefxsound;
3109 if( !IsDefined( level.zombie_sounds[ref] ) )
3111 AssertMsg(
"Sound \"" + ref +
"\" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." );
3115 self PlaySound( level.zombie_sounds[ref] );
3121 floatParts = strTok(
string,
"." );
3122 if ( floatParts.size == 1 )
3123 return int(floatParts[0]);
3125 whole = int(floatParts[0]);
3128 for ( i=floatParts[1].size-1; i>=0; i-- )
3130 decimal = decimal/10 + int(floatParts[1][i])/10;
3134 return (whole + decimal);
3136 return (whole - decimal);
3147 if ( !IsDefined( is_float ) )
3151 if ( !IsDefined(column) )
3158 foreach( team
in level.teams )
3160 level.zombie_vars[ team ][ zvar ] = value;
3165 level.zombie_vars[zvar] = value;
3176 if ( !IsDefined(table) )
3178 table =
"mp/zombiemode.csv";
3180 if ( !IsDefined(is_float) )
3184 if ( !IsDefined(column) )
3190 table_value = TableLookUp( table, 0, var_name, column );
3191 if ( IsDefined( table_value ) && table_value !=
"" )
3199 value = int( table_value );
3214 if( level.hudelem_count > max )
3216 max = level.hudelem_count;
3219 println(
"HudElems: " + level.hudelem_count +
"[Peak: " + max +
"]" );
3232 for( i = 0; i < zombs.size; i++ )
3234 zombs[i] dodamage( zombs[i].health + 666, ( 0, 0, 0 ) );
3244 self endon(
"death" );
3247 print3d(
self.origin +( 0, 0, 64 ), speed, ( 1, 1, 1 ) );
3256 if( GetDvarInt(
"zombie_debug" ) != 1 )
3261 ent1 endon(
"death" );
3262 ent2 endon(
"death" );
3266 line( ent1.origin, ent2.origin );
3275 if( GetDvarInt(
"zombie_debug" ) != 1 )
3280 ent endon(
"death" );
3282 ent notify(
"stop_draw_line_ent_to_pos" );
3283 ent endon(
"stop_draw_line_ent_to_pos" );
3285 if( IsDefined( end_on ) )
3287 ent endon( end_on );
3292 line( ent.origin, pos );
3301 if( GetDvarInt(
"zombie_debug" ) > 0 )
3303 println(
"######### ZOMBIE: " + msg );
3311 self notify(
"stop_debug_blocker" );
3312 self endon(
"stop_debug_blocker" );
3316 if( GetDvarInt(
"zombie_debug" ) != 1 )
3334 for( r = 0; r < 20; r++ )
3336 theta = r / 20 * 360;
3337 theta2 = ( r + 1 ) / 20 * 360;
3339 line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) );
3340 line( pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos +( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) );
3341 line( pos +( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos +( cos( theta ) * currad, sin( theta ) * currad, curheight ) );
3349 self endon(
"death" );
3351 if( IsDefined( thread_endon ) )
3353 self notify( thread_endon );
3354 self endon( thread_endon );
3357 if( !IsDefined( offset ) )
3359 offset = ( 0, 0, 0 );
3364 print3d(
self.origin + offset, msg );
3373 self endon(
"disconnect" );
3374 self notify(
"stop_debug_breadcrumbs");
3375 self endon(
"stop_debug_breadcrumbs");
3380 if( GetDvarInt(
"zombie_debug" ) != 1 )
3386 for( i = 0; i <
self.zombie_breadcrumbs.size; i++ )
3400 self notify(
"stop_debug_breadcrumbs");
3401 self endon(
"stop_debug_breadcrumbs");
3405 if( GetDvarInt(
"zombie_debug" ) != 2 )
3413 for( i = 0; i <
self.attack_spots_taken.size; i++ )
3415 if(
self.attack_spots_taken[i] )
3418 circle(
self.attack_spots[i], 12, (1,0,0),
false,
true, 1);
3422 circle(
self.attack_spots[i], 12, (0,1,0),
false,
true, 1);
3426 msg =
"" + count +
" / " +
self.attack_spots_taken.size;
3427 print3d(
self.origin, msg );
3436 self endon(
"death" );
3438 time = GetTime() + ( time * 1000 );
3439 offset = ( 0, 0, 72 );
3440 while( GetTime() < time )
3442 offset = offset + ( 0, 0, 2 );
3443 print3d(
self.origin + offset, msg, ( 1, 1, 1 ) );
3453 sound =
"zmb_vox_plr_" + index +
"_" + snd;
3454 if(IsDefined (variation_count))
3456 sound = sound +
"_" + randomintrange(0, variation_count);
3458 if(!isDefined(level.player_is_speaking))
3460 level.player_is_speaking = 0;
3463 if (level.player_is_speaking == 0)
3465 level.player_is_speaking = 1;
3466 self PlaySoundWithNotify(sound,
"sound_done");
3467 self waittill(
"sound_done");
3470 level.player_is_speaking = 0;
3476 if( !IsDefined( ent ) )
3480 return !
IS_TRUE( ent.allowDeath );
3485 temp_ent =
spawn(
"script_origin", (0,0,0));
3486 temp_ent PlaySoundWithNotify (sound, sound +
"wait");
3487 temp_ent waittill (sound +
"wait");
3517 /# println(
"ZM >> include_weapon = " + weapon_name ); #/
3518 if( !isDefined( in_box ) )
3529 players = GetPlayers();
3530 for ( i = 0; i < players.size; i++ )
3532 if ( isdefined( players[i] ) )
3534 self SetInvisibleToPlayer( players[i],
enable );
3543 self endon(
"death");
3545 if ( IsDefined(overwrite) && overwrite && IsDefined(
self._debug_print3d_msg ) )
3548 self notify(
"end_print3d" );
3552 self endon(
"end_print3d");
3554 if ( !IsDefined(color) )
3559 if ( !IsDefined(scale) )
3564 if ( !IsDefined(offset) )
3569 if ( IsDefined(end_msg) )
3571 self endon(end_msg);
3575 self._debug_print3d_msg = text;
3577 while ( !
IS_TRUE( level.disable_print3d_ent ) )
3579 print3d(
self.origin+offset,
self._debug_print3d_msg, color, scale );
3589 if( !IsDefined( x ) )
3595 hud.alignX =
"left";
3597 hud.horzAlign =
"user_left";
3598 hud.vertAlign =
"user_top";
3599 hud.color = ( 1, 1, 1 );
3605 hud SetShader(
"hud_chalk_1", 64, 64 );
3618 if ( IsDefined(
self.cached_zone) )
3620 zone =
self.cached_zone;
3621 zone_name =
self.cached_zone_name;
3622 vol =
self.cached_zone_volume;
3624 if (
self IsTouching(zone.volumes[vol]) )
3633 for (i = 0; i < zone.volumes.size; i++)
3637 if (
self IsTouching(zone.volumes[i]) )
3639 self.cached_zone = zone;
3640 self.cached_zone_volume = i;
3651 for( z=0; z<level.zone_keys.size; z++ )
3653 zone_name = level.zone_keys[z];
3654 zone = level.zones[ zone_name ];
3656 if (
IS_EQUAL( zone,
self.cached_zone ) )
3660 for (i = 0; i < zone.volumes.size; i++)
3662 if (
self IsTouching(zone.volumes[i]) )
3664 self.cached_zone = zone;
3665 self.cached_zone_name = zone_name;
3666 self.cached_zone_volume = i;
3676 self.cached_zone = undefined;
3677 self.cached_zone_name = undefined;
3678 self.cached_zone_volume = undefined;
3697 players = GetPlayers();
3699 for( i = 0; i < players.size; i++ )
3701 players[i] notify(
"stop_fog" );
3707 notifyData = spawnStruct();
3708 notifyData.titleText = notifyText;
3709 notifyData.notifyText = titleText;
3712 notifyData.sound =
"mus_level_up";
3713 notifyData.duration = duration;
3714 notifyData.glowColor = (1.0, 0.0, 0.0);
3715 notifyData.color = (0.0, 0.0, 0.0);
3716 notifyData.iconName =
"hud_zombies_meat";
3722 return self.animname ==
"quad_zombie";
3727 return self.animname ==
"leaper_zombie";
3732 self endon(
"death" );
3733 self endon(
"disconnect" );
3735 self notify(
"stop_shock_onpain");
3736 self endon(
"stop_shock_onpain");
3738 if( GetDvarString(
"blurpain" ) ==
"" )
3740 SetDvar(
"blurpain",
"on" );
3745 oldhealth =
self.health;
3746 self waittill(
"damage",
damage, attacker, direction_vec, point, mod );
3748 if( IsDefined( level.shock_onpain ) && !level.shock_onpain )
3758 if(
self.health < 1 )
3763 if ( IsDefined(attacker) && IsDefined(attacker.custom_player_shellshock) )
3765 self [[ attacker.custom_player_shellshock ]] (
damage, attacker, direction_vec, point, mod );
3767 else if( mod ==
"MOD_PROJECTILE" || mod ==
"MOD_PROJECTILE_SPLASH" )
3771 else if( mod ==
"MOD_GRENADE_SPLASH" || mod ==
"MOD_GRENADE" || mod ==
"MOD_EXPLOSIVE" )
3773 shockType = undefined;
3774 shockLight = undefined;
3779 shockLight =
"lava_small";
3786 if( GetDvarString(
"blurpain" ) ==
"on" )
3788 self ShellShock(
"pain_zm", 0.5 );
3798 scaled_damage = 100 *
damage /
self.maxhealth;
3800 if( scaled_damage >= 90 )
3804 else if( scaled_damage >= 50 )
3808 else if( scaled_damage >= 25 )
3812 else if( scaled_damage > 10 )
3819 if ( !IsDefined( shockType ) )
3821 shockType =
"explosion";
3824 self ShellShock( shockType, time );
3826 else if (IsDefined(shockLight))
3828 self ShellShock( shockLight, time );
3836 self.ignorme_count++;
3837 self.ignoreme = (
self.ignorme_count > 0 );
3843 if(
self.ignorme_count > 0 )
3845 self.ignorme_count--;
3849 AssertMsg(
"making ignorme_count less than 0" );
3852 self.ignoreme = (
self.ignorme_count > 0 );
3863 if(
IS_TRUE(level.devgui_dpad_watch) )
3870 if( !isdefined(
self.is_drinking) )
3871 self.is_drinking = 0;
3873 if(
self.is_drinking == 0 )
3876 self DisableOffhandWeapons();
3877 self DisableWeaponCycling();
3894 return (
self.is_drinking > 1 );
3902 if(
self.is_drinking > 0 )
3908 AssertMsg(
"making is_drinking less than 0" );
3912 if(
self.is_drinking == 0 )
3914 self EnableOffhandWeapons();
3915 self EnableWeaponCycling();
3924 self.is_drinking = 0;
3926 self EnableOffhandWeapons();
3927 self EnableWeaponCycling();
3934 DEFAULT( level.n_no_end_game_check_count, 0 );
3935 level.n_no_end_game_check_count++;
3936 level.no_end_game_check = ( level.n_no_end_game_check_count > 0 );
3941 DEFAULT( level.n_no_end_game_check_count, 0 );
3942 if( level.n_no_end_game_check_count > 0 )
3944 level.n_no_end_game_check_count--;
3948 AssertMsg(
"making no_end_game_check_count less than 0" );
3951 level.no_end_game_check = ( level.n_no_end_game_check_count > 0 );
3953 if ( !level.no_end_game_check )
4038 assert( isdefined( weapon ) );
4039 if ( !isdefined( weapon ) )
4044 if ( !isdefined ( level.weaponClassArray ) )
4046 level.weaponClassArray = [];
4049 if ( isdefined( level.weaponClassArray[weapon] ) )
4051 return level.weaponClassArray[weapon];
4054 baseWeaponIndex = GetBaseWeaponItemIndex( weapon );
4057 level.weaponClassArray[weapon] = weaponClass;
4063 if ( !isdefined( model ) )
4065 model = weapon.worldModel;
4068 weapon_model =
spawn(
"script_model", origin );
4069 if ( isdefined( angles ) )
4071 weapon_model.angles = angles;
4074 if ( isdefined( options ) )
4076 weapon_model useweaponmodel( weapon, model, options );
4080 weapon_model useweaponmodel( weapon, model );
4083 return weapon_model;
4089 weapon_model =
spawn(
"script_model", origin );
4090 if ( isdefined( angles ) )
4092 weapon_model.angles = angles;
4096 if ( upgraded && (!IsDefined( camo ) || 0 > camo) )
4101 weapon_model UseBuildKitWeaponModel( player, weapon, camo, upgraded );
4103 return weapon_model;
4109 if ( weapon == level.weaponReviveTool ||
IS_EQUAL(weapon,
self.weaponReviveTool) )
4119 if ( IsDefined( level.limited_weapons ) && IsDefined( level.limited_weapons[weapon] ) )
4130 weapon = GetWeapon( weaponname );
4136 if ( !isdefined( level.zombie_lethal_grenade_list ) )
4138 level.zombie_lethal_grenade_list = [];
4141 level.zombie_lethal_grenade_list[weapon] = weapon;
4147 if ( !isdefined( weapon ) || !isdefined( level.zombie_lethal_grenade_list ) )
4152 return isdefined(level.zombie_lethal_grenade_list[weapon]);
4158 if ( !isdefined( weapon ) || !isdefined(
self.current_lethal_grenade ) )
4163 return self.current_lethal_grenade == weapon;
4169 grenade = level.weaponNone;
4171 if(IsDefined(
self.current_lethal_grenade))
4173 grenade =
self.current_lethal_grenade;
4182 if ( !IsDefined( weapon ) )
4184 weapon = level.weaponNone;
4187 self notify(
"new_lethal_grenade", weapon );
4188 self.current_lethal_grenade = weapon;
4200 weapon = GetWeapon( weaponname );
4206 if ( !isdefined( level.zombie_tactical_grenade_list ) )
4208 level.zombie_tactical_grenade_list = [];
4211 level.zombie_tactical_grenade_list[weapon] = weapon;
4217 if ( !isdefined( weapon ) || !isdefined( level.zombie_tactical_grenade_list ) )
4222 return isdefined(level.zombie_tactical_grenade_list[weapon]);
4228 if ( !isdefined( weapon ) || !isdefined(
self.current_tactical_grenade ) )
4233 return self.current_tactical_grenade == weapon;
4239 tactical = level.weaponNone;
4241 if(IsDefined(
self.current_tactical_grenade))
4243 tactical =
self.current_tactical_grenade;
4252 if ( !IsDefined( weapon ) )
4254 weapon = level.weaponNone;
4257 self notify(
"new_tactical_grenade", weapon );
4258 self.current_tactical_grenade = weapon;
4269 DEFAULT(level.placeable_mines,[]);
4271 if ( !isdefined( weapon ) || weapon == level.weaponNone )
4276 return isdefined( level.placeable_mines[weapon.name] );
4282 if ( !isdefined( weapon ) || !isdefined(
self.current_placeable_mine ) )
4287 return self.current_placeable_mine == weapon;
4293 placeable_mine = level.weaponNone;
4295 if(IsDefined(
self.current_placeable_mine))
4297 placeable_mine =
self.current_placeable_mine;
4300 return placeable_mine;
4306 if ( !IsDefined( weapon ) )
4308 weapon = level.weaponNone;
4311 self notify(
"new_placeable_mine", weapon );
4312 self.current_placeable_mine = weapon;
4324 weapon = GetWeapon( weaponname );
4330 if ( !isdefined( level.zombie_melee_weapon_list ) )
4332 level.zombie_melee_weapon_list = [];
4335 level.zombie_melee_weapon_list[weapon] = weapon;
4341 if ( !isdefined( weapon ) || !isdefined( level.zombie_melee_weapon_list ) || ( weapon == GetWeapon(
"none" ) ) )
4346 return isdefined(level.zombie_melee_weapon_list[weapon]);
4352 if ( !isdefined( weapon ) || !isdefined(
self.current_melee_weapon ) )
4357 return self.current_melee_weapon == weapon;
4363 melee_weapon = level.weaponNone;
4365 if(IsDefined(
self.current_melee_weapon))
4367 melee_weapon =
self.current_melee_weapon;
4370 return melee_weapon;
4376 if ( !IsDefined( weapon ) )
4378 weapon = level.weaponNone;
4381 self notify(
"new_melee_weapon", weapon );
4382 self.current_melee_weapon = weapon;
4394 weapon = GetWeapon( weaponname );
4400 if ( !isdefined( level.zombie_hero_weapon_list ) )
4402 level.zombie_hero_weapon_list = [];
4405 level.zombie_hero_weapon_list[weapon] = weapon;
4410 if ( !isdefined( weapon ) || !isdefined( level.zombie_hero_weapon_list ) )
4415 return isdefined(level.zombie_hero_weapon_list[weapon]);
4421 if ( !isdefined( weapon ) || !isdefined(
self.current_hero_weapon ) )
4426 return self.current_hero_weapon == weapon;
4432 hero_weapon = level.weaponNone;
4434 if(IsDefined(
self.current_hero_weapon))
4436 hero_weapon =
self.current_hero_weapon;
4445 if ( !IsDefined( weapon ) )
4447 weapon = level.weaponNone;
4450 self notify(
"new_hero_weapon", weapon );
4451 self.current_hero_weapon = weapon;
4461 return (IsDefined(
self.current_hero_weapon) &&
self.current_hero_weapon != level.weaponNone);
4468 return IS_TRUE( level.should_watch_for_emp );
4473 if ( isdefined( level.register_offhand_weapons_for_level_defaults_override ) )
4475 [[ level.register_offhand_weapons_for_level_defaults_override ]]();
4480 level.zombie_lethal_grenade_player_init = GetWeapon(
"frag_grenade" );
4483 level.zombie_tactical_grenade_player_init = undefined;
4486 level.zombie_placeable_mine_player_init = undefined;
4490 level.zombie_melee_weapon_player_init = GetWeapon(
"knife" );
4492 level.zombie_equipment_player_init = undefined;
4526 weapon =
self GetCurrentWeapon();
4527 return IS_TRUE( weapon.isheroweapon );
4534 if(
self.hasCompletedSuperEE )
4537 self GiveMaxAmmo( level.start_weapon );
4551 if( !IsDefined ( level._array_flag_wait_any_calls ) )
4553 level._n_array_flag_wait_any_calls = 0;
4557 level._n_array_flag_wait_any_calls ++;
4560 str_condition =
"array_flag_wait_call_" + level._n_array_flag_wait_any_calls;
4562 for(index = 0; index < flag_array.size; index ++)
4567 level waittill( str_condition );
4573 level endon( condition );
4577 level notify( condition );
4582 return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0,
self )[
"position" ];
4587 return bullettrace( origin, ( origin + ( 0, 0, -100000 ) ), 0,
self,
true )[
"position" ];
4592 return groundtrace( origin, ( origin + ( 0, 0, -100000 ) ), 0,
self,
true )[
"position" ];
4606 if (IsDefined(
self))
4624 self endon(
"death" );
4625 self.ignoreTriggers =
true;
4626 if( IsDefined(
timer ) )
4634 self.ignoreTriggers =
false;
4651 if ( achievement ==
"" )
4657 if (
IS_TRUE( level.zm_disable_recording_stats ) )
4662 achievement_lower = tolower(achievement);
4665 if ( IsDefined( all_players ) && all_players )
4667 players = GetPlayers();
4668 for ( i = 0; i < players.size; i++ )
4670 players[i] GiveAchievement( achievement );
4672 has_achievement =
false;
4680 if( issplitscreen() && i == 0 || !issplitscreen() )
4682 if(isDefined(level.achievement_sound_func))
4684 players[i] thread [[level.achievement_sound_func]](achievement_lower);
4691 if ( !IsPlayer(
self ) )
4693 /# println(
"^1self needs to be a player for util::giveachievement_wrapper()" ); #/
4697 self GiveAchievement( achievement );
4700 has_achievement =
false;
4707 if(isDefined(level.achievement_sound_func))
4709 self thread [[level.achievement_sound_func]](achievement_lower);
4715 incrementCounter(
"global_" + achievement_lower,global_counter);
4722 angles = VectorToAngles(org-
self.origin);
4730 yaw =
self.angles[1] -
GetYaw(pos);
4731 yaw = AngleClamp180( yaw );
4749 assert( isalive(
self ),
"Tried to disable react on a non ai" );
4750 self.a.disableReact =
true;
4751 self.allowReact =
false;
4769 assert( isalive(
self ),
"Tried to enable react on a non ai" );
4770 self.a.disableReact =
false;
4771 self.allowReact =
true;
4778 if ( type ==
"MOD_PISTOL_BULLET" )
4782 return type ==
"MOD_RIFLE_BULLET";
4789 player =
self.owner;
4792 clip_ammo = player GetWeaponAmmoClip(
self.weapon );
4793 clip_max_ammo =
self.weapon.clipSize;
4794 if( clip_ammo < clip_max_ammo )
4798 player SetWeaponAmmoClip(
self.weapon, clip_ammo );
4818 self endon(
"death");
4819 self endon(
"disconnect" );
4820 self endon(
"detonated" );
4821 level endon(
"game_ended" );
4823 if (
self.classname ==
"grenade" )
4825 self waittill(
"stationary");
4829 prevorigin =
self.origin;
4833 if (
self.origin == prevorigin )
4835 prevorigin =
self.origin;
4853 players = GetPlayers();
4854 return ArrayGetClosest( org, players );
4862 message_array[ message_array.size ] =
"goal";
4863 message_array[ message_array.size ] =
"damage";
4865 for( i = 0; i < message_array.size; i++)
4882 self endon(
"death");
4883 self waittill( message );
4884 self.ent_flag[ message ] =
true;
4900 rangle = ( 0, angle[ 1 ], 0 );
4915 self.alwaysRunForward = undefined;
4916 self.a.combatrunanim = undefined;
4917 self.run_noncombatanim = undefined;
4918 self.walk_combatanim = undefined;
4919 self.walk_noncombatanim = undefined;
4920 self.preCombatRunEnabled =
true;
4925 self endon(
"disconnect" );
4926 self endon(
"death" );
4927 level endon(
"end_game" );
4933 killed_players =
false;
4934 players = GetPlayers();
4935 for ( i = 0; i < players.size; i++ )
4942 for ( j = 0; j < players.size; j++ )
4949 if ( isDefined( level.player_intersection_tracker_override ) )
4951 if ( players[i] [[level.player_intersection_tracker_override]]( players[j] ) )
4957 playerI_origin = players[i].origin;
4958 playerJ_origin = players[j].origin;
4961 if ( abs(playerI_origin[2] - playerJ_origin[2] ) > 60 )
4965 distance_apart = distance2d( playerI_origin, playerJ_origin );
4968 if ( abs(distance_apart) > 18 )
4972 IPrintLnBold(
"PLAYERS ARE TOO FRIENDLY!!!!!" );
4974 players[i] dodamage( 1000, (0, 0, 0) );
4975 players[j] dodamage( 1000, (0, 0, 0) );
4977 if ( !killed_players )
4979 players[i] playlocalsound( level.zmb_laugh_alias );
4989 killed_players =
true;
5011 assert(IsPlayer(
self),
"player_looking_at must be called on a player.");
5013 if (!IsDefined(dot))
5018 if (!IsDefined(do_trace))
5025 delta_vec = AnglesToForward(VectorToAngles(origin - eye));
5026 view_vec = AnglesToForward(
self GetPlayerAngles());
5028 new_dot = VectorDot( delta_vec, view_vec );
5029 if ( new_dot >= dot )
5033 return BulletTracePassed( origin, eye,
false, ignore_ent );
5082 if( !IsDefined( dist ) )
5092 for( i = 0;i <
array.size;i++ )
5094 newdistsq = distancesquared(
array[ i ].origin, org );
5095 if( newdistsq >= distsq )
5107 liftedorigin = point.origin + (0,0,5);
5110 mins = (-1 * size,-1 * size,0 );
5111 maxs = ( size,size,height );
5112 absmins = liftedorigin + mins;
5113 absmaxs = liftedorigin + maxs;
5115 if ( BoundsWouldTelefrag( absmins, absmaxs ) )
5136 org = entity.origin;
5137 if( !IsDefined( dist ) )
5147 for( i = 0;i <
array.size;i++ )
5149 if (isdefined(extra_check) && ![[extra_check]](entity,
array[ i ]) )
5151 newdistsq = distancesquared(
array[ i ].origin, org );
5152 if( newdistsq >= distsq )
5164 if(!isdefined(game[
"gamemode_match"]))
5166 game[
"gamemode_match"] = [];
5169 game[
"gamemode_match"][gvar] = val;
5174 if(!isdefined(game[
"gamemode_match"]))
5176 game[
"gamemode_match"] = [];
5179 if(!isdefined(game[
"gamemode_match"][gvar]))
5181 game[
"gamemode_match"][gvar] = val;
5192 if(!isdefined(game[gvar]))
5200 if(isdefined(game[gvar]))
5210 if(isdefined(game[
"gamemode_match"]) && isdefined(game[
"gamemode_match"][gvar]))
5212 return game[
"gamemode_match"][gvar];
5220 self endon (
"death");
5221 ent = SpawnStruct();
5223 returned_threads = 0;
5225 if (IsDefined (string1))
5230 if (IsDefined (string2))
5235 if (IsDefined (string3))
5240 if (IsDefined (string4))
5245 if (IsDefined (string5))
5253 ent waittill (
"returned");
5256 if(returned_threads >= min_num )
5267 if( !isdefined( sHitLoc ) )
5272 if( (sHitLoc !=
"head" && sHitLoc !=
"helmet") )
5278 if( sMeansofDeath ==
"MOD_IMPACT" && weapon.isBallisticKnife )
5283 return sMeansOfDeath !=
"MOD_MELEE" && sMeansOfDeath !=
"MOD_IMPACT" && sMeansofDeath !=
"MOD_UNKNOWN";
5290 ground_ent =
self GetGroundEnt();
5291 return (!isdefined(ground_ent));
5296 if( !IsDefined( mod ) )
5299 if( mod ==
"MOD_GRENADE" || mod ==
"MOD_GRENADE_SPLASH" || mod ==
"MOD_PROJECTILE" || mod ==
"MOD_PROJECTILE_SPLASH" || mod ==
"MOD_EXPLOSIVE" )
5310 game[
"zmbdialog"][
"prefix"] =
"vox_zmba_sam";
5311 level.zmb_laugh_alias =
"zmb_laugh_sam";
5312 level.sndAnnouncerIsRich =
false;
5320 if( isDefined(
timer) && isDefined(level.votimer[type]) && level.votimer[type] > 0)
5329 level.votimer[type] =
timer;
5336 level endon(
"end_game");
5338 /# println(
"ZM >> VOX TIMER STARTED FOR " + type +
" ( " +
timer +
")" ); #/
5345 level.votimer[type] =
timer;
5346 /# println(
"ZM >> VOX TIMER ENDED FOR " + type +
" ( " +
timer +
")" ); #/
5353 level.votimer[type] = 0;
5363 if(!isDefined(
self.favorite_wall_weapons_list))
5368 foreach(weapon
in self.favorite_wall_weapons_list)
5370 if (weapon_to_check == weapon )
5381 level.response_chances[event] = chance;
5386 spawnpoints = getentarray(
"mp_global_intermission",
"classname");
5387 if ( !spawnpoints.size )
5392 spawnpoint = spawnpoints[0];
5395 location = level.scr_zm_map_start_location;
5396 if ( (location ==
"default" || location ==
"") && IsDefined( level.default_start_location ) )
5398 location = level.default_start_location;
5401 match_string = level.scr_zm_ui_gametype +
"_" + location;
5403 for ( i = 0; i < spawnpoints.size; i++ )
5405 if ( IsDefined( spawnpoints[i].script_string ) )
5407 tokens = strtok( spawnpoints[i].script_string,
" " );
5408 foreach ( token
in tokens )
5410 if ( token == match_string )
5412 spawnpoint = spawnpoints[i];
5413 i = spawnpoints.size;
5420 setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
5425 level.navcard_needed = navcard_needed_for_computer;
5426 level.map_navcard = navcard_on_map;
5436 if(!isDefined(level.navcard_needed ))
5445 navcard =
spawn(
"script_model",org);
5446 navcard setmodel( str_model );
5447 navcard.angles = angles;
5451 navcard_pickup_trig =
Spawn(
"trigger_radius_use", org, 0, 84, 72 );
5452 navcard_pickup_trig SetCursorHint(
"HINT_NOICON" );
5453 navcard_pickup_trig SetHintString( &
"ZOMBIE_NAVCARD_PICKUP" );
5454 navcard_pickup_trig TriggerIgnoreTeam();
5456 a_navcard_stats =
array(
"navcard_held_zm_transit",
"navcard_held_zm_highrise",
"navcard_held_zm_buried" );
5458 is_holding_card =
false;
5459 str_placing_stat = undefined;
5463 navcard_pickup_trig waittill(
"trigger",who );
5468 foreach ( str_cur_stat
in a_navcard_stats )
5472 str_placing_stat = str_cur_stat;
5473 is_holding_card =
true;
5478 who playsound(
"zmb_buildable_piece_add" );
5480 who.navcard_grabbed = str_stat;
5491 navcard_pickup_trig
delete();
5494 if ( is_holding_card )
5496 level thread
place_navcard( str_model, str_placing_stat, org, angles );
5502 if (!IsDefined(level.navcards))
5504 players = GetPlayers();
5505 foreach( player
in players )
5513 self endon(
"disconnect");
5516 for(i = 0;i < level.navcards.size; i++)
5519 if (isdefined(
self.navcard_grabbed) &&
self.navcard_grabbed == level.navcards[i] )
5523 navcard_bits +=( 1 << i );
5528 if ( navcard_bits > 0 )
5538 self AllowCrouch(
true );
5539 self AllowLean(
false );
5540 self AllowAds(
false );
5541 self AllowSprint(
false );
5542 self AllowProne(
false );
5543 self AllowMelee(
false );
5545 if((isdefined(forceStanceChange)) && (forceStanceChange ==
true))
5547 if (
self GetStance() ==
"prone" )
5549 self SetStance(
"crouch" );
5556 if((!isdefined(
self._allow_lean)) || (
self._allow_lean ==
true))
5558 self AllowLean(
true );
5561 if((!isdefined(
self._allow_ads)) || (
self._allow_ads ==
true))
5563 self AllowAds(
true );
5566 if((!isdefined(
self._allow_sprint)) || (
self._allow_sprint ==
true))
5568 self AllowSprint(
true );
5571 if((!isdefined(
self._allow_prone)) || (
self._allow_prone ==
true))
5573 self AllowProne(
true );
5576 if((!isdefined(
self._allow_melee)) || (
self._allow_melee ==
true))
5578 self AllowMelee(
true );
5585 if(!isdefined(level._link_node_list))
5587 level._link_node_list = [];
5590 if(!isdefined(level._unlink_node_list))
5592 level._unlink_node_list = [];
5598 if(NodesAreLinked(
a,b))
5605 a_index_string =
"" +
a.origin;
5606 b_index_string =
"" + b.origin;
5608 if(!isdefined(level._link_node_list[a_index_string]))
5610 level._link_node_list[a_index_string] = spawnstruct();
5611 level._link_node_list[a_index_string].node =
a;
5612 level._link_node_list[a_index_string].links = [];
5613 level._link_node_list[a_index_string].ignore_on_migrate = [];
5616 if(!isdefined(level._link_node_list[a_index_string].links[b_index_string]))
5618 level._link_node_list[a_index_string].links[b_index_string] = b;
5619 level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = bDontUnlinkOnMigrate;
5622 if(isdefined(level._unlink_node_list[a_index_string]))
5624 if(isdefined(level._unlink_node_list[a_index_string].links[b_index_string]))
5626 level._unlink_node_list[a_index_string].links[b_index_string] = undefined;
5627 level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined;
5638 if(!NodesAreLinked(
a,b))
5645 a_index_string =
"" +
a.origin;
5646 b_index_string =
"" + b.origin;
5648 if(!isdefined(level._unlink_node_list[a_index_string]))
5650 level._unlink_node_list[a_index_string] = spawnstruct();
5651 level._unlink_node_list[a_index_string].node =
a;
5652 level._unlink_node_list[a_index_string].links = [];
5653 level._unlink_node_list[a_index_string].ignore_on_migrate = [];
5656 if(!isdefined(level._unlink_node_list[a_index_string].links[b_index_string]))
5658 level._unlink_node_list[a_index_string].links[b_index_string] = b;
5659 level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = bDontLinkOnMigrate;
5663 if(isdefined(level._link_node_list[a_index_string]))
5665 if(isdefined(level._link_node_list[a_index_string].links[b_index_string]))
5667 level._link_node_list[a_index_string].links[b_index_string] = undefined;
5668 level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined;
5681 if(!isdefined(level._spawned_path_nodes))
5683 level._spawned_path_nodes = [];
5686 node = spawnstruct();
5688 node.origin = origin;
5689 node.angles = angles;
5697 level._spawned_path_nodes[level._spawned_path_nodes.size] = node;
5706 return SpawnPathNode(
"node_pathnode", origin, angles, k1, v1, k2, v2);
5708 else if(isdefined(k1))
5710 return SpawnPathNode(
"node_pathnode", origin, angles, k1, v1);
5714 return SpawnPathNode(
"node_pathnode", origin, angles);
5738 if(!isdefined(level._spawned_path_nodes))
5743 for(i = 0; i < level._spawned_path_nodes.size; i ++)
5745 node_struct = level._spawned_path_nodes[i];
5747 /# println(
"Re-spawning spawned path node @ " + node_struct.origin); #/
5748 node_struct.node =
spawn_path_node_internal(node_struct.origin, node_struct.angles, node_struct.k1, node_struct.v1, node_struct.k2, node_struct.v2);
5754 keys = GetArrayKeys(list);
5756 for(i = 0; i < keys.size; i ++)
5758 node = list[keys[i]].node;
5760 node_keys = GetArrayKeys(list[keys[i]].links);
5762 for(j = 0; j < node_keys.size; j ++)
5764 if(isdefined(list[keys[i]].links[node_keys[j]]))
5767 if(
IS_TRUE(list[keys[i]].ignore_on_migrate[node_keys[j]]))
5769 /# println(
"Node at " + keys[i] +
" to node at " + node_keys[j] +
" - IGNORED"); #/
5773 /# println(
"Node at " + keys[i] +
" to node at " + node_keys[j]); #/
5774 [[func]](node, list[keys[i]].links[node_keys[j]]);
5783 if(isdefined(level._link_node_list))
5785 /# println(
"Link List"); #/
5789 if(isdefined(level._unlink_node_list))
5791 /# println(
"UnLink List"); #/
5798 if(!NodesAreLinked(
a,b))
5806 if(NodesAreLinked(
a,b))
5816 println(
"*** Undoing link changes"); #/
5828 println(
"*** Redoing link changes"); #/
5837 b_is_gametype_active =
false;
5839 if ( !IsArray( a_gametypes ) )
5841 a_gametypes = Array( a_gametypes );
5844 for ( i = 0; i < a_gametypes.size; i++ )
5846 if ( GetDvarString(
"g_gametype" ) == a_gametypes[ i ] )
5848 b_is_gametype_active =
true;
5852 return b_is_gametype_active;
5857 if ( !IsDefined( level.custom_spawner_entry ) )
5859 level.custom_spawner_entry = [];
5862 level.custom_spawner_entry[ spot_noteworthy ] = func;
5869 return [[
self.get_player_weapon_limit]]( player );
5872 if ( IsDefined( level.get_player_weapon_limit ) )
5874 return [[level.get_player_weapon_limit]]( player );
5880 weapon_limit = level.additionalprimaryweapon_limit;
5883 return weapon_limit;
5888 n_perk_purchase_limit_override = level.perk_purchase_limit;
5891 if ( IsDefined( level.get_player_perk_purchase_limit ) )
5893 n_perk_purchase_limit_override =
self [[level.get_player_perk_purchase_limit]]();
5896 return n_perk_purchase_limit_override;
5920 a_str_perks = GetArrayKeys( level._custom_perks );
5922 foreach( str_perk
in a_str_perks )
5929 if( !
self HasPerk( str_perk ) )
5933 if ( isdefined( level.perk_bought_func ) )
5935 self [[ level.perk_bought_func ]]( str_perk );
5943 self waittill(
"attractor_positions_generated" );
5945 self.attract_to_origin =
false;
5951 assert( IsPlayer( player ) );
5952 assert( IsDefined( player.characterIndex ) );
5956 if ( player.entity_num == 0 && GetDvarString(
"zombie_player_vo_overwrite" ) !=
"" )
5958 new_vo_index = GetDvarInt(
"zombie_player_vo_overwrite" );
5959 return new_vo_index;
5962 return player.characterIndex;
5976 foreach( character
in level.players )
5978 if( character.characterIndex == n_character_index )
5986 level notify(
"restart_round" );
5988 if ( n_target_round < 1 )
5993 level.zombie_total = 0;
5999 if ( isdefined( zombies ) )
6001 array::run_all( zombies, &Kill );
6004 level.sndGotoRoundOccurred =
true;
6006 level waittill(
"between_round_over" );
6014 temp_ent =
Spawn(
"script_origin", v_origin );
6016 foreach( zone
in level.zones )
6019 if ( !zone.is_enabled )
6024 if( isdefined( ignore_zone ) && ( zone == ignore_zone ) )
6030 foreach( e_volume
in zone.volumes )
6032 if ( temp_ent IsTouching( e_volume ) )
6047 if ( IsDefined(
self.streamer_hint) )
6049 self.streamer_hint Delete();
6050 self.streamer_hint = undefined;
6052 self notify(
"wait_clear_streamer_hint");
6057 self endon(
"wait_clear_streamer_hint");
6059 if ( IsDefined(
self) )
6066 if (
self == level )
6068 foreach( player
in GetPlayers() )
6074 self.streamer_hint = CreateStreamerHint( origin, value );
6075 if ( IsDefined(angles) )
6076 self.streamer_hint.angles = angles;
6077 if (
self != level )
6079 self.streamer_hint SetInvisibleToAll();
6080 self.streamer_hint SetVisibleToPlayer(
self );
6083 self.streamer_hint SetIncludeMeshes(
true );
6085 self notify(
"wait_clear_streamer_hint");
6086 if ( IsDefined(lifetime) && lifetime > 0 )
6094 AIProfile_BeginEntry(
"approximate_path_dist" );
6096 goal_pos = player.origin;
6097 if ( isdefined( player.last_valid_position ) )
6099 goal_pos = player.last_valid_position;
6102 if (
IS_TRUE( player.b_teleporting ) )
6104 if ( isdefined( player.teleport_location ) )
6106 goal_pos = player.teleport_location;
6107 if ( !IsPointOnNavmesh( goal_pos,
self ) )
6109 position = GetClosestPointOnNavMesh( goal_pos, 100, 15 );
6110 if ( IsDefined( position ) )
6112 goal_pos = position;
6118 assert( IsDefined( level.pathdist_type ),
"level.pathdist_type must be set before calling PathDistance" );
6121 approx_dist = PathDistance(
self.origin, goal_pos,
true,
self, level.pathdist_type );
6123 AIProfile_EndEntry();
6133 if ( !isdefined( level.a_n_slowdown_rates ) )
6135 level.a_n_slowdown_rates = [];
6138 level.a_s_slowdowns[ str_type ] = SpawnStruct();
6139 level.a_s_slowdowns[ str_type ].n_rate = n_rate;
6140 level.a_s_slowdowns[ str_type ].n_duration = n_duration;
6150 self notify(
"starting_slowdown_ai" );
6151 self endon(
"starting_slowdown_ai" );
6152 self endon(
"death" );
6154 Assert( isdefined( level.a_s_slowdowns[ str_type ] ),
"Slowdown \"" + str_type +
"\" must be registered through register_slowdown first" );
6156 if ( !isdefined(
self.a_n_slowdown_timeouts ) )
6158 self.a_n_slowdown_timeouts = [];
6162 n_timeout = n_time + level.a_s_slowdowns[ str_type ].n_duration;
6165 if ( !isdefined(
self.a_n_slowdown_timeouts[ str_type ] ) ||
6166 self.a_n_slowdown_timeouts[ str_type ] < n_timeout )
6168 self.a_n_slowdown_timeouts[ str_type ] = n_timeout;
6172 while (
self.a_n_slowdown_timeouts.size )
6174 str_lowest_type = undefined;
6175 n_lowest_rate = 10.0;
6176 foreach( str_index, n_slowdown_timeout
in self.a_n_slowdown_timeouts )
6180 if ( n_slowdown_timeout <= n_time )
6182 self.a_n_slowdown_timeouts[ str_index ] = undefined;
6186 if ( level.a_s_slowdowns[ str_index ].n_rate < n_lowest_rate )
6188 str_lowest_type = str_index;
6189 n_lowest_rate = level.a_s_slowdowns[ str_index ].n_rate;
6193 if ( isdefined ( str_lowest_type ) )
6196 self ASMSetAnimationRate( n_lowest_rate );
6198 n_duration =
self.a_n_slowdown_timeouts[ str_lowest_type ] - n_time;
6202 self.a_n_slowdown_timeouts[ str_lowest_type ] = undefined;
6207 self ASMSetAnimationRate( 1.0 );
6215 a_players= ArrayCopy( level.activeplayers );
6218 ArrayRemoveValue( a_players,
e_target );
6220 e_closest_player = ArrayGetClosest(
e_target.origin, a_players );
6222 return e_closest_player;
6230 orientation =
self getPlayerAngles();
6231 v_forward = anglesToForward( orientation );
6232 v_to_facee = facee.origin -
self.origin;
6236 v_forward_computed = ( v_forward[0], v_forward[1], 0 );
6237 v_to_facee_computed = ( v_to_facee[0], v_to_facee[1], 0 );
6241 v_forward_computed = v_forward;
6242 v_to_facee_computed = v_to_facee;
6245 v_unit_forward_computed = VectorNormalize( v_forward_computed );
6246 v_unit_to_facee_computed = VectorNormalize( v_to_facee_computed );
6248 dotProduct = VectorDot( v_unit_forward_computed, v_unit_to_facee_computed );
6249 return ( dotProduct > requiredDot );
6255 return ( level.players.size == 1 && GetDvarInt(
"zm_private_rankedmatch", 0 ) );