1 #insert scripts\shared\shared.gsh;
3 #using scripts\codescripts\struct;
5 #using scripts\shared\array_shared;
6 #using scripts\shared\flag_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
10 #using scripts\shared\ai\zombie_utility;
12 #using scripts\zm\_zm_utility;
13 #using scripts\zm\_zm_zonemgr;
16 #namespace giant_cleanup;
18 #define TRACKING_INNER_DIST 2000
19 #define TRACKING_OUTER_DIST 2200
20 #define TOO_HIGH_DIST 800
22 #define N_CLEANUP_INTERVAL_MIN 3000 // Minimum time in msec for cleanup checks
23 #define N_CLEANUP_AGE_MIN 5000 // You must be this old (in msec) before considering for cleanup
24 #define N_CLEANUP_AGE_TIMEOUT 45000 // If you are at least this old (in msec) then allow cleanup no matter what
25 #define N_CLEANUP_EVALS_PER_FRAME_MAX 1 // Maximum number of AI to process per frame
26 #define N_CLEANUP_FOV_COS 0.766 // cos(40) == 80 degree FOV
27 #define N_CLEANUP_DIST_SQ_MIN_AGGRESSIVE 189225 // Minimum distance squared. 435^2
28 #define N_CLEANUP_DIST_SQ_MIN 250000 // Minimum distance squared. 500^2
29 #define N_CLEANUP_DIST_SQ_ROUND_END 2250000 // Minimum distance squared. 1500^2
39 level.n_cleanups_processed_this_frame = 0;
49 level notify(
"pump_distance_check" );
62 if ( n_time < n_next_eval )
68 if( isdefined(level.n_cleanup_manager_restart_time) )
70 n_current_time = gettime() /
N_MSEC;
71 n_delta_time = n_current_time - level.n_cleanup_manager_restart_time;
72 if( n_delta_time < 0 )
76 level.n_cleanup_manager_restart_time = undefined;
80 n_round_time = ( n_time - level.round_start_time ) /
N_MSEC;
81 if( (level.round_number <= 5) && (n_round_time < 30) )
85 else if( (level.round_number > 5) && (n_round_time < 20) )
92 n_override_cleanup_dist_sq = undefined;
101 a_ai_enemies = GetAITeamArray(
"axis" );
102 foreach( ai_enemy
in a_ai_enemies )
106 level.n_cleanups_processed_this_frame = 0;
120 if ( !IsAlive(
self ) )
125 if (
self.b_ignore_cleanup ===
true )
130 n_time_alive = GetTime() -
self.spawn_time;
142 self.script_string !==
"find_flesh" &&
143 self.completed_emerging_into_playable_area !==
true )
151 level.n_cleanups_processed_this_frame++;
153 if ( !b_in_active_zone )
156 n_dist_sq_min = 10000000;
157 e_closest_player = level.activeplayers[0];
158 foreach( player
in level.activeplayers )
160 n_dist_sq = DistanceSquared(
self.origin, player.origin );
161 if ( n_dist_sq < n_dist_sq_min )
163 n_dist_sq_min = n_dist_sq;
164 e_closest_player = player;
169 if( isdefined(n_override_cleanup_dist) )
171 n_cleanup_dist_sq = n_override_cleanup_dist;
184 if ( n_dist_sq_min >= n_cleanup_dist_sq )
201 if(
IS_TRUE(
self.in_the_ground ) )
206 foreach ( player
in level.players )
209 if( player.sessionstate ==
"spectator" )
221 if ( !
IS_TRUE(
self.exclude_cleanup_adding_to_total ) )
223 level.zombie_total++;
224 level.zombie_respawns++;
226 if(
self.health <
self.maxhealth)
228 if ( !isdefined( level.a_zombie_respawn_health[
self.archetype ] ) )
230 level.a_zombie_respawn_health[
self.archetype ] = [];
232 ARRAY_ADD( level.a_zombie_respawn_health[
self.archetype ],
self.health);
240 if ( isdefined(
self ) )
256 v_player_angles = player GetPlayerAngles();
257 v_player_forward = AnglesToForward( v_player_angles );
259 v_player_to_self =
self.origin - player GetOrigin();
260 v_player_to_self = VectorNormalize( v_player_to_self );
262 n_dot = VectorDot( v_player_forward, v_player_to_self );
276 v_player_angles = player GetPlayerAngles();
277 v_player_forward = AnglesToForward( v_player_angles );
279 v_dir = player GetOrigin() -
self.origin;
281 n_dot = VectorDot( v_player_forward, v_dir );
297 self endon(
"death" );
300 str_zone =
self.zone_name;
303 if( !IsDefined( str_zone ) )
305 str_zone =
self.zone_name;
309 if ( IsDefined( str_zone ) )
328 a_adjacencies[ 0 ] = str_zone;
330 a_adjacent_zones = GetArrayKeys( level.zones[ str_zone ].adjacent_zones );
331 for ( i = 0; i < a_adjacent_zones.size; i++ )
333 if ( level.zones[ str_zone ].adjacent_zones[ a_adjacent_zones[ i ] ].is_connected )
335 ARRAY_ADD( a_adjacencies, a_adjacent_zones[ i ] );
339 return a_adjacencies;
345 a_wait_locations = [];
347 foreach ( zone
in a_zones )
349 a_wait_locations = ArrayCombine( a_wait_locations, level.zones[ zone ].a_loc_types[
"dog_location" ],
false,
false );
352 return a_wait_locations;
359 if ( !isdefined( a_wait_locations ) || a_wait_locations.size == 0 )
364 n_farthest_index = 0;
365 n_distance_farthest = 0;
366 for ( i = 0; i < a_wait_locations.size; i++ )
369 n_distance_sq = DistanceSquared(
self.origin, a_wait_locations[ i ].origin );
371 if ( n_distance_sq > n_distance_farthest )
373 n_distance_farthest = n_distance_sq;
374 n_farthest_index = i;
378 return a_wait_locations[ n_farthest_index ];
384 if( isdefined(level.zones[ zone ].a_loc_types[
"dog_location" ]) )
386 a_wait_locations = [];
387 a_wait_locations = ArrayCombine( a_wait_locations, level.zones[ zone ].a_loc_types[
"dog_location" ],
false,
false );
388 return a_wait_locations;
397 self endon(
"death" );
400 str_zone =
self.zone_name;
403 if( !IsDefined( str_zone ) )
405 str_zone =
self.zone_name;
408 if ( IsDefined( str_zone ) )
414 if( isdefined(a_wait_locations) )