#include maps/mp/zombies/_zm_audio; #include maps/mp/zombies/_zm_stats; #include maps/mp/gametypes_zm/_hud_message; #include maps/mp/zombies/_zm_equipment; #include maps/mp/zombies/_zm_powerups; #include maps/mp/zombies/_zm_power; #include maps/mp/zombies/_zm_weapons; #include maps/mp/zombies/_zm_laststand; #include maps/mp/zombies/_zm_server_throttle; #include maps/mp/animscripts/zm_utility; #include maps/mp/animscripts/zm_run; #include common_scripts/utility; #include maps/mp/_utility; init_utility() //checked matches cerberus output { //begin debug code level.custom_zm_utility_loaded = 1; maps/mp/zombies/_zm_bot::init(); if ( !isDefined( level.debugLogging_zm_utility ) ) { level.debugLogging_zm_utility = 0; } //end debug code } is_classic() //checked matches cerberus output { var = getDvar( "ui_zm_gamemodegroup" ); if ( var == "zclassic" ) { return 1; } return 0; } is_standard() //checked matches cerberus output { var = getDvar( "ui_gametype" ); if ( var == "zstandard" ) { return 1; } return 0; } convertsecondstomilliseconds( seconds ) //checked matches cerberus output { return seconds * 1000; } is_player() //checked does not match cerberus output changed at own discretion { if ( !isplayer( self ) ) { return 0; } if ( isDefined( self.pers ) && isDefined( self.pers[ "isBot" ] ) && self.pers[ "isBot" ] ) { return 0; } return 1; } lerp( chunk ) //checked matches cerberus output { link = spawn( "script_origin", self getorigin() ); link.angles = self.first_node.angles; self linkto( link ); link rotateto( self.first_node.angles, level._contextual_grab_lerp_time ); link moveto( self.attacking_spot, level._contextual_grab_lerp_time ); link waittill_multiple( "rotatedone", "movedone" ); self unlink(); link delete(); return; } clear_mature_blood() //checked changed to match cerberus output { blood_patch = getentarray( "mature_blood", "targetname" ); if ( is_mature() ) { return; } if ( isDefined( blood_patch ) ) { for ( i = 0; i < blood_patch.size; i++ ) { blood_patch[ i ] delete(); } } } recalc_zombie_array() //checked matches cerberus output { } clear_all_corpses() //checked changed to match cerberus output { corpse_array = getcorpsearray(); for ( i = 0; i < corpse_array.size; i++ ) { if ( isDefined( corpse_array[ i ] ) ) { corpse_array[ i ] delete(); } } } get_current_corpse_count() //checked matches cerberus output { corpse_array = getcorpsearray(); if ( isDefined( corpse_array ) ) { return corpse_array.size; } return 0; } get_current_actor_count() //checked matches cerberus output { count = 0; actors = getaispeciesarray( level.zombie_team, "all" ); if ( isDefined( actors ) ) { count += actors.size; } count += get_current_corpse_count(); return count; } get_current_zombie_count() //checked matches cerberus output { enemies = get_round_enemy_array(); return enemies.size; } get_round_enemy_array() //checked partially changed to match cerberus output//did not change while loop to for loop to prevent infinite continue loop bug { enemies = []; valid_enemies = []; enemies = getaispeciesarray( level.zombie_team, "all" ); i = 0; while ( i < enemies.size ) { if ( isDefined( enemies[ i ].ignore_enemy_count ) && enemies[ i ].ignore_enemy_count ) { i++; continue; } valid_enemies[ valid_enemies.size ] = enemies[ i ]; i++; } return valid_enemies; } init_zombie_run_cycle() //checked matches cerberus output { if ( isDefined( level.speed_change_round ) ) { if ( level.round_number >= level.speed_change_round ) { speed_percent = 0.2 + ( ( level.round_number - level.speed_change_round ) * 0.2 ); speed_percent = min( speed_percent, 1 ); change_round_max = int( level.speed_change_max * speed_percent ); change_left = change_round_max - level.speed_change_num; if ( change_left == 0 ) { self set_zombie_run_cycle(); return; } change_speed = randomint( 100 ); if ( change_speed > 80 ) { self change_zombie_run_cycle(); return; } zombie_count = get_current_zombie_count(); zombie_left = level.zombie_ai_limit - zombie_count; if ( zombie_left == change_left ) { self change_zombie_run_cycle(); return; } } } self set_zombie_run_cycle(); } change_zombie_run_cycle() //checked matches cerberus output { level.speed_change_num++; if ( level.gamedifficulty == 0 ) { self set_zombie_run_cycle( "sprint" ); } else { self set_zombie_run_cycle( "walk" ); } self thread speed_change_watcher(); } speed_change_watcher() //checked matches cerberus output { self waittill( "death" ); if ( level.speed_change_num > 0 ) { level.speed_change_num--; } } set_zombie_run_cycle( new_move_speed ) //checked matches cerberus output { self.zombie_move_speed_original = self.zombie_move_speed; if ( isDefined( new_move_speed ) ) { self.zombie_move_speed = new_move_speed; } else if ( level.gamedifficulty == 0 ) { self set_run_speed_easy(); } else { self set_run_speed(); } self maps/mp/animscripts/zm_run::needsupdate(); self.deathanim = self maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_death" ); } set_run_speed() //checked matches cerberus output { rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 35 ); if ( rand <= 35 ) { self.zombie_move_speed = "walk"; } else if ( rand <= 70 ) { self.zombie_move_speed = "run"; } else { self.zombie_move_speed = "sprint"; } } set_run_speed_easy() //checked matches cerberus output { rand = randomintrange( level.zombie_move_speed, level.zombie_move_speed + 25 ); if ( rand <= 35 ) { self.zombie_move_speed = "walk"; } else { self.zombie_move_speed = "run"; } } spawn_zombie( spawner, target_name, spawn_point, round_number ) //checked matches cerberus output { if ( !isDefined( spawner ) ) { /* /# println( "ZM >> spawn_zombie - NO SPAWNER DEFINED" ); #/ */ return undefined; } while ( getfreeactorcount() < 1 ) { wait 0.05; } spawner.script_moveoverride = 1; if ( isDefined( spawner.script_forcespawn ) && spawner.script_forcespawn ) { guy = spawner spawnactor(); if ( isDefined( level.giveextrazombies ) ) { guy [[ level.giveextrazombies ]](); } guy enableaimassist(); if ( isDefined( round_number ) ) { guy._starting_round_number = round_number; } guy.aiteam = level.zombie_team; guy clearentityowner(); level.zombiemeleeplayercounter = 0; guy thread run_spawn_functions(); guy forceteleport( spawner.origin ); guy show(); } spawner.count = 666; if ( !spawn_failed( guy ) ) { if ( isDefined( target_name ) ) { guy.targetname = target_name; } return guy; } return undefined; } run_spawn_functions() //checked changed to match cerberus output { self endon( "death" ); waittillframeend; for ( i = 0; i < level.spawn_funcs[ self.team ].size; i++ ) { func = level.spawn_funcs[ self.team ][ i ]; single_thread( self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ], func[ "param5" ] ); } if ( isDefined( self.spawn_funcs ) ) { for ( i = 0; i < self.spawn_funcs.size; i++ ) { func = self.spawn_funcs[ i ]; single_thread( self, func[ "function" ], func[ "param1" ], func[ "param2" ], func[ "param3" ], func[ "param4" ] ); } /* /# self.saved_spawn_functions = self.spawn_funcs; #/ */ self.spawn_funcs = undefined; /* /# self.spawn_funcs = self.saved_spawn_functions; self.saved_spawn_functions = undefined; #/ */ self.spawn_funcs = undefined; } } create_simple_hud( client, team ) //checked matches cerberus output { if ( isDefined( team ) ) { hud = newteamhudelem( team ); hud.team = team; } else if ( isDefined( client ) ) { hud = newclienthudelem( client ); } else { hud = newhudelem(); } level.hudelem_count++; hud.foreground = 1; hud.sort = 1; hud.hidewheninmenu = 0; return hud; } destroy_hud() //checked matches cerberus output { level.hudelem_count--; self destroy(); } all_chunks_intact( barrier, barrier_chunks ) //checked changed to match cerberus output { if ( isDefined( barrier.zbarrier ) ) { pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) { return 0; } } for ( i = 0; i < barrier_chunks.size; i++ ) { if ( barrier_chunks[ i ] get_chunk_state() != "repaired" ) { return 0; } } return 1; } no_valid_repairable_boards( barrier, barrier_chunks ) //checked changed to match cerberus output { if ( isDefined( barrier.zbarrier ) ) { pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); if ( pieces.size ) { return 0; } } for ( i = 0; i < barrier_chunks.size; i++ ) { if ( barrier_chunks[ i ] get_chunk_state() == "destroyed" ) { return 0; } } return 1; } is_survival() //checked matches cerberus output { var = getDvar( "ui_zm_gamemodegroup" ); if ( var == "zsurvival" ) { return 1; } return 0; } is_encounter() //checked matches cerberus output { if ( isDefined( level._is_encounter ) && level._is_encounter ) { return 1; } var = getDvar( "ui_zm_gamemodegroup" ); if ( var == "zencounter" ) { level._is_encounter = 1; return 1; } return 0; } all_chunks_destroyed( barrier, barrier_chunks ) //checked changed to match cerberus output { if ( isDefined( barrier.zbarrier ) ) { pieces = arraycombine( barrier.zbarrier getzbarrierpieceindicesinstate( "open" ), barrier.zbarrier getzbarrierpieceindicesinstate( "opening" ), 1, 0 ); if ( pieces.size != barrier.zbarrier getnumzbarrierpieces() ) { return 0; } } if ( isDefined( barrier_chunks ) ) { /* /# assert( isDefined( barrier_chunks ), "_zm_utility::all_chunks_destroyed - Barrier chunks undefined" ); #/ */ for ( i = 0; i < barrier_chunks.size; i++ ) { if ( barrier_chunks[ i ] get_chunk_state() != "destroyed" ) { return 0; } } } return 1; } check_point_in_playable_area( origin ) //checked changed to match cerberus output { playable_area = getentarray( "player_volume", "script_noteworthy" ); check_model = spawn( "script_model", origin + vectorScale( ( 0, 0, 1 ), 40 ) ); valid_point = 0; for ( i = 0; i < playable_area.size; i++ ) { if ( check_model istouching( playable_area[ i ] ) ) { valid_point = 1; } } check_model delete(); return valid_point; } check_point_in_enabled_zone( origin, zone_is_active, player_zones ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite continue bug { if ( !isDefined( player_zones ) ) { player_zones = getentarray( "player_volume", "script_noteworthy" ); } if ( !isDefined( level.zones ) || !isDefined( player_zones ) ) { return 1; } scr_org = spawn( "script_origin", origin + vectorScale( ( 0, 0, 1 ), 40 ) ); one_valid_zone = 0; i = 0; while ( i < player_zones.size ) { if ( scr_org istouching( player_zones[ i ] ) ) { zone = level.zones[ player_zones[ i ].targetname ]; if ( isDefined( zone ) && isDefined( zone.is_enabled ) && zone.is_enabled ) { if ( isDefined( zone_is_active ) && zone_is_active == 1 && isDefined( zone.is_active ) && !zone.is_active ) { i++; continue; } one_valid_zone = 1; break; } } i++; } scr_org delete(); return one_valid_zone; } round_up_to_ten( score ) //checked matches cerberus output { new_score = score - score % 10; if ( new_score < score ) { new_score += 10; } return new_score; } round_up_score( score, value ) //checked matches cerberus output { score = int( score ); new_score = score - score % value; if ( new_score < score ) { new_score += value; } return new_score; } random_tan() //checked matches cerberus output { rand = randomint( 100 ); if ( isDefined( level.char_percent_override ) ) { percentnotcharred = level.char_percent_override; } else { percentnotcharred = 65; } } places_before_decimal( num ) //checked matches cerberus output { abs_num = abs( num ); count = 0; while ( 1 ) { abs_num *= 0.1; count += 1; if ( abs_num < 1 ) { return count; } } } create_zombie_point_of_interest( attract_dist, num_attractors, added_poi_value, start_turned_on, initial_attract_func, arrival_attract_func, poi_team ) //checked matches cerberus output { if ( !isDefined( added_poi_value ) ) { self.added_poi_value = 0; } else { self.added_poi_value = added_poi_value; } if ( !isDefined( start_turned_on ) ) { start_turned_on = 1; } self.script_noteworthy = "zombie_poi"; self.poi_active = start_turned_on; if ( isDefined( attract_dist ) ) { self.poi_radius = attract_dist * attract_dist; } else { self.poi_radius = undefined; } self.num_poi_attracts = num_attractors; self.attract_to_origin = 1; self.attractor_array = []; self.initial_attract_func = undefined; self.arrival_attract_func = undefined; if ( isDefined( poi_team ) ) { self._team = poi_team; } if ( isDefined( initial_attract_func ) ) { self.initial_attract_func = initial_attract_func; } if ( isDefined( arrival_attract_func ) ) { self.arrival_attract_func = arrival_attract_func; } } create_zombie_point_of_interest_attractor_positions( num_attract_dists, diff_per_dist, attractor_width ) //checked partially changed to match cerberus output //did not change while loop to for loop to prevent infinite loop bug with continue { self endon( "death" ); forward = ( 0, 1, 0 ); if ( !isDefined( self.num_poi_attracts ) || isDefined( self.script_noteworthy ) && self.script_noteworthy != "zombie_poi" ) { return; } if ( !isDefined( num_attract_dists ) ) { num_attract_dists = 4; } if ( !isDefined( diff_per_dist ) ) { diff_per_dist = 45; } if ( !isDefined( attractor_width ) ) { attractor_width = 45; } self.attract_to_origin = 0; self.num_attract_dists = num_attract_dists; self.last_index = []; for ( i = 0; i < num_attract_dists; i++ ) { self.last_index[ i ] = -1; } self.attract_dists = []; for ( i = 0; i < self.num_attract_dists; i++ ) { self.attract_dists[ i ] = diff_per_dist * ( i + 1 ); } max_positions = []; for ( i = 0; i < self.num_attract_dists; i++ ) { max_positions[ i ] = int( ( 6.28 * self.attract_dists[ i ] ) / attractor_width ); } num_attracts_per_dist = self.num_poi_attracts / self.num_attract_dists; self.max_attractor_dist = self.attract_dists[ self.attract_dists.size - 1 ] * 1.1; diff = 0; actual_num_positions = []; i = 0; while ( i < self.num_attract_dists ) { if ( num_attracts_per_dist > ( max_positions[ i ] + diff ) ) { actual_num_positions[ i ] = max_positions[ i ]; diff += num_attracts_per_dist - max_positions[ i ]; i++; continue; } actual_num_positions[ i ] = num_attracts_per_dist + diff; diff = 0; i++; } self.attractor_positions = []; failed = 0; angle_offset = 0; prev_last_index = -1; for ( j = 0; j < 4; j++) { if ( ( actual_num_positions[ j ] + failed ) < max_positions[ j ] ) { actual_num_positions[ j ] += failed; failed = 0; } else if ( actual_num_positions[ j ] < max_positions[ j ] ) { actual_num_positions[ j ] = max_positions[ j ]; failed = max_positions[ j ] - actual_num_positions[ j ]; } failed += self generated_radius_attract_positions( forward, angle_offset, actual_num_positions[ j ], self.attract_dists[ j ] ); angle_offset += 15; self.last_index[ j ] = int( ( actual_num_positions[ j ] - failed ) + prev_last_index ); prev_last_index = self.last_index[ j ]; } self notify( "attractor_positions_generated" ); level notify( "attractor_positions_generated" ); } generated_radius_attract_positions( forward, offset, num_positions, attract_radius ) //checked partially changed to match cerberus output //did not change while loop to for loop because it doesn't make sense as a for loop { self endon( "death" ); epsilon = 0.1; failed = 0; degs_per_pos = 360 / num_positions; i = offset; while ( i < 360 + offset ) { altforward = forward * attract_radius; rotated_forward = ( ( cos( i ) * altforward[ 0 ] ) - ( sin( i ) * altforward[ 1 ] ), ( sin( i ) * altforward[ 0 ] ) + ( cos( i ) * altforward[ 1 ] ), altforward[ 2 ] ); if ( isDefined( level.poi_positioning_func ) ) { pos = [[ level.poi_positioning_func ]]( self.origin, rotated_forward ); } else if ( isDefined( level.use_alternate_poi_positioning ) && level.use_alternate_poi_positioning ) { pos = maps/mp/zombies/_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorScale( ( 0, 0, 1 ), 10 ) ); } else { pos = maps/mp/zombies/_zm_server_throttle::server_safe_ground_trace( "poi_trace", 10, self.origin + rotated_forward + vectorScale( ( 0, 0, 1 ), 100 ) ); } if ( !isDefined( pos ) ) { failed++; } else if ( isDefined( level.use_alternate_poi_positioning ) && level.use_alternate_poi_positioning ) { if ( isDefined( self ) && isDefined( self.origin ) ) { if ( self.origin[ 2 ] >= ( pos[ 2 ] - epsilon ) && ( self.origin[ 2 ] - pos[ 2 ] ) <= 150 ) { pos_array = []; pos_array[ 0 ] = pos; pos_array[ 1 ] = self; self.attractor_positions[ self.attractor_positions.size ] = pos_array; } } else { failed++; } } else if ( abs( pos[ 2 ] - self.origin[ 2 ] ) < 60 ) { pos_array = []; pos_array[ 0 ] = pos; pos_array[ 1 ] = self; self.attractor_positions[ self.attractor_positions.size ] = pos_array; } else { failed++; } i += degs_per_pos; } return failed; } debug_draw_attractor_positions() //checked changed to match cerberus output { /* /# while ( 1 ) { while ( !isDefined( self.attractor_positions ) ) { wait 0.05; } for ( i = 0; i < self.attractor_positions.size; i++ ) { line( self.origin, self.attractor_positions[ i ][ 0 ], ( 1, 0, 0 ), 1, 1 ); } wait 0.05; if ( !isDefined( self ) ) { return; } #/ } */ } get_zombie_point_of_interest( origin, poi_array ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues cause infinite loops in for loops { if ( isDefined( self.ignore_all_poi ) && self.ignore_all_poi ) { return undefined; } curr_radius = undefined; if ( isDefined( poi_array ) ) { ent_array = poi_array; } else { ent_array = getentarray( "zombie_poi", "script_noteworthy" ); } best_poi = undefined; position = undefined; best_dist = 100000000; i = 0; while ( i < ent_array.size ) { if ( !isDefined( ent_array[ i ].poi_active ) || !ent_array[ i ].poi_active ) { i++; continue; } if ( isDefined( self.ignore_poi_targetname ) && self.ignore_poi_targetname.size > 0 ) { if ( isDefined( ent_array[ i ].targetname ) ) { ignore = 0; for ( j = 0; j < self.ignore_poi_targetname.size; j++ ) { if ( ent_array[ i ].targetname == self.ignore_poi_targetname[ j ] ) { ignore = 1; break; } } if ( ignore ) { i++; continue; } } } if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) { ignore = 0; for ( j = 0; j < self.ignore_poi.size; j++ ) { if ( self.ignore_poi[ j ] == ent_array[ i ] ) { ignore = 1; break; } } if ( ignore ) { i++; continue; } } dist = distancesquared( origin, ent_array[ i ].origin ); dist -= ent_array[ i ].added_poi_value; if ( isDefined( ent_array[ i ].poi_radius ) ) { curr_radius = ent_array[ i ].poi_radius; } if ( isDefined( curr_radius ) && dist < curr_radius && dist < best_dist && ent_array[ i ] can_attract( self ) ) { best_poi = ent_array[ i ]; best_dist = dist; } i++; } if ( isDefined( best_poi ) ) { if ( isDefined( best_poi._team ) ) { if ( isDefined( self._race_team ) && self._race_team != best_poi._team ) { return undefined; } } if ( isDefined( best_poi._new_ground_trace ) && best_poi._new_ground_trace ) { position = []; position[ 0 ] = groundpos_ignore_water_new( best_poi.origin + vectorScale( ( 0, 0, 1 ), 100 ) ); position[ 1 ] = self; } else if ( isDefined( best_poi.attract_to_origin ) && best_poi.attract_to_origin ) { position = []; position[ 0 ] = groundpos( best_poi.origin + vectorScale( ( 0, 0, 1 ), 100 ) ); position[ 1 ] = self; } else { position = self add_poi_attractor( best_poi ); } if ( isDefined( best_poi.initial_attract_func ) ) { self thread [[ best_poi.initial_attract_func ]]( best_poi ); } if ( isDefined( best_poi.arrival_attract_func ) ) { self thread [[ best_poi.arrival_attract_func ]]( best_poi ); } } return position; } activate_zombie_point_of_interest() //checked matches cerberus output { if ( self.script_noteworthy != "zombie_poi" ) { return; } self.poi_active = 1; } deactivate_zombie_point_of_interest() //checked changed to match cerberus output { if ( self.script_noteworthy != "zombie_poi" ) { return; } for ( i = 0; i < self.attractor_array.size; i++ ) { self.attractor_array[ i ] notify( "kill_poi" ); } self.attractor_array = []; self.claimed_attractor_positions = []; self.poi_active = 0; } assign_zombie_point_of_interest( origin, poi ) //checked matches cerberus output { position = undefined; doremovalthread = 0; if ( isDefined( poi ) && poi can_attract( self ) ) { if ( !isDefined( poi.attractor_array ) || isDefined( poi.attractor_array ) && array_check_for_dupes( poi.attractor_array, self ) ) { doremovalthread = 1; } position = self add_poi_attractor( poi ); if ( isDefined( position ) && doremovalthread && !array_check_for_dupes( poi.attractor_array, self ) ) { self thread update_on_poi_removal( poi ); } } return position; } remove_poi_attractor( zombie_poi ) //checked changed to match cerberus output { if ( !isDefined( zombie_poi.attractor_array ) ) { return; } for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) { if ( zombie_poi.attractor_array[ i ] == self ) { self notify( "kill_poi" ); arrayremovevalue( zombie_poi.attractor_array, zombie_poi.attractor_array[ i ] ); arrayremovevalue( zombie_poi.claimed_attractor_positions, zombie_poi.claimed_attractor_positions[ i ] ); } } } array_check_for_dupes_using_compare( array, single, is_equal_fn ) //checked changed to match cerberus output { for ( i = 0; i < array.size; i++ ) { if ( [[ is_equal_fn ]]( array[ i ], single ) ) { return 0; } } return 1; } poi_locations_equal( loc1, loc2 ) //checked matches cerberus output { return loc1[ 0 ] == loc2[ 0 ]; } add_poi_attractor( zombie_poi ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { if ( !isDefined( zombie_poi ) ) { return; } if ( !isDefined( zombie_poi.attractor_array ) ) { zombie_poi.attractor_array = []; } if ( array_check_for_dupes( zombie_poi.attractor_array, self ) ) { if ( !isDefined( zombie_poi.claimed_attractor_positions ) ) { zombie_poi.claimed_attractor_positions = []; } if ( !isDefined( zombie_poi.attractor_positions ) || zombie_poi.attractor_positions.size <= 0 ) { return undefined; } start = -1; end = -1; last_index = -1; for ( i = 0; i < 4; i++ ) { if ( zombie_poi.claimed_attractor_positions.size < zombie_poi.last_index[ i ] ) { start = last_index + 1; end = zombie_poi.last_index[ i ]; break; } last_index = zombie_poi.last_index[ i ]; } best_dist = 100000000; best_pos = undefined; if ( start < 0 ) { start = 0; } if ( end < 0 ) { return undefined; } i = int( start ); while ( i <= int( end ) ) { if ( !isDefined( zombie_poi.attractor_positions[ i ] ) ) { i++; continue; } if ( array_check_for_dupes_using_compare( zombie_poi.claimed_attractor_positions, zombie_poi.attractor_positions[ i ], ::poi_locations_equal ) ) { if ( isDefined( zombie_poi.attractor_positions[ i ][ 0 ] ) && isDefined( self.origin ) ) { dist = distancesquared( zombie_poi.attractor_positions[ i ][ 0 ], self.origin ); if ( dist < best_dist || !isDefined( best_pos ) ) { best_dist = dist; best_pos = zombie_poi.attractor_positions[ i ]; } } } i++; } if ( !isDefined( best_pos ) ) { return undefined; } zombie_poi.attractor_array[ zombie_poi.attractor_array.size ] = self; self thread update_poi_on_death( zombie_poi ); zombie_poi.claimed_attractor_positions[ zombie_poi.claimed_attractor_positions.size ] = best_pos; return best_pos; } for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) { if ( zombie_poi.attractor_array[ i ] == self ) { if ( isDefined( zombie_poi.claimed_attractor_positions ) && isDefined( zombie_poi.claimed_attractor_positions[ i ] ) ) { return zombie_poi.claimed_attractor_positions[ i ]; } } } return undefined; } can_attract( attractor ) //checked matches cerberus output { if ( !isDefined( self.attractor_array ) ) { self.attractor_array = []; } if ( isDefined( self.attracted_array ) && !isinarray( self.attracted_array, attractor ) ) { return 0; } if ( !array_check_for_dupes( self.attractor_array, attractor ) ) { return 1; } if ( isDefined( self.num_poi_attracts ) && self.attractor_array.size >= self.num_poi_attracts ) { return 0; } return 1; } update_poi_on_death( zombie_poi ) //checked matches cerberus output { self endon( "kill_poi" ); self waittill( "death" ); self remove_poi_attractor( zombie_poi ); } update_on_poi_removal( zombie_poi ) //checked changed to match cerberus output { zombie_poi waittill( "death" ); if ( !isDefined( zombie_poi.attractor_array ) ) { return; } for ( i = 0; i < zombie_poi.attractor_array.size; i++ ) { if ( zombie_poi.attractor_array[ i ] == self ) { arrayremoveindex( zombie_poi.attractor_array, i ); arrayremoveindex( zombie_poi.claimed_attractor_positions, i ); } } } invalidate_attractor_pos( attractor_pos, zombie ) //checked changed to match cerberus output { if ( !isDefined( self ) || !isDefined( attractor_pos ) ) { wait 0.1; return undefined; } if ( isDefined( self.attractor_positions ) && !array_check_for_dupes_using_compare( self.attractor_positions, attractor_pos, ::poi_locations_equal ) ) { index = 0; for ( i = 0; i < self.attractor_positions.size; i++ ) { if ( poi_locations_equal( self.attractor_positions[ i ], attractor_pos ) ) { index = i; } } for ( i = 0; i < self.last_index.size; i++ ) { if ( index <= self.last_index[ i ] ) { self.last_index[ i ]--; } } arrayremovevalue( self.attractor_array, zombie ); arrayremovevalue( self.attractor_positions, attractor_pos ); for ( i = 0; i < self.claimed_attractor_positions.size; i++ ) { if ( self.claimed_attractor_positions[ i ][ 0 ] == attractor_pos[ 0 ] ) { arrayremovevalue( self.claimed_attractor_positions, self.claimed_attractor_positions[ i ] ); } } } else { wait 0.1; } return get_zombie_point_of_interest( zombie.origin ); } remove_poi_from_ignore_list( poi ) //checked changed to match cerberus output { if ( isDefined( self.ignore_poi ) && self.ignore_poi.size > 0 ) { for ( i = 0; i < self.ignore_poi.size; i++ ) { if ( self.ignore_poi[ i ] == poi ) { arrayremovevalue( self.ignore_poi, self.ignore_poi[ i ] ); return; } } } } add_poi_to_ignore_list( poi ) //checked changed to match cerberus output { if ( !isDefined( self.ignore_poi ) ) { self.ignore_poi = []; } add_poi = 1; if ( self.ignore_poi.size > 0 ) { for ( i = 0; i < self.ignore_poi.size; i++ ) { if ( self.ignore_poi[ i ] == poi ) { add_poi = 0; break; } } } else if ( add_poi ) { self.ignore_poi[ self.ignore_poi.size ] = poi; } } default_validate_enemy_path_length( player ) //checked matches cerberus output { max_dist = 1296; d = distancesquared( self.origin, player.origin ); if ( d <= max_dist ) { return 1; } return 0; } get_path_length_to_enemy( enemy ) //checked matches cerberus output { path_length = self calcpathlength( enemy.origin ); return path_length; } get_closest_player_using_paths( origin, players ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { min_length_to_player = 9999999; n_2d_distance_squared = 9999999; player_to_return = undefined; i = 0; while ( i < players.size ) { player = players[ i ]; length_to_player = get_path_length_to_enemy( player ); if ( isDefined( level.validate_enemy_path_length ) ) { if ( length_to_player == 0 ) { valid = self thread [[ level.validate_enemy_path_length ]]( player ); if ( !valid ) { i++; continue; } } } if ( length_to_player < min_length_to_player ) { min_length_to_player = length_to_player; player_to_return = player; n_2d_distance_squared = distance2dsquared( self.origin, player.origin ); i++; continue; } if ( length_to_player == min_length_to_player && length_to_player <= 5 ) { n_new_distance = distance2dsquared( self.origin, player.origin ); if ( n_new_distance < n_2d_distance_squared ) { min_length_to_player = length_to_player; player_to_return = player; n_2d_distance_squared = n_new_distance; } } i++; } return player_to_return; } get_closest_valid_player( origin, ignore_player ) //checked changed to match cerberus output { valid_player_found = 0; players = get_players(); if ( isDefined( level._zombie_using_humangun ) && level._zombie_using_humangun ) { players = arraycombine( players, level._zombie_human_array, 0, 0 ); } if ( isDefined( ignore_player ) ) { for ( i = 0; i < ignore_player.size; i++ ) { arrayremovevalue( players, ignore_player[ i ] ); } } done = 0; while ( players.size && !done ) { done = 1; for ( i = 0; i < players.size; i++ ) { player = players[ i ]; if ( !is_player_valid( player, 1 ) ) { arrayremovevalue( players, player ); done = 0; break; } } } if ( players.size == 0 ) { return undefined; } while ( !valid_player_found ) { if ( isDefined( self.closest_player_override ) ) { player = [[ self.closest_player_override ]]( origin, players ); } else if ( isDefined( level.closest_player_override ) ) { player = [[ level.closest_player_override ]]( origin, players ); } else if ( isDefined( level.calc_closest_player_using_paths ) && level.calc_closest_player_using_paths ) { player = get_closest_player_using_paths( origin, players ); } else { player = getclosest( origin, players ); } if ( !isDefined( player ) || players.size == 0 ) { return undefined; } if ( isDefined( level._zombie_using_humangun ) && level._zombie_using_humangun && isai( player ) ) { return player; } if ( !is_player_valid( player, 1 ) ) { arrayremovevalue( players, player ); if ( players.size == 0 ) { return undefined; } } return player; } } is_player_valid( player, checkignoremeflag, ignore_laststand_players ) //checked matches cerberus output { if ( !isDefined( player ) ) { return 0; } if ( !isalive( player ) ) { return 0; } if ( !isplayer( player ) ) { return 0; } if ( isDefined( player.is_zombie ) && player.is_zombie == 1 ) { return 0; } if ( player.sessionstate == "spectator" ) { return 0; } if ( player.sessionstate == "intermission" ) { return 0; } if ( isDefined( self.intermission ) && self.intermission ) { return 0; } if ( isDefined( ignore_laststand_players ) && !ignore_laststand_players ) { if ( player maps/mp/zombies/_zm_laststand::player_is_in_laststand() ) { return 0; } } if ( isDefined( checkignoremeflag ) && checkignoremeflag && player.ignoreme ) { return 0; } if ( isDefined( level.is_player_valid_override ) ) { return [[ level.is_player_valid_override ]]( player ); } return 1; } get_number_of_valid_players() //checked changed to match cerberus output { players = get_players(); num_player_valid = 0; for ( i = 0; i < players.size; i++ ) { if ( is_player_valid( players[ i ] ) ) { num_player_valid += 1; } } return num_player_valid; } in_revive_trigger() //checked changed to match cerberus output { if ( isDefined( self.rt_time ) && ( self.rt_time + 100 ) >= getTime() ) { return self.in_rt_cached; } self.rt_time = getTime(); players = level.players; for ( i = 0; i < players.size; i++ ) { current_player = players[ i ]; if ( isDefined( current_player ) && isDefined( current_player.revivetrigger ) && isalive( current_player ) ) { if ( self istouching( current_player.revivetrigger ) ) { self.in_rt_cached = 1; return 1; } } } self.in_rt_cached = 0; return 0; } get_closest_node( org, nodes ) //checked matches cerberus output { return getclosest( org, nodes ); } non_destroyed_bar_board_order( origin, chunks ) //checked partially changed to match cerberus output //did not change while loop with continue to for loop to prevent infinite continue loop bug { first_bars = []; first_bars1 = []; first_bars2 = []; i = 0; while ( i < chunks.size ) { if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "classic_boards" ) { if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "board" ) { return get_closest_2d( origin, chunks ); } else if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team != "bar_board_variant1" && chunks[ i ].script_team != "bar_board_variant2" || chunks[ i ].script_team == "bar_board_variant4" && chunks[ i ].script_team == "bar_board_variant5" ) { return undefined; } i++; continue; } if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "new_barricade" ) { if ( isDefined( chunks[ i ].script_parameters ) || chunks[ i ].script_parameters == "repair_board" && chunks[ i ].script_parameters == "barricade_vents" ) { return get_closest_2d( origin, chunks ); } } i++; } for ( i = 0; i < chunks.size; i++ ) { if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) { if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) { if ( isDefined( chunks[ i ].script_noteworthy ) ) { if ( chunks[ i ].script_noteworthy == "4" || chunks[ i ].script_noteworthy == "6" ) { first_bars[ first_bars.size ] = chunks[ i ]; } } } } } for ( i = 0; i < chunks.size; i++ ) { if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) { if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) { if ( !first_bars[ i ].destroyed ) { return first_bars[ i ]; } } } } for ( i = 0; i < chunks.size; i++ ) { if ( isDefined( chunks[ i ].script_team ) && chunks[ i ].script_team == "6_bars_bent" || chunks[ i ].script_team == "6_bars_prestine" ) { if ( isDefined( chunks[ i ].script_parameters ) && chunks[ i ].script_parameters == "bar" ) { if ( !chunks[ i ].destroyed ) { return get_closest_2d( origin, chunks ); } } } } } non_destroyed_grate_order( origin, chunks_grate ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { grate_order = []; grate_order1 = []; grate_order2 = []; grate_order3 = []; grate_order4 = []; grate_order5 = []; grate_order6 = []; if ( isDefined( chunks_grate ) ) { for ( i = 0; i < chunks_grate.size; i++ ) { if ( isDefined( chunks_grate[ i ].script_parameters ) && chunks_grate[ i ].script_parameters == "grate" ) { if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "1" ) { grate_order1[ grate_order1.size ] = chunks_grate[ i ]; } if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "2" ) { grate_order2[ grate_order2.size ] = chunks_grate[ i ]; } if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "3" ) { grate_order3[ grate_order3.size ] = chunks_grate[ i ]; } if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "4" ) { grate_order4[ grate_order4.size ] = chunks_grate[ i ]; } if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "5" ) { grate_order5[ grate_order5.size ] = chunks_grate[ i ]; } if ( isDefined( chunks_grate[ i ].script_noteworthy ) && chunks_grate[ i ].script_noteworthy == "6" ) { grate_order6[ grate_order6.size ] = chunks_grate[ i ]; } } } for ( i = 0; i < chunks_grate.size; i++ ) { if ( isDefined( chunks_grate[ i ].script_parameters ) && chunks_grate[ i ].script_parameters == "grate" ) { if ( isDefined( grate_order1[ i ] ) ) { if ( grate_order1[ i ].state == "repaired" ) { grate_order2[ i ] thread show_grate_pull(); return grate_order1[ i ]; } if ( grate_order2[ i ].state == "repaired" ) { /* /# iprintlnbold( " pull bar2 " ); #/ */ grate_order3[ i ] thread show_grate_pull(); return grate_order2[ i ]; } if ( grate_order3[ i ].state == "repaired" ) { /* /# iprintlnbold( " pull bar3 " ); #/ */ grate_order4[ i ] thread show_grate_pull(); return grate_order3[ i ]; } if ( grate_order4[ i ].state == "repaired" ) { /* /# iprintlnbold( " pull bar4 " ); #/ */ grate_order5[ i ] thread show_grate_pull(); return grate_order4[ i ]; } if ( grate_order5[ i ].state == "repaired" ) { /* /# iprintlnbold( " pull bar5 " ); #/ */ grate_order6[ i ] thread show_grate_pull(); return grate_order5[ i ]; } if ( grate_order6[ i ].state == "repaired" ) { return grate_order6[ i ]; } } } } } } non_destroyed_variant1_order( origin, chunks_variant1 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { variant1_order = []; variant1_order1 = []; variant1_order2 = []; variant1_order3 = []; variant1_order4 = []; variant1_order5 = []; variant1_order6 = []; if ( isDefined( chunks_variant1 ) ) { for ( i = 0; i < chunks_variant1.size; i++ ) { if ( isDefined( chunks_variant1[ i ].script_team ) && chunks_variant1[ i ].script_team == "bar_board_variant1" ) { if ( isDefined( chunks_variant1[ i ].script_noteworthy ) ) { if ( chunks_variant1[ i ].script_noteworthy == "1" ) { variant1_order1[ variant1_order1.size ] = chunks_variant1[ i ]; } if ( chunks_variant1[ i ].script_noteworthy == "2" ) { variant1_order2[ variant1_order2.size ] = chunks_variant1[ i ]; } if ( chunks_variant1[ i ].script_noteworthy == "3" ) { variant1_order3[ variant1_order3.size ] = chunks_variant1[ i ]; } if ( chunks_variant1[ i ].script_noteworthy == "4" ) { variant1_order4[ variant1_order4.size ] = chunks_variant1[ i ]; } if ( chunks_variant1[ i ].script_noteworthy == "5" ) { variant1_order5[ variant1_order5.size ] = chunks_variant1[ i ]; } if ( chunks_variant1[ i ].script_noteworthy == "6" ) { variant1_order6[ variant1_order6.size ] = chunks_variant1[ i ]; } } } } for ( i = 0; i < chunks_variant1.size; i++ ) { if ( isDefined( chunks_variant1[ i ].script_team ) && chunks_variant1[ i ].script_team == "bar_board_variant1" ) { if ( isDefined( variant1_order2[ i ] ) ) { if ( variant1_order2[ i ].state == "repaired" ) { return variant1_order2[ i ]; } if ( variant1_order3[ i ].state == "repaired" ) { return variant1_order3[ i ]; } if ( variant1_order4[ i ].state == "repaired" ) { return variant1_order4[ i ]; } if ( variant1_order6[ i ].state == "repaired" ) { return variant1_order6[ i ]; } if ( variant1_order5[ i ].state == "repaired" ) { return variant1_order5[ i ]; } if ( variant1_order1[ i ].state == "repaired" ) { return variant1_order1[ i ]; } } } } } } non_destroyed_variant2_order( origin, chunks_variant2 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { variant2_order = []; variant2_order1 = []; variant2_order2 = []; variant2_order3 = []; variant2_order4 = []; variant2_order5 = []; variant2_order6 = []; if ( isDefined( chunks_variant2 ) ) { for ( i = 0; i < chunks_variant2.size; i++ ) { if ( isDefined( chunks_variant2[ i ].script_team ) && chunks_variant2[ i ].script_team == "bar_board_variant2" ) { if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "1" ) { variant2_order1[ variant2_order1.size ] = chunks_variant2[ i ]; } if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "2" ) { variant2_order2[ variant2_order2.size ] = chunks_variant2[ i ]; } if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "3" ) { variant2_order3[ variant2_order3.size ] = chunks_variant2[ i ]; } if ( isDefined( chunks_variant2[ i ].script_noteworthy ) && chunks_variant2[ i ].script_noteworthy == "4" ) { variant2_order4[ variant2_order4.size ] = chunks_variant2[ i ]; } 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" ) { variant2_order5[ variant2_order5.size ] = chunks_variant2[ i ]; } 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" ) { variant2_order6[ variant2_order6.size ] = chunks_variant2[ i ]; } } } for ( i = 0; i < chunks_variant2.size; i++ ) { if ( isDefined( chunks_variant2[ i ].script_team ) && chunks_variant2[ i ].script_team == "bar_board_variant2" ) { if ( isDefined( variant2_order1[ i ] ) ) { if ( variant2_order1[ i ].state == "repaired" ) { return variant2_order1[ i ]; } if ( variant2_order2[ i ].state == "repaired" ) { return variant2_order2[ i ]; } if ( variant2_order3[ i ].state == "repaired" ) { return variant2_order3[ i ]; } if ( variant2_order5[ i ].state == "repaired" ) { return variant2_order5[ i ]; } if ( variant2_order4[ i ].state == "repaired" ) { return variant2_order4[ i ]; } if ( variant2_order6[ i ].state == "repaired" ) { return variant2_order6[ i ]; } } } } } } non_destroyed_variant4_order( origin, chunks_variant4 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { variant4_order = []; variant4_order1 = []; variant4_order2 = []; variant4_order3 = []; variant4_order4 = []; variant4_order5 = []; variant4_order6 = []; if ( isDefined( chunks_variant4 ) ) { for ( i = 0; i < chunks_variant4.size; i++ ) { if ( isDefined( chunks_variant4[ i ].script_team ) && chunks_variant4[ i ].script_team == "bar_board_variant4" ) { if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "1" && !isDefined( chunks_variant4[ i ].script_location ) ) { variant4_order1[ variant4_order1.size ] = chunks_variant4[ i ]; } if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "2" ) { variant4_order2[ variant4_order2.size ] = chunks_variant4[ i ]; } if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "3" ) { variant4_order3[ variant4_order3.size ] = chunks_variant4[ i ]; } 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" ) { variant4_order4[ variant4_order4.size ] = chunks_variant4[ i ]; } if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "5" ) { variant4_order5[ variant4_order5.size ] = chunks_variant4[ i ]; } if ( isDefined( chunks_variant4[ i ].script_noteworthy ) && chunks_variant4[ i ].script_noteworthy == "6" ) { variant4_order6[ variant4_order6.size ] = chunks_variant4[ i ]; } } } for ( i = 0; i < chunks_variant4.size; i++ ) { if ( isDefined( chunks_variant4[ i ].script_team ) && chunks_variant4[ i ].script_team == "bar_board_variant4" ) { if ( isDefined( variant4_order1[ i ] ) ) { if ( variant4_order1[ i ].state == "repaired" ) { return variant4_order1[ i ]; } if ( variant4_order6[ i ].state == "repaired" ) { return variant4_order6[ i ]; } if ( variant4_order3[ i ].state == "repaired" ) { return variant4_order3[ i ]; } if ( variant4_order4[ i ].state == "repaired" ) { return variant4_order4[ i ]; } if ( variant4_order2[ i ].state == "repaired" ) { return variant4_order2[ i ]; } if ( variant4_order5[ i ].state == "repaired" ) { return variant4_order5[ i ]; } } } } } } non_destroyed_variant5_order( origin, chunks_variant5 ) //checked partially changed to match cerberus output //did not include continues because they would be redundant { variant5_order = []; variant5_order1 = []; variant5_order2 = []; variant5_order3 = []; variant5_order4 = []; variant5_order5 = []; variant5_order6 = []; if ( isDefined( chunks_variant5 ) ) { for ( i = 0; i < chunks_variant5.size; i++ ) { if ( isDefined( chunks_variant5[ i ].script_team ) && chunks_variant5[ i ].script_team == "bar_board_variant5" ) { if ( isDefined( chunks_variant5[ i ].script_noteworthy ) ) { if ( chunks_variant5[ i ].script_noteworthy == "1" && !isDefined( chunks_variant5[ i ].script_location ) ) { variant5_order1[ variant5_order1.size ] = chunks_variant5[ i ]; } if ( chunks_variant5[ i ].script_noteworthy == "2" ) { variant5_order2[ variant5_order2.size ] = chunks_variant5[ i ]; } 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" ) { variant5_order3[ variant5_order3.size ] = chunks_variant5[ i ]; } if ( chunks_variant5[ i ].script_noteworthy == "4" ) { variant5_order4[ variant5_order4.size ] = chunks_variant5[ i ]; } if ( chunks_variant5[ i ].script_noteworthy == "5" ) { variant5_order5[ variant5_order5.size ] = chunks_variant5[ i ]; } if ( chunks_variant5[ i ].script_noteworthy == "6" ) { variant5_order6[ variant5_order6.size ] = chunks_variant5[ i ]; } } } } for ( i = 0; i < chunks_variant5.size; i++ ) { if ( isDefined( chunks_variant5[ i ].script_team ) && chunks_variant5[ i ].script_team == "bar_board_variant5" ) { if ( isDefined( variant5_order1[ i ] ) ) { if ( variant5_order1[ i ].state == "repaired" ) { return variant5_order1[ i ]; } if ( variant5_order6[ i ].state == "repaired" ) { return variant5_order6[ i ]; } if ( variant5_order3[ i ].state == "repaired" ) { return variant5_order3[ i ]; } if ( variant5_order2[ i ].state == "repaired" ) { return variant5_order2[ i ]; } if ( variant5_order5[ i ].state == "repaired" ) { return variant5_order5[ i ]; } if ( variant5_order4[ i ].state == "repaired" ) { return variant5_order4[ i ]; } } } } } } show_grate_pull() //checked changed to match cerberus output { wait 0.53; self show(); self vibrate( vectorScale( ( 0, 1, 0 ), 270 ), 0.2, 0.4, 0.4 ); } get_closest_2d( origin, ents ) //checked changed to match cerberus output { if ( !isDefined( ents ) ) { return undefined; } dist = distance2d( origin, ents[ 0 ].origin ); index = 0; temp_array = []; for ( i = 1; i < ents.size; i++ ) { if ( isDefined( ents[ i ].unbroken ) && ents[ i ].unbroken == 1 ) { ents[ i ].index = i; temp_array[ temp_array.size ] = ents[ i ]; } } if ( temp_array.size > 0 ) { index = temp_array[ randomintrange( 0, temp_array.size ) ].index; return ents[ index ]; } else { for ( i = 1; i < ents.size; i++ ) { temp_dist = distance2d( origin, ents[ i ].origin ); if ( temp_dist < dist ) { dist = temp_dist; index = i; } } return ents[ index ]; } } disable_trigger() //checked matches cerberus output { if ( !isDefined( self.disabled ) || !self.disabled ) { self.disabled = 1; self.origin -= vectorScale( ( 0, 0, 1 ), 10000 ); } } enable_trigger() //checked matches cerberus output { if ( !isDefined( self.disabled ) || !self.disabled ) { return; } self.disabled = 0; self.origin += vectorScale( ( 0, 0, 1 ), 10000 ); } in_playable_area() //checked changed to match cerberus output { playable_area = getentarray( "player_volume", "script_noteworthy" ); if ( !isDefined( playable_area ) ) { /* /# println( "No playable area playable_area found! Assume EVERYWHERE is PLAYABLE" ); #/ */ return 1; } for ( i = 0; i < playable_area.size; i++ ) { if ( self istouching( playable_area[ i ] ) ) { return 1; } } return 0; } get_closest_non_destroyed_chunk( origin, barrier, barrier_chunks ) //checked changed to match cerberus output { chunks = undefined; chunks_grate = undefined; chunks_grate = get_non_destroyed_chunks_grate( barrier, barrier_chunks ); chunks = get_non_destroyed_chunks( barrier, barrier_chunks ); if ( isDefined( barrier.zbarrier ) ) { if ( isDefined( chunks ) ) { return array_randomize( chunks )[ 0 ]; } if ( isDefined( chunks_grate ) ) { return array_randomize( chunks_grate )[ 0 ]; } } else if ( isDefined( chunks ) ) { return non_destroyed_bar_board_order( origin, chunks ); } else if ( isDefined( chunks_grate ) ) { return non_destroyed_grate_order( origin, chunks_grate ); } return undefined; } get_random_destroyed_chunk( barrier, barrier_chunks ) //checked changed to match cerberus output { if ( isDefined( barrier.zbarrier ) ) { ret = undefined; pieces = barrier.zbarrier getzbarrierpieceindicesinstate( "open" ); if ( pieces.size ) { ret = array_randomize( pieces )[ 0 ]; } return ret; } else { chunk = undefined; chunks_repair_grate = undefined; chunks = get_destroyed_chunks( barrier_chunks ); chunks_repair_grate = get_destroyed_repair_grates( barrier_chunks ); if ( isDefined( chunks ) ) { return chunks[ randomint( chunks.size ) ]; } else if ( isDefined( chunks_repair_grate ) ) { return grate_order_destroyed( chunks_repair_grate ); } return undefined; } } get_destroyed_repair_grates( barrier_chunks ) //checked changed to match cerberus output { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ] ) ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } get_non_destroyed_chunks( barrier, barrier_chunks ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { if ( isDefined( barrier.zbarrier ) ) { return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); } else { array = []; i = 0; while ( i < barrier_chunks.size ) { if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "classic_boards" ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "board" ) { if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) { if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) { array[ array.size ] = barrier_chunks[ i ]; } } } } if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "new_barricade" ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "repair_board" || barrier_chunks[ i ].script_parameters == "barricade_vents" ) { if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) { if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) { array[ array.size ] = barrier_chunks[ i ]; } } } i++; continue; } if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "6_bars_bent" ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) { if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) { if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) { array[ array.size ] = barrier_chunks[ i ]; } } } i++; continue; } if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "6_bars_prestine" ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) { if ( barrier_chunks[ i ] get_chunk_state() == "repaired" ) { if ( barrier_chunks[ i ].origin == barrier_chunks[ i ].og_origin ) { array[ array.size ] = barrier_chunks[ i ]; } } } } i++; } if ( array.size == 0 ) { return undefined; } return array; } } get_non_destroyed_chunks_grate( barrier, barrier_chunks ) //checked changed to match cerberus output { if ( isDefined( barrier.zbarrier ) ) { return barrier.zbarrier getzbarrierpieceindicesinstate( "closed" ); } else { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) { if ( isDefined( barrier_chunks[ i ] ) ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } } get_non_destroyed_variant1( barrier_chunks ) //checked changed to match cerberus output { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant1" ) { if ( isDefined( barrier_chunks[ i ] ) ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } get_non_destroyed_variant2( barrier_chunks ) //checked changed to match cerberus output { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant2" ) { if ( isDefined( barrier_chunks[ i ] ) ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } get_non_destroyed_variant4( barrier_chunks ) //checked changed to match cerberus output { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant4" ) { if ( isDefined( barrier_chunks[ i ] ) ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } get_non_destroyed_variant5( barrier_chunks ) //checked changed to match cerberus output { array = []; for ( i = 0; i < barrier_chunks.size; i++ ) { if ( isDefined( barrier_chunks[ i ].script_team ) && barrier_chunks[ i ].script_team == "bar_board_variant5" ) { if ( isDefined( barrier_chunks[ i ] ) ) { array[ array.size ] = barrier_chunks[ i ]; } } } if ( array.size == 0 ) { return undefined; } return array; } get_destroyed_chunks( barrier_chunks ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { array = []; i = 0; while ( i < barrier_chunks.size ) { if ( barrier_chunks[ i ] get_chunk_state() == "destroyed" ) { if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "board" ) { array[ array.size ] = barrier_chunks[ i ]; i++; continue; } if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "repair_board" || barrier_chunks[ i ].script_parameters == "barricade_vents" ) { array[ array.size ] = barrier_chunks[ i ]; i++; continue; } if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "bar" ) { array[ array.size ] = barrier_chunks[ i ]; i++; continue; } if ( isDefined( barrier_chunks[ i ].script_parameters ) && barrier_chunks[ i ].script_parameters == "grate" ) { return undefined; } } i++; } if ( array.size == 0 ) { return undefined; } return array; } grate_order_destroyed( chunks_repair_grate ) //checked changed to match cerberus output { grate_repair_order = []; grate_repair_order1 = []; grate_repair_order2 = []; grate_repair_order3 = []; grate_repair_order4 = []; grate_repair_order5 = []; grate_repair_order6 = []; for ( i = 0; i < chunks_repair_grate.size; i++ ) { if ( isDefined( chunks_repair_grate[ i ].script_parameters ) && chunks_repair_grate[ i ].script_parameters == "grate" ) { if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "1" ) { grate_repair_order1[ grate_repair_order1.size ] = chunks_repair_grate[ i ]; } if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "2" ) { grate_repair_order2[ grate_repair_order2.size ] = chunks_repair_grate[ i ]; } if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "3" ) { grate_repair_order3[ grate_repair_order3.size ] = chunks_repair_grate[ i ]; } if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "4" ) { grate_repair_order4[ grate_repair_order4.size ] = chunks_repair_grate[ i ]; } if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "5" ) { grate_repair_order5[ grate_repair_order5.size ] = chunks_repair_grate[ i ]; } if ( isDefined( chunks_repair_grate[ i ].script_noteworthy ) && chunks_repair_grate[ i ].script_noteworthy == "6" ) { grate_repair_order6[ grate_repair_order6.size ] = chunks_repair_grate[ i ]; } } } for ( i = 0; i < chunks_repair_grate.size; i++ ) { if ( isDefined( chunks_repair_grate[ i ].script_parameters ) && chunks_repair_grate[ i ].script_parameters == "grate" ) { if ( isDefined( grate_repair_order1[ i ] ) ) { if ( grate_repair_order6[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate6 " ); #/ */ return grate_repair_order6[ i ]; } if ( grate_repair_order5[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate5 " ); #/ */ grate_repair_order6[ i ] thread show_grate_repair(); return grate_repair_order5[ i ]; } if ( grate_repair_order4[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate4 " ); #/ */ grate_repair_order5[ i ] thread show_grate_repair(); return grate_repair_order4[ i ]; } if ( grate_repair_order3[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate3 " ); #/ */ grate_repair_order4[ i ] thread show_grate_repair(); return grate_repair_order3[ i ]; } if ( grate_repair_order2[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate2 " ); #/ */ grate_repair_order3[ i ] thread show_grate_repair(); return grate_repair_order2[ i ]; } if ( grate_repair_order1[ i ].state == "destroyed" ) { /* /# iprintlnbold( " Fix grate1 " ); #/ */ grate_repair_order2[ i ] thread show_grate_repair(); return grate_repair_order1[ i ]; } } } } } show_grate_repair() //checked matches cerberus output { wait 0.34; self hide(); } get_chunk_state() //checked matches cerberus output { /* /# assert( isDefined( self.state ) ); #/ */ return self.state; } is_float( num ) //checked matches cerberus output { val = num - int( num ); if ( val != 0 ) { return 1; } else { return 0; } } array_limiter( array, total ) //checked changed to match cerberus output { new_array = []; for ( i = 0; i < array.size; i++ ) { if ( i < total ) { new_array[ new_array.size ] = array[ i ]; } } return new_array; } array_validate( array ) //checked matches cerberus output { if ( isDefined( array ) && array.size > 0 ) { return 1; } else { return 0; } } add_spawner( spawner ) //checked matches cerberus output { if ( isDefined( spawner.script_start ) && level.round_number < spawner.script_start ) { return; } if ( isDefined( spawner.is_enabled ) && !spawner.is_enabled ) { return; } if ( isDefined( spawner.has_been_added ) && spawner.has_been_added ) { return; } spawner.has_been_added = 1; level.zombie_spawn_locations[ level.zombie_spawn_locations.size ] = spawner; } fake_physicslaunch( target_pos, power ) //checked matches cerberus output { start_pos = self.origin; gravity = getDvarInt( "bg_gravity" ) * -1; dist = distance( start_pos, target_pos ); time = dist / power; delta = target_pos - start_pos; drop = ( 0.5 * gravity ) * ( time * time ); velocity = ( delta[ 0 ] / time, delta[ 1 ] / time, ( delta[ 2 ] - drop ) / time ); level thread draw_line_ent_to_pos( self, target_pos ); self movegravity( velocity, time ); return time; } add_zombie_hint( ref, text ) //checked matches cerberus output { if ( !isDefined( level.zombie_hints ) ) { level.zombie_hints = []; } precachestring( text ); level.zombie_hints[ ref ] = text; } get_zombie_hint( ref ) //checked matches cerberus output { if ( isDefined( level.zombie_hints[ ref ] ) ) { return level.zombie_hints[ ref ]; } /* /# println( "UNABLE TO FIND HINT STRING " + ref ); #/ */ return level.zombie_hints[ "undefined" ]; } set_hint_string( ent, default_ref, cost ) //checked matches cerberus output { ref = default_ref; if ( isDefined( ent.script_hint ) ) { ref = ent.script_hint; } if ( isDefined( level.legacy_hint_system ) && level.legacy_hint_system ) { ref = ref + "_" + cost; self sethintstring( get_zombie_hint( ref ) ); } else { hint = get_zombie_hint( ref ); if ( isDefined( cost ) ) { self sethintstring( hint, cost ); return; } else { self sethintstring( hint ); } } } get_hint_string( ent, default_ref, cost ) //checked matches cerberus output { ref = default_ref; if ( isDefined( ent.script_hint ) ) { ref = ent.script_hint; } if ( isDefined( level.legacy_hint_system ) && level.legacy_hint_system && isDefined( cost ) ) { ref = ref + "_" + cost; } return get_zombie_hint( ref ); } unitrigger_set_hint_string( ent, default_ref, cost ) //checked partially changed to match cerberus output //did not change while loop to foreach to prevent infinite loop related to continues { triggers = []; if ( self.trigger_per_player ) { triggers = self.playertrigger; } else { triggers[ 0 ] = self.trigger; } i = 0; while ( i < triggers.size ) { ref = default_ref; if ( isDefined( ent.script_hint ) ) { ref = ent.script_hint; } if ( isDefined( level.legacy_hint_system ) && level.legacy_hint_system ) { ref = ref + "_" + cost; triggers[ i ] sethintstring( get_zombie_hint( ref ) ); i++; continue; } hint = get_zombie_hint( ref ); if ( isDefined( cost ) ) { triggers[ i ] sethintstring( hint, cost ); i++; continue; } triggers[ i ] sethintstring( hint ); i++; } } add_sound( ref, alias ) //checked matches cerberus output { if ( !isDefined( level.zombie_sounds ) ) { level.zombie_sounds = []; } level.zombie_sounds[ ref ] = alias; } play_sound_at_pos( ref, pos, ent ) //checked matches cerberus output { if ( isDefined( ent ) ) { if ( isDefined( ent.script_soundalias ) ) { playsoundatposition( ent.script_soundalias, pos ); return; } if ( isDefined( self.script_sound ) ) { ref = self.script_sound; } } if ( ref == "none" ) { return; } if ( !isDefined( level.zombie_sounds[ ref ] ) ) { /* /# assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ */ return; } playsoundatposition( level.zombie_sounds[ ref ], pos ); } play_sound_on_ent( ref ) //checked matches cerberus output { if ( isDefined( self.script_soundalias ) ) { self playsound( self.script_soundalias ); return; } if ( isDefined( self.script_sound ) ) { ref = self.script_sound; } if ( ref == "none" ) { return; } if ( !isDefined( level.zombie_sounds[ ref ] ) ) { /* /# assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ */ return; } self playsound( level.zombie_sounds[ ref ] ); } play_loopsound_on_ent( ref ) //checked matches cerberus output { if ( isDefined( self.script_firefxsound ) ) { ref = self.script_firefxsound; } if ( ref == "none" ) { return; } if ( !isDefined( level.zombie_sounds[ ref ] ) ) { /* /# assertmsg( "Sound "" + ref + "" was not put to the zombie sounds list, please use add_sound( ref, alias ) at the start of your level." ); #/ */ return; } self playsound( level.zombie_sounds[ ref ] ); } string_to_float( string ) //checked changed to match cerberus output { floatparts = strtok( string, "." ); if ( floatparts.size == 1 ) { return int( floatparts[ 0 ] ); } whole = int( floatparts[ 0 ] ); decimal = 0; for ( i = floatparts[1].size - 1; i >= 0; i-- ) { decimal = ( decimal / 10 ) + ( int( floatparts[ 1 ][ i ] ) / 10 ); } if ( whole >= 0 ) { return whole + decimal; } else { return whole - decimal; } } onplayerconnect_callback( func ) //checked matches cerberus output { addcallback( "on_player_connect", func ); } onplayerdisconnect_callback( func ) //checked matches cerberus output { addcallback( "on_player_disconnect", func ); } set_zombie_var( var, value, is_float, column, is_team_based ) //checked changed to match cerberus output { if ( !isDefined( is_float ) ) { is_float = 0; } if ( !isDefined( column ) ) { column = 1; } table = "mp/zombiemode.csv"; table_value = tablelookup( table, 0, var, column ); if ( isDefined( table_value ) && table_value != "" ) { if ( is_float ) { value = float( table_value ); } else { value = int( table_value ); } } if ( isDefined( is_team_based ) && is_team_based ) { foreach ( team in level.teams ) { level.zombie_vars[ team ][ var ] = value; } } else level.zombie_vars[ var ] = value; return value; } get_table_var( table, var_name, value, is_float, column ) //checked matches cerberus output { if ( !isDefined( table ) ) { table = "mp/zombiemode.csv"; } if ( !isDefined( is_float ) ) { is_float = 0; } if ( !isDefined( column ) ) { column = 1; } table_value = tablelookup( table, 0, var_name, column ); if ( isDefined( table_value ) && table_value != "" ) { if ( is_float ) { value = string_to_float( table_value ); } else { value = int( table_value ); } } return value; } hudelem_count() //checked matches cerberus output { /* /# max = 0; curr_total = 0; while ( 1 ) { if ( level.hudelem_count > max ) { max = level.hudelem_count; } println( "HudElems: " + level.hudelem_count + "[Peak: " + max + "]" ); wait 0.05; #/ } */ } debug_round_advancer() //checked changed to match cerberus output { /* /# while ( 1 ) { zombs = get_round_enemy_array(); i = 0; while ( i < zombs.size ) { zombs[ i ] dodamage( zombs[ i ].health + 666, ( 0, 0, 0 ) ); wait 0.5; i++; } #/ } */ } print_run_speed( speed ) //checked changed to match cerberus output { /* /# self endon( "death" ); while ( 1 ) { print3d( self.origin + vectorScale( ( 0, 0, 1 ), 64 ), speed, ( 1, 1, 1 ) ); wait 0.05; #/ } */ } draw_line_ent_to_ent( ent1, ent2 ) //checked matches cerberus output { /* /# if ( getDvarInt( "zombie_debug" ) != 1 ) { return; } ent1 endon( "death" ); ent2 endon( "death" ); while ( 1 ) { line( ent1.origin, ent2.origin ); wait 0.05; #/ } */ } draw_line_ent_to_pos( ent, pos, end_on ) //checked changed to match cerberus output { /* /# if ( getDvarInt( "zombie_debug" ) != 1 ) { return; } ent endon( "death" ); ent notify( "stop_draw_line_ent_to_pos" ); ent endon( "stop_draw_line_ent_to_pos" ); if ( isDefined( end_on ) ) { ent endon( end_on ); } while ( 1 ) { line( ent.origin, pos ); wait 0.05; #/ } */ } debug_print( msg ) //checked matches cerberus output { /* /# if ( getDvarInt( "zombie_debug" ) > 0 ) { println( "######### ZOMBIE: " + msg ); #/ } */ } debug_blocker( pos, rad, height ) //checked matches cerberus output { /* /# self notify( "stop_debug_blocker" ); self endon( "stop_debug_blocker" ); for ( ;; ) { if ( getDvarInt( "zombie_debug" ) != 1 ) { return; } wait 0.05; drawcylinder( pos, rad, height ); #/ } */ } drawcylinder( pos, rad, height ) //checked changed to match cerberus output { /* /# currad = rad; curheight = height; for ( r = 0; r < 20; r++ ) { theta = ( r / 20 ) * 360; theta2 = ( ( r + 1 ) / 20 ) * 360; line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, 0 ) ); line( pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ), pos + ( cos( theta2 ) * currad, sin( theta2 ) * currad, curheight ) ); line( pos + ( cos( theta ) * currad, sin( theta ) * currad, 0 ), pos + ( cos( theta ) * currad, sin( theta ) * currad, curheight ) ); #/ } */ } print3d_at_pos( msg, pos, thread_endon, offset ) //checked changed to match cerberus output { /* /# self endon( "death" ); if ( isDefined( thread_endon ) ) { self notify( thread_endon ); self endon( thread_endon ); } if ( !isDefined( offset ) ) { offset = ( 0, 0, 0 ); } while ( 1 ) { print3d( self.origin + offset, msg ); wait 0.05; #/ } */ } debug_breadcrumbs() //checked changed to match cerberus output { /* /# self endon( "disconnect" ); self notify( "stop_debug_breadcrumbs" ); self endon( "stop_debug_breadcrumbs" ); while ( 1 ) { while ( getDvarInt( "zombie_debug" ) != 1 ) { wait 1; } for ( i = 0; i < self.zombie_breadcrumbs.size; i++ ) { drawcylinder( self.zombie_breadcrumbs[ i ], 5, 5 ); } wait 0.05; #/ } */ } debug_attack_spots_taken() //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { /* /# self notify( "stop_debug_breadcrumbs" ); self endon( "stop_debug_breadcrumbs" ); while ( 1 ) { if ( getDvarInt( "zombie_debug" ) != 2 ) { wait 1; continue; } wait 0.05; count = 0; i = 0; while ( i < self.attack_spots_taken.size ) { if ( self.attack_spots_taken[ i ] ) { count++; circle( self.attack_spots[ i ], 12, ( 1, 0, 0 ), 0, 1, 1 ); i++; continue; } circle( self.attack_spots[ i ], 12, ( 0, 1, 0 ), 0, 1, 1 ); i++; } msg = "" + count + " / " + self.attack_spots_taken.size; print3d( self.origin, msg ); #/ } */ } float_print3d( msg, time ) //checked changed to match cerberus output { /* /# self endon( "death" ); time = getTime() + ( time * 1000 ); offset = vectorScale( ( 0, 0, 1 ), 72 ); while ( getTime() < time ) { offset += vectorScale( ( 0, 0, 1 ), 2 ); print3d( self.origin + offset, msg, ( 1, 1, 1 ) ); wait 0.05; #/ } */ } do_player_vo( snd, variation_count ) //checked matches cerberus output { index = maps/mp/zombies/_zm_weapons::get_player_index( self ); sound = "zmb_vox_plr_" + index + "_" + snd; if ( isDefined( variation_count ) ) { sound = sound + "_" + randomintrange( 0, variation_count ); } if ( !isDefined( level.player_is_speaking ) ) { level.player_is_speaking = 0; } if ( level.player_is_speaking == 0 ) { level.player_is_speaking = 1; self playsoundwithnotify( sound, "sound_done" ); self waittill( "sound_done" ); wait 2; level.player_is_speaking = 0; } } stop_magic_bullet_shield() //checked matches cerberus output { self.attackeraccuracy = 1; self notify( "stop_magic_bullet_shield" ); self.magic_bullet_shield = undefined; self._mbs = undefined; } magic_bullet_shield() //checked matches cerberus output { if ( isDefined( self.magic_bullet_shield ) && !self.magic_bullet_shield ) { if ( isai( self ) || isplayer( self ) ) { self.magic_bullet_shield = 1; /* /# level thread debug_magic_bullet_shield_death( self ); #/ */ if ( !isDefined( self._mbs ) ) { self._mbs = spawnstruct(); } if ( isai( self ) ) { /* /# assert( isalive( self ), "Tried to do magic_bullet_shield on a dead or undefined guy." ); #/ */ self._mbs.last_pain_time = 0; self._mbs.ignore_time = 2; self._mbs.turret_ignore_time = 5; } self.attackeraccuracy = 0.1; return; } else { /* /# assertmsg( "magic_bullet_shield does not support entity of classname '" + self.classname + "'." ); #/ */ } } } debug_magic_bullet_shield_death( guy ) //checked matches cerberus output { targetname = "none"; if ( isDefined( guy.targetname ) ) { targetname = guy.targetname; } guy endon( "stop_magic_bullet_shield" ); guy waittill( "death" ); /* /# assert( !isDefined( guy ), "Guy died with magic bullet shield on with targetname: " + targetname ); #/ */ } is_magic_bullet_shield_enabled( ent ) //checked changed at own discretion { if ( !isDefined( ent ) ) { return 0; } if ( isDefined( ent.magic_bullet_shield ) && ent.magic_bullet_shield == 1 ) { return 1; } return 0; } really_play_2d_sound( sound ) //checked changed to match cerberus output { temp_ent = spawn( "script_origin", ( 0, 0, 0 ) ); temp_ent playsoundwithnotify( sound, sound + "wait" ); temp_ent waittill( sound + "wait" ); wait 0.05; temp_ent delete(); } play_sound_2d( sound ) //checked matches cerberus output { level thread really_play_2d_sound( sound ); } include_weapon( weapon_name, in_box, collector, weighting_func ) //checked matches cerberus output { /* /# println( "ZM >> include_weapon = " + weapon_name ); #/ */ if ( !isDefined( in_box ) ) { in_box = 1; } if ( !isDefined( collector ) ) { collector = 0; } maps/mp/zombies/_zm_weapons::include_zombie_weapon( weapon_name, in_box, collector, weighting_func ); } include_buildable( buildable_struct ) //checked matches cerberus output { /* /# println( "ZM >> include_buildable = " + buildable_struct.name ); #/ */ maps/mp/zombies/_zm_buildables::include_zombie_buildable( buildable_struct ); } is_buildable_included( name ) //checked matches cerberus output { if ( isDefined( level.zombie_include_buildables[ name ] ) ) { return 1; } return 0; } create_zombie_buildable_piece( modelname, radius, height, hud_icon ) //checked matches cerberus output { /* /# println( "ZM >> create_zombie_buildable_piece = " + modelname ); #/ */ self maps/mp/zombies/_zm_buildables::create_zombie_buildable_piece( modelname, radius, height, hud_icon ); } is_buildable() //checked matches cerberus output { return self maps/mp/zombies/_zm_buildables::is_buildable(); } wait_for_buildable( buildable_name ) //checked matches cerberus output { level waittill( buildable_name + "_built", player ); return player; } include_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ) //checked matches cerberus output { return maps/mp/zombies/_zm_power::add_powered_item( power_on_func, power_off_func, range_func, cost_func, power_sources, start_power, target ); } include_powerup( powerup_name ) //checked matches cerberus output { maps/mp/zombies/_zm_powerups::include_zombie_powerup( powerup_name ); } include_equipment( equipment_name ) //checked matches cerberus output { maps/mp/zombies/_zm_equipment::include_zombie_equipment( equipment_name ); } limit_equipment( equipment_name, limited ) //checked matches cerberus output { maps/mp/zombies/_zm_equipment::limit_zombie_equipment( equipment_name, limited ); } trigger_invisible( enable ) //checked changed to match cerberus output { players = get_players(); for ( i = 0; i < players.size; i++ ) { if ( isDefined( players[ i ] ) ) { self setinvisibletoplayer( players[ i ], enable ); } } } print3d_ent( text, color, scale, offset, end_msg, overwrite ) //checked changed to match cerberus output { self endon( "death" ); if ( isDefined( overwrite ) && overwrite && isDefined( self._debug_print3d_msg ) ) { self notify( "end_print3d" ); wait 0.05; } self endon( "end_print3d" ); if ( !isDefined( color ) ) { color = ( 1, 1, 1 ); } if ( !isDefined( scale ) ) { scale = 1; } if ( !isDefined( offset ) ) { offset = ( 0, 0, 0 ); } if ( isDefined( end_msg ) ) { self endon( end_msg ); } self._debug_print3d_msg = text; /* /# while ( 1 ) { print3d( self.origin + offset, self._debug_print3d_msg, color, scale ); wait 0,05; #/ } */ } isexplosivedamage( meansofdeath ) //checked matches cerberus output { explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE"; if ( issubstr( explosivedamage, meansofdeath ) ) { return 1; } return 0; } isprimarydamage( meansofdeath ) //checked matches cerberus output { if ( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" ) { return 1; } return 0; } isfiredamage( weapon, meansofdeath ) //checked changed to match cerberus output { if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) ) && ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) ) { return 1; } else if ( ( issubstr( weapon, "flame" ) || issubstr( weapon, "molotov_" ) ) && meansofdeath == "MOD_GRENADE_SPLASH" ) { return 1; } else if ( ( meansofdeath == "MOD_BURNED" || meansofdeath == "MOD_GRENADE" ) && issubstr( weapon, "napalmblob_" ) ) { return 1; } else if ( issubstr( weapon, "napalmblob_" ) && meansofdeath == "MOD_GRENADE_SPLASH" ) { return 1; } return 0; } isplayerexplosiveweapon( weapon, meansofdeath ) //checked matches cerberus output { if ( !isexplosivedamage( meansofdeath ) ) { return 0; } if ( weapon == "artillery_mp" ) { return 0; } if ( issubstr( weapon, "turret" ) ) { return 0; } return 1; } create_counter_hud( x ) //checked changed to match cerberus output { if ( !isDefined( x ) ) { x = 0; } hud = create_simple_hud(); hud.alignx = "left"; hud.aligny = "top"; hud.horzalign = "user_left"; hud.vertalign = "user_top"; hud.color = ( 1, 1, 1 ); hud.fontscale = 32; hud.x = x; hud.alpha = 0; hud setshader( "hud_chalk_1", 64, 64 ); return hud; } get_current_zone( return_zone ) //checked changed to match cerberus output { flag_wait( "zones_initialized" ); for ( z = 0; z < level.zone_keys.size; z++ ) { zone_name = level.zone_keys[ z ]; zone = level.zones[ zone_name ]; for ( i = 0; i < zone.volumes.size; i++ ) { if ( self istouching( zone.volumes[ i ] ) ) { if ( isDefined( return_zone ) && return_zone ) { return zone; } return zone_name; } } } return undefined; } remove_mod_from_methodofdeath( mod ) //checked matches cerberus output { return mod; } clear_fog_threads() //checked changed to match cerberus output { players = get_players(); for ( i = 0; i < players.size; i++ ) { players[ i ] notify( "stop_fog" ); } } display_message( titletext, notifytext, duration ) //checked changed to match cerberus output { notifydata = spawnstruct(); notifydata.titletext = notifytext; notifydata.notifytext = titletext; notifydata.sound = "mus_level_up"; notifydata.duration = duration; notifydata.glowcolor = ( 1, 0, 0 ); notifydata.color = ( 0, 0, 0 ); notifydata.iconname = "hud_zombies_meat"; self thread maps/mp/gametypes_zm/_hud_message::notifymessage( notifydata ); } is_quad() //checked matches cerberus output { return self.animname == "quad_zombie"; } is_leaper() //checked matches cerberus output { return self.animname == "leaper_zombie"; } shock_onpain() //checked changed to match cerberus output { self endon( "death" ); self endon( "disconnect" ); self notify( "stop_shock_onpain" ); self endon( "stop_shock_onpain" ); if ( getDvar( "blurpain" ) == "" ) { setdvar( "blurpain", "on" ); } while ( 1 ) { oldhealth = self.health; self waittill( "damage", damage, attacker, direction_vec, point, mod ); if ( isDefined( level.shock_onpain ) && !level.shock_onpain ) { continue; } if ( isDefined( self.shock_onpain ) && !self.shock_onpain ) { continue; } if ( self.health < 1 ) { continue; } if ( mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" ) { continue; } else if ( mod == "MOD_GRENADE_SPLASH" || mod == "MOD_GRENADE" || mod == "MOD_EXPLOSIVE" ) { shocktype = undefined; shocklight = undefined; if ( isDefined( self.is_burning ) && self.is_burning ) { shocktype = "lava"; shocklight = "lava_small"; } self shock_onexplosion( damage, shocktype, shocklight ); } else if ( getDvar( "blurpain" ) == "on" ) { self shellshock( "pain", 0.5 ); } } } shock_onexplosion( damage, shocktype, shocklight ) //checked changed to match cerberus output { time = 0; scaled_damage = ( 100 * damage ) / self.maxhealth; if ( scaled_damage >= 90 ) { time = 4; } else if ( scaled_damage >= 50 ) { time = 3; } else if ( scaled_damage >= 25 ) { time = 2; } else if ( scaled_damage > 10 ) { time = 1; } if ( time ) { if ( !isDefined( shocktype ) ) { shocktype = "explosion"; } self shellshock( shocktype, time ); } else if ( isDefined( shocklight ) ) { self shellshock( shocklight, time ); } } increment_is_drinking() //checked matches cerberus output { /* /# if ( isDefined( level.devgui_dpad_watch ) && level.devgui_dpad_watch ) { self.is_drinking++; return; #/ } */ if ( !isDefined( self.is_drinking ) ) { self.is_drinking = 0; } if ( self.is_drinking == 0 ) { self disableoffhandweapons(); self disableweaponcycling(); } self.is_drinking++; } is_multiple_drinking() //checked matches cerberus output { return self.is_drinking > 1; } decrement_is_drinking() //checked matches cerberus output { if ( self.is_drinking > 0 ) { self.is_drinking--; } else { /* /# assertmsg( "making is_drinking less than 0" ); #/ */ } if ( self.is_drinking == 0 ) { self enableoffhandweapons(); self enableweaponcycling(); } } clear_is_drinking() //checked matches cerberus output { self.is_drinking = 0; self enableoffhandweapons(); self enableweaponcycling(); } getweaponclasszm( weapon ) //checked matches cerberus output { /* /# assert( isDefined( weapon ) ); #/ */ if ( !isDefined( weapon ) ) { return undefined; } if ( !isDefined( level.weaponclassarray ) ) { level.weaponclassarray = []; } if ( isDefined( level.weaponclassarray[ weapon ] ) ) { return level.weaponclassarray[ weapon ]; } baseweaponindex = getbaseweaponitemindex( weapon ) + 1; weaponclass = tablelookupcolumnforrow( "zm/zm_statstable.csv", baseweaponindex, 2 ); level.weaponclassarray[ weapon ] = weaponclass; return weaponclass; } spawn_weapon_model( weapon, model, origin, angles, options ) //checked matches cerberus output { if ( !isDefined( model ) ) { model = getweaponmodel( weapon ); } weapon_model = spawn( "script_model", origin ); if ( isDefined( angles ) ) { weapon_model.angles = angles; } if ( isDefined( options ) ) { weapon_model useweaponmodel( weapon, model, options ); } else { weapon_model useweaponmodel( weapon, model ); } return weapon_model; } is_limited_weapon( weapname ) //checked matches cerberus output { if ( isDefined( level.limited_weapons ) ) { if ( isDefined( level.limited_weapons[ weapname ] ) ) { return 1; } } return 0; } is_alt_weapon( weapname ) //checked matches cerberus output { if ( getsubstr( weapname, 0, 3 ) == "gl_" ) { return 1; } if ( getsubstr( weapname, 0, 3 ) == "sf_" ) { return 1; } if ( getsubstr( weapname, 0, 10 ) == "dualoptic_" ) { return 1; } return 0; } is_grenade_launcher( weapname ) //checked changed to match cerberus output { return weapname == "m32_zm" || weapname == "m32_upgraded_zm"; } register_lethal_grenade_for_level( weaponname ) //checked changed at own discretion { if ( !is_lethal_grenade( weaponname ) ) { return; } if ( !isDefined( level.zombie_lethal_grenade_list ) ) { level.zombie_lethal_grenade_list = []; } level.zombie_lethal_grenade_list[ weaponname ] = weaponname; } is_lethal_grenade( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( level.zombie_lethal_grenade_list ) ) { return 0; } if ( isDefined( level.zombie_lethal_grenade_list[ weaponname ] ) ) { return 1; } return 0; } is_player_lethal_grenade( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( self.current_lethal_grenade ) ) { return 0; } if ( self.current_lethal_grenade == weaponname ) { return 1; } return 0; } get_player_lethal_grenade() //checked matches cerberus output { grenade = ""; if ( isDefined( self.current_lethal_grenade ) ) { grenade = self.current_lethal_grenade; } return grenade; } set_player_lethal_grenade( weaponname ) //checked matches cerberus output { self.current_lethal_grenade = weaponname; } init_player_lethal_grenade() //checked matches cerberus output { self set_player_lethal_grenade( level.zombie_lethal_grenade_player_init ); } register_tactical_grenade_for_level( weaponname ) //checked changed at own discretion { if ( !is_tactical_grenade( weaponname ) ) { return; } if ( !isDefined( level.zombie_tactical_grenade_list ) ) { level.zombie_tactical_grenade_list = []; } level.zombie_tactical_grenade_list[ weaponname ] = weaponname; } is_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( level.zombie_tactical_grenade_list ) ) { return 0; } if ( isDefined( level.zombie_tactical_grenade_list[ weaponname ] ) ) { return 1; } return 0; } is_player_tactical_grenade( weaponname ) //checked matches cerberus output //checked changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( self.current_tactical_grenade ) ) { return 0; } if ( self.current_tactical_grenade == weaponname ) { return 1; } return 0; } get_player_tactical_grenade() //checked matches cerberus output { tactical = ""; if ( isDefined( self.current_tactical_grenade ) ) { tactical = self.current_tactical_grenade; } return tactical; } set_player_tactical_grenade( weaponname ) //checked changed to match cerberus output { self notify( "new_tactical_grenade", weaponname ); self.current_tactical_grenade = weaponname; } init_player_tactical_grenade() //checked matches cerberus output { self set_player_tactical_grenade( level.zombie_tactical_grenade_player_init ); } register_placeable_mine_for_level( weaponname ) //checked changed at own discretion { if ( !is_placeable_mine( weaponname ) ) { return; } if ( !isDefined( level.zombie_placeable_mine_list ) ) { level.zombie_placeable_mine_list = []; } level.zombie_placeable_mine_list[ weaponname ] = weaponname; } is_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( level.zombie_placeable_mine_list ) ) { return 0; } if ( isDefined( level.zombie_placeable_mine_list[ weaponname ] ) ) { return 1; } return 0; } is_player_placeable_mine( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( self.current_placeable_mine ) ) { return 0; } if ( self.current_placeable_mine == weaponname ) { return 1; } return 0; } get_player_placeable_mine() //checked matches cerberus output { return self.current_placeable_mine; } set_player_placeable_mine( weaponname ) //checked matches cerberus output { self.current_placeable_mine = weaponname; } init_player_placeable_mine() //checked matches cerberus output { self set_player_placeable_mine( level.zombie_placeable_mine_player_init ); } register_melee_weapon_for_level( weaponname ) //checked matches cerberus output { if ( !is_melee_weapon( weaponname ) ) { return; } if ( !isDefined( level.zombie_melee_weapon_list ) ) { level.zombie_melee_weapon_list = []; } level.zombie_melee_weapon_list[ weaponname ] = weaponname; } is_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( level.zombie_melee_weapon_list ) ) { return 0; } if ( isDefined( level.zombie_melee_weapon_list[ weaponname ] ) ) { return 1; } return 0; } is_player_melee_weapon( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( self.current_melee_weapon ) ) { return 0; } if ( self.current_melee_weapon == weaponname ) { return 1; } return 0; } get_player_melee_weapon() //checked matches cerberus output { return self.current_melee_weapon; } set_player_melee_weapon( weaponname ) //checked matches cerberus output { self.current_melee_weapon = weaponname; } init_player_melee_weapon() //checked matches cerberus output { self set_player_melee_weapon( level.zombie_melee_weapon_player_init ); } should_watch_for_emp() //checked matches cerberus output { return isDefined( level.zombie_weapons[ "emp_grenade_zm" ] ); } register_equipment_for_level( weaponname ) //checked matches cerberus output { if ( is_equipment( weaponname ) ) { return; } if ( !isDefined( level.zombie_equipment_list ) ) { level.zombie_equipment_list = []; } level.zombie_equipment_list[ weaponname ] = weaponname; } is_equipment( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( level.zombie_equipment_list ) ) { return 0; } if ( isDefined( level.zombie_equipment_list[ weaponname ] ) ) { return 1; } return 0; } is_equipment_that_blocks_purchase( weaponname ) //checked matches cerberus output //changed at own discretion { if ( is_equipment( weaponname ) ) { return 1; } return 0; } is_player_equipment( weaponname ) //checked matches cerberus output //changed at own discretion { if ( !isDefined( weaponname ) || !isDefined( self.current_equipment ) ) { return 0; } if ( self.current_equipment == weaponname ) { return 1; } return 0; } has_deployed_equipment( weaponname ) //checked changed to match cerberus output { if ( !isDefined( weaponname ) || !isDefined( self.deployed_equipment ) || self.deployed_equipment.size < 1 ) { return 0; } for ( i = 0; i < self.deployed_equipment.size; i++ ) { if ( self.deployed_equipment[ i ] == weaponname ) { return 1; } } return 0; } has_player_equipment( weaponname ) //checked changed at own discretion { if ( self is_player_equipment( weaponname ) || self has_deployed_equipment( weaponname ) ) { return 1; } return 0; } get_player_equipment() //checked matches cerberus output { return self.current_equipment; } hacker_active() //checked matches cerberus output //changed at own discretion { if ( self maps/mp/zombies/_zm_equipment::is_equipment_active( "equip_hacker_zm" ) ) { return 1; } return 0; } set_player_equipment( weaponname ) //checked matches cerberus output { if ( !isDefined( self.current_equipment_active ) ) { self.current_equipment_active = []; } if ( isDefined( weaponname ) ) { self.current_equipment_active[ weaponname ] = 0; } if ( !isDefined( self.equipment_got_in_round ) ) { self.equipment_got_in_round = []; } if ( isDefined( weaponname ) ) { self.equipment_got_in_round[ weaponname ] = level.round_number; } self.current_equipment = weaponname; } init_player_equipment() //checked matches cerberus output { self set_player_equipment( level.zombie_equipment_player_init ); } register_offhand_weapons_for_level_defaults() //checked matches cerberus output { if ( isDefined( level.register_offhand_weapons_for_level_defaults_override ) ) { [[ level.register_offhand_weapons_for_level_defaults_override ]](); return; } register_lethal_grenade_for_level( "frag_grenade_zm" ); level.zombie_lethal_grenade_player_init = "frag_grenade_zm"; register_tactical_grenade_for_level( "cymbal_monkey_zm" ); level.zombie_tactical_grenade_player_init = undefined; register_placeable_mine_for_level( "claymore_zm" ); level.zombie_placeable_mine_player_init = undefined; register_melee_weapon_for_level( "knife_zm" ); register_melee_weapon_for_level( "bowie_knife_zm" ); level.zombie_melee_weapon_player_init = "knife_zm"; level.zombie_equipment_player_init = undefined; } init_player_offhand_weapons() //checked matches cerberus output { init_player_lethal_grenade(); init_player_tactical_grenade(); init_player_placeable_mine(); init_player_melee_weapon(); init_player_equipment(); } is_offhand_weapon( weaponname ) //checked changed at own discretion { if ( is_lethal_grenade( weaponname ) || is_tactical_grenade( weaponname ) || is_placeable_mine( weaponname ) || is_melee_weapon( weaponname ) || is_equipment( weaponname ) ) { return 1; } return 0; } is_player_offhand_weapon( weaponname ) //checked changed at own discretion { if ( self is_player_lethal_grenade( weaponname ) || self is_player_tactical_grenade( weaponname ) || self is_player_placeable_mine( weaponname ) || self is_player_melee_weapon( weaponname ) || self is_player_equipment( weaponname ) ) { return 1; } return 0; } has_powerup_weapon() //checked changed at own discretion { if ( isDefined( self.has_powerup_weapon ) && self.has_powerup_weapon ) { return 1; } return 0; } give_start_weapon( switch_to_weapon ) //checked matches cerberus output { self giveweapon( level.start_weapon ); self givestartammo( level.start_weapon ); if ( isDefined( switch_to_weapon ) && switch_to_weapon ) { self switchtoweapon( level.start_weapon ); } } array_flag_wait_any( flag_array ) //checked changed to match cerberus output { if ( !isDefined( level._array_flag_wait_any_calls ) ) { level._n_array_flag_wait_any_calls = 0; } else { level._n_array_flag_wait_any_calls++; } str_condition = "array_flag_wait_call_" + level._n_array_flag_wait_any_calls; for ( index = 0; index < flag_array.size; index++ ) { level thread array_flag_wait_any_thread( flag_array[ index ], str_condition ); } level waittill( str_condition ); } array_flag_wait_any_thread( flag_name, condition ) //checked matches cerberus output { level endon( condition ); flag_wait( flag_name ); level notify( condition ); } array_removedead( array ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { newarray = []; if ( !isDefined( array ) ) { return undefined; } i = 0; while ( i < array.size ) { if ( !isalive( array[ i ] ) || isDefined( array[ i ].isacorpse ) && array[ i ].isacorpse ) { i++; continue; } newarray[ newarray.size ] = array[ i ]; i++; } return newarray; } groundpos( origin ) //checked matches cerberus output { return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self )[ "position" ]; } groundpos_ignore_water( origin ) //checked matches cerberus output { return bullettrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; } groundpos_ignore_water_new( origin ) //checked matches cerberus output { return groundtrace( origin, origin + vectorScale( ( 0, 0, -1 ), 100000 ), 0, self, 1 )[ "position" ]; } waittill_notify_or_timeout( msg, timer ) //checked matches cerberus output { self endon( msg ); wait timer; return timer; } self_delete() //checked matches cerberus output { if ( isDefined( self ) ) { self delete(); } } script_delay() //checked changed to match cerberus output { if ( isDefined( self.script_delay ) ) { wait self.script_delay; return 1; } else if ( isDefined( self.script_delay_min ) && isDefined( self.script_delay_max ) ) { wait randomfloatrange( self.script_delay_min, self.script_delay_max ); return 1; } return 0; } button_held_think( which_button ) //checked changed to match cerberus output { self endon( "disconnect" ); if ( !isDefined( self._holding_button ) ) { self._holding_button = []; } self._holding_button[ which_button ] = 0; time_started = 0; use_time = 250; while ( 1 ) { if ( self._holding_button[ which_button ] ) { if ( !( self [[ level._button_funcs[ which_button ] ]]() ) ) { self._holding_button[ which_button ] = 0; } } else if ( self [[ level._button_funcs[ which_button ] ]]() ) { if ( time_started == 0 ) { time_started = getTime(); } if ( ( getTime() - time_started ) > use_time ) { self._holding_button[ which_button ] = 1; } } else if ( time_started != 0 ) { time_started = 0; } wait 0.05; } } use_button_held() //checked matches cerberus output { init_button_wrappers(); if ( !isDefined( self._use_button_think_threaded ) ) { self thread button_held_think( level.button_use ); self._use_button_think_threaded = 1; } return self._holding_button[ level.button_use ]; } ads_button_held() //checked matches cerberus output { init_button_wrappers(); if ( !isDefined( self._ads_button_think_threaded ) ) { self thread button_held_think( level.button_ads ); self._ads_button_think_threaded = 1; } return self._holding_button[ level.button_ads ]; } attack_button_held() //checked matches cerberus output { init_button_wrappers(); if ( !isDefined( self._attack_button_think_threaded ) ) { self thread button_held_think( level.button_attack ); self._attack_button_think_threaded = 1; } return self._holding_button[ level.button_attack ]; } use_button_pressed() //checked matches cerberus output { return self usebuttonpressed(); } ads_button_pressed() //checked matches cerberus output { return self adsbuttonpressed(); } attack_button_pressed() //checked matches cerberus output { return self attackbuttonpressed(); } init_button_wrappers() //checked matches cerberus output { if ( !isDefined( level._button_funcs ) ) { level.button_use = 0; level.button_ads = 1; level.button_attack = 2; level._button_funcs[ level.button_use ] = ::use_button_pressed; level._button_funcs[ level.button_ads ] = ::ads_button_pressed; level._button_funcs[ level.button_attack ] = ::attack_button_pressed; } } wait_network_frame() //checked partially changed to match cerberus output //did not change while loop to for loop { if ( numremoteclients() ) { snapshot_ids = getsnapshotindexarray(); acked = undefined; while ( !isDefined( acked ) ) { level waittill( "snapacknowledged" ); acked = snapshotacknowledged( snapshot_ids ); } } else { wait 0.1; } } ignore_triggers( timer ) //checked matches cerberus output { self endon( "death" ); self.ignoretriggers = 1; if ( isDefined( timer ) ) { wait timer; } else { wait 0.5; } self.ignoretriggers = 0; } giveachievement_wrapper( achievement, all_players ) //checked changed to match cerberus output { if ( achievement == "" ) { return; } if ( isDefined( level.zm_disable_recording_stats ) && level.zm_disable_recording_stats ) { return; } achievement_lower = tolower( achievement ); global_counter = 0; if ( isDefined( all_players ) && all_players ) { players = get_players(); for ( i = 0; i < players.size; i++ ) { players[ i ] giveachievement( achievement ); has_achievement = players[ i ] maps/mp/zombies/_zm_stats::get_global_stat( achievement_lower ); if ( isDefined( has_achievement ) && !has_achievement ) { global_counter++; } players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( achievement_lower, 0 ); if ( issplitscreen() && i == 0 || !issplitscreen() ) { if ( isDefined( level.achievement_sound_func ) ) { players[ i ] thread [[ level.achievement_sound_func ]]( achievement_lower ); } } } } else if ( !isplayer( self ) ) { /* /# println( "^1self needs to be a player for _utility::giveachievement_wrapper()" ); #/ */ return; } self giveachievement( achievement ); has_achievement = self maps/mp/zombies/_zm_stats::get_global_stat( achievement_lower ); if ( isDefined( has_achievement ) && !has_achievement ) { global_counter++; } self maps/mp/zombies/_zm_stats::increment_client_stat( achievement_lower, 0 ); if ( isDefined( level.achievement_sound_func ) ) { self thread [[ level.achievement_sound_func ]]( achievement_lower ); } if ( global_counter ) { incrementcounter( "global_" + achievement_lower, global_counter ); } } spawn_failed( spawn ) //checked matches cerberus output { if ( isDefined( spawn ) && isalive( spawn ) ) { if ( isalive( spawn ) ) { return 0; } } return 1; } getyaw( org ) //checked matches cerberus output { angles = vectorToAngles( org - self.origin ); return angles[ 1 ]; } getyawtospot( spot ) //checked matches cerberus output { pos = spot; yaw = self.angles[ 1 ] - getyaw( pos ); yaw = AbsAngleClamp180( yaw ); return yaw; } add_spawn_function( function, param1, param2, param3, param4 ) //checked matches cerberus output { /* /# if ( isDefined( level._loadstarted ) ) { assert( !isalive( self ), "Tried to add_spawn_function to a living guy." ); } #/ */ func = []; func[ "function" ] = function; func[ "param1" ] = param1; func[ "param2" ] = param2; func[ "param3" ] = param3; func[ "param4" ] = param4; if ( !isDefined( self.spawn_funcs ) ) { self.spawn_funcs = []; } self.spawn_funcs[ self.spawn_funcs.size ] = func; } disable_react() //checked matches cerberus output { /* /# assert( isalive( self ), "Tried to disable react on a non ai" ); #/ */ self.a.disablereact = 1; self.allowreact = 0; } enable_react() //checked matches cerberus output { /* /# assert( isalive( self ), "Tried to enable react on a non ai" ); #/ */ self.a.disablereact = 0; self.allowreact = 1; } flag_wait_or_timeout( flagname, timer ) //not sure what to do here { start_time = getTime(); for ( ;; ) { if ( level.flag[ flagname ] ) { return; } else if ( getTime() >= ( start_time + ( timer * 1000 ) ) ) { return; } else { wait_for_flag_or_time_elapses( flagname, timer ); } } } wait_for_flag_or_time_elapses( flagname, timer ) //checked matches cerberus output { level endon( flagname ); wait timer; } isads( player ) //checked matches cerberus output { return player playerads() > 0.5; } bullet_attack( type ) //checked matches cerberus output { if ( type == "MOD_PISTOL_BULLET" ) { return 1; } return type == "MOD_RIFLE_BULLET"; } pick_up() //checked matches cerberus output { player = self.owner; self destroy_ent(); clip_ammo = player getweaponammoclip( self.name ); clip_max_ammo = weaponclipsize( self.name ); if ( clip_ammo < clip_max_ammo ) { clip_ammo++; } player setweaponammoclip( self.name, clip_ammo ); } destroy_ent() //checked matches cerberus output { self delete(); } waittill_not_moving() //checked changed to match cerberus output { self endon( "death" ); self endon( "disconnect" ); self endon( "detonated" ); level endon( "game_ended" ); if ( self.classname == "grenade" ) { self waittill( "stationary" ); } prevorigin = self.origin; while ( 1 ) { wait 0.15; if ( self.origin == prevorigin ) { return; } prevorigin = self.origin; } } get_closest_player( org ) //checked matches cerberus output { players = []; players = get_players(); return getclosest( org, players ); } ent_flag_wait( msg ) //checked matches cerberus output { self endon( "death" ); while ( !self.ent_flag[ msg ] ) { self waittill( msg ); } } ent_flag_wait_either( flag1, flag2 ) //no idea what to do here { self endon( "death" ); for ( ;; ) { if ( ent_flag( flag1 ) ) { return; } if ( ent_flag( flag2 ) ) { return; } self waittill_either( flag1, flag2 ); } } ent_wait_for_flag_or_time_elapses( flagname, timer ) //checked matches cerberus output { self endon( flagname ); wait timer; } ent_flag_wait_or_timeout( flagname, timer ) //no idea what to do here { self endon( "death" ); start_time = getTime(); for ( ;; ) { if ( self.ent_flag[ flagname ] ) { return; } else if ( getTime() >= ( start_time + ( timer * 1000 ) ) ) { return; } else { self ent_wait_for_flag_or_time_elapses( flagname, timer ); } } } ent_flag_waitopen( msg ) //checked matches cerberus output { self endon( "death" ); while ( self.ent_flag[ msg ] ) { self waittill( msg ); } } ent_flag_init( message, val ) //checked matches cerberus output { if ( !isDefined( self.ent_flag ) ) { self.ent_flag = []; self.ent_flags_lock = []; } if ( !isDefined( level.first_frame ) ) { /* /# assert( !isDefined( self.ent_flag[ message ] ), "Attempt to reinitialize existing flag '" + message + "' on entity." ); #/ */ } if ( isDefined( val ) && val ) { self.ent_flag[ message ] = 1; /* /# self.ent_flags_lock[ message ] = 1; #/ */ } else { self.ent_flag[ message ] = 0; /* /# self.ent_flags_lock[ message ] = 0; #/ */ } } ent_flag_exist( message ) //checked matches cerberus output { if ( isDefined( self.ent_flag ) && isDefined( self.ent_flag[ message ] ) ) { return 1; } return 0; } ent_flag_set_delayed( message, delay ) //checked matches cerberus output { wait delay; self ent_flag_set( message ); } ent_flag_set( message ) //checked matches cerberus output { /* /# assert( isDefined( self ), "Attempt to set a flag on entity that is not defined" ); assert( isDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] ); self.ent_flags_lock[ message ] = 1; #/ */ self.ent_flag[ message ] = 1; self notify( message ); } ent_flag_toggle( message ) //checked matches cerberus output { if ( self ent_flag( message ) ) { self ent_flag_clear( message ); } else { self ent_flag_set( message ); } } ent_flag_clear( message ) //checked matches cerberus output { /* /# assert( isDefined( self ), "Attempt to clear a flag on entity that is not defined" ); assert( isDefined( self.ent_flag[ message ] ), "Attempt to set a flag before calling flag_init: '" + message + "'." ); assert( self.ent_flag[ message ] == self.ent_flags_lock[ message ] ); self.ent_flags_lock[ message ] = 0; #/ */ if ( self.ent_flag[ message ] ) { self.ent_flag[ message ] = 0; self notify( message ); } } ent_flag_clear_delayed( message, delay ) //checked matches cerberus output { wait delay; self ent_flag_clear( message ); } ent_flag( message ) //checked matches cerberus output { /* /# assert( isDefined( message ), "Tried to check flag but the flag was not defined." ); #/ /# assert( isDefined( self.ent_flag[ message ] ), "Tried to check entity flag '" + message + "', but the flag was not initialized." ); #/ */ if ( !self.ent_flag[ message ] ) { return 0; } return 1; } ent_flag_init_ai_standards() //checked changed to match cerberus output { message_array = []; message_array[ message_array.size ] = "goal"; message_array[ message_array.size ] = "damage"; for ( i = 0; i < message_array.size; i++ ) { self ent_flag_init( message_array[ i ] ); self thread ent_flag_wait_ai_standards( message_array[ i ] ); } } ent_flag_wait_ai_standards( message ) //checked matches cerberus output { self endon( "death" ); self waittill( message ); self.ent_flag[ message ] = 1; } flat_angle( angle ) //checked matches cerberus output { rangle = ( 0, angle[ 1 ], 0 ); return rangle; } waittill_any_or_timeout( timer, string1, string2, string3, string4, string5 ) //checked matches cerberus output { /* /# assert( isDefined( string1 ) ); #/ */ self endon( string1 ); if ( isDefined( string2 ) ) { self endon( string2 ); } if ( isDefined( string3 ) ) { self endon( string3 ); } if ( isDefined( string4 ) ) { self endon( string4 ); } if ( isDefined( string5 ) ) { self endon( string5 ); } wait timer; } clear_run_anim() //checked matches cerberus output { self.alwaysrunforward = undefined; self.a.combatrunanim = undefined; self.run_noncombatanim = undefined; self.walk_combatanim = undefined; self.walk_noncombatanim = undefined; self.precombatrunenabled = 1; } track_players_intersection_tracker() //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { self endon( "disconnect" ); self endon( "death" ); level endon( "end_game" ); wait 5; while ( 1 ) { killed_players = 0; players = get_players(); i = 0; while ( i < players.size ) { if ( players[ i ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ i ].sessionstate != "playing" ) { i++; continue; } j = 0; while ( j < players.size ) { if ( j == i || players[ j ] maps/mp/zombies/_zm_laststand::player_is_in_laststand() || players[ j ].sessionstate != "playing" ) { j++; continue; } if ( isDefined( level.player_intersection_tracker_override ) ) { if ( players[ i ] [[ level.player_intersection_tracker_override ]]( players[ j ] ) ) { j++; continue; } } playeri_origin = players[ i ].origin; playerj_origin = players[ j ].origin; if ( abs( playeri_origin[ 2 ] - playerj_origin[ 2 ] ) > 60 ) { j++; continue; } distance_apart = distance2d( playeri_origin, playerj_origin ); if ( abs( distance_apart ) > 18 ) { j++; continue; } /* /# iprintlnbold( "PLAYERS ARE TOO FRIENDLY!!!!!" ); #/ */ players[ i ] dodamage( 1000, ( 0, 0, 1 ) ); players[ j ] dodamage( 1000, ( 0, 0, 1 ) ); if ( !killed_players ) { players[ i ] playlocalsound( level.zmb_laugh_alias ); } players[ i ] maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); players[ i ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); players[ j ] maps/mp/zombies/_zm_stats::increment_map_cheat_stat( "cheat_too_friendly" ); players[ j ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_too_friendly", 0 ); players[ j ] maps/mp/zombies/_zm_stats::increment_client_stat( "cheat_total", 0 ); killed_players = 1; j++; } i++; } wait 0.5; } } get_eye() //checked matches cerberus output { if ( isplayer( self ) ) { linked_ent = self getlinkedent(); if ( isDefined( linked_ent ) && getDvarInt( "cg_cameraUseTagCamera" ) > 0 ) { camera = linked_ent gettagorigin( "tag_camera" ); if ( isDefined( camera ) ) { return camera; } } } pos = self geteye(); return pos; } is_player_looking_at( origin, dot, do_trace, ignore_ent ) //checked matches cerberus output { /* /# assert( isplayer( self ), "player_looking_at must be called on a player." ); #/ */ if ( !isDefined( dot ) ) { dot = 0.7; } if ( !isDefined( do_trace ) ) { do_trace = 1; } eye = self get_eye(); delta_vec = anglesToForward( vectorToAngles( origin - eye ) ); view_vec = anglesToForward( self getplayerangles() ); new_dot = vectordot( delta_vec, view_vec ); if ( new_dot >= dot ) { if ( do_trace ) { return bullettracepassed( origin, eye, 0, ignore_ent ); } else { return 1; } } return 0; } add_gametype( gt, dummy1, name, dummy2 ) //checked matches cerberus output { } add_gameloc( gl, dummy1, name, dummy2 ) //checked matches cerberus output { } get_closest_index( org, array, dist ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { if ( !isDefined( dist ) ) { dist = 9999999; } distsq = dist * dist; if ( array.size < 1 ) { return; } index = undefined; i = 0; while ( i < array.size ) { newdistsq = distancesquared( array[ i ].origin, org ); if ( newdistsq >= distsq ) { i++; continue; } distsq = newdistsq; index = i; i++; } return index; } is_valid_zombie_spawn_point( point ) //checked matches cerberus output { liftedorigin = point.origin + vectorScale( ( 0, 0, 1 ), 5 ); size = 48; height = 64; mins = ( -1 * size, -1 * size, 0 ); maxs = ( size, size, height ); absmins = liftedorigin + mins; absmaxs = liftedorigin + maxs; if ( boundswouldtelefrag( absmins, absmaxs ) ) { return 0; } return 1; } get_closest_index_to_entity( entity, array, dist, extra_check ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { org = entity.origin; if ( !isDefined( dist ) ) { dist = 9999999; } distsq = dist * dist; if ( array.size < 1 ) { return; } index = undefined; i = 0; while ( i < array.size ) { if ( isDefined( extra_check ) && !( [[ extra_check ]]( entity, array[ i ] ) ) ) { i++; continue; } newdistsq = distancesquared( array[ i ].origin, org ); if ( newdistsq >= distsq ) { i++; continue; } distsq = newdistsq; index = i; i++; } return index; } set_gamemode_var( var, val ) //checked matches cerberus output { if ( !isDefined( game[ "gamemode_match" ] ) ) { game[ "gamemode_match" ] = []; } game[ "gamemode_match" ][ var ] = val; } set_gamemode_var_once( var, val ) //checked matches cerberus output { if ( !isDefined( game[ "gamemode_match" ] ) ) { game[ "gamemode_match" ] = []; } if ( !isDefined( game[ "gamemode_match" ][ var ] ) ) { game[ "gamemode_match" ][ var ] = val; } } set_game_var( var, val ) //checked matches cerberus output { game[ var ] = val; } set_game_var_once( var, val ) //checked matches cerberus output { if ( !isDefined( game[ var ] ) ) { game[ var ] = val; } } get_game_var( var ) //checked matches cerberus output { if ( isDefined( game[ var ] ) ) { return game[ var ]; } return undefined; } get_gamemode_var( var ) //checked matches cerberus output { if ( isDefined( game[ "gamemode_match" ] ) && isDefined( game[ "gamemode_match" ][ var ] ) ) { return game[ "gamemode_match" ][ var ]; } return undefined; } waittill_subset( min_num, string1, string2, string3, string4, string5 ) //checked matches cerberus output { self endon( "death" ); ent = spawnstruct(); ent.threads = 0; returned_threads = 0; if ( isDefined( string1 ) ) { self thread waittill_string( string1, ent ); ent.threads++; } if ( isDefined( string2 ) ) { self thread waittill_string( string2, ent ); ent.threads++; } if ( isDefined( string3 ) ) { self thread waittill_string( string3, ent ); ent.threads++; } if ( isDefined( string4 ) ) { self thread waittill_string( string4, ent ); ent.threads++; } if ( isDefined( string5 ) ) { self thread waittill_string( string5, ent ); ent.threads++; } while ( ent.threads ) { ent waittill( "returned" ); ent.threads--; returned_threads++; if ( returned_threads >= min_num ) { break; } } ent notify( "die" ); } is_headshot( sweapon, shitloc, smeansofdeath ) //checked changed at own diecretion { if ( shitloc == "head" && shitloc == "helmet" ) { return 1; } if ( smeansofdeath == "MOD_IMPACT" && issubstr( sweapon, "knife_ballistic" ) ) { return 1; } if ( smeansofdeath != "MOD_MELEE" && smeansofdeath != "MOD_BAYONET" && smeansofdeath != "MOD_IMPACT" && smeansofdeath != "MOD_UNKNOWN" ) { return 0; } } is_jumping() //checked matches cerberus output { ground_ent = self getgroundent(); return !isDefined( ground_ent ); } is_explosive_damage( mod ) //checked changed to match cerberus output { if ( !isDefined( mod ) ) { return 0; } if ( mod == "MOD_GRENADE" || mod == "MOD_GRENADE_SPLASH" || mod == "MOD_PROJECTILE" || mod == "MOD_PROJECTILE_SPLASH" || mod == "MOD_EXPLOSIVE" ) { return 1; } return 0; } sndswitchannouncervox( who ) //checked matches cerberus output { switch( who ) { case "sam": game[ "zmbdialog" ][ "prefix" ] = "vox_zmba_sam"; level.zmb_laugh_alias = "zmb_laugh_sam"; level.sndannouncerisrich = 0; break; case "richtofen": game[ "zmbdialog" ][ "prefix" ] = "vox_zmba"; level.zmb_laugh_alias = "zmb_laugh_richtofen"; level.sndannouncerisrich = 1; break; } } do_player_general_vox( category, type, timer, chance ) //checked matches cerberus output { if ( isDefined( timer ) && isDefined( level.votimer[ type ] ) && level.votimer[ type ] > 0 ) { return; } if ( !isDefined( chance ) ) { chance = maps/mp/zombies/_zm_audio::get_response_chance( type ); } if ( chance > randomint( 100 ) ) { self thread maps/mp/zombies/_zm_audio::create_and_play_dialog( category, type ); if ( isDefined( timer ) ) { level.votimer[ type ] = timer; level thread general_vox_timer( level.votimer[ type ], type ); } } } general_vox_timer( timer, type ) //checked matches cerberus output { level endon( "end_game" ); /* /# println( "ZM >> VOX TIMER STARTED FOR " + type + " ( " + timer + ")" ); #/ */ while ( timer > 0 ) { wait 1; timer--; } level.votimer[ type ] = timer; /* /# println( "ZM >> VOX TIMER ENDED FOR " + type + " ( " + timer + ")" ); #/ */ } create_vox_timer( type ) //checked matches cerberus output { level.votimer[ type ] = 0; } play_vox_to_player( category, type, force_variant ) //checked matches cerberus output { self thread maps/mp/zombies/_zm_audio::playvoxtoplayer( category, type, force_variant ); } is_favorite_weapon( weapon_to_check ) { if ( !isDefined( self.favorite_wall_weapons_list ) ) { return 0; } _a6174 = self.favorite_wall_weapons_list; _k6174 = getFirstArrayKey( _a6174 ); while ( isDefined( _k6174 ) ) { weapon = _a6174[ _k6174 ]; if ( weapon_to_check == weapon ) { return 1; } _k6174 = getNextArrayKey( _a6174, _k6174 ); } return 0; } add_vox_response_chance( event, chance ) { level.response_chances[ event ] = chance; } set_demo_intermission_point() //checked changed to match cerberus output { spawnpoints = getentarray( "mp_global_intermission", "classname" ); if ( !spawnpoints.size ) { return; } spawnpoint = spawnpoints[ 0 ]; match_string = ""; location = level.scr_zm_map_start_location; if ( ( location != "default" || location == "" ) && isDefined( level.default_start_location ) ) { location = level.default_start_location; } match_string = level.scr_zm_ui_gametype + "_" + location; for ( i = 0; i < spawnpoints.size; i++ ) { if ( isDefined( spawnpoints[ i ].script_string ) ) { tokens = strtok( spawnpoints[ i ].script_string, " " ); foreach ( token in tokens ) { if ( token == match_string ) { spawnpoint = spawnpoints[ i ]; i = spawnpoints.size; break; } } } } setdemointermissionpoint( spawnpoint.origin, spawnpoint.angles ); } register_map_navcard( navcard_on_map, navcard_needed_for_computer ) //checked matches cerberus output { level.navcard_needed = navcard_needed_for_computer; level.map_navcard = navcard_on_map; } does_player_have_map_navcard( player ) //checked matches cerberus output { return player maps/mp/zombies/_zm_stats::get_global_stat( level.map_navcard ); } does_player_have_correct_navcard( player ) //checked matches cerberus output { if ( !isDefined( level.navcard_needed ) ) { return 0; } return player maps/mp/zombies/_zm_stats::get_global_stat( level.navcard_needed ); } place_navcard( str_model, str_stat, org, angles ) //checked changed to match cerberus output { navcard = spawn( "script_model", org ); navcard setmodel( str_model ); navcard.angles = angles; wait 1; navcard_pickup_trig = spawn( "trigger_radius_use", org, 0, 84, 72 ); navcard_pickup_trig setcursorhint( "HINT_NOICON" ); navcard_pickup_trig sethintstring( &"ZOMBIE_NAVCARD_PICKUP" ); navcard_pickup_trig triggerignoreteam(); a_navcard_stats = array( "navcard_held_zm_transit", "navcard_held_zm_highrise", "navcard_held_zm_buried" ); is_holding_card = 0; str_placing_stat = undefined; while ( 1 ) { navcard_pickup_trig waittill( "trigger", who ); if ( is_player_valid( who ) ) { foreach ( str_cur_stat in a_navcard_stats ) { if ( who maps/mp/zombies/_zm_stats::get_global_stat( str_cur_stat ) ) { str_placing_stat = str_cur_stat; is_holding_card = 1; who maps/mp/zombies/_zm_stats::set_global_stat( str_cur_stat, 0 ); } } who playsound( "zmb_buildable_piece_add" ); who maps/mp/zombies/_zm_stats::set_global_stat( str_stat, 1 ); who.navcard_grabbed = str_stat; wait_network_frame(); is_stat = who maps/mp/zombies/_zm_stats::get_global_stat( str_stat ); thread sq_refresh_player_navcard_hud(); break; } } navcard delete(); navcard_pickup_trig delete(); if ( is_holding_card ) { level thread place_navcard( str_model, str_placing_stat, org, angles ); } } sq_refresh_player_navcard_hud() //checked changed to match cerberus output { if ( !isDefined( level.navcards ) ) { return; } players = get_players(); foreach ( player in players ) { player thread sq_refresh_player_navcard_hud_internal(); } } sq_refresh_player_navcard_hud_internal() //checked changed to match cerberus output { self endon( "disconnect" ); navcard_bits = 0; for ( i = 0; i < level.navcards.size; i++ ) { hasit = self maps/mp/zombies/_zm_stats::get_global_stat( level.navcards[ i ] ); if ( isDefined( self.navcard_grabbed ) && self.navcard_grabbed == level.navcards[ i ] ) { hasit = 1; } if ( hasit ) { navcard_bits += 1; } } wait_network_frame(); self setclientfield( "navcard_held", 0 ); if ( navcard_bits > 0 ) { wait_network_frame(); self setclientfield( "navcard_held", navcard_bits ); } } set_player_is_female( onoff ) //checked matches cerberus output { if ( isDefined( level.use_female_animations ) && level.use_female_animations ) { female_perk = "specialty_gpsjammer"; if ( onoff ) { self setperk( female_perk ); return; } else { self unsetperk( female_perk ); } } } disable_player_move_states( forcestancechange ) //checked matches cerberus output { self allowcrouch( 1 ); self allowlean( 0 ); self allowads( 0 ); self allowsprint( 0 ); self allowprone( 0 ); self allowmelee( 0 ); if ( isDefined( forcestancechange ) && forcestancechange == 1 ) { if ( self getstance() == "prone" ) { self setstance( "crouch" ); } } } enable_player_move_states() //checked matches cerberus output { if ( !isDefined( self._allow_lean ) || self._allow_lean == 1 ) { self allowlean( 1 ); } if ( !isDefined( self._allow_ads ) || self._allow_ads == 1 ) { self allowads( 1 ); } if ( !isDefined( self._allow_sprint ) || self._allow_sprint == 1 ) { self allowsprint( 1 ); } if ( !isDefined( self._allow_prone ) || self._allow_prone == 1 ) { self allowprone( 1 ); } if ( !isDefined( self._allow_melee ) || self._allow_melee == 1 ) { self allowmelee( 1 ); } } check_and_create_node_lists() //checked matches cerberus output { if ( !isDefined( level._link_node_list ) ) { level._link_node_list = []; } if ( !isDefined( level._unlink_node_list ) ) { level._unlink_node_list = []; } } link_nodes( a, b, bdontunlinkonmigrate ) //checked changed to match cerberus output { if ( !isDefined( bdontunlinkonmigrate ) ) { bdontunlinkonmigrate = 0; } if ( nodesarelinked( a, b ) ) { return; } check_and_create_node_lists(); a_index_string = "" + a.origin; b_index_string = "" + b.origin; if ( !isDefined( level._link_node_list[ a_index_string ] ) ) { level._link_node_list[ a_index_string ] = spawnstruct(); level._link_node_list[ a_index_string ].node = a; level._link_node_list[ a_index_string ].links = []; level._link_node_list[ a_index_string ].ignore_on_migrate = []; } if ( !isDefined( level._link_node_list[ a_index_string ].links[ b_index_string ] ) ) { level._link_node_list[ a_index_string ].links[ b_index_string ] = b; level._link_node_list[ a_index_string ].ignore_on_migrate[ b_index_string ] = bdontunlinkonmigrate; } if ( isDefined( level._unlink_node_list[ a_index_string ] ) ) { if ( isDefined( level._unlink_node_list[ a_index_string ].links[ b_index_string ] ) ) { level._unlink_node_list[a_index_string].links[b_index_string] = undefined; level._unlink_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; } } linknodes( a, b ); } unlink_nodes( a, b, bdontlinkonmigrate ) //checked changed to match cerberus output { if ( !isDefined( bdontlinkonmigrate ) ) { bdontlinkonmigrate = 0; } if ( !nodesarelinked( a, b ) ) { return; } check_and_create_node_lists(); a_index_string = "" + a.origin; b_index_string = "" + b.origin; if ( !isDefined( level._unlink_node_list[ a_index_string ] ) ) { level._unlink_node_list[ a_index_string ] = spawnstruct(); level._unlink_node_list[ a_index_string ].node = a; level._unlink_node_list[ a_index_string ].links = []; level._unlink_node_list[ a_index_string ].ignore_on_migrate = []; } if ( !isDefined( level._unlink_node_list[ a_index_string ].links[ b_index_string ] ) ) { level._unlink_node_list[ a_index_string ].links[ b_index_string ] = b; level._unlink_node_list[ a_index_string ].ignore_on_migrate[ b_index_string ] = bdontlinkonmigrate; } if ( isDefined( level._link_node_list[ a_index_string ] ) ) { if ( isDefined( level._link_node_list[ a_index_string ].links[ b_index_string ] ) ) { level._link_node_list[a_index_string].links[b_index_string] = undefined; level._link_node_list[a_index_string].ignore_on_migrate[b_index_string] = undefined; } } unlinknodes( a, b ); } spawn_path_node( origin, angles, k1, v1, k2, v2 ) //checked matches cerberus output { if ( !isDefined( level._spawned_path_nodes ) ) { level._spawned_path_nodes = []; } node = spawnstruct(); node.origin = origin; node.angles = angles; node.k1 = k1; node.v1 = v1; node.k2 = k2; node.v2 = v2; node.node = spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ); level._spawned_path_nodes[ level._spawned_path_nodes.size ] = node; return node.node; } spawn_path_node_internal( origin, angles, k1, v1, k2, v2 ) //checked matches cerberus output { if ( isDefined( k2 ) ) { return spawnpathnode( "node_pathnode", origin, angles, k1, v1, k2, v2 ); } else if ( isDefined( k1 ) ) { return spawnpathnode( "node_pathnode", origin, angles, k1, v1 ); } else { return spawnpathnode( "node_pathnode", origin, angles ); } return undefined; } delete_spawned_path_nodes() //checked matches cerberus output { } respawn_path_nodes() //checked changed to match cerberus output { if ( !isDefined( level._spawned_path_nodes ) ) { return; } for ( i = 0; i < level._spawned_path_nodes.size; i++ ) { node_struct = level._spawned_path_nodes[ i ]; /* /# println( "Re-spawning spawned path node @ " + node_struct.origin ); #/ */ 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 ); } } link_changes_internal_internal( list, func ) //checked partially changed to match cerberus output //did not change while loop to for loop because continues in for loops go infinite { keys = getarraykeys( list ); for ( i = 0; i < keys.size; i++ ) { node = list[ keys[ i ] ].node; node_keys = getarraykeys( list[ keys[ i ] ].links ); j = 0; while ( j < node_keys.size ) { if ( isDefined( list[ keys[ i ] ].links[ node_keys[ j ] ] ) ) { if ( isDefined( list[ keys[ i ] ].ignore_on_migrate[ node_keys[ j ] ] ) && list[ keys[ i ] ].ignore_on_migrate[ node_keys[ j ] ] ) { /* /# println( "Node at " + keys[ i ] + " to node at " + node_keys[ j ] + " - IGNORED" ); #/ */ j++; continue; } /* /# println( "Node at " + keys[ i ] + " to node at " + node_keys[ j ] ); #/ */ [[ func ]]( node, list[ keys[ i ] ].links[ node_keys[ j ] ] ); } j++; } } } link_changes_internal( func_for_link_list, func_for_unlink_list ) //checked matches cerberus output { if ( isDefined( level._link_node_list ) ) { /* /# println( "Link List" ); #/ */ link_changes_internal_internal( level._link_node_list, func_for_link_list ); } if ( isDefined( level._unlink_node_list ) ) { /* /# println( "UnLink List" ); #/ */ link_changes_internal_internal( level._unlink_node_list, func_for_unlink_list ); } } link_nodes_wrapper( a, b ) //checked matches cerberus output { if ( !nodesarelinked( a, b ) ) { linknodes( a, b ); } } unlink_nodes_wrapper( a, b ) //checked matches cerberus output { if ( nodesarelinked( a, b ) ) { unlinknodes( a, b ); } } undo_link_changes() //checked matches cerberus output { /* /# println( "***" ); println( "***" ); println( "*** Undoing link changes" ); #/ */ link_changes_internal( ::unlink_nodes_wrapper, ::link_nodes_wrapper ); delete_spawned_path_nodes(); } redo_link_changes() //checked matches cerberus output { /* /# println( "***" ); println( "***" ); println( "*** Redoing link changes" ); #/ */ respawn_path_nodes(); link_changes_internal( ::link_nodes_wrapper, ::unlink_nodes_wrapper ); } set_player_tombstone_index() //checked matches cerberus output { if ( !isDefined( level.tombstone_index ) ) { level.tombstone_index = 0; } if ( !isDefined( self.tombstone_index ) ) { self.tombstone_index = level.tombstone_index; level.tombstone_index++; } } hotjoin_setup_player( viewmodel ) //checked matches cerberus output { if ( is_true( level.passed_introscreen ) && !isDefined( self.first_spawn ) && !isDefined( self.characterindex ) ) { self.first_spawn = 1; self setviewmodel( viewmodel ); return 1; } return 0; } is_temporary_zombie_weapon( str_weapon ) //checked changed at own discretion { if ( is_zombie_perk_bottle(str_weapon) || str_weapon == level.revive_tool || str_weapon == "zombie_builder_zm" || str_weapon == "chalk_draw_zm" || str_weapon == "no_hands_zm" || str_weapon == level.machine_assets["packapunch"].weapon ) { return 1; } return 0; } is_gametype_active( a_gametypes ) //checked changed to match cerberus output { b_is_gametype_active = 0; if ( !isarray( a_gametypes ) ) { a_gametypes = array( a_gametypes ); } for ( i = 0; i < a_gametypes.size; i++ ) { if ( getDvar( "g_gametype" ) == a_gametypes[ i ] ) { b_is_gametype_active = 1; } } return b_is_gametype_active; } is_createfx_active() //checked changed at own discretion { if ( !isDefined( level.createfx_enabled ) ) { level.createfx_enabled = getDvar( "createfx" ); } return level.createfx_enabled; } is_zombie_perk_bottle( str_weapon ) //checked matches cerberus output { switch( str_weapon ) { case "zombie_perk_bottle_additionalprimaryweapon": case "zombie_perk_bottle_cherry": case "zombie_perk_bottle_deadshot": case "zombie_perk_bottle_doubletap": case "zombie_perk_bottle_jugg": case "zombie_perk_bottle_marathon": case "zombie_perk_bottle_nuke": case "zombie_perk_bottle_oneinch": case "zombie_perk_bottle_revive": case "zombie_perk_bottle_sixth_sense": case "zombie_perk_bottle_sleight": case "zombie_perk_bottle_tombstone": case "zombie_perk_bottle_vulture": case "zombie_perk_bottle_whoswho": b_is_perk_bottle = 1; break; default: b_is_perk_bottle = 0; break; } return b_is_perk_bottle; } register_custom_spawner_entry( spot_noteworthy, func ) //checked matches cerberus output { if ( !isDefined( level.custom_spawner_entry ) ) { level.custom_spawner_entry = []; } level.custom_spawner_entry[ spot_noteworthy ] = func; } get_player_weapon_limit( player ) //checked matches cerberus output { if ( isDefined( level.get_player_weapon_limit ) ) { return [[ level.get_player_weapon_limit ]]( player ); } weapon_limit = 2; if ( player hasperk( "specialty_additionalprimaryweapon" ) ) { weapon_limit = level.additionalprimaryweapon_limit; } return weapon_limit; } get_player_perk_purchase_limit() //checked matches cerberus output { if ( isDefined( level.get_player_perk_purchase_limit ) ) { return self [[ level.get_player_perk_purchase_limit ]](); } return level.perk_purchase_limit; }